The API call you make. The wire your bank moves. The receipt we keep.
This is the actual sequence a grantor walks through. Six steps, one API integration, no custody change. You keep your bank, you keep your authority, you keep your fiduciary status. We just sit between the decision and the wire and document everything.
Six steps end-to-end.
Each step shows the actor, the API endpoint, and a status badge:livemeans the endpoint is wired and tested in production,partialmeans the path works but some sub-features ship in a follow-up milestone.
Grantor onboards
You sign in to the grantor portal, capture your charter and signers, register a webhook endpoint, and request API credentials. Sandbox keys are issued same-day; production keys after the MSA + DPA are signed.
Onboarding wizard at /portal/auth/signup?type=foundationWebhook URL captured in foundation profileRequest payment attestation
Before each disbursement you POST recipient + payment context. We run five check streams in parallel: entity categorization (IRS classification for US, OpenCorporates/GLEIF for foreign), BEC (domain age, MX/SPF/DMARC, lookalike), BID (document + registry verification), bank-account structural validation, and the full 148-check Verdict Engine. Returns YES, NO, or REVIEW with evidence.
POST /v1/attestationsOn YES, you pay the recipient
Your bank, your wire, your authority. We never touch the money. The attestation we issued is hashed and queued for CourtChain anchoring at issue time - that anchor is what makes the YES defensible later, not whether we held the funds.
(out of band - your bank or custodian moves the money)Report payment back
Within 24 hours of settlement, you POST the disbursement details: settled amount, settlement date, bank reference, attestation_id you authorized against. We record it linked to the original attestation, refuse the report if the attestation was NO, and require attestation foundation_id match the caller.
POST /v1/disbursementsLifecycle monitoring
Every recipient you have paid is screened continuously - sanctions re-checks, registry-match monitor, behavioral anomaly detection. If a previously-paid recipient lands on a sanctions list six months later, your registered webhook gets a notification. (Sanctions and registry monitors live; lifecycle webhook events are partial - more event types ship in the next milestone.)
Webhook delivery worker (existing)Lifecycle event types - partialQuarterly review report
Pull a categorized aggregate at any time: attestations issued (YES/NO/REVIEW), disbursements settled, by-program totals, by-jurisdiction totals, by-amount-tier breakdown, registry hits during the period. Defaults to the previous full quarter; pass ?from=&to= for any range.
GET /v1/reports/quarterlyFive parallel verification streams.
Every attestation runs these in parallel. The aggregate decision combines the verdict-engine score with per-stream penalties; any stream returning a hard block forces NO regardless of overall score.
What kind of entity is this?
For US recipients: IRS Tax-Exempt Organization Search lookup against EIN. For foreign: OpenCorporates + GLEIF LEI registry. Output: 501(c)(3) public charity / private foundation / fiscal sponsor / foreign equivalent / individual / unverified.
kyc-service /v1/kyb/verifyIs the recipient email/domain legit?
Domain age (RDAP), MX/SPF/DMARC posture, lookalike detection against known charity domains, disposable-email blocklist match. Catches impersonation and grant-solicitation fraud at the email layer.
kyc-service /v1/kyc/becAre the documents real?
Document field parsing, PDF metadata anomaly detection, OpenCorporates registry match, GLEIF LEI, name fuzzy match across registries. Catches forged or fabricated organizational documents.
kyc-service /v1/kyc/bidIs the receiving account real?
IBAN MOD-97 + format, BIC ISO 9362 format, US routing-number validation. Live bank-of-record verification (GIACT/Plaid) is a planned integration; today this is structural validation only.
internal (structural validation)Is tax-exempt status current?
IRS TEOS API check against EIN. Confirms current 501(c)(3) status, public-support test if applicable, and any recent revocations. Surfaces the same data your equivalency-determination counsel would pull.
verdict-engine JUR-002Everything else.
The full 148 checks across 15 categories runs alongside the four streams above: governance, programmatic coherence, network effects (cross-foundation registry hits), behavioral anomaly, personnel screening, and so on. See coverage map →
Three calls. Real schema.
Field names match the live API exactly. Authentication is via session cookie or API key in the X-API-Key header.
{
"recipient": {
"legal_name": "Acme Charitable Trust",
"ein": "12-3456789",
"jurisdiction": "us",
"contact_email": "[email protected]",
"domain": "acme-charity.org",
"bank_account": {
"iban": "GB29 NWBK 6016 1331 9268 19",
"institution_name": "NatWest"
}
},
"payment": {
"amount_cents": 50000000,
"currency": "USD",
"program_code": "education-rural-2026",
"purpose": "Q2 milestone disbursement"
},
"context": {
"external_ref": "GRANT-2026-0042"
}
}{
"attestation_id": "att_a3e9f1c0...",
"decision": "YES",
"aggregate_score": 12,
"hard_blocks": [],
"categorization": { "entity_type": "501(c)(3) public charity", ... },
"bec": { "domain_age_days": 4214, "dmarc": "p=reject", ... },
"bid": { "matches_found": 2, "confidence": "high", ... },
"bank_account": { "iban_format": true, "iban_mod97": true, ... },
"verdict_summary": {
"aggregate_score": 8,
"category_scores": { "SAN": 0, "BEN": 5, "FIN": 8, ... },
"checks_run": 120,
"skipped": 28
},
"evidence_url": "/v1/creb/att_a3e9f1c0.../receipt",
"courtchain_anchor": "pending_anchor_worker",
"issued_at": "2026-05-04T19:42:11.318Z",
"valid_until": "2026-05-11T19:42:11.318Z",
"payload_hash": "sha256:..."
}{
"attestation_id": "att_a3e9f1c0...",
"settled_at": "2026-05-04T22:18:09Z",
"settled_amount_cents": 50000000,
"settled_currency": "USD",
"bank_reference": "WIRE-2026-05-04-99821",
"settlement_method": "wire_ach"
}What the quarterly report contains
PullGET /v1/reports/quarterly at any time. Defaults to the previous full quarter; pass ?from= + ?to=for any range. Same data your CFO and external auditor see.
Summary
Attestations issued (YES / NO / REVIEW counts), disbursements settled (count + total), total disbursed in cents.
By program
Disbursement counts and totals grouped by yourprogram_code. Trend versus prior quarter on
request.
By jurisdiction
Country-level breakdown of recipients. Cross-border share. Per-corridor sanctions exposure summary.
By amount tier
Sub-$10K / $10-100K / $100K-1M / $1M+ tiers with count and total. Concentration analysis on the top decile.
Registry hits
Any prior recipient newly added to the bad-actor registry during the period. Count + linked inclusion records.
Format
JSON by default. PDF and CSV exports available; query with ?format=pdf or ?format=csvin the next milestone.
Ready to wire it in?
Sandbox keys issued same-day. Integration runs 1-2 days of engineering time end-to-end. We sit on the call with your engineers if useful.
Start integration →