# Update customer data

PATCH /customers/{customer_id}Update customer data

Endpoint: PATCH /customers/{customer_id}
Version: 2026-03-01
Security: bearerAuth

## Security:

  - `bearerAuth` (unknown)
    http bearer JWT

## Path parameters:

  - `customer_id` (string, required)
    Customer ID

## Request fields (application/json):

  - `email` (string)
    New contact email

  - `phone` (string)
    New contact phone — E.164, Brazilian numbers only (+55 followed by 10 or 11 digits)

## Response 200:

  - `200` (unknown)
    Customer updated

## Response 200 fields (application/json):

  - `id` (string, required)
    Unique customer identifier
    Example: cust_550e8400e29b41d4a716446655440000

  - `external_id` (string | null, required)
    Partner's reference ID for this customer
    Example: partner-ref-123

  - `name` (string | null, required)
    Legal name of the business owner
    Example: Joao Silva

  - `email` (string, required)
    Contact email
    Example: joao@example.com

  - `phone` (string, required)
    Contact phone in E.164 format
    Example: +5511999999999

  - `cpf` (string, required)
    Customer CPF. Always formatted as `XXX.XXX.XXX-XX` in responses
    Example: 123.456.789-00

  - `cnpj` (string | null, required)
    Company CNPJ. Always formatted as `XX.XXX.XXX/XXXX-XX` in responses
    Example: 12.345.678/0001-90

  - `trading_name` (string | null, required)
    Business trade name
    Example: Loja do Joao

  - `status` (string, required)
    Lifecycle state: `creating`, `pending_kyc`, `under_review`, `active`, `denied`
    Enum: "creating", "pending_kyc", "under_review", "active", "denied"

  - `kyc` (array)
    KYC requirements array. Omitted during `creating` status. Present from `pending_kyc` onward

  - `kyc.requirement_type` (string, required)
    KYC requirement type discriminator
    Enum: "identity", "selfie", "proof_of_address", "company_document", "ei_mei_documents", "income_statement", "articles_of_association", "eireli_incorporation_statement", "email"

  - `kyc.requirement_id` (string, required)
    Format: `identity_{subject_id}`
    Example: identity_003XXXXXXXXXXXXXXX

  - `kyc.label` (string, required)
    Human-readable label.
    Example: Documento de identidade

  - `kyc.mandatory` (boolean, required)
    Whether this requirement must be fulfilled

  - `kyc.subject` (object, required)
    Identifies who the requirement is about (a person or company co-owner).

  - `kyc.subject.id` (string, required)
    Opaque identifier for this subject (used in `requirement_id` suffix and document uploads).
    Example: 003XXXXXXXXXXXXXXX

  - `kyc.subject.name` (string, required)
    Human-readable name of the subject.
    Example: Joao Silva

  - `kyc.subject.subject_type` (string, required)
    `applicant` — the customer themselves. `co_owner` — a director/shareholder of the company.
    Enum: "applicant", "co_owner"

  - `kyc.submitted` (any)
    Evidence submitted for this requirement. Absent if nothing submitted yet

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "cnh"

  - `kyc.submitted.attachments` (any, required)
    Physical CNH (front + back photos) or digital CNH (single PDF)

  - `kyc.submitted.attachments.attachment_type` (string, required)
    Physical CNH attachment type
    Enum: "front", "back"

  - `kyc.submitted.attachments.submitted` (boolean, required)
    `true` if this slot has been filled

  - `kyc.submitted.attachments.attachment_type` (string, required)
    Digital CNH attachment type
    Enum: "file"

  - `kyc.submitted.review_status` (string, required)
    `pending` — awaiting review. `accepted` — approved. `rejected` — partner must resubmit.
    Enum: "pending", "accepted", "rejected"

  - `kyc.submitted.review_reason` (string | null, required)
    Explanation when `review_status` is `rejected`. `null` otherwise.

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "rg"

  - `kyc.submitted.attachments` (array, required)
    RG — front and back photos

  - `kyc.submitted.attachments.attachment_type` (string, required)
    RG attachment type
    Enum: "front", "back"

  - `kyc.requirement_id` (string, required)
    Format: `selfie_{subject_id}`
    Example: selfie_003XXXXXXXXXXXXXXX

  - `kyc.label` (string, required)
    Human-readable requirement label
    Example: Selfie

  - `kyc.mandatory` (boolean, required)
    Whether this requirement is mandatory

  - `kyc.submitted` (object)
    Selfie evidence.

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "selfie"

  - `kyc.submitted.attachments` (array, required)
    Submitted selfie photo

  - `kyc.submitted.attachments.attachment_type` (string, required)
    Type of submitted attachment
    Enum: "photo"

  - `kyc.requirement_id` (string, required)
    Format: `proof_of_address_{subject_id}`
    Example: proof_of_address_003XXXXXXXXXXXXXXX

  - `kyc.submitted` (object)
    Proof of address evidence.

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "proof_of_address"

  - `kyc.submitted.attachments` (array, required)
    Submitted proof of address file

  - `kyc.submitted.attachments.attachment_type` (string, required)
    Type of submitted attachment
    Enum: "file"

  - `kyc.requirement_id` (string, required)
    Fixed requirement identifier
    Example: company_document_001XXXXXXXXXXXXXXX

  - `kyc.submitted` (object)
    Company document evidence.

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "ccmei"

  - `kyc.submitted.attachments` (array, required)
    Submitted CCMEI file

  - `kyc.requirement_id` (string, required)
    Fixed requirement identifier
    Enum: "ei_mei_documents"

  - `kyc.submitted` (object)
    EI/MEI evidence.

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "ei_mei"

  - `kyc.submitted.attachments` (array, required)
    Both attachments are required

  - `kyc.submitted.attachments.attachment_type` (string, required)
    Type of submitted attachment
    Enum: "ei_registration_requirement", "ccmei"

  - `kyc.requirement_id` (string, required)
    Fixed requirement identifier
    Enum: "income_statement"

  - `kyc.submitted` (object)
    Income statement evidence.

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "income_statement"

  - `kyc.submitted.attachments` (array, required)
    Submitted revenue statement file

  - `kyc.requirement_id` (string, required)
    Fixed requirement identifier
    Enum: "articles_of_association"

  - `kyc.submitted` (object)
    Articles of association evidence.

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "articles_of_association"

  - `kyc.submitted.attachments` (array, required)
    Submitted articles of association file

  - `kyc.requirement_id` (string, required)
    Fixed requirement identifier
    Enum: "eireli_incorporation_statement"

  - `kyc.submitted` (object)
    EIRELI incorporation statement evidence.

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "eireli_incorporation_statement"

  - `kyc.submitted.attachments` (array, required)
    Submitted EIRELI incorporation statement file

  - `kyc.requirement_id` (string, required)
    Format: `email_{subject_id}`
    Example: email_003XXXXXXXXXXXXXXX

  - `kyc.submitted` (object)
    Email verification state. No evidence_type or attachments — this is a data-field validation.

  - `kyc.submitted.evidence_type` (string, required)
    Type of submitted evidence
    Enum: "email"

  - `kyc.submitted.attachments` (array, required)
    Email submitted for CCB contract signing

  - `kyc.submitted.attachments.attachment_type` (string, required)
    Type of submitted attachment
    Enum: "email"

  - `created_at` (integer, required)
    When this resource was created (Unix epoch seconds)

  - `updated_at` (integer, required)
    When this resource was last modified (Unix epoch seconds)

## Response 400:

  - `400` (unknown)
    Bad request

## Response 400 fields (application/problem+json):

  - `type` (string, required)
    Enum: "https://docs.dinie.com/errors/invalid-request"

  - `title` (string, required)
    Enum: "Invalid Request"

  - `status` (integer, required)
    Enum: "400"

  - `detail` (string, required)

  - `code` (string, required)
    Enum: "invalid_content_type", "malformed_body", "empty_update"

## Response 401:

  - `401` (unknown)
    Authentication failed

## Response 401 fields (application/problem+json):

  - `type` (string, required)
    Enum: "https://docs.dinie.com/errors/authentication-failed"

  - `title` (string, required)
    Enum: "Authentication Failed"

  - `status` (integer, required)
    Enum: "401"

  - `detail` (string, required)

  - `code` (string, required)
    Enum: "missing_token", "invalid_token", "token_expired"

## Response 404:

  - `404` (unknown)
    Resource not found

## Response 404 fields (application/problem+json):

  - `type` (string, required)
    Enum: "https://docs.dinie.com/errors/not-found"

  - `title` (string, required)
    Enum: "Not Found"

  - `status` (integer, required)
    Enum: "404"

  - `detail` (string, required)

  - `code` (string, required)
    Enum: "customer_not_found"

## Response 422:

  - `422` (unknown)
    Validation failed

## Response 422 fields (application/problem+json):

  - `type` (string, required)
    Enum: "https://docs.dinie.com/errors/validation-failed"

  - `title` (string, required)
    Enum: "Validation Failed"

  - `status` (integer, required)
    Enum: "422"

  - `detail` (string, required)

  - `code` (string, required)
    Enum: "invalid_email", "invalid_phone"

## Response 429:

  - `429` (unknown)
    Rate limit exceeded

## Response 429 fields (application/problem+json):

  - `type` (string, required)
    Enum: "https://docs.dinie.com/errors/rate-limit-exceeded"

  - `title` (string, required)
    Enum: "Rate Limit Exceeded"

  - `status` (integer, required)
    Enum: "429"

  - `detail` (string, required)

## Response 429 headers (application/problem+json):

  - `Retry-After` (integer)
    Seconds until the rate limit resets

## Response 500:

  - `500` (unknown)
    Internal server error

## Response 500 fields (application/problem+json):

  - `type` (string, required)
    Enum: "https://docs.dinie.com/errors/internal"

  - `title` (string, required)
    Enum: "Internal Error"

  - `status` (integer, required)
    Enum: "500"

  - `detail` (string, required)

## Response 400 examples:

  - ``Content-Type` is not `application/json`` (unknown)

  - `Request body is not valid JSON` (unknown)

  - `Request body contains no updatable fields` (unknown)

## Response 401 examples:

  - `Authorization header is missing` (unknown)

  - `Bearer token is invalid or malformed` (unknown)

  - `Bearer token has expired` (unknown)

## Response 404 examples:

  - `Customer ID does not exist or does not belong to this partner` (unknown)

## Response 422 examples:

  - `Email format is invalid` (unknown)

  - `Phone format is invalid (expected E.164 with +55 country code)` (unknown)

