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

# Create an Individual Customer

> Create customer profiles for individual users. Handle KYC and identity verification.

This guide provides a technical walkthrough on programmatically creating an individual customer account within your Busha Business account using the Busha API. By automating customer creation, you can streamline your onboarding processes and prepare to perform transactions on behalf of your customers.

<Tip>
  **What You'll Achieve:**

  1. Understand the basic structure for creating a customer.
  2. Learn how to structure API requests for individual customer types.
  3. Successfully create and verify customer accounts programmatically.
</Tip>

## Prerequisites

Before you begin, ensure you have:

* A **Busha Business Account** and **Secret API Key** (from the [Quick Start Tutorial](/guides/getting-started/quick-start)).
* An understanding of **API Environments** (Sandbox vs. Production) and their base URLs (from the [Make Your First Request Guide](/guides/getting-started/make-first-request)).

## Creating an Individual Customer Account

<Steps>
  <Step title="Understand Customer Creation Parameters">
    The essential parameters for creating an individual customer type are:

    <table style={{ width: '100%', borderCollapse: 'collapse' }}>
      <thead>
        <tr>
          <th style={{ width: '30%', textAlign: 'left', padding: '12px' }}>
            Parameter
          </th>

          <th style={{ width: '15%', textAlign: 'left', padding: '12px' }}>Type</th>

          <th style={{ width: '55%', textAlign: 'left', padding: '12px' }}>
            Description
          </th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td style={{ padding: '12px' }}>
            <code>email</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The individual customer's email address.
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>has\_accepted\_terms</code>
          </td>

          <td style={{ padding: '12px' }}>boolean</td>

          <td style={{ padding: '12px' }}>
            A flag indicating whether the individual has accepted your platform's
            (or Busha's) terms and conditions.
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>type</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The type of customer. Must be <code>individual</code> for this customer
            type.
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>country\_id</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The ISO 3166-1 alpha-2 country code representing the individual's
            primary country of residence.
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>phone</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The individual's phone number, including the international country code
            (e.g., +234 8012345678).
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>birth\_date</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The individual's date of birth, typically required for identity
            verification. Format: DD-MM-YYYY.
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>first\_name</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>
          <td style={{ padding: '12px' }}>The individual customer's first name.</td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>middle\_name</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The individual customer's middle name (optional).
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>last\_name</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>
          <td style={{ padding: '12px' }}>The individual customer's last name.</td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>address</code>
          </td>

          <td style={{ padding: '12px' }}>object</td>

          <td style={{ padding: '12px' }}>
            The individual's physical address details. See the Address Object
            Parameters table below for nested fields.
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>identifying\_information</code>
          </td>

          <td style={{ padding: '12px' }}>array</td>

          <td style={{ padding: '12px' }}>
            An array of objects describing the individual's identification documents
            and selfie image (e.g., passport + selfie, national ID + selfie).
          </td>
        </tr>
      </tbody>
    </table>

    For the `address` field in the customer creation object, the fields required are:

    <table style={{ width: '100%', borderCollapse: 'collapse' }}>
      <thead>
        <tr>
          <th style={{ width: '30%', textAlign: 'left', padding: '12px' }}>
            Parameter
          </th>

          <th style={{ width: '15%', textAlign: 'left', padding: '12px' }}>Type</th>

          <th style={{ width: '55%', textAlign: 'left', padding: '12px' }}>
            Description
          </th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td style={{ padding: '12px' }}>
            <code>city</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>
          <td style={{ padding: '12px' }}>The city component of the address.</td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>state</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The state or region component of the address.
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>county</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The county or district component of the address (optional).
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>country\_id</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The ISO 3166-1 alpha-2 country code of the address.
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>address\_line\_1</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>
          <td style={{ padding: '12px' }}>The first line of the street address.</td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>address\_line\_2</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The second line of the street address (optional).
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>province</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The province component of the address (optional).
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>
            <code>postal\_code</code>
          </td>

          <td style={{ padding: '12px' }}>string</td>

          <td style={{ padding: '12px' }}>
            The postal or ZIP code of the address.
          </td>
        </tr>
      </tbody>
    </table>

    **Know Your Customer (KYC)**

    Optionally, you can choose to upload your customer's KYC documents at the point of creation in the `identifying_information` array field.

    <Note>
      Files uploaded for KYC must be in Base64 format and have a file size less than
      4MB.
    </Note>

    **KYC Document Requirements:**

    For individual customers, you must provide ONE of the following combinations in the `identifying_information` array:

    **Option 1: Passport + Selfie**

    ```json theme={null}
    "identifying_information": [
      {
        "type": "passport",
        "number": "passport-number",
        "country": "NG",
        "image_front": "{{base64 encoded passport image}}"
      },
      {
        "type": "selfie",
        "image_front": "{{base64 encoded selfie image}}",
        "number": "",
        "country": "NG"
      }
    ]
    ```

    **Option 2: National ID + Selfie**

    ```json theme={null}
    "identifying_information": [
      {
        "type": "national-id",
        "number": "id-number",
        "country": "NG"
      },
      {
        "type": "selfie",
        "image_front": "{{base64 encoded selfie image}}",
        "number": "",
        "country": "NG"
      }
    ]
    ```

    <table style={{ width: '100%', borderCollapse: 'collapse' }}>
      <thead>
        <tr>
          <th style={{ width: '30%', textAlign: 'left', padding: '12px' }}>
            Country
          </th>

          <th style={{ width: '70%', textAlign: 'left', padding: '12px' }}>
            Documents Required
          </th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td style={{ padding: '12px' }}>Nigeria</td>

          <td style={{ padding: '12px' }}>
            <ul style={{ margin: '8px 0', paddingLeft: '20px' }}>
              <li>NIN number and selfie image</li>
              <li>National passport and selfie image</li>
              <li>Driver's license and selfie image</li>
            </ul>
          </td>
        </tr>

        <tr>
          <td style={{ padding: '12px' }}>Kenya</td>

          <td style={{ padding: '12px' }}>
            <ul style={{ margin: '8px 0', paddingLeft: '20px' }}>
              <li>National ID and selfie image</li>
            </ul>
          </td>
        </tr>
      </tbody>
    </table>

    For a full list of acceptable documents, please refer to the [Compliance Guide](/overview/compliance).
  </Step>

  <Step title="Create a Customer (Without KYC Documents)">
    Individual customers refer to persons who engage with your services. Start with basic information and add KYC documents later.

    To create an individual customer without KYC documents:

    1. Open your terminal or command prompt.
    2. Use the `POST` request below to the `/v1/customers` endpoint.
    3. Replace `YOUR_BASE_URL` with your chosen environment's URL and `{YOUR_SECRET_KEY}` with your actual key.

    ```shell theme={null}
        $ curl -i -X POST https://YOUR_BASE_URL/v1/customers \
          -H 'Authorization: Bearer {YOUR_SECRET_KEY}' \
          -H 'Content-Type: application/json' \
          -d '{
            "email": "customer.basic@gmail.com",
            "has_accepted_terms": true,
            "type": "individual",
            "country_id": "NG",
            "phone": "+234 8012345678",
            "birth_date": "24-12-2000",
            "address": {
              "city": "Lagos",
              "state": "Lagos",
              "country_id": "NG",
              "address_line_1": "10 Allen Avenue",
              "postal_code": "100001"
            },
            "first_name": "John",
            "last_name": "Doe"
          }'
    ```

    **Expected Response:**

    A successful response will return a Customer object with `status: "inactive"` until KYC is completed.

    <Note>
      The default status of a customer is `inactive` until they complete their Know-Your-Customer (KYC) process.
    </Note>

    ```json theme={null}
    {
      "status": "success",
      "message": "Created customer successfully",
      "data": {
        "address": {
          "address_line_1": "10 Allen Avenue",
          "city": "Lagos",
          "country_id": "NG",
          "postal_code": "100001",
          "state": "Lagos"
        },
        "business_id": "BUS_jlKUYwF9z1ynQZ98bWbaP",
        "country_id": "NG",
        "created_at": "2026-01-27T09:23:09.317273Z",
        "deposit": true,
        "display_currency": "NGN",
        "email": "customer.basic@gmail.com",
        "first_name": "John",
        "has_accepted_terms_of_service": true,
        "id": "CUS_IL2Qf2pEoNADZ",
        "last_name": "Doe",
        "level": "0",
        "payout": true,
        "phone": "+234 8012345678",
        "status": "inactive",
        "type": "individual",
        "updated_at": "2026-01-27T09:23:09.317273Z"
      }
    }
    ```
  </Step>

  <Step title="Create a Customer (With KYC Documents)">
    Create a verified customer by including KYC documents at creation.

    To create a customer with supporting KYC documents:

    1. Open your terminal or command prompt.
    2. Use the `POST` request below to the `/v1/customers` endpoint.
    3. Replace `YOUR_BASE_URL` with your chosen environment's URL and `{YOUR_SECRET_KEY}` with your actual key.

    **Example with Passport + Selfie:**

    ```shell theme={null}
        $ curl -i -X POST https://YOUR_BASE_URL/v1/customers \
          -H 'Authorization: Bearer {YOUR_SECRET_KEY}' \
          -H 'Content-Type: application/json' \
          -d '{
            "email": "jacob.verified@gmail.com",
            "first_name": "Jacob",
            "last_name": "Zuma",
            "has_accepted_terms": true,
            "type": "individual",
            "country_id": "NG",
            "phone": "+234 8087654321",
            "birth_date": "24-12-1990",
            "address": {
              "city": "Lagos",
              "state": "Lagos",
              "country_id": "NG",
              "address_line_1": "15 Victoria Island",
              "postal_code": "100001"
            },
            "identifying_information": [
              {
                "type": "passport",
                "number": "passport-number",
                "country": "NG",
                "image_front": "{{base64 encoded passport image}}"
              },
              {
                "type": "selfie",
                "image_front": "{{base64 encoded selfie image}}",
                "number": "",
                "country": "NG"
              }
            ]
          }'
    ```

    **Example with National ID + Selfie:**

    ```shell theme={null}
        $ curl -i -X POST https://YOUR_BASE_URL/v1/customers \
          -H 'Authorization: Bearer {YOUR_SECRET_KEY}' \
          -H 'Content-Type: application/json' \
          -d '{
            "email": "jacob.verified@gmail.com",
            "first_name": "Jacob",
            "last_name": "Zuma",
            "has_accepted_terms": true,
            "type": "individual",
            "country_id": "NG",
            "phone": "+234 8087654321",
            "birth_date": "24-12-1990",
            "address": {
              "city": "Lagos",
              "state": "Lagos",
              "country_id": "NG",
              "address_line_1": "15 Victoria Island",
              "postal_code": "100001"
            },
            "identifying_information": [
              {
                "type": "national-id",
                "number": "id-number",
                "country": "NG"
              },
              {
                "type": "selfie",
                "image_front": "{{base64 encoded selfie image}}",
                "number": "",
                "country": "NG"
              }
            ]
          }'
    ```

    **Expected Response:**

    ```json theme={null}
    {
      "status": "success",
      "message": "Created customer successfully",
      "data": {
        "address": {
          "address_line_1": "15 Victoria Island",
          "city": "Lagos",
          "country_id": "NG",
          "postal_code": "100001",
          "state": "Lagos"
        },
        "business_id": "BUS_jlKUYwF9z1ynQZ98bWbaP",
        "country_id": "NG",
        "created_at": "2026-01-27T09:23:09.317273Z",
        "deposit": true,
        "display_currency": "NGN",
        "email": "jacob.verified@gmail.com",
        "first_name": "Jacob",
        "has_accepted_terms_of_service": true,
        "id": "CUS_Ikdb49NLsnlYU",
        "last_name": "Zuma",
        "level": "0",
        "payout": true,
        "phone": "+234 8087654321",
        "status": "inactive",
        "type": "individual",
        "updated_at": "2026-01-27T09:23:09.317273Z"
      }
    }
    ```

    <Info>
      The status remains `inactive` until the documents are verified. Call the verify endpoint to submit for verification.
    </Info>
  </Step>

  <Step title="Verify the Customer">
    After creating a customer with KYC documents, verify them to activate their account.

    To verify a customer:

    1. Open your terminal or command prompt.
    2. Use the `POST` request below to the `/v1/customers/{customer_id}/verify` endpoint.
    3. Replace `{customer_id}` with the customer ID from the previous response.
    4. Replace `YOUR_BASE_URL` with your chosen environment's URL and `{YOUR_SECRET_KEY}` with your actual key.

    ```shell theme={null}
        $ curl -i -X POST https://YOUR_BASE_URL/v1/customers/CUS_Ikdb49NLsnlYU/verify \
          -H 'Authorization: Bearer {YOUR_SECRET_KEY}'
    ```

    **Expected Response:**

    A successful verification will return:

    ```json theme={null}
    {
      "status": "success",
      "message": "Customer verified successfully"
    }
    ```

    <Note>
      After verification, check the customer status. It will change from `inactive` to `in_review` or `active`.
    </Note>

    **Common Errors:**

    * **`profile_kyc_verification`:** KYC documents are missing or incomplete (e.g., no selfie image)

    If you receive this error, update the customer with the missing documents using `PUT /v1/customers/{customer_id}`, then retry verification.
  </Step>
</Steps>

## Complete Example: Create and Verify Customer

Here's a complete workflow to create and verify an individual customer:

**Step 1: Create customer with KYC documents (Passport + Selfie)**

```shell theme={null}
curl -X POST https://api.sandbox.busha.so/v1/customers \
  -H 'Authorization: Bearer YOUR_SECRET_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "email": "verified.customer@gmail.com",
    "first_name": "Test",
    "last_name": "Customer",
    "has_accepted_terms": true,
    "type": "individual",
    "country_id": "NG",
    "phone": "+234 8012345678",
    "birth_date": "15-06-1990",
    "address": {
      "city": "Lagos",
      "state": "Lagos",
      "country_id": "NG",
      "address_line_1": "10 Allen Avenue",
      "postal_code": "100001"
    },
    "identifying_information": [
      {
        "type": "passport",
        "number": "passport-number",
        "country": "NG",
        "image_front": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="
      },
      {
        "type": "selfie",
        "image_front": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",
        "number": "",
        "country": "NG"
      }
    ]
  }'
```

**Step 2: Verify the customer**

```shell theme={null}
curl -X POST https://api.sandbox.busha.so/v1/customers/CUS_xxx/verify \
  -H 'Authorization: Bearer YOUR_SECRET_KEY'
```

**Step 3: Check customer status**

```shell theme={null}
curl -X GET https://api.sandbox.busha.so/v1/customers/CUS_xxx \
  -H 'Authorization: Bearer YOUR_SECRET_KEY'
```

Expected status: `"status": "in_review"` or `"status": "active"`

<Info>
  **Customer Status Flow:** 1. `inactive` - Default status after creation 2.
  `in_review` - After calling verify endpoint with valid documents 3. `active` -
  After verification approval (automatic in sandbox, manual review in
  production)
</Info>

***

## Troubleshooting

* **400 Bad Request / 422 Unprocessable Entity:** Review your request body to ensure all required fields are present and correctly formatted.
* **401 Unauthorized:** Verify that your Secret API Key is correct and included in the header.
* **Email validation error:** Use real email domains like `@gmail.com` instead of generic domains like `@example.com`.
* **`profile_kyc_verification` error during verification:** Ensure all required documents (ID images and selfie image) are uploaded before calling verify.

## What's Next?

Now that you can programmatically create and verify individual customers, you can proceed to manage them and perform transactions on their behalf:

* [How to Create a Business Customer](/guides/customers/create-business): Learn how to create a business customer in your Busha business account.
* [How to Verify Customer's Identity (KYC/KYB)](/guides/customers/verify-identity): Learn more about the verification process and required documents.
* [How to Initiate Transactions on Behalf of a Customer](/guides/customers/transactions-on-behalf): Understand how to use the `customer_id` to perform operations for your customers.
* [Webhook Events](/guides/webhooks/webhook-events): Learn about customer verification webhook events.
