GSB e-Services federation API
Version 1.1.0 30 operations Download the OpenAPI file
Contract v1 between the national hub and the MDA nodes (backlog FED-02). Every request and answer is signed (detached JWS, ES256 - docs/federation/README.md "Message signing"); transport is mTLS. Bodies are canonical JSON validated against the JSON Schemas in schemas/ (unknown fields are refused). Writes need an Idempotency-Key; a repeat with the same key returns the first answer. Versioned under /fed/v1; a sunset is announced with the Deprecation and Sunset headers. Revision 2 (1.1.0, FED-03): catalogue.put answers catalogue-ack.json; catalogue.list takes full, ids and limit; the service manifest gains its signature, the passport detail and tombstones (schemas/service-manifest.json $comment) - additive, hubs first.
Base address: https://fed.{instance}.gsb.gov.zm
Other
POST /fed/v1/ping
Signed liveness and trust check between two instances
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Idempotency-Key required | header | string | Required on writes, and inside the signature ( |
Request body (required)
application/json:ping-request.json
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json ping-response.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
409 | IDEMPOTENCY_IN_PROGRESS: the first request with this key is still running (Retry-After) | application/json error.json |
422 | IDEMPOTENCY_KEY_REUSED: the key was used with another body | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
PUT /fed/v1/catalogue/services/{serviceId}
A node pushes a signed service manifest (publish, unpublish, withdraw)
The node pushes the manifest of a service it owns whenever its catalogue entry changes (publish, edit, unpublish, withdraw). The hub checks the request signature, then the manifest: its owner is the calling node (and, when the registry lists the node's ministries, the manifest's ministry is one of them), its contentHash matches, its own signature (signature, typ gsb-manifest+jws) verifies against the node's keys, and its version is not older than the mirrored one. The apply is idempotent on (serviceId, version, contentHash).
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Idempotency-Key required | header | string | Required on writes, and inside the signature ( |
serviceId required | path | string |
Request body (required)
application/json:service-manifest.json
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature): applied, or unchanged when the hub already mirrors exactly this version. | application/json catalogue-ack.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH, FED_MANIFEST_UNSIGNED / FED_MANIFEST_SIGNATURE (the manifest's own signature is missing, not the sender's or does not verify) | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope; FED_NOT_OWNER: the manifest names another owner node, or a ministry the node does not serve, or a service another node owns | application/json error.json |
409 | IDEMPOTENCY_IN_PROGRESS: the first request with this key is still running (Retry-After); FED_STALE_VERSION: the hub mirrors a newer version; FED_VERSION_CONFLICT: the hub mirrors this version with other content; FED_SERVICE_ID_LOCAL: the hub hosts a service with this id itself | application/json error.json |
422 | IDEMPOTENCY_KEY_REUSED: the key was used with another body | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/catalogue
The hub pulls catalogue changes since a cursor (heals missed pushes)
Pull reconciliation (FED-03): the hub reads the node's catalogue ledger - every service the node has offered nationally, with its catalogue version, content hash and state - ordered by change time. With since only entries changed after that cursor; with full=1 each item carries its signed manifest (manifestJws, attached compact JWS); with ids just those services. The node refreshes its ledger from its live services first, so drift made outside the publishing flow is found too. Answers are signed.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
since | query | string | The cursor of the previous page (pull reconciliation). |
full | query | string: 0, 1 | 1: include each item's signed manifest (manifestJws). |
ids | query | string | Comma-separated service ids (at most 100): just these entries, whatever their change time. |
limit | query | string | Items per page (1-500, default 100; 25 with full=1). |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json catalogue-page.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
POST /fed/v1/submissions
The hub relays a citizen application to the owner node
FED-05 (docs/federation/README.md section 11). The hub relays a citizen's application made on the national portal. Idempotency-Key = the hub submission id; the citizen is the X-GSB-Citizen-Assertion (FED-04, single use). The node re-validates against its live form, pulls the files from the presigned URLs on its own HUB_URL and checks their SHA-256, makes the case for the shadow applicant and answers with its case number. A node never queues.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Idempotency-Key required | header | string | Required on writes, and inside the signature ( |
X-GSB-Citizen-Assertion | header | string | FED-04: the hub's short-lived (120 s) ES256 citizen assertion (token-exchange profile, pairwise subject, aud = the node). The node decides with its own PDP. |
Request body (required)
application/json:submission-request.json
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature): the node made the case - 201 when made now, 200 with | application/json submission-ack.json |
201 | Signed answer: the node made the case (FED-05). | application/json submission-ack.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope; the citizen assertion refused: FED_ASSURANCE_TOO_LOW, FED_PRINCIPAL_NOT_APPLICANT, FED_PRINCIPAL_INACTIVE | application/json error.json |
404 | FED_SERVICE_UNKNOWN: not an active service of this node | application/json error.json |
409 | IDEMPOTENCY_IN_PROGRESS: the first request with this key is still running (Retry-After); DUPLICATE_APPLICATION (EF-49), FED_SERVICE_CLOSED (intake window): the citizen must act | application/json error.json |
422 | IDEMPOTENCY_KEY_REUSED: the key was used with another body; FED_VALIDATION / FED_FORM_CHANGED (the node's live form - | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
503 | FED_FILE_UNAVAILABLE: the files could not be fetched from the hub's presigned URLs (the hub tries again) | application/json error.json |
GET /fed/v1/cases/{caseNumber}/status
Case status only, for the hub helpdesk
FED-04 (built): the hub helpdesk's scoped lookup. The node answers the status only - no form answers, documents or personal data - and requires the helpdesk operator's reason and pseudonymous id (both inside the signed path, htu), which it writes to its own audit (federation.helpdesk.caseStatus) under the same X-GSB-Federation-Id the hub audits (federation.helpdesk.lookup).
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
caseNumber required | path | string | |
reason required | query | string | Why the helpdesk looks this case up (10-300 characters, e.g. the call reference). Audited on both sides. |
operator required | query | string | The hub helpdesk user's id (pseudonymous to the node). |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json case-status.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | FED_NOT_FOUND: no case with that number on this node | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/cases/{caseId}/applicant-view
The citizen's live case detail (with a citizen assertion)
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
X-GSB-Citizen-Assertion | header | string | FED-04: the hub's short-lived (120 s) ES256 citizen assertion (token-exchange profile, pairwise subject, aud = the node). The node decides with its own PDP. |
caseId required | path | string |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json applicant-view.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
POST /fed/v1/cases/{caseId}/actions/{action}
A citizen action proxied to the node (with a citizen assertion)
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Idempotency-Key required | header | string | Required on writes, and inside the signature ( |
X-GSB-Citizen-Assertion | header | string | FED-04: the hub's short-lived (120 s) ES256 citizen assertion (token-exchange profile, pairwise subject, aud = the node). The node decides with its own PDP. |
caseId required | path | string | |
action required | path | string |
Request body (required)
application/json:applicant-action.json
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature); the body is defined by the lane that builds the operation. | |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
409 | IDEMPOTENCY_IN_PROGRESS: the first request with this key is still running (Retry-After) | application/json error.json |
422 | IDEMPOTENCY_KEY_REUSED: the key was used with another body | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/documents/{documentId}/link
A node-signed short-lived download URL for an issued document
FED-08. Needs X-GSB-Citizen-Assertion; documentId is a case document id or an issued permit id. The url is node-signed and short-lived (FED_DOCUMENT_LINK_TTL_S, 120 s); the hub streams it to the citizen (or redirects) and keeps no copy.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
X-GSB-Citizen-Assertion | header | string | FED-04: the hub's short-lived (120 s) ES256 citizen assertion (token-exchange profile, pairwise subject, aud = the node). The node decides with its own PDP. |
documentId required | path | string |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json document-link.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | DOCUMENT_NOT_FOUND: no such document, not released to the applicant, or not the asserted citizen's (one answer for all). 401 FED_ASSERTION_* when the citizen assertion is missing or refused. | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/payments/{invoiceNumber}
An invoice as the owner node holds it (read only)
FED-07. Needs X-GSB-Citizen-Assertion: the node answers only for an invoice on a case of the asserted citizen (its own PDP). Read only - no hub component can mark a node invoice paid. checkoutUrl (unpaid, not expired) is a node-signed, short-lived pay link bound to the pairwise subject: opened on the node it redirects to the ZamPay checkout of this node's own merchant.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
X-GSB-Citizen-Assertion | header | string | FED-04: the hub's short-lived (120 s) ES256 citizen assertion (token-exchange profile, pairwise subject, aud = the node). The node decides with its own PDP. |
invoiceNumber required | path | string |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json payment-status.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | PAYMENT_NOT_FOUND: no such invoice, or not the asserted citizen's (one answer for both). 401 FED_ASSERTION_* when the citizen assertion is missing or refused. | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/verify/receipts/{ref}
Public receipt verification, routed by the node key in the receipt reference
FED-07. No citizen assertion: the hub relays a public check of a receipt reference that carries this node's key. The hub applies its per-address limit (RATE_LIMIT_RECEIPT_VERIFY_MAX) before relaying.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
ref required | path | string | |
sig required | query | string |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json receipt-verification.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | RECEIPT_NOT_FOUND: unknown reference, wrong signature, not paid - one answer for all (no oracle) | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/verify/documents/{code}
Public permit / licence verification by the verification code, routed by the node key in the code
FED-08. No citizen assertion. Only the verification code (the QR) opens the record (PP-32); the hub applies its per-address limit (VERIFY_CODE_MAX) before relaying.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
code required | path | string |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json document-verification.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | NO_MATCH: unknown or malformed code - one answer (PP-32) | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/verify/document-hashes
Is a file sealed on this node one it issued? By its SHA-256 values only (the hub validated the file)
SIGN-22 (lane S4 sigverify). The hub validated an uploaded PDF sealed with this node's key against the national trust list and asks, by hashes only, for the issued record: the file never leaves the hub. Unknown hashes: 404 NO_MATCH. The answer never carries holder data.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
hashes required | query | string | SHA-256 values in hex, comma-separated, at most 12: the whole file and each signed revision. |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json document-hash-match.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | NO_MATCH: unknown or malformed code - one answer (PP-32) | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/verify/trust-list
The instance's trust list: a node's own seal / TSA / OCSP / CA certificates; the hub's national list
SIGN-19 / SIGN-22 (lane S4 sigverify). Pulled hourly (job verification-maintenance): the hub from every active node, a node from the hub. The receiver keeps only entries that chain to its own configured roots; a root is never taken from a peer.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json trust-list.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | NO_MATCH: unknown or malformed code - one answer (PP-32) | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/pay-points/{token}
What a pay-at-point code this node printed sells: label, place, service, charge, amount (ngwee), who is paid - no ids, no personal data (lane paypoint)
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
token required | path | string | The code's token, without the node key (22 characters of base64url for the facilities module). |
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json pay-point.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold payments:point (only the hub does, HUB_SCOPES). | application/json error.json |
404 | POINT_UNAVAILABLE: unknown, switched off or renewed code, a module that is off, a service the council does not offer - one answer for all. | application/json error.json |
POST /fed/v1/pay-points/{token}/orders
The ticket invoice for one payer session (the hub's keyed hash of the browser session), priced from the node's approved tariff and raised on the node's merchant; the same invoice again while it is open (lane paypoint)
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
token required | path | string | The code's token, without the node key (22 characters of base64url for the facilities module). |
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Idempotency-Key required | header | string | Required on writes, and inside the signature ( |
Request body (required)
application/json:pay-point-session.json
Responses
| Status | Description | Body |
|---|---|---|
200 | The session's open ticket invoice, handed out again (reused: true). | application/json pay-point-order.json |
201 | A new ticket invoice. | application/json pay-point-order.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold payments:point (only the hub does, HUB_SCOPES). | application/json error.json |
404 | POINT_UNAVAILABLE | application/json error.json |
503 | INVOICE_FAILED: the node's gateway could not raise the invoice. | application/json error.json |
POST /fed/v1/pay-points/{token}/ticket
One payer session's latest ticket at the code: open / paid / expired (the node asks its own gateway through its finaliser first) and, once paid, the receipt number and the receipt check (ref carries the node key) (lane paypoint)
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
token required | path | string | The code's token, without the node key (22 characters of base64url for the facilities module). |
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Request body (required)
application/json:pay-point-session.json
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json pay-point-ticket.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold payments:point (only the hub does, HUB_SCOPES). | application/json error.json |
404 | POINT_UNAVAILABLE, or NO_TICKET: this session has no ticket at the code. | application/json error.json |
GET /fed/v1/events
The events of one application after a sequence number, from the node's log (the hub's gap repair)
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
record required | query | string | The application: its case number on the node. |
after | query | integer | Return the events with a higher sequence number (default 0: all). |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json event-page.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
POST /fed/v1/events
A CloudEvent from a node (case.*, payment.*, document.issued, action.required, service.*) or from the hub (session.revoked)
The receiver (lib/federation/events.js) checks the envelope and data against the contract, that source is the signing peer, and the direction of the type; a type this instance has no handler for answers 501 FED_NOT_IMPLEMENTED (the sender keeps it and retries). FED-04 handles gsb.fed.v1.session.revoked (hub -> node only): the node ends every session it derived from the hub's assertions for that pairwise subject. Answer: { received, id, type, applied }.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Idempotency-Key required | header | string | Required on writes, and inside the signature ( |
Request body (required)
application/json:cloudevent.json
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature); the body is defined by the lane that builds the operation. | |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
409 | IDEMPOTENCY_IN_PROGRESS: the first request with this key is still running (Retry-After) | application/json error.json |
422 | IDEMPOTENCY_KEY_REUSED: the key was used with another body | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /.well-known/jwks.json
This instance's federation signing keys (public JWKs, ES256)
No authentication.
Responses
| Status | Description | Body |
|---|---|---|
200 | JWKS | application/jwk-set+json object |
GET /.well-known/gsb-federation
Who this instance is: contract version, role, NODE_KEY, where its keys and API are
No authentication.
Responses
| Status | Description | Body |
|---|---|---|
200 | Discovery document | application/json object |
GET /fed/v1/geo/sources
The public map-search sources of this node: registers approved for the public and module sources (LA8, lane landportal; capability geo-search)
SIGN-22 (lane S4 sigverify). The hub validated an uploaded PDF sealed with this node's key against the national trust list and asks, by hashes only, for the issued record: the file never leaves the hub. Unknown hashes: 404 NO_MATCH. The answer never carries holder data.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json geo-search-sources.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | NO_MATCH: unknown, malformed or not this node's - one answer | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN), or more than VERIFY_FED_LOOKUP_PER_MIN look-ups from this peer in a minute (RATE_LIMITED) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/geo/sources/{source}/search
Search one public map-search source by number (key, survey record, diagram) or by a place on the map (LA8)
SIGN-22 (lane S4 sigverify). The hub validated an uploaded PDF sealed with this node's key against the national trust list and asks, by hashes only, for the issued record: the file never leaves the hub. Unknown hashes: 404 NO_MATCH. The answer never carries holder data.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
source required | path | string | The source key of this node (not <key>@<node>: the hub strips its node key). |
by | query | string: key, survey-record, diagram | key (default), survey-record or diagram |
q | query | string | The number searched for: letters, digits, spaces and / - . (at most 80) |
lon | query | number | A place on the map: longitude (WGS 84); with lat instead of by/q |
lat | query | number | Latitude (WGS 84) |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json geo-search-results.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | SOURCE_NOT_FOUND: no public source of that key here | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN), or more than VERIFY_FED_LOOKUP_PER_MIN look-ups from this peer in a minute (RATE_LIMITED) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/geo/sources/{source}/features
The outlines of one public map-search source in a map view, simplified for the zoom; nothing below minZoom (LA8)
SIGN-22 (lane S4 sigverify). The hub validated an uploaded PDF sealed with this node's key against the national trust list and asks, by hashes only, for the issued record: the file never leaves the hub. Unknown hashes: 404 NO_MATCH. The answer never carries holder data.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
source required | path | string | The source key of this node (not <key>@<node>: the hub strips its node key). |
bbox | query | string | minLon,minLat,maxLon,maxLat (WGS 84) |
zoom | query | string | The map zoom, 0-22 |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json geo-search-features.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | SOURCE_NOT_FOUND: no public source of that key here | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN), or more than VERIFY_FED_LOOKUP_PER_MIN look-ups from this peer in a minute (RATE_LIMITED) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/verify/lookup/{number}
A document of this node's register by its verification code or, for the hub's authenticated partner door, its issued number (the national verification hub, LP-INT-06)
SIGN-22 (lane S4 sigverify). The hub validated an uploaded PDF sealed with this node's key against the national trust list and asks, by hashes only, for the issued record: the file never leaves the hub. Unknown hashes: 404 NO_MATCH. The answer never carries holder data.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
number required | path | string | The verification code (by=code) or the issued number or code (by=number), URL-encoded; at most 80 characters. |
by | query | string: code, number | code (default) or number. The hub asks by number only for an authenticated partner client (permits:verify). |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json verify-lookup.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | NO_MATCH: unknown, malformed or not this node's - one answer | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN), or more than VERIFY_FED_LOOKUP_PER_MIN look-ups from this peer in a minute (RATE_LIMITED) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/registers
The registers this instance holds that the asking instance may read: its public registers and those it granted the asker under a data-sharing agreement (NDP-15)
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json register-catalogue-page.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | NO_MATCH: unknown, malformed or not this node's - one answer | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN), or more than VERIFY_FED_LOOKUP_PER_MIN look-ups from this peer in a minute (RATE_LIMITED) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
POST /fed/v1/registers/lookup
An officer of the asking instance looks up a register held here: a search (key / label / context) or one record, projected with the home instance's grant for the asking node; both instances audit; nothing is cached (NDP-15)
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Request body (required)
application/json:register-lookup-request.json
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature): | application/json register-lookup.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | REGISTER_FORBIDDEN: this instance has not granted the register to the asking node. | application/json error.json |
404 | NOT_FOUND: no such register here, or no record with the key. | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN), or more than VERIFY_FED_LOOKUP_PER_MIN look-ups from this peer in a minute (RATE_LIMITED) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
GET /fed/v1/citizen/accounts
The billing accounts the asserted citizen holds or pays on this node (read only)
WP2, contract citizen-accounts.v1. Needs X-GSB-Citizen-Assertion: the node lists only the accounts the asserted citizen holds or pays (a linked account, or a party identifier equal to an NRC the hub vouches for as verified - its own PDP). Numbers, status words, amounts (ngwee) and labels only. The hub caches the answer for at most 60 seconds and never stores it.
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
X-GSB-Citizen-Assertion | header | string | FED-04: the hub's short-lived (120 s) ES256 citizen assertion (token-exchange profile, pairwise subject, aud = the node). The node decides with its own PDP. |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json citizen-accounts.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
404 | Not offered by this node (the hub reads it as "no accounts"). 401 FED_ASSERTION_* when the citizen assertion is missing or refused. | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
POST /fed/v1/citizen/accounts/{source}/{ref}/orders
An order on one of the asserted citizen's accounts: priced and invoiced by the node on its own merchant
WP2, contract citizen-accounts.v1. Needs X-GSB-Citizen-Assertion and an Idempotency-Key (a repeat answers the first invoice). The node prices the order from its own ledger, raises the invoice on its own ZamPay merchant and returns a node-signed pay link; ZamPay's callback lands on the node, which allocates the money (oldest bill first).
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Idempotency-Key required | header | string | Required on writes, and inside the signature ( |
X-GSB-Citizen-Assertion | header | string | FED-04: the hub's short-lived (120 s) ES256 citizen assertion (token-exchange profile, pairwise subject, aud = the node). The node decides with its own PDP. |
source required | path | string | |
ref required | path | string |
Request body (required)
application/json:citizen-account-order-request.json
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json citizen-account-order.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope; the citizen assertion refused: FED_ASSURANCE_TOO_LOW, FED_PRINCIPAL_NOT_APPLICANT, FED_PRINCIPAL_INACTIVE | application/json error.json |
404 | ACCOUNT_NOT_FOUND: no such account, or not the asserted citizen's (one answer for both). | application/json error.json |
409 | PRICE_MISMATCH (with the node's total), NOTHING_DUE, MODULE_DISABLED, NO_PAYMENT_SERVICE, FED_IDEMPOTENCY_IN_PROGRESS | application/json error.json |
422 | IDEMPOTENCY_KEY_REUSED: the key was used with another body; FED_VALIDATION / FED_FORM_CHANGED (the node's live form - | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
503 | FED_FILE_UNAVAILABLE: the files could not be fetched from the hub's presigned URLs (the hub tries again) | application/json error.json |
GET /fed/v1/status/summary
How the node is doing, for the hub's Ministries overview: aggregate counts (active services, applications received today, outstanding incidents) and readiness only - never a name or a case (lane hubhome)
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature). | application/json status-summary.json |
400 | FED_INVALID (unknown field, wrong type - | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE: the calling peer does not hold this operation's scope | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance yet | application/json error.json |
POST /fed/v1/staff/sso/redeem
A node redeems the single-use sign-on code a member of staff brought from the hub, for a signed staff assertion (lane staffsso; README section 20). The hub answers only the node the code was made for, once, within its life
Authentication: federationSignature
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-GSB-Federation-Id | header | string | Correlation id of the journey, written to both instances' audit trails; inside the signature ( |
traceparent | header | string | W3C trace context, carried end to end. |
Request body (required)
application/json:staff-sso-redeem-request.json
Responses
| Status | Description | Body |
|---|---|---|
200 | Signed answer (X-GSB-Fed-Signature) carrying the staff assertion (typ gsb-staff+jwt) for the asking node. | application/json staff-sso-assertion.json |
400 | FED_INVALID (unknown field, wrong type), SSO_CODE_USED (already redeemed, by any node), SSO_CODE_EXPIRED, SSO_CODE_UNKNOWN, FED_VERSION | application/json error.json |
401 | FED_UNSIGNED, FED_MALFORMED, FED_UNKNOWN_ISSUER, FED_UNKNOWN_KEY, FED_BAD_SIGNATURE, FED_WRONG_AUDIENCE, FED_EXPIRED, FED_NOT_YET_VALID, FED_WRONG_TARGET, FED_REPLAY, FED_MTLS_REQUIRED, FED_MTLS_MISMATCH | application/json error.json |
403 | FED_SCOPE (the node's registry entry does not hold sso:redeem), SSO_CODE_WRONG_NODE (the code was made for another node; it is spent all the same), SSO_ACCOUNT_UNAVAILABLE (the hub account is no longer active staff, or was signed out everywhere since) | application/json error.json |
404 | STAFF_SSO_OFF: staff sign-on is not switched on at the hub (STAFF_SSO); FED_UNKNOWN_ROUTE from an older hub | application/json error.json |
429 | Too many requests from this address (FED_RATE_LIMIT_PER_MIN) | application/json error.json |
501 | FED_NOT_IMPLEMENTED: part of contract v1, not offered by this instance | application/json error.json |