{"id":"agent-api-contract-diff","card_id":"card_agent_api_contract_diff","name":"Agent API contract diff","description":"Compares supplied before/after API endpoint contracts and flags added, removed, changed, and breaking surfaces.","stage":1,"safety_level":"data_only_read_only","auth":{"type":"hmac-sha256","required_headers":["x-apex-tool-timestamp","x-apex-tool-nonce","x-apex-tool-content-sha256","x-apex-tool-signature"],"canonical_payload":"APEX-TOOL-V1\\n{tool_id}\\n{timestamp}\\n{nonce}\\n{sha256(canonical_json(body))}"},"permissionless":{"enabled":true,"tier":"bounded_public","rate_limit":"Shared 20 calls per IP per hour across permissionless bounded tools plus global agent-write protection","review_required":false,"note":"Anonymous bounded execution is allowed because this is a deterministic DATA ONLY diff over caller-supplied endpoint contracts. It performs no network route discovery and never reads source."},"input_schema":{"type":"object","properties":{"before":{"type":"array"},"after":{"type":"array"}}},"output_schema":{"type":"object","properties":{"decision":{"type":"string"},"breaking_changes":{"type":"array"}}},"sample_input":{"before":[{"method":"GET","path":"/v1/cards","response_schema":{"type":"array"}}],"after":[{"method":"GET","path":"/v1/cards","response_schema":{"type":"object"}}]},"test_vectors":[{"input":{"before":[{"method":"GET","path":"/v1/cards","response_schema":{"type":"array"}}],"after":[{"method":"GET","path":"/v1/cards","response_schema":{"type":"object"}}]},"expected":{"result":{"decision":"WATCH","before_count":1,"after_count":1,"added":[],"removed":[],"changed":["GET /v1/cards"],"breaking_changes":[]}},"match":"subset","verified_at":"2026-07-04T06:30:00.000Z"},{"input":{"before":[{"method":"GET","path":"/v1/cards","response_schema":{"type":"object","properties":{"id":"string"}},"status_codes":[200]}],"after":[{"method":"GET","path":"/v1/cards","response_schema":{"type":"object","properties":{"id":"string"}},"status_codes":[200]},{"method":"POST","path":"/v1/cards/intake","request_schema":{"required":["source_url"]},"response_schema":{"type":"object"},"status_codes":[202]}]},"expected":{"result":{"decision":"WATCH","before_count":1,"after_count":2,"added":["POST /v1/cards/intake"],"removed":[],"changed":[],"breaking_changes":[]}},"match":"subset","verified_at":"2026-07-04T06:30:00.000Z"}]}