Card Onboarding (KYC)
Before a user can hold a card they must complete onboarding: identity verification (KYC), underwriting, and agreement acceptance. Qwik orchestrates this with the card provider and hands you a hosted embed URL to render in a WebView.
Flow:
POST /partner/cards/onboarding → open onboardingEmbedUrl in a WebView → user completes KYC/offer/agreement → POST /partner/cards/onboarding/:id/complete. Use GET /partner/cards/onboarding/latest to resume an in-progress session.POST/partner/cards/onboarding
🔑 Org key + secret👤 User session
| Field | Type | Required | Notes |
|---|---|---|---|
first_name, last_name | string | ✅ | |
email | string | ✅ | Valid email. |
phone_number | string | ✅ | |
country_code | string | ✅ | e.g. US. |
date_of_birth | string | ✅ | YYYY-MM-DD. |
address_line1 | string | ✅ | |
address_line2 | string | — | Omit or "" if none. |
address_city, address_state, address_zip | string | ✅ | |
ssn | string | ✅ | Normalized server-side. |
200 · Response
{
"message": "Complete onboarding in the embedded flow to get your card.",
"onboardingEmbedUrl": "https://component-embedded-sandbox.upwardli.com/...",
"accessToken": "...",
"expiresIn": 3600,
"onboardingId": "uuid",
"consumerId": "...",
"status": "in_progress",
"consumerKycStatus": "pending"
}
GET/partner/cards/onboarding/latest
🔑 Org key + secret👤 User session
Returns the user's most recent onboarding session, enriched with step-progress flags. If none exists, the response is the following with HTTP 200 (note: data is omitted entirely when null):
200 · Response (none found)
{
"success": false,
"error": { "message": "No onboarding found for this user" }
}
POST/partner/cards/onboarding/:onboardingId/complete
🔑 Org key + secret👤 User session
Finalizes onboarding after the embedded flow succeeds. Path: onboardingId — from the start response.
| Field | Type | Required | Notes |
|---|---|---|---|
result | "pass" | "fail" | ✅ | Outcome of the embedded KYC/underwriting flow. |
data | string or object | ✅ | Result payload from the embed (objects are JSON-stringified server-side). |
agreement_accepted | boolean | ✅ | Must reflect the user's acceptance. |
inquiry_id | string | — | Defaults to the server-configured value if omitted. |
product_id | string | — | Defaults to the server-configured value if omitted. |
product_configuration | object | null | — |
If neither
inquiry_id/product_id is supplied and the server has no configured defaults, you get 400 Missing inquiry_id or product_id. Your Qwik client team sets these defaults per environment.Response (200): the completion result (consumer + card details). 404 if the onboarding isn't found or doesn't belong to the user.