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

# Update customer

> Update the authenticated customer's profile, consent preferences, or push devices.

Updates the customer record for the given external `id`. Send only the fields you want to change. Omitted top-level fields keep their current values.

Use this endpoint to update profile fields, channel consent, and the push device list. To read the full customer object, use [get customer](/docs/storefront-api/customers/\[id]/get).

<Note>
  Requires a Fire spark access token obtained through [token
  exchange](/docs/storefront-api/oauth/exchange/post).
</Note>

## Path parameters

| Parameter | Required | Description                                                       |
| --------- | -------- | ----------------------------------------------------------------- |
| `id`      | Yes      | External customer identifier. Must match the token's customer id. |

## Request body

| Field                | Required | Description                                                                                                                                                             |
| -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `name`               | No       | Full name.                                                                                                                                                              |
| `gender`             | No       | `MALE`, `FEMALE`, or `OTHER`.                                                                                                                                           |
| `dob`                | No       | Date of birth (ISO 8601 with offset). Cannot be changed after it is set.                                                                                                |
| `document_type`      | No       | Government ID type.                                                                                                                                                     |
| `document_number`    | No       | Government ID number.                                                                                                                                                   |
| `country`            | No       | Customer country.                                                                                                                                                       |
| `phone`              | No       | Phone number in international format.                                                                                                                                   |
| `delivery_addresses` | No       | Up to 10 saved delivery addresses. Replaces the existing list when provided. At most one may have `preferred: true`.                                                    |
| `billing_profiles`   | No       | Up to 10 billing profiles. Replaces the existing list when provided. Each profile requires `type` (`INDIVIDUAL` or `BUSINESS`). At most one may have `preferred: true`. |
| `consent`            | No       | Channel consent preferences. Send only the flags you want to change; omitted flags keep their current values.                                                           |
| `devices`            | No       | Full list of push devices (max 10). Replaces the existing list when provided. To unregister a device, omit it from the array.                                           |
| `metadata`           | No       | Custom key-value metadata. Must serialize to 1MB or less.                                                                                                               |

Nested `delivery_addresses`, `billing_profiles`, `devices`, and `consent` objects use the same shapes as [get customer](/docs/storefront-api/customers/\[id]/get).

### Consent

| Field                | Type    | Description        |
| -------------------- | ------- | ------------------ |
| `email`              | boolean | Email marketing    |
| `push_notifications` | boolean | Push notifications |
| `in_app_messages`    | boolean | In-app messages    |
| `phone_calls`        | boolean | Phone calls        |
| `sms`                | boolean | SMS messages       |
| `whatsapp`           | boolean | WhatsApp messages  |

### Device

| Field        | Required | Type     | Description                       |
| ------------ | -------- | -------- | --------------------------------- |
| `id`         | Yes      | string   | External device identifier.       |
| `os`         | Yes      | string   | `IOS`, `ANDROID`, or `WEB`.       |
| `fcm_token`  | Yes      | string   | Firebase Cloud Messaging token.   |
| `created_at` | Yes      | datetime | When the device was registered.   |
| `updated_at` | Yes      | datetime | When the device was last updated. |

## Request

```bash theme={null}
curl -X PATCH "https://firespark.cloud/api/storefront/v1/customers/auth0|abc123" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+593991234567",
    "consent": {
      "email": true,
      "push_notifications": true,
      "sms": true
    },
    "devices": [
      {
        "id": "iphone-15-pro",
        "os": "IOS",
        "fcm_token": "fcm-token-abc123",
        "created_at": "2026-01-10T08:00:00Z",
        "updated_at": "2026-03-01T12:00:00Z"
      }
    ]
  }'
```

## Response

Returns the updated customer object in `data`, using the same shape as [get customer](/docs/storefront-api/customers/\[id]/get).

## Error responses

| Status | Description                                                                       |
| ------ | --------------------------------------------------------------------------------- |
| `400`  | Invalid request body.                                                             |
| `401`  | Missing or invalid access token.                                                  |
| `403`  | The `id` does not match the token's customer id.                                  |
| `404`  | No customer found with the given `id`.                                            |
| `422`  | Cannot update date of birth or gender if already set, or invalid devices payload. |


## OpenAPI

````yaml PATCH /customers/{id}
openapi: 3.0.1
info:
  title: Fire spark Storefront API
  description: Customer-facing channel endpoints for Fire spark.
  version: 1.0.0
servers:
  - url: https://firespark.cloud/api/storefront/v1
security:
  - bearerAuth: []
paths:
  /customers/{id}:
    patch:
      summary: Update customer
      description: >-
        Update a customer by id. Send only the fields you want to change. Use
        `consent` to update channel preferences and `devices` to replace the
        push device list.
      parameters:
        - in: path
          name: id
          description: The customer unique identifier in your system
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomerUpdate'
      responses:
        '200':
          description: Customer updated
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/StoreFrontCustomer'
        '404':
          description: Customer not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Cannot update date of birth or gender if already set
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    CustomerUpdate:
      type: object
      properties:
        name:
          description: The full name of the customer
          type: string
          example: John Smith
        gender:
          description: The gender of the customer
          type: string
          nullable: true
          enum:
            - MALE
            - FEMALE
            - OTHER
        dob:
          description: The date of birth of the customer
          type: string
          nullable: true
          format: date-time
        document_type:
          description: The document type of the customer
          type: string
          nullable: true
        document_number:
          description: The document number of the customer
          type: string
          nullable: true
          maxLength: 50
        country:
          description: The country of the customer
          type: string
          nullable: true
          maxLength: 100
        phone:
          description: The customer's phone number in international format
          type: string
          nullable: true
          example: +593 99 123 4567
        delivery_addresses:
          type: array
          maxItems: 10
          items:
            $ref: '#/components/schemas/DeliveryAddress'
        billing_profiles:
          type: array
          maxItems: 10
          items:
            $ref: '#/components/schemas/BillingProfile'
        metadata:
          description: Custom metadata for the customer
          type: object
          additionalProperties: true
        consent:
          $ref: '#/components/schemas/Consent'
          description: Channel consent preferences. Send only the flags you want to change.
          nullable: true
        devices:
          type: array
          maxItems: 10
          description: >-
            Full list of push devices for the customer. Replaces the existing
            list when provided. To unregister a device, omit it from this array.
            Maximum 10 devices.
          items:
            $ref: '#/components/schemas/CustomerDevice'
      description: >-
        Partial customer update. Omit fields you do not want to change. When
        `devices` is provided, it replaces the full device list. When `consent`
        is provided, omitted consent flags keep their current values.
    StoreFrontCustomer:
      type: object
      description: >-
        Customer profile returned by Storefront API endpoints. Omits internal
        fields such as `birthday`.
      required:
        - uid
        - id
        - name
        - status
        - registration_date
        - organization_id
        - merchant_id
      properties:
        uid:
          type: string
          format: uuid
          description: Fire spark internal customer identifier
        organization_id:
          type: string
          format: uuid
          description: Fire spark organization identifier
        merchant_id:
          type: string
          format: uuid
          description: Fire spark merchant identifier
        id:
          type: string
          description: Your customer unique identifier
        status:
          description: The status of the customer
          type: string
          enum:
            - ACTIVE
            - INACTIVE
        is_anonymous:
          description: Whether the customer is anonymous
          type: boolean
          default: false
        name:
          description: The full name of the customer
          type: string
          example: John Smith
        email:
          description: The email of the customer
          type: string
          format: email
          nullable: true
        email_verified:
          description: Whether the customer's email is verified
          type: boolean
          default: false
        gender:
          description: The gender of the customer
          type: string
          nullable: true
          enum:
            - MALE
            - FEMALE
            - OTHER
        dob:
          description: The date of birth of the customer
          type: string
          nullable: true
          format: date-time
        document_type:
          description: The document type of the customer
          type: string
          nullable: true
        document_number:
          description: The document number of the customer
          type: string
          nullable: true
          maxLength: 50
        country:
          description: The country of the customer
          type: string
          nullable: true
          maxLength: 100
        phone:
          description: The customer's phone number in international format
          type: string
          nullable: true
          example: +593 99 123 4567
        phone_verified:
          description: Whether the customer's phone number is verified
          type: boolean
          default: false
        registration_date:
          description: The date when the customer was registered
          type: string
          format: date-time
        devices:
          type: array
          maxItems: 10
          description: Customer devices for push notifications
          items:
            $ref: '#/components/schemas/CustomerDevice'
        delivery_addresses:
          type: array
          maxItems: 10
          items:
            $ref: '#/components/schemas/DeliveryAddress'
        billing_profiles:
          type: array
          maxItems: 10
          items:
            $ref: '#/components/schemas/BillingProfile'
        consent:
          $ref: '#/components/schemas/Consent'
          description: The customer's consent preferences
          nullable: true
        metadata:
          description: Custom metadata for the customer. Must serialize to 1MB or less.
          type: object
          nullable: true
          additionalProperties: true
    Error:
      required:
        - error
        - details
      type: object
      properties:
        error:
          type: string
        details:
          type: string
    DeliveryAddress:
      type: object
      required:
        - alias
        - address_line1
      properties:
        alias:
          type: string
          maxLength: 100
        address_line1:
          type: string
          maxLength: 100
        address_line2:
          type: string
          maxLength: 100
        city:
          type: string
          maxLength: 100
        state:
          type: string
          maxLength: 100
        zip:
          type: string
          maxLength: 100
        country:
          type: string
          maxLength: 100
        reference:
          type: string
          maxLength: 100
        latitude:
          type: number
          minimum: -90
          maximum: 90
        longitude:
          type: number
          minimum: -180
          maximum: 180
        instructions:
          type: string
          maxLength: 100
        preferred:
          type: boolean
          default: false
        metadata:
          description: Custom metadata. Must serialize to 1MB or less.
          type: object
          nullable: true
          additionalProperties: true
    BillingProfile:
      type: object
      required:
        - alias
        - type
        - legal_name
        - address_line1
        - tax_id
        - tax_id_type
      properties:
        alias:
          type: string
          maxLength: 100
        type:
          type: string
          enum:
            - INDIVIDUAL
            - BUSINESS
          description: Whether this profile is for an individual or a business
        legal_name:
          type: string
          maxLength: 100
        address_line1:
          type: string
          maxLength: 100
        address_line2:
          type: string
          maxLength: 100
        city:
          type: string
          maxLength: 100
        state:
          type: string
          maxLength: 100
        zip:
          type: string
          maxLength: 100
        country:
          type: string
          maxLength: 100
        tax_id:
          type: string
          minLength: 1
          maxLength: 64
          pattern: ^[a-zA-Z0-9_-]+$
        tax_id_type:
          type: string
          enum:
            - VAT
            - EIN
            - SSN
            - TIN
            - NIF
            - CUIT
            - RUT
            - NIT
            - RCN
            - RUC
            - CI
            - DNI
            - PASSPORT
            - OTHER
        preferred:
          type: boolean
          default: false
        metadata:
          description: Custom metadata. Must serialize to 1MB or less.
          type: object
          nullable: true
          additionalProperties: true
    Consent:
      type: object
      description: >-
        Channel-level marketing and messaging consent preferences. Omitted flags
        default to false.
      properties:
        email:
          type: boolean
          description: Consent for email marketing
          default: false
        push_notifications:
          type: boolean
          description: Consent for push notifications
          default: false
        in_app_messages:
          type: boolean
          description: Consent for in-app messages
          default: false
        phone_calls:
          type: boolean
          description: Consent for phone calls
          default: false
        sms:
          type: boolean
          description: Consent for SMS messages
          default: false
        whatsapp:
          type: boolean
          description: Consent for WhatsApp messages
          default: false
    CustomerDevice:
      type: object
      required:
        - id
        - os
        - fcm_token
        - created_at
        - updated_at
      properties:
        id:
          type: string
          minLength: 1
          maxLength: 64
          pattern: ^[a-zA-Z0-9_-]+$
          description: External device identifier
        os:
          type: string
          enum:
            - IOS
            - ANDROID
            - WEB
          description: Device operating system
        fcm_token:
          type: string
          minLength: 1
          maxLength: 64
          pattern: ^[a-zA-Z0-9_-]+$
          description: Firebase Cloud Messaging token
        created_at:
          type: string
          format: date-time
          description: When the device was registered
        updated_at:
          type: string
          format: date-time
          description: When the device was last updated
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````