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

# Create user profile

> Create the personal profile for an end-user — required before starting KYC.

<Note>
  Requires `X-Api-Key` and `X-Api-Secret` headers. Pass `userId` in the request body — no JWT required.
</Note>

Creates the personal profile for a partner user. A profile **must exist before calling [Start KYC](/api-reference/users/start-kyc)** — Persona uses the profile data to pre-fill the verification form.

If a profile already exists for the user, this endpoint updates it instead of returning an error.

<Tip>
  After creating the profile, call [`GET /api/v1/user/profile/check-completion`](/api-reference/users/profile-check-completion) to confirm all required fields are present before moving to KYC. Missing fields are listed in `missingFields` — use [`PATCH /api/v1/user/profile`](/api-reference/users/update-profile) to fill them in.
</Tip>

## Request

```http theme={null}
POST /api/v1/user/profile
X-Api-Key: <your-api-key>
X-Api-Secret: <your-api-secret>
Content-Type: application/json
```

### Body

| Field                   | Type          | Required | Description                                                               |
| ----------------------- | ------------- | -------- | ------------------------------------------------------------------------- |
| `userId`                | string (UUID) | **Yes**  | Qash user ID from [Register user](/api-reference/users/register-personal) |
| `firstName`             | string        | **Yes**  | User's legal first name                                                   |
| `lastName`              | string        | **Yes**  | User's legal last name                                                    |
| `middleName`            | string        | No       | Middle name                                                               |
| `dateOfBirth`           | string        | No       | `YYYY-MM-DD` format                                                       |
| `nationality`           | string        | No       | ISO 3166-1 alpha-2 country code — e.g. `"MX"`                             |
| `gender`                | string        | No       | `"male"`, `"female"`, `"other"`, `"prefer_not_to_say"`                    |
| `governmentIdType`      | string        | No       | `"passport"`, `"national_id"`, `"drivers_license"`, `"other"`             |
| `governmentIdNumber`    | string        | No       | Document number                                                           |
| `governmentIdCountry`   | string        | No       | Issuing country — ISO 3166-1 alpha-2                                      |
| `governmentIdExpiry`    | string        | No       | `YYYY-MM-DD` format                                                       |
| `addressLine1`          | string        | No       | Street address                                                            |
| `addressLine2`          | string        | No       | Apartment, suite, etc.                                                    |
| `city`                  | string        | No       | City                                                                      |
| `stateProvince`         | string        | No       | State or province                                                         |
| `postalCode`            | string        | No       | Postal / ZIP code                                                         |
| `addressCountry`        | string        | No       | ISO 3166-1 alpha-2 — e.g. `"MX"`                                          |
| `occupation`            | string        | No       | Occupation                                                                |
| `annualSalary`          | string        | No       | Annual salary range                                                       |
| `accountPurpose`        | string        | No       | Stated purpose for the Qash account                                       |
| `expectedMonthlyVolume` | string        | No       | Expected monthly transaction volume                                       |
| `isPep`                 | boolean       | No       | Politically Exposed Person flag — defaults to `false`                     |
| `isSanctioned`          | boolean       | No       | Sanctions flag — defaults to `false`                                      |
| `usCitizen`             | boolean       | No       | US citizen flag — defaults to `false`                                     |
| `acceptedTerms`         | boolean       | No       | User accepted Qash terms of service                                       |
| `company`               | string        | No       | Employer or company name, if relevant to `occupation`/`accountPurpose`    |
| `naicsCode`             | string        | No       | NAICS industry code, if relevant to `accountPurpose`                      |

```json theme={null}
{
  "userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "firstName": "Juan",
  "lastName": "García",
  "dateOfBirth": "1990-05-15",
  "nationality": "MX",
  "gender": "male",
  "governmentIdType": "passport",
  "governmentIdNumber": "A1234567",
  "governmentIdCountry": "MX",
  "addressLine1": "Av. Insurgentes Sur 1234",
  "city": "Ciudad de México",
  "stateProvince": "CDMX",
  "postalCode": "06600",
  "addressCountry": "MX",
  "occupation": "engineer",
  "annualSalary": "50000-100000",
  "accountPurpose": "personal_savings",
  "expectedMonthlyVolume": "5000-10000",
  "isPep": false,
  "isSanctioned": false,
  "usCitizen": false,
  "acceptedTerms": true
}
```

## Response

**201 Created**

```json theme={null}
{
  "success": true,
  "data": {
    "profile": {
      "id": "bfc7083b-75a2-11f1-86bf-42010a400007",
      "userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "firstName": "Juan",
      "lastName": "García",
      "fullName": "Juan García",
      "dateOfBirth": "1990-05-15T00:00:00.000Z",
      "nationality": "MX",
      "gender": "male",
      "governmentIdType": "passport",
      "governmentIdNumber": "A1234567",
      "governmentIdCountry": "MX",
      "addressLine1": "Av. Insurgentes Sur 1234",
      "city": "Ciudad de México",
      "stateProvince": "CDMX",
      "postalCode": "06600",
      "addressCountry": "MX",
      "occupation": "engineer",
      "isPep": false,
      "isSanctioned": false,
      "usCitizen": false,
      "acceptedTerms": "2026-06-01T00:00:00.000Z",
      "createdAt": "2026-06-01T00:00:00.000Z",
      "updatedAt": "2026-06-01T00:00:00.000Z"
    }
  }
}
```

## Errors

| HTTP status | Error                                            | Cause                                         |
| ----------- | ------------------------------------------------ | --------------------------------------------- |
| `400`       | Validation message                               | Missing required field or invalid format      |
| `400`       | `Missing userId in request body or query params` | `userId` not included in the body             |
| `401`       | `Invalid partner credentials`                    | Wrong or missing `X-Api-Key` / `X-Api-Secret` |
| `403`       | `User does not belong to this partner`           | `userId` belongs to a different partner       |
| `404`       | `User not found`                                 | `userId` does not exist                       |
