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

# Enrol a customer

> Opens the card program for an individual or a business whose KYC or KYB is complete. Employees aren't enrolled — [add them as cardholders](/api-reference/cards/create-cardholder) instead.

Returns `202` with the enrolment; status changes arrive as `card_enrollment.updated`. Calling it again for a customer who already has an enrolment returns that enrolment (`200`) and starts nothing new.

Customers living in restricted countries, or businesses with owners there, can't be enrolled. Businesses are reviewed by our team first, so they take longer.



## OpenAPI

````yaml api-reference/endl-cards-api.json POST /api/v0/cards/{customerId}/enrollment
openapi: 3.1.0
info:
  title: Endl Cards API
  version: '0'
  description: >-
    Issue virtual cards to your customers: enrol the customer, fund the card
    balance, issue cards, show card details securely, and follow every
    transaction by webhook.


    Paths are under `/api/v0`. The key must carry the **`cards`** permission.
    **This API is not final yet** — see [what may still
    change](/api-reference/cards/introduction#not-final-yet).
servers:
  - url: https://api-sandbox.endl.io
    description: Sandbox
security:
  - apiKey: []
tags:
  - name: Enrolment
  - name: Cardholders
  - name: Cards
  - name: Card details
  - name: Transactions and balance
  - name: Deposits
  - name: Withdrawals
paths:
  /api/v0/cards/{customerId}/enrollment:
    post:
      tags:
        - Enrolment
      summary: Enrol a customer
      description: >-
        Opens the card program for an individual or a business whose KYC or KYB
        is complete. Employees aren't enrolled — [add them as
        cardholders](/api-reference/cards/create-cardholder) instead.


        Returns `202` with the enrolment; status changes arrive as
        `card_enrollment.updated`. Calling it again for a customer who already
        has an enrolment returns that enrolment (`200`) and starts nothing new.


        Customers living in restricted countries, or businesses with owners
        there, can't be enrolled. Businesses are reviewed by our team first, so
        they take longer.
      parameters:
        - $ref: '#/components/parameters/ApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
        - $ref: '#/components/parameters/CustomerId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - termsAcceptance
                - walletId
              properties:
                termsAcceptance:
                  allOf:
                    - $ref: '#/components/schemas/TermsAcceptance'
                  description: The customer's acceptance of the Endl card terms.
                walletId:
                  type: string
                  description: >-
                    The customer's EVM wallet (`wlt_`), used for deposits from
                    and withdrawals to their Endl account.
            example:
              termsAcceptance:
                acceptedAt: '2026-10-16T08:30:00Z'
                ipAddress: 203.0.113.7
                version: 2026-09
              walletId: wlt_3Kd8...
      responses:
        '200':
          description: >-
            The customer already has an enrolment; it is returned and nothing
            new starts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Enrolment'
        '202':
          description: The enrolment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Enrolment'
              example:
                customerId: cus_1Xb7...
                status: pending
                reason: null
                updatedAt: '2026-10-16T08:30:02Z'
        '400':
          description: >-
            A request field is missing or invalid.


            Card terms acceptance is missing.


            The customer lives in a restricted country, or a business owner
            does.


            The wallet isn't the customer's, or its chain isn't supported.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The API key lacks the `cards` permission.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Customer not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: The `Idempotency-Key` was reused with a different body.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Enrolment checks are temporarily unavailable; retry.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  parameters:
    ApiVersion:
      name: Api-Version
      in: header
      required: true
      description: >-
        The API version this request targets. `2026-09.1`. See
        [Versioning](/api-reference/versioning).
      schema:
        type: string
        pattern: ^\d{4}-\d{2}\.\d+$
        default: 2026-09.1
      example: 2026-09.1
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: >-
        1 to 64 characters. Required on every POST that creates something. A
        repeat returns the first result; the same key with a different body
        returns `409`.
      schema:
        type: string
        minLength: 1
        maxLength: 64
    CustomerId:
      name: customerId
      in: path
      required: true
      description: An individual, a business or an employee (`cus_`).
      schema:
        type: string
        example: cus_1Xb7...
  schemas:
    TermsAcceptance:
      type: object
      required:
        - acceptedAt
        - ipAddress
        - version
      properties:
        acceptedAt:
          type: string
          format: date-time
          description: When the customer accepted the Endl card terms.
        ipAddress:
          type: string
          description: The customer's IP address when they accepted.
        version:
          type: string
          description: The version of the terms they accepted.
    Enrolment:
      type: object
      properties:
        customerId:
          type: string
          example: cus_1Xb7...
        status:
          type: string
          enum:
            - pending
            - active
            - rejected
            - locked
            - canceled
          description: >-
            `pending` — under review; businesses are reviewed by our team first,
            so they take longer, and if more information is needed `reason` says
            so. `active` — enrolled; cards can be issued. `rejected` — not
            approved; `reason` says why. `locked` — temporarily blocked; contact
            Endl support. `canceled` — closed.
        reason:
          oneOf:
            - $ref: '#/components/schemas/Reason'
            - type: 'null'
          description: '`{ code, message }` when set, otherwise `null`.'
        updatedAt:
          type: string
          format: date-time
    Error:
      type: object
      description: >-
        The standard Endl error body. `errors[].code` is an `ERRCRD_` code —
        **the code numbers are not final yet** — and `field` names the request
        field when one is at fault.
      properties:
        code:
          type: integer
        message:
          type: string
        status:
          type: string
          enum:
            - ERROR
        data:
          type: 'null'
        errors:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
              message:
                type: string
              field:
                type:
                  - string
                  - 'null'
    Reason:
      type: object
      description: '`{ code, message }`. The enrolment `reason` codes are **not final yet**.'
      properties:
        code:
          type: string
        message:
          type: string
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: Api-Key
      description: Partner API key. Must carry the `cards` permission.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.