---
title: "Create a user"
method: POST
path: "/v1/users"
tags: ["User"]
---

# Create a user

`POST /v1/users`

Creates the authenticated Firebase user's Cardda account. The identity (id
and email) is taken from the verified Firebase ID token — **not** from the
body. This endpoint authenticates via a Firebase ID token (the normal bearer
session is skipped); the token is supplied in the `Authorization` header.
Optional `pomelo_user` details provision a Pomelo (Mexico) card user; if that
provisioning fails a `400` is returned.

## Parameters

- `#/paths/~1v1~1users/get/parameters/0` — unresolved $ref

## Request body

- object
  - `first_name` string
  - `last_name` string
  - `identifier` string
  - `phone` integer
  - `country` string
  - `nationality` string
  - `address` string
  - `occupation` string
  - `terms_accepted` boolean
  - `user_type` string
  - `legal_address` object
    - `street` string
    - `number` string
    - `municipality_id` string
    - `complement` string
    - `city` string
  - `pomelo_user` object — Optional. When present, provisions a Pomelo (Mexico) card user for the created account. If Pomelo provisioning fails the request returns `400`.
    - `identification_type` string
    - `identification_value` string
    - `birthdate` string
    - `gender` string
    - `occupation` string
    - `legal_address` object
      - `street_name` string
      - `street_number` string
      - `floor` string
      - `apartment` string
      - `zip_code` string
      - `neighborhood` string
      - `city` string
      - `region` string
      - `additional_info` string
      - `country` string

## Response `201`

The created user.

- User — An individual user (Firebase-authenticated). The `id` is the Firebase UID. Internal attributes (`ever_paid`, `roles`, `statistics`, ...) are **not part of the documented public contract** and are intentionally omitted here. The supported user shape is documented below.
  - `id` string, required — Firebase UID.
  - `first_name` string, nullable
  - `last_name` string, nullable
  - `email` string, nullable
  - `phone` integer, nullable
  - `identifier` string, nullable — Tax id / national id of the user.
  - `country` string, nullable
  - `nationality` string, nullable
  - `address` string, nullable
  - `occupation` string, nullable
  - `gender` integer, nullable
  - `birthdate` string, date-time, nullable
  - `is_pep` boolean — Whether the user is a politically exposed person.
  - `legal_address` object, nullable
  - `user_type` string, nullable
  - `status` string
  - `terms_accepted` boolean
  - `legal_representative` boolean, nullable
  - `has_powers_to_act` boolean, nullable
  - `whatsapp_verified` boolean
  - `milestone_ids` string[] — Computed list of milestone ids reached by the user.
  - `n_companies` integer — Number of companies the user belongs to (computed).
  - `company_role` string, nullable — The user's role in the current company context (computed).
  - `plh_profile_complete` boolean — Whether the user's PLH profile is complete (computed; serialized as `plh_profile_complete?`).
  - `missing_plh_profile_fields` string[]
  - `needs_password_setup` boolean — Whether the user still needs to set a password (computed; serialized as `needs_password_setup?`).
  - `created_at` string, date-time
  - `updated_at` string, date-time

## Other responses

- `400` — Pomelo (Mexico) card-user provisioning failed.
- `401` — Unauthorized (missing/invalid Firebase token)
- `422` — Validation failed

---

[API](https://skmtc.dev/cardda/apis/banking-api.md) · [All operations](https://skmtc.dev/cardda/apis/banking-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/cardda/banking-api/revisions/ff1aeb3fda8b/schema)
