Skip to main content

Customers quickstart

Onboard end-customers once into the customer vault. You get a stable customer_id (pcus_*) to reuse on quotes instead of resending full KYC on every order. Inline customer on POST /partner/orders/quote still works. Prefer customer_id once the vault case is approved.

Auth and environments

Same partner X-API-Key as other /partner/* routes. Keys are per environment. Live: after submit, Element Pay reviews and approves customers. Always read status from GET /partner/customers/{customer_id} — do not assume automatic approval on any environment.

Status model

Happy path

1

Requirements

GET /partner/customers/requirements
2

Create

POST /partner/customers with profile
3

Documents

Upload required categories
4

Submit

→ typically pending_review
5

Wait for approved

Prefer webhooks (customer.approved); poll GET /partner/customers/{customer_id} as backup until status=approved
6

Quote (optional)

Pass customer_id on POST /partner/orders/quote instead of a full inline customer

1. Requirements

Collect exactly the returned required_fields and required_documents.

2. Create customer

Idempotent on partner_customer_ref per tenant. Call requirements first for the exact required_fields / required_documents for type=individual or type=business (and country when relevant).

Individual

Business

Illustrative shape — treat requirements as source of truth. US-incorporated businesses also need tax_id (EIN). Officers and KYB documents are required before submit.
Save data.id (pcus_*). While incomplete: PATCH /partner/customers/{customer_id} with {"profile": { … }}. List: GET /partner/customers?status=incomplete&limit=50.

3. Upload documents

JSON + Base64. category must match a requirements document key.

4. Submit

Incomplete package → 422 with missing[].

5. Wait until approved (webhooks + poll)

We send signed partner webhooks for vault lifecycle events (same key webhook_url / webhook_secret as orders). Typical events: Treat webhooks as the primary signal for review outcomes and banking readiness. Poll GET /partner/customers/{customer_id} as a backup if a webhook is delayed or missed. Full payload shapes: Webhooks.
Example:
Use customer_id on quote only when status == "approved".

6. Quote with customer_id (optional)

payment_method and asset remain required. Omit the full inline customer object when using customer_id. Accept is unchanged (POST /partner/orders/{quote_id}/accept with {}). Amounts / networks / network_id are illustrative — discover network_id from payment-methods or catalog for the same country + order_type.
Successful response includes a quote_id like ep_bank_…. Use asset: { token, currency, network } — not a bare top-level "token".

Errors

Next