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

Tools

ToolPurposeRequiresEffect
screen_counterparty Screen a counterparty and return a decision: clear, review or blocked. fraud_screen read only
fraud_markers Whether this counterparty carries any fraud marker, as a count by category. fraud_screen read only
sanctions_check Whether a counterparty matches a sanctions list. Returns match or no match, never the list. fraud_screen read only

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.