> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ach.netevia.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Onboard a new Person into the ACH application ( SUNSETTING )

> **This Endpoint is Sunsetting and you should use the stable endpoint. Sunsetting APIs that are still supported but scheduled for deprecation.**



## OpenAPI

````yaml https://api.grailpay.com/docs?api-docs.json post /3p/api/v2/users
openapi: 3.0.0
info:
  title: GrailPay ACH API
  description: API Documentation for moving funds via ACH using the GrailPay ACH API
  version: 2025.12.19.2
servers:
  - url: https://api.grailpay.com
    description: Production environment
  - url: https://api-sandbox.grailpay.com
    description: Sandbox environment
security: []
tags:
  - name: Users
    description: >-
      API Endpoints used for the onboarding and managing People, Businesses, and
      Merchants.
  - name: Transactions
    description: API Endpoints used for creating and managing transactions.
  - name: Payouts
    description: API Endpoints used for fetching payout information.
  - name: Refunds
    description: API Endpoints used for creating and retrieving refunds.
  - name: Bank Accounts
    description: API Endpoints used for adding and managing bank accounts.
  - name: Webhooks
    description: API Endpoints used for registering and de-registering webhooks.
  - name: Billing
    description: API Endpoints used for retrieving billing information.
  - name: Stable
    description: Stable, up-to-date APIs that are recommended for current integration.
  - name: Sunsetting
    description: Sunsetting APIs that are still supported but scheduled for deprecation.
  - name: Deprecated
    description: Deprecated APIs that are no longer supported and should be removed.
  - name: SUNSETTING
    description: SUNSETTING
paths:
  /3p/api/v2/users:
    post:
      tags:
        - Users
        - Sunsetting
      summary: Onboard a new Person into the ACH application ( SUNSETTING )
      description: >-
        **This Endpoint is Sunsetting and you should use the stable endpoint.
        Sunsetting APIs that are still supported but scheduled for
        deprecation.**
      operationId: 8b5aae9b3342dfb2d67304524b4da60b
      requestBody:
        required: true
        content:
          application/json:
            schema:
              properties:
                client_reference_id:
                  type: string
                  example: '123456'
                  nullable: true
                first_name:
                  type: string
                  example: John
                  nullable: true
                last_name:
                  type: string
                  example: Doe
                  nullable: true
                email:
                  type: string
                  example: test@example.org
                  nullable: true
                phone:
                  type: string
                  example: '1234567890'
                  nullable: true
                address:
                  properties:
                    line_1:
                      type: string
                      example: 10554 W Quarles Ave
                      nullable: true
                    city:
                      type: string
                      example: Littleton
                      nullable: true
                    state:
                      type: string
                      example: CO
                      nullable: true
                    zip:
                      type: string
                      example: '80127'
                      nullable: true
                  type: object
                bank_account:
                  $ref: '#/components/schemas/V2BankAccountRequest'
                billing_merchant_user_uuid:
                  type: string
                  format: uuid
                  example: 2bcf2ac3-38fc-4238-a638-4f092821fc27
                  nullable: true
                billing_processor_mid:
                  type: string
                  example: '21245678932'
                  nullable: true
                payout_type:
                  type: string
                  enum:
                    - batch
                    - individual
                  example: individual
                  nullable: true
              type: object
      responses:
        '201':
          description: Person registered successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V2OnboardPersonResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/Error401Unauthorized'
                  - $ref: '#/components/schemas/Error401InvalidTokenStructure'
                  - $ref: '#/components/schemas/Error401InvalidTokenData'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error403ForbiddenResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                properties:
                  status:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: The given data was invalid.
                  data:
                    type: string
                    example: null
                  errors:
                    properties:
                      first_name:
                        type: array
                        items:
                          type: string
                          example: The first name must be a string.
                    type: object
                  error_code:
                    type: string
                    example: null
                type: object
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
      security:
        - ApiToken: []
components:
  schemas:
    V2BankAccountRequest:
      description: Bank account can be either Plaid or Custom, not both
      oneOf:
        - required:
            - custom
          properties:
            custom:
              $ref: '#/components/schemas/CustomBankAccount'
          type: object
        - required:
            - plaid
          properties:
            plaid:
              $ref: '#/components/schemas/PlaidAccount'
          type: object
    V2OnboardPersonResponse:
      title: Person Response
      description: Schema for a person response
      properties:
        status:
          description: Response status
          type: boolean
          example: true
        message:
          description: Response message
          type: string
        data:
          description: User data
          properties:
            client_reference_id:
              description: Client reference ID
              type: string
              example: company_45458
            uuid:
              description: User UUID
              type: string
              format: uuid
              example: 9d264b4a-006c-4d01-acd0-730e27784c59
            first_name:
              description: User first name
              type: string
              example: John
            last_name:
              description: User last name
              type: string
              example: Dew
            email:
              description: User email address
              type: string
              format: email
              example: john.dew@example.com
            phone:
              description: User phone number
              type: string
              example: '2457856490'
            user_status:
              description: User status
              type: string
              example: APPROVED
            payout_type:
              description: Payout Type
              type: string
              example: individual
            address:
              description: User address details
              properties:
                street_address:
                  description: Street address
                  type: string
                  example: 10554 W Quarles Ave
                city:
                  description: City
                  type: string
                  example: Littleton
                state:
                  description: State
                  type: string
                  example: CO
                country:
                  description: Country
                  type: string
                  example: US
                zip:
                  description: Zip code
                  type: string
                  example: '80127'
              type: object
            role:
              type: string
              example: Person
            vendor_name:
              description: Vendor name
              type: string
              example: Fintech
            valid_account:
              type: string
              example: Valid
            bank_account:
              properties:
                risk:
                  properties:
                    confidence_score:
                      type: number
                      format: float
                      example: '0.83'
                      nullable: true
                    threshold:
                      type: number
                      format: float
                      example: '0.61'
                      nullable: true
                  type: object
              type: object
            created_at:
              type: string
              format: date-time
              example: '2024-10-02 14:06:14'
            updated_at:
              type: string
              format: date-time
              example: '2024-10-02 14:06:17'
          type: object
        errors:
          description: Error details if any
          type: object
          nullable: true
        error_code:
          description: Error code if any
          type: string
          nullable: true
      type: object
    Error400:
      properties:
        status:
          type: boolean
          example: false
        message:
          type: string
          example: Invalid Parameters Received
        data:
          type: string
          example: null
        errors:
          type: string
          example: null
        error_code:
          type: string
          example: null
      type: object
    Error401Unauthorized:
      properties:
        status:
          type: boolean
          example: false
        message:
          type: string
          example: Invalid Token
        data:
          type: string
          example: null
        errors:
          type: string
          example: null
        error_code:
          type: string
          example: null
      type: object
    Error401InvalidTokenStructure:
      properties:
        status:
          type: boolean
          example: false
        message:
          type: string
          example: >-
            Invalid token format. The token should be in the following format:
            ID|TOKEN_VALUE. Example: 12345|abcdefg
        data:
          type: string
          example: null
        errors:
          type: string
          example: null
        error_code:
          type: string
          example: null
      type: object
    Error401InvalidTokenData:
      properties:
        status:
          type: boolean
          example: false
        message:
          type: string
          example: >-
            Invalid token format. The ID in the token must be an integer.
            Example: 12345|abcdefg
        data:
          type: string
          example: null
        errors:
          type: string
          example: null
        error_code:
          type: string
          example: null
      type: object
    Error403ForbiddenResponse:
      properties:
        status:
          type: boolean
          example: false
        message:
          type: string
          example: Access denied. Please use a secure (HTTPS) connection.
        data:
          type: string
          example: null
        errors:
          type: string
          example: null
        error_code:
          type: string
          example: null
      type: object
    Error500:
      properties:
        status:
          type: boolean
          example: false
        message:
          type: string
          example: Internal server error occurred.
        data:
          type: string
          example: null
        errors:
          type: string
          example: null
        error_code:
          type: string
          example: server_error
      type: object
    CustomBankAccount:
      required:
        - account_number
        - routing_number
        - account_name
        - account_type
      properties:
        account_number:
          type: string
          example: '123456789'
        routing_number:
          type: string
          example: '123456789'
        account_name:
          type: string
          example: John Doe
        account_type:
          type: string
          example: checking
      type: object
    PlaidAccount:
      required:
        - account_id
        - access_token
      properties:
        account_id:
          type: string
          example: '123456789'
        access_token:
          type: string
          example: token123
      type: object
  securitySchemes:
    ApiToken:
      type: http
      description: >-
        Token-based authentication using Authorization: Bearer <YOUR_API_KEY>
        provided by the GrailPay Support Team.
      bearerFormat: Token
      scheme: bearer

````