GET /customers/:id
Read a customer. Scoped to the org bound to the credential. Customers owned by a different org return 404. The response is the polymorphic Customer envelope: a type discriminator, the saved profile (a KycProfile for individuals, a KybProfile for businesses), and the inline kyc_link: the hosted-link { token, url } partners share with their end-customer.
The profile body can be partially populated pre-submit. The wizard saves drafts via PUT /customers/:id/kyc/profile, and absent fields are normal at that stage. After POST /customers/:id/kyc/submit succeeds, every required field is present.
Verification status (status, missing fields, hosted verification link if any) lives on GET /customers/:id/kyc/state. This endpoint returns the saved input. That one returns the verification verdict.
Response 200
The Customer envelope. Example: an individual customer post-submit.
{
"type": "individual",
"profile": {
"identity": {
"first_name": "Alice",
"middle_name": "Margaret",
"last_name": "Liddell",
"date_of_birth": "1985-06-15",
"nationality": "US",
"citizenship": "US",
"gender": "female",
"country_of_birth": "US",
"country_of_residence": "US",
"tax_identification_number": "123-45-6789",
"social_profile_url": "https://www.linkedin.com/in/alice-liddell"
},
"addresses": {
"residential": {
"line1": "1 Wall St",
"city": "New York",
"state": "NY",
"postal_code": "10005",
"country": "US"
}
},
"contact": {
"email": "alice@example.com",
"phone": "+12025550100",
"phone_country_code": "US"
},
"employment": {
"employment_status": "employee",
"occupation_soc": "15-1252",
"employer_name": "Acme Inc."
},
"risk": {
"primary_source_of_funds": "salary",
"source_of_wealth": "savings",
"account_purpose": "personal_use",
"acting_as_intermediary": false,
"pep_status": false
},
"volumes": {
"usd_value_of_fiat": 120000,
"usd_value_of_crypto": 25000,
"monthly_deposits": 4,
"monthly_withdrawals": 2,
"monthly_crypto_deposits": 1,
"monthly_crypto_withdrawals": 0,
"monthly_investment_deposit_usd": 500,
"monthly_investment_withdrawal_usd": 0,
"monthly_crypto_investment_deposit_usd": 0,
"monthly_crypto_investment_withdrawal_usd": 0
},
"jurisdictions": {
"funds_send_receive_jurisdictions": [
"US",
"GB"
],
"high_risk_activities": [
"none_of_the_above"
],
"vendors_and_counterparties": [
"self_transactions",
"merchants_suppliers"
]
},
"attestations": {
"terms_and_conditions_accepted": true,
"information_attested": true
},
"documents": {
"government_issued_identification": {
"kind": "passport",
"number": "X12345678",
"country": "US",
"front_image_document_id": "8e3b…"
},
"supporting_documents": []
},
"supplemental": [
{
"id": "0e8b…",
"kind": "text",
"title": "Clarification on settlement volumes",
"description": "Q3 volume increase reflects two new enterprise clients onboarded in July."
}
]
},
"kyc_link": {
"token": "klink_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w",
"url": "https://orchestration.seismic.systems/kyc-link/ind/klink_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w"
}
}A business customer carries the same envelope with type: "business", profile follows the KybProfile shape, and kyc_link.url uses the /kyc-link/biz/... path segment:
{
"type": "business",
"profile": {
"business": {
"legal_name": "Acme Inc.",
"entity_type": "c_corporation",
"country_of_registration": "US"
}
},
"kyc_link": {
"token": "klink_b9c8d7e6f5g4h3i2j1k0l9m8n7o6p5q4r3s2t1u0v9w8x",
"url": "https://orchestration.seismic.systems/kyc-link/biz/klink_b9c8d7e6f5g4h3i2j1k0l9m8n7o6p5q4r3s2t1u0v9w8x"
}
}The field is named kyc_link for both kinds. There is no separate kyb_link here. See HostedKycLink for the link shape and how partners use it.
Errors
404, unknown id, or the customer belongs to an org you're not a member of (the two cases collapse so existence doesn't leak across tenants).
Example
curl "$SEISMIC_ORCHESTRATION_URL/v0/customers/2f10…" \
-H "Api-Key: $SEISMIC_ORCHESTRATION_API_KEY"