Credit & Passport
Financial Passport
Create holder-consent verification requests and verify signed threshold-based Financial Passport presentations.
/api/credit-api/v1/passport/requestCreate a verifier request and receive token, holder share URL, status URL and expiry.
/api/credit-api/v1/passport/requests/{token}/statusPoll pending, consented, fulfilled, rejected, expired or revoked state.
/api/credit-api/v1/passport/verifyVerify a VP JWT directly or resolve a fulfilled request token.
/api/credit-api/v1/passport/batchVerify up to 50 VP JWTs or request tokens with per-item results.
Request criteria
A request must contain at least one supported criterion. The holder sees the verifier name, human-readable purpose and requested thresholds before deciding whether to fulfil it.
{
"purpose": "affordability_assessment",
"purpose_description": "Confirm rental affordability",
"verifier_name": "Example Property",
"criteria": {
"income": {
"currency_code": "KES",
"monthly_amount": 50000,
"months_required": 12,
"source_rail": "mpesa",
"source_country": "KE"
},
"score": { "min": 65 },
"dti": { "max": 0.4 },
"savings_rate": { "min": 0.1 }
},
"ttl_seconds": 86400
}End-to-end flow
- Create the request.
- Send
share_urlto the holder; do not imitate the consent screen. - Poll
status_urlwith bounded backoff. - When
presentation_availableis true, call verify withrequest_token. - Require
valid === truebefore trusting any returned claim. - Evaluate
overall_holdsseparately as the business outcome.
Current SDK path
Version 0.1.0 of @fullness/credit-api-sdk does not yet expose Passport-specific convenience methods. Its public low-level request method still applies the API key, exact-body HMAC and purpose header, so approved integrators can call the implemented routes now.
const request = await credit.request<{
token: string;
share_url: string | null;
}>(
'POST',
'/api/credit-api/v1/passport/request',
{
purpose: 'affordability_assessment',
purpose_description: 'Confirm rental affordability',
criteria: {
income: { currency_code: 'KES', monthly_amount: 50000, months_required: 12 },
},
},
{ purpose: 'affordability_assessment' },
);
// Give request.share_url to the holder, then poll request.status_url.
const verified = await credit.request<{
valid: boolean;
overall_holds: boolean;
}>(
'POST',
'/api/credit-api/v1/passport/verify',
{ purpose: 'affordability_assessment', request_token: request.token },
{ purpose: 'affordability_assessment' },
);