{"resource":"https://rs-supplier.demo.cba.raidiam.io","resource_name":"CBA Business Banking Supplier and Invoice Register","resource_documentation":"https://rs-supplier.demo.cba.raidiam.io/","authorization_servers":["https://commbiz.demo.cba.raidiam.io"],"bearer_methods_supported":["header"],"scopes_supported":["openid","suppliers.read","invoices.settle"],"authorization_details_types_supported":["supplier_invoice"],"dpop_signing_alg_values_supported":["ES256"],"dpop_bound_access_tokens_required":false,"tls_client_certificate_bound_access_tokens":false,"cba_resource_profile":{"profile_version":"1.0","treatment":"CBA side illustration, not a Raidiam product","operator":"Commonwealth Bank business banking, illustrative reference model","domain":"accounts payable","summary":"Holds the approved supplier list and the invoice book for a business banking customer, and refuses any payment instruction naming a counterparty, an account or an amount that does not match what is on file.","read_only":false,"dpop_binding":{"mode":"bound","description":"This resource verifies a DPoP proof whenever one is presented, and requires one whenever the access token carries a cnf.jkt claim. Plain bearer tokens are still accepted while the authorization server is being moved onto sender constrained tokens."},"trust":{"authorization_server":"https://commbiz.demo.cba.raidiam.io","trust_anchor":null,"federation_required":false,"description":"No federation trust anchor is configured, so the authorization server named above is trusted by configuration alone. Set RS_TRUST_ANCHOR to require a resolvable trust chain."},"authorization_details_profiles":[{"type":"supplier_invoice","title":"Supplier and invoice access","description":"Authority to read the approved supplier list and the invoice book, and to settle an approved invoice. Settlement still needs a separate payment_initiation token addressed to the payments resource, because this resource never forwards the token it was called with.","actions":["read","validate","settle"],"required_members":["type","purpose"],"optional_members":["invoice","supplier","instructedAmount","constraints"],"example":{"type":"supplier_invoice","purpose":"Settle approved supplier invoices for the August accounts payable run","invoice":"INV-1041","supplier":"SUP-2201","instructedAmount":{"amount":"8200.00","currency":"AUD"}}}],"required_token_claims":[{"claim":"sub","required":true,"description":"The business banking customer whose supplier list and invoice book are in scope."},{"claim":"root_grant","required":false,"description":"The root delegation this call belongs to, recorded on every decision."},{"claim":"act","required":false,"description":"The RFC 8693 actor chain, so a refused instruction names the sub agent that made it."},{"claim":"cnf.jkt","required":false,"description":"The thumbprint of the key the access token is bound to."},{"claim":"authorization_details[supplier_invoice]","required":true,"description":"The authority to read the register and to settle from it."}],"policies":[{"id":"rs.authenticated_caller","title":"Every call carries a token from the named authorization server","statement":"Calls are accepted only with an access token issued by https://commbiz.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.","denial_reason":"missing_access_token, invalid_token","enforced_at":"authorization","remedy":"Read this metadata document, then request a token from the authorization server it names, with this resource as the audience."},{"id":"rs.authority_gate","title":"Authority is the RFC 9396 detail type, not a scope","statement":"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.","denial_reason":"insufficient_authority","enforced_at":"authorization","remedy":"Obtain a token carrying the detail type the tool names. Delegation only ever narrows, so the delegating envelope must already contain it."},{"id":"rs.revocation_honoured","title":"A revoked delegation stops working before its tokens expire","statement":"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.","denial_reason":"delegation_revoked","enforced_at":"authorization","remedy":"The customer must grant a fresh delegation. There is no way to appeal a revocation at the resource."},{"id":"rs.dpop_binding","title":"Sender constrained tokens are bound to the key that holds them","statement":"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.","denial_reason":"dpop_proof_required, invalid_dpop_proof, dpop_key_mismatch, dpop_proof_replayed, access_token_not_dpop_bound","enforced_at":"authorization","remedy":"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."},{"id":"rs.request_validity","title":"A malformed request is refused with the reason it was malformed","statement":"Arguments are validated before any business rule runs, and the refusal names the argument at fault rather than returning a bare failure.","denial_reason":"tool_error, invalid_amount, unknown_tool","enforced_at":"execution","remedy":"Correct the named argument. The tool schemas are published in this document."},{"id":"sup.approved_list","title":"Money moves only to a counterparty on the approved supplier list","statement":"A supplier joins the approved list through a human onboarding process that confirms its bank details by callback to a number already on file. An agent may read the list. An agent may not add to it, and no payment instruction naming a counterparty outside it is passed on, whatever authority the agent holds and however plausible the invoice looks.","denial_reason":"supplier_not_approved","enforced_at":"execution","remedy":"None available to an agent. Onboarding a supplier is a human process."},{"id":"sup.counterparty_matches_invoice","title":"The counterparty paid is the counterparty that issued the invoice","statement":"When an instruction names the supplier it believes it is paying, that name is checked against the invoice record. An agent that has been fed a substituted counterparty is refused on the mismatch rather than on the amount.","denial_reason":"counterparty_mismatch","enforced_at":"execution","remedy":"Pay the supplier that issued the invoice, or name the invoice the other supplier issued."},{"id":"sup.payee_account_on_file","title":"The destination account is the one confirmed by callback","statement":"Matching the supplier name is not sufficient. The BSB and account number on the instruction are checked against the details recorded against that supplier. Substituting the account while keeping the name correct is the harder version of the attack, and it is refused here.","denial_reason":"payee_account_mismatch","enforced_at":"execution","remedy":"None available to an agent. Bank details change only through onboarding, with a callback to a number already on file."},{"id":"sup.invoice_must_exist","title":"Every payment settles a real invoice","statement":"An instruction that names no invoice in the book is refused. Accounts payable settles invoices, so a payment with nothing behind it has nothing to settle.","denial_reason":"unknown_invoice","enforced_at":"execution","remedy":"Read the invoice book and name an invoice from it."},{"id":"sup.invoice_approved_for_payment","title":"Only an invoice the business has approved is settled","statement":"An invoice awaiting approval or in dispute is not settled by an agent, even when the supplier is approved and the amount is within every limit.","denial_reason":"invoice_not_approved_for_payment","enforced_at":"execution","remedy":"The business approves the invoice first. That is a human step."},{"id":"sup.amount_matches_invoice","title":"The amount paid is the amount owed","statement":"An accounts payable agent settles an invoice, it does not decide what the invoice is worth. An instruction for an amount other than the invoice total is refused.","denial_reason":"invoice_amount_mismatch","enforced_at":"execution","remedy":"Instruct the invoice total, or raise the difference with the supplier as a credit note."},{"id":"sup.settle_once","title":"An invoice is settled once","statement":"Sub agents run in parallel and can be handed overlapping work. An invoice already settled is refused a second time here as well as at the payments resource, so a duplicate is caught before it reaches the payment rail.","denial_reason":"invoice_already_settled","enforced_at":"execution","remedy":"None. The invoice is paid."},{"id":"sup.separate_payment_token","title":"Settlement carries its own audience scoped token","statement":"Settling an invoice means calling the payments resource, and this server never forwards the token it was called with. The caller supplies a separate payment token addressed to the payments resource, and the payments resource applies its own envelope and single payment limit on top of everything decided here.","denial_reason":"payment_token_required","enforced_at":"execution","remedy":"Obtain a payment_initiation token addressed to the payments resource and pass it as payment_token."}],"tools":[{"name":"list_suppliers","description":"List the supplier records, with the approval status of each one.","required_authorization_details_type":"supplier_invoice","mutates":false,"http_endpoint":"https://rs-supplier.demo.cba.raidiam.io/api/list_suppliers","mcp_tool":"list_suppliers"},{"name":"get_supplier","description":"Read one supplier record, including its approval status and the account recorded against it.","required_authorization_details_type":"supplier_invoice","mutates":false,"http_endpoint":"https://rs-supplier.demo.cba.raidiam.io/api/get_supplier","mcp_tool":"get_supplier"},{"name":"list_invoices","description":"List invoices, optionally filtered by supplier or status.","required_authorization_details_type":"supplier_invoice","mutates":false,"http_endpoint":"https://rs-supplier.demo.cba.raidiam.io/api/list_invoices","mcp_tool":"list_invoices"},{"name":"get_invoice","description":"Read one invoice, with the supplier it came from and the approval status of both.","required_authorization_details_type":"supplier_invoice","mutates":false,"http_endpoint":"https://rs-supplier.demo.cba.raidiam.io/api/get_invoice","mcp_tool":"get_invoice"},{"name":"validate_payment_instruction","description":"Check a payment instruction against the approved supplier list, the invoice record and the account on file, without settling anything.","required_authorization_details_type":"supplier_invoice","mutates":false,"http_endpoint":"https://rs-supplier.demo.cba.raidiam.io/api/validate_payment_instruction","mcp_tool":"validate_payment_instruction"},{"name":"settle_invoice","description":"Settle an approved invoice by instructing the payments resource, after the counterparty guardrails have passed.","required_authorization_details_type":"supplier_invoice","mutates":true,"http_endpoint":"https://rs-supplier.demo.cba.raidiam.io/api/settle_invoice","mcp_tool":"settle_invoice"}],"interfaces":{"mcp":{"transport":"streamable-http","endpoint":"https://rs-supplier.demo.cba.raidiam.io/mcp","description":"Model Context Protocol over Streamable HTTP. The same authority gate applies as on the HTTP endpoints."},"http":{"style":"json","endpoint_template":"https://rs-supplier.demo.cba.raidiam.io/api/{tool}","description":"A plain JSON twin of every tool, sharing one handler with the MCP surface."}},"observability":{"decisions_endpoint":"https://rs-supplier.demo.cba.raidiam.io/decisions","description":"The most recent admission decisions, allowed and refused, each carrying the policy that decided it and the values the decision turned on.","correlation":{"request_header":"x-correlation-id","also_accepted":["traceparent","access token correlation_id claim","access token txn claim"],"response_header":"x-correlation-id","echoed_in":["the response body of every allowed call","the body of every refusal","every decision log entry"],"lookup":"https://rs-supplier.demo.cba.raidiam.io/decisions?correlation_id={id}","description":"Send an identifier from whatever triggered the work and this resource records its decision under that identifier rather than minting its own. One id therefore runs from the trigger, through the token issued for it, to the decision made here, and the decisions taken under it can be read back in order."},"recorded_per_decision":["the correlation id and where it came from","the authorization server, the published key that verified the token, and whether that server was resolved to the configured federation trust anchor","the agent identity that made the call and the full delegation chain behind it, as asserted by the authorization server in the RFC 8693 act claim","the delegating customer and the root delegation","the authorization_details types held against the type the tool required","the outcome, and for a refusal the policy that decided it and the values it turned on"]}}}