Integrators · Partner Flow API

Partner Flow OpenAPI contract

Machine-readable specification for browser-redirect Partner Flow — evaluate, Passport handoff, complete, refresh, and public receipt verification.

OpenAPI 3.1 spec: https://abraxasworld.xyz/openapi/partner-flow.openapi.yaml. Compatibility manifest v1.0.0: https://abraxasworld.xyz/api/protocol/compatibility. Narrative guide: Partner Flow integrator kit.

Auth boundaries

  • Browser entry & session — holder on abraxasworld.xyz; `abraxas_browser_session` cookie; no partner API key in client code.
  • Passport handoff — same browser session during first-time ID verification (`next=passport`).
  • Public receipt — partner backend fetches `GET /api/receipts/{receiptId}/public` (no auth, CORS enabled).
  • Server-to-server API-key routes are intentionally excluded from this contract (see below).

Documented operations

Browser entry & session

  • GET /partner/verify — Browser redirect entry — holder starts Partner Flow
  • POST /api/v1/partner-flow/evaluate — Evaluate holder credential against partner policy (browser session)
  • POST /api/v1/partner-flow/complete — Complete flow after manual approval and issue session receipt
  • POST /api/v1/partner-flow/refresh — Re-issue session receipt when prior receipt expired but credential remains valid

Passport & consent handoff

  • GET /passport — Passport UI — ID capture and consent after evaluate returns next=passport
  • GET /api/v1/verification-requests/{verificationRequestId} — Holder preview of verification request before consent
  • POST /api/v1/verification-requests/{verificationRequestId}/consent — Holder consents; policy engine returns decision
  • POST /api/v1/verification-requests/{verificationRequestId}/decline — Holder declines verification request

Public receipt verification

  • GET /api/receipts/{receiptId}/public — Public eligibility decision receipt (no auth, no PII)

Callback parameters (no PII)

Callback query parameters contain no PII — no legal name, DOB, document numbers, images, or wallet address. Verify eligibility via the signed receipt, not the URL alone.

Receipt verification (fail closed)

  • signature_valid: must be true
  • decision_result: must be "approved"
  • status: must be "active" (missing fails)
  • expires_at: required, valid ISO-8601, not expired at verification time
  • production_usable: must be true unless allowSandbox opt-in
  • partner_id: must match expected partner integration id
  • policy_id: must match expected policy gate id

Sandbox policies: set explicit allowSandbox: true only for pilot testing — never in production gates.

Example — fetch public receipt (curl)

curl -sS "https://abraxasworld.xyz/api/receipts/RECEIPT_ID/public" \
  -H "Accept: application/json"

Example — verify receipt (JavaScript, server-side)

// Server-side — verify after holder callback redirect
const receiptId = new URL(request.url).searchParams.get("receipt_id");
const res = await fetch(
  "https://abraxasworld.xyz/api/receipts/" + encodeURIComponent(receiptId) + "/public",
  { headers: { Accept: "application/json" } },
);
if (!res.ok) throw new Error("Receipt fetch failed: " + res.status);
const receipt = await res.json();

// Fail closed — see lib/partner/verifyPartnerFlowReceipt.ts
if (receipt.signature_valid !== true) throw new Error("signature_invalid");
if (receipt.decision_result !== "approved") throw new Error("decision_not_approved");
if (receipt.status !== "active") throw new Error("status_not_active");
if (!receipt.expires_at || new Date(receipt.expires_at) <= new Date()) {
  throw new Error("receipt_expired");
}
if (receipt.production_usable !== true) throw new Error("production_not_usable");
if (receipt.partner_id !== "your-partner-id") throw new Error("partner_mismatch");
if (receipt.policy_id !== "your-policy-v1") throw new Error("policy_mismatch");

Intentionally excluded (private / other integration paths)

  • POST /api/v1/verification-requests — Server-to-server integration — requires partner API key (verify:requests); see /docs/partner-verification-requests
  • GET /api/v1/receipts/{receiptId} — Partner-authenticated receipt view — requires API key; browser Partner Flow uses GET /api/receipts/{receiptId}/public
  • GET /api/v1/decision-receipts/{receiptId}/status — Partner-authenticated receipt status — requires API key
  • POST /api/credentials/verify — Credential/registry verify path — separate integration; see /docs/relying-party-verify
  • POST /api/v1/authorize — Abraxas Connect path — separate integration; see /docs/ail
Download OpenAPI YAMLPartner Flow guideDocs hub