Customers quickstart
Onboard end-customers once into the customer vault. You get a stablecustomer_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
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/requirements2
Create
POST /partner/customers with profile3
Documents
Upload required categories
4
Submit
→ typically
pending_review5
Wait for approved
Prefer webhooks (
customer.approved); poll GET /partner/customers/{customer_id} as backup until status=approved6
Quote (optional)
Pass
customer_id on POST /partner/orders/quote instead of a full inline customer1. Requirements
required_fields and required_documents.
2. Create customer
Idempotent onpartner_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 needtax_id (EIN). Officers and KYB documents are required before submit.
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
missing[].
5. Wait until approved (webhooks + poll)
We send signed partner webhooks for vault lifecycle events (same keywebhook_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.
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.
quote_id like ep_bank_…. Use asset: { token, currency, network } — not a bare top-level "token".