{"resource":"https://rs-accounts.demo.cba.raidiam.io","resource_name":"CBA Business Banking Accounts","resource_documentation":"https://rs-accounts.demo.cba.raidiam.io/","authorization_servers":["https://commbiz.demo.cba.raidiam.io"],"bearer_methods_supported":["header"],"scopes_supported":["openid","accounts.read"],"authorization_details_types_supported":["accounts_read","accounts_write"],"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":"Reports business account balances, postings and payment limits to an agent holding read authority. It is a read only resource, and refuses every state changing call whatever authority is presented.","read_only":true,"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":"accounts_read","title":"Account reporting","description":"Authority to read balances, postings and payment limits on the delegating customer's business accounts. It carries no ability to move money and no ability to change a setting. It is the only type this resource will act on.","actions":["read"],"required_members":["type","purpose"],"optional_members":["accounts","constraints"],"example":{"type":"accounts_read","purpose":"Confirm available funds before settling approved supplier invoices","accounts":["ACC-8801"]}},{"type":"accounts_write","title":"Account administration, declared and not reachable","description":"The type the write tools name: changing payees, limits and mandates. It is published so the refusal a read only agent receives is checkable against a declared requirement rather than looking arbitrary. An agent may be entitled by its role to request this type and still be unable to obtain it, because it does not sit under the payment envelope the customer delegated. And a caller that did hold it would still be refused here, because this resource is read only. Two independent gates, each with its own stated reason.","actions":["write"],"required_members":["type","purpose"],"optional_members":[],"example":{"type":"accounts_write","purpose":"Outside the accounts payable envelope. Account administration is performed by a human signatory in CommBiz."}}],"required_token_claims":[{"claim":"sub","required":true,"description":"The business banking customer whose accounts are in scope."},{"claim":"root_grant","required":false,"description":"The root delegation this read belongs to. Recorded on every decision so a read can be traced back to the delegation that permitted it."},{"claim":"act","required":false,"description":"The RFC 8693 actor chain, recorded on every decision."},{"claim":"cnf.jkt","required":false,"description":"The thumbprint of the key the access token is bound to."},{"claim":"authorization_details[accounts_read]","required":true,"description":"The authority to read. Nothing else admits a call here."}],"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.read_only_resource","title":"CBA Business Banking Accounts never changes state","statement":"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.","denial_reason":"resource_is_read_only","enforced_at":"authorization","remedy":"State changing instructions belong to the resource that owns the record. This one only reports."},{"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":"acct.read_authority_is_not_write_authority","title":"Read authority never becomes write authority","statement":"accounts_read admits the reporting tools and nothing else. The write tools name accounts_write, which does not sit under the supplier_payment envelope, so no attenuation an agent can perform turns reading into writing. Being entitled to ask for a type and being inside the delegated envelope are two separate gates, and the accounts payable orchestrator passes the first and fails the second.","denial_reason":"insufficient_authority","enforced_at":"authorization","remedy":"There is no path from a payment envelope to account administration. Write authority over account standing data is exercised by human signatories through CommBiz administration."},{"id":"acct.limits_are_not_agent_settable","title":"An agent cannot raise the limit that is refusing it","statement":"Payment limits are readable so an agent can plan, and are not settable here by anyone. An agent that has just been refused a payment for exceeding the single payment limit cannot come here and raise the limit, which is the whole reason the limit is worth having.","denial_reason":"resource_is_read_only","enforced_at":"authorization","remedy":"A human signatory changes limits through CommBiz administration."},{"id":"acct.customer_scope","title":"Only the delegating customer's accounts are visible","statement":"The accounts returned are those of the customer named in the token sub claim. An account id that belongs to another customer is refused as unknown rather than as forbidden, so the resource does not confirm that it exists.","denial_reason":"unknown_account","enforced_at":"execution","remedy":"Read the account list first. It contains everything this delegation can see."}],"tools":[{"name":"list_accounts","description":"List the business accounts visible to this delegation.","required_authorization_details_type":"accounts_read","mutates":false,"http_endpoint":"https://rs-accounts.demo.cba.raidiam.io/api/list_accounts","mcp_tool":"list_accounts"},{"name":"get_account_balance","description":"Report the balance and available funds on one account.","required_authorization_details_type":"accounts_read","mutates":false,"http_endpoint":"https://rs-accounts.demo.cba.raidiam.io/api/get_account_balance","mcp_tool":"get_account_balance"},{"name":"list_transactions","description":"List recent postings on one account.","required_authorization_details_type":"accounts_read","mutates":false,"http_endpoint":"https://rs-accounts.demo.cba.raidiam.io/api/list_transactions","mcp_tool":"list_transactions"},{"name":"get_payment_limits","description":"Report the payment limits that apply to this account, including the ceiling on an agent initiated payment.","required_authorization_details_type":"accounts_read","mutates":false,"http_endpoint":"https://rs-accounts.demo.cba.raidiam.io/api/get_payment_limits","mcp_tool":"get_payment_limits"},{"name":"update_payment_limits","description":"Change the payment limits on an account. Published so the refusal can be demonstrated. This resource never performs it.","required_authorization_details_type":"accounts_write","mutates":true,"http_endpoint":"https://rs-accounts.demo.cba.raidiam.io/api/update_payment_limits","mcp_tool":"update_payment_limits"},{"name":"create_payee","description":"Add a new payee to the account. Published so the refusal can be demonstrated. This resource never performs it.","required_authorization_details_type":"accounts_write","mutates":true,"http_endpoint":"https://rs-accounts.demo.cba.raidiam.io/api/create_payee","mcp_tool":"create_payee"}],"interfaces":{"mcp":{"transport":"streamable-http","endpoint":"https://rs-accounts.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-accounts.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-accounts.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-accounts.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"]}}}