CBA side illustration
CBA Institutional Counterparty Screening
Screens a counterparty against sanctions, adverse media and the internal fraud marker register. Read only, and it never returns a reason a screening list holds an entity, only that it does.
This service is an illustration built on the CBA side of the boundary. It is not a Raidiam product. It exists to show what a resource server can demand of an agent, and to show that a refusal can always be explained.
What an agent has to discover
Resourcehttps://rs-fraud.demo.cba.raidiam.io
Authorization serverhttps://ibm.demo.cba.raidiam.io
Trust anchorhttps://authority.directory.cba.raidiam.io/authority/5a27c88b-97ed-4d37-a3c8-59c66b19aa25
Detail typesfraud_screen
Scopesopenid, fraud.screen
Sender constrainingDPoP verified when presented, required for bound tokens
Mutabilityread only
Authorization detail types
fraud_screen
Authority to screen a counterparty and read fraud markers. It returns a decision and never the underlying intelligence, so an agent cannot use screening as a way to read a watchlist.
Required members: type purpose
Optional members: none
{
"type": "fraud_screen",
"purpose": "Screen a supplier before its first payment"
}
Token claims this resource decides on
sub required The customer this authority was delegated over.
root_grant optional The delegation this call belongs to, recorded on every decision.
act optional The RFC 8693 actor chain, recorded on every decision.
cnf.jkt optional The thumbprint of the key the access token is bound to.
authorization_details[fraud_screen] required The authority this resource acts on.
Tools
Guardrails, published in advance
Every call carries a token from the named authorization server
Calls are accepted only with an access token issued by https://ibm.demo.cba.raidiam.io and addressed to this resource as its audience. A token minted for a different resource is refused even when it is otherwise valid.
Refusal reason missing_access_token, invalid_token · decided at authorization · policy id rs.authenticated_caller
What clears it: Read this metadata document, then request a token from the authorization server it names, with this resource as the audience.
Authority is the RFC 9396 detail type, not a scope
Each tool names one authorization_details type. The token must carry that type, or an umbrella type that narrows to it. Holding a scope, or holding authority for a neighbouring resource, does not admit the call.
Refusal reason insufficient_authority · decided at authorization · policy id rs.authority_gate
What clears it: Obtain a token carrying the detail type the tool names. Delegation only ever narrows, so the delegating envelope must already contain it.
A revoked delegation stops working before its tokens expire
Revocation arrives as a Shared Signals event and is applied to the delegation, not to a single token. Every token issued under a revoked delegation is refused from that moment, whatever its expiry says.
Refusal reason delegation_revoked · decided at authorization · policy id rs.revocation_honoured
What clears it: The customer must grant a fresh delegation. There is no way to appeal a revocation at the resource.
Sender constrained tokens are bound to the key that holds them
A DPoP proof is verified whenever one is presented, and is required whenever the access token names a key in its cnf.jkt claim. Each proof is accepted once, so a captured proof cannot be replayed.
Refusal reason dpop_proof_required, invalid_dpop_proof, dpop_key_mismatch, dpop_proof_replayed, access_token_not_dpop_bound · decided at authorization · policy id rs.dpop_binding
What clears it: Request the access token with a DPoP proof so the authorization server binds it to your key, then send a fresh proof with every call.
CBA Institutional Counterparty Screening never changes state
This resource publishes read_only true and exposes no path that writes. A mutating tool is refused before it runs, regardless of the authority the caller presents, so an agent cannot widen its own position by writing here.
Refusal reason resource_is_read_only · decided at authorization · policy id rs.read_only_resource
What clears it: State changing instructions belong to the resource that owns the record. This one only reports.
A malformed request is refused with the reason it was malformed
Arguments are validated before any business rule runs, and the refusal names the argument at fault rather than returning a bare failure.
Refusal reason tool_error, invalid_amount, unknown_tool · decided at execution · policy id rs.request_validity
What clears it: Correct the named argument. The tool schemas are published in this document.
A decision, never the intelligence behind it
Screening returns a decision and a marker category. It never returns the source, the narrative, or which list an entity appears on. An agent holding screening authority learns enough to stop and nothing it could take away.
Refusal reason not_disclosed · decided at execution · policy id fraud.decision_without_intelligence
What clears it: Escalate to a financial crime analyst, who has a different authority and a different surface.
A clear screen is not an approval
A clear result means this resource holds no marker. It is not an instruction to pay and it does not widen any payment envelope. The payment controls are enforced elsewhere and are unaffected by what this returns.
Refusal reason insufficient_authority · decided at authorization · policy id fraud.screening_is_not_clearance
What clears it: Payment authority comes from the customer mandate, not from a screening result.
Observability
Every admission decision, allowed and refused, is recorded with the policy that decided it and the values it turned on. Read them at /decisions.