{"agent_response_sections":["request","subject","decision","evidence_summary","module_decisions","explainability","trace","data_plane","links"],"agent_screen_contract":"a2a_agent_screen_v1","app_version":"Financial Crime | Released: 2026-03-18","async_lifecycle":{"adaptive_timeout_tiers":[{"applies_to":"simple individual/entity screens with few or no connected-party/network follow-on targets","max_attempts":90,"tier":"standard","timeout_seconds":180},{"applies_to":"company, vessel, PEP/RCA, sanctions-linked associate, UBO, listed-issuer, or multi-domain cases","max_attempts":180,"tier":"complex_network","timeout_seconds":360},{"applies_to":"high-node network/UBO cases, large listed issuers, vessels with ownership chains, or cases where polling progress shows many linked parties","max_attempts":240,"tier":"deep_network","timeout_seconds":480}],"guaranteed_final_path":"result.screening_result.screen_ui","latency_attribution":"Final job responses include latency_profile and result.screening_result.runtime_latency_profile with public-safe timings for sanctions, PEP, adverse/connected-party follow-on, network/UBO, online context, AI recommendation, and screen_ui payload assembly.","poll":"GET /public/a2a/jobs/<job_id> returns running progress until terminal state.","polling_guidance":"Poll every 2 seconds using an adaptive timeout budget: standard cases up to 90 attempts, complex network/UBO/PEP/RCA/sanctions-linked cases up to 180 attempts, and deep-network or high-node cases up to 240 attempts. Stop only when final_report_ready=true or a terminal error/failed state appears. Clients may add conservative backoff after repeated pending responses.","recommended_max_poll_attempts":90,"recommended_poll_interval_seconds":2,"result_delivery":"The public A2A job endpoint only includes result.screening_result when final_report_ready=true. If AI recommendation synthesis is still pending, result is withheld and ai_recommendation.pending=true is returned.","submit":"POST /public/a2a/screen/async returns contract a2a_public_screen_job_v1 with job_id and poll_url.","terminal_failure":"status=failed or report_state=failed contains error and no final screening_result.","terminal_success":"final_report_ready=true and report_state=final indicate the external-agent result is complete."},"available_endpoints":["/.well-known/agent-card.json","/public/a2a/schema","/public/a2a/examples","/public/a2a/capabilities","/public/a2a/health","/public/a2a/data-plane","/public/a2a/openapi.json","/public/a2a/openapi.yaml","/public/a2a/docs","/public/a2a/client-examples","/public/a2a/screen","/public/a2a/screen/async","/public/a2a/jobs/<job_id>"],"contract":"a2a_public_schema_v1","developer_examples":{"ascii_payload":{"country":"CA","mode":"company","name":"Northstar Example Trading Ltd.","type":"company"},"cjk_payload":{"country":"CN","mode":"company","name":"\u5b89\u5e73\u6e2c\u8a66\u8cbf\u6613\u6709\u9650\u516c\u53f8","type":"company"},"docs_endpoint":"/public/a2a/examples","encoding":{"body_encoding":"utf-8","content_type":"application/json; charset=utf-8","guidance":"Request bodies must be UTF-8 encoded JSON. Send Content-Type: application/json; charset=utf-8. Non-UTF-8 body bytes are rejected before job creation with error_code=invalid_utf8 where the backend can detect the decode failure; some client/proxy paths may otherwise surface as invalid_characters.","powershell_utf8_bytes":"[Text.Encoding]::UTF8.GetBytes($json)"},"invalid_utf8_error":{"error_code":"invalid_utf8","ok":false,"request_id":"present"},"malformed_json_error":{"error_code":"malformed_json","ok":false,"request_id":"present"},"missing_name_error":{"error_code":"name_required","ok":false,"request_id":"present"},"polling":{"adaptive_timeout_tiers":[{"applies_to":"simple individual/entity screens with few or no connected-party/network follow-on targets","max_attempts":90,"tier":"standard","timeout_seconds":180},{"applies_to":"company, vessel, PEP/RCA, sanctions-linked associate, UBO, listed-issuer, or multi-domain cases","max_attempts":180,"tier":"complex_network","timeout_seconds":360},{"applies_to":"high-node network/UBO cases, large listed issuers, vessels with ownership chains, or cases where polling progress shows many linked parties","max_attempts":240,"tier":"deep_network","timeout_seconds":480}],"guidance":"Poll every 2 seconds using an adaptive timeout budget: standard cases up to 90 attempts, complex network/UBO/PEP/RCA/sanctions-linked cases up to 180 attempts, and deep-network or high-node cases up to 240 attempts. Stop only when final_report_ready=true or a terminal error/failed state appears. Clients may add conservative backoff after repeated pending responses.","interval_seconds":2,"max_attempts":90,"poll":"GET /public/a2a/jobs/<job_id>","read":"result.screening_result.screen_ui.summary","submit":"POST /public/a2a/screen/async","supports_backoff":true,"terminal_error":"status=failed, report_state=failed, or ok=false with an error_code","until":"final_report_ready == true"}},"domain_scope":{"identity_verification":{"public_a2a_enabled":false,"status":"development_in_progress"},"name_screening":{"engine":"same_screening_runtime_as_live_ui","maturity":"public_demo_ready","public_a2a_enabled":true,"status":"available"},"regulatory_intelligence":{"public_a2a_enabled":false,"status":"development_in_progress"}},"guaranteed_response_fields":{"decision":["risk_score","recommendation","decision_status","overall_decision_band"],"evidence":["module_decisions","pep_intelligence","identity_control","relationship_propagation"],"job_status":["job_id","job_trace_id","screening_trace_id","final_report_ready","report_state","request.payload","ai_recommendation","result_withheld","latency_profile"],"latency_profile":["contract","total_ms","job_lifecycle","timeout_tier","domains","bottlenecks","complexity_summary"],"screen_ui":["summary","modules.sanctions","modules.pep","modules.adverse","modules.network","modules.ubo","modules.crr","summary.sanctions_pep_identity_alignment","modules.sanctions.sanctions_pep_identity_alignment","modules.pep.sanctions_pep_identity_alignment"],"screen_ui.summary":["subject","overall_decision","risk_score","sanctions_status","pep_status","adverse_status","network_status","ubo_status","sector_industry_status","sector_industry_score","sector_industry_factors","sector_industry_risk","business_nature","occupation","review_required","evidence_count","linked_party_count","warnings","errors","provenance","final_report_ready","sanctions_pep_identity_alignment"],"screening_result":["screen_ui","risk_score","recommendation","decision_narrative","runtime_latency_profile"],"trace":["trace_id","history_available","replay_available","snapshot_ids"],"ui_consistency":["same_engine_as_live_ui","live_ui_result_path","a2a_result_path","screen_ui_field_mapping"]},"ok":true,"public_no_api_gate":true,"rate_limit_and_abuse_control":{"actual_policy":{"bucket":"ip_hash+user_agent_hash+route","enabled":true,"env":{"docs_enabled":"FINANCIAL_CRIME_PUBLIC_A2A_RATE_LIMIT_DOCS_ENABLED","enabled":"FINANCIAL_CRIME_PUBLIC_A2A_RATE_LIMIT_ENABLED","fail_mode":"FINANCIAL_CRIME_PUBLIC_A2A_RATE_LIMIT_FAIL_MODE","max_requests":"FINANCIAL_CRIME_PUBLIC_A2A_RATE_LIMIT_MAX_REQUESTS","window_seconds":"FINANCIAL_CRIME_PUBLIC_A2A_RATE_LIMIT_WINDOW_SECONDS"},"fail_mode":"closed","headers":["X-Request-ID","Retry-After","X-RateLimit-Policy"],"limited_routes":["/public/a2a/screen/async","/public/a2a/jobs/<job_id>"],"max_requests":300,"safe_error_body":{"error_code":"rate_limit_exceeded","ok":false,"request_id":"present","retry_after":"seconds"},"unlimited_routes":["/.well-known/agent-card.json","/public/a2a/schema","/public/a2a/examples","/public/a2a/capabilities","/public/a2a/health","/public/a2a/data-plane","/public/a2a/openapi.json","/public/a2a/openapi.yaml","/public/a2a/docs","/public/a2a/client-examples"],"window_seconds":60},"default_public_demo_posture":"safe public-demo limiter enabled for submit and poll routes; schema/examples/capabilities/health/data-plane remain open unless explicitly configured.","headers_if_enforced":["X-Request-ID","Retry-After","X-RateLimit-Policy"],"limited_routes":["/public/a2a/screen/async","/public/a2a/jobs/<job_id>"],"observability":{"aggregate_signals":["malformed_json_count","missing_name_count","validation_failure_count","submit_count","completed_job_count","rate_limit_count"],"privacy":"Public health/data-plane exposes aggregate counters and policy only, never raw names, raw IPs, user agents, or job payloads."},"rate_limit_enforced":true,"retry_semantics":"HTTP 429 includes ok=false, error_code=rate_limit_exceeded, request_id, retry_after, X-Request-ID, Retry-After, and X-RateLimit-Policy.","safe_error_body":{"error_code":"rate_limit_exceeded","ok":false,"request_id":"present","retry_after":"seconds"},"unlimited_routes":["/.well-known/agent-card.json","/public/a2a/schema","/public/a2a/examples","/public/a2a/capabilities","/public/a2a/health","/public/a2a/data-plane","/public/a2a/openapi.json","/public/a2a/openapi.yaml","/public/a2a/docs","/public/a2a/client-examples"]},"rate_limit_enforced":true,"request_id":"36b1b1b17945457f","request_id_contract":{"body_field":"request_id","final_payload":"result.request.request_id is returned when a final result is embedded.","header":"X-Request-ID","inbound_header_note":"If an upstream edge passes X-Request-ID it is adopted; otherwise the service generates a fresh request_id and returns it in both header and body.","poll":"Top-level request_id is returned on every poll response.","submit":"Top-level request_id and request.request_id are returned.","validation_errors":"Malformed JSON and validation errors return request_id before job creation."},"required_request_fields":{"diff":["previous_trace_id","current_trace_id"],"history":["name"],"job_status":["job_id"],"screen":["name"],"screen_async":["name"]},"response_sections":["request","subject","decision","evidence","explainability","trace","data_plane","cache","latency_profile","ui_consistency","screening_result"],"screen_contract":"a2a_public_screen_v1","screen_job_contract":"a2a_public_screen_job_v1","screen_surface_enabled":true,"screen_ui_contract":{"cross_domain_identity_alignment":{"llm_secondary_review":"Optional audit-support review; deterministic identity gates remain authoritative.","module_paths":["result.screening_result.screen_ui.modules.sanctions.sanctions_pep_identity_alignment","result.screening_result.screen_ui.modules.pep.sanctions_pep_identity_alignment"],"same_person_semantics":"When true, sanctions and PEP alerts are treated as one aligned identity for audit trail and review routing rather than two unrelated domain findings.","sanctions_pep_alignment_path":"result.screening_result.screen_ui.summary.sanctions_pep_identity_alignment"},"decision_semantics":{"overall_decision":"Screening disposition for agent workflow routing, not a final legal/compliance decision.","review_required":"True means human review or enhanced checks are expected before relying on the result.","sanctions_pep_identity_alignment":"Explains whether sanctions and PEP hits are the same person, including identity anchors, confidence, reason codes, flags, and LLM secondary review if available.","sanctions_status":"potential_match or stronger always requires review."},"field_mapping":{"result.screen_ui":"result.screening_result.screen_ui","result.screen_ui.adjudication":"result.screening_result.screen_ui.adjudication","result.screen_ui.modules":"result.screening_result.screen_ui.modules","result.screen_ui.modules.adverse":"result.screening_result.screen_ui.modules.adverse","result.screen_ui.modules.crr":"result.screening_result.screen_ui.modules.crr","result.screen_ui.modules.network":"result.screening_result.screen_ui.modules.network","result.screen_ui.modules.pep":"result.screening_result.screen_ui.modules.pep","result.screen_ui.modules.sanctions":"result.screening_result.screen_ui.modules.sanctions","result.screen_ui.modules.ubo":"result.screening_result.screen_ui.modules.ubo","result.screen_ui.summary":"result.screening_result.screen_ui.summary"},"guaranteed_path":"result.screening_result.screen_ui","live_ui_source_path":"result.screen_ui","modules":{"adverse":["status","decision","display_articles","payload","connected_party_screening"],"crr":["status","decision","risk_breakdown","sector_industry_risk","top_risk_drivers","claims_boundary"],"network":["status","decision","payload"],"pep":["status","decision","payload","connected_party_screening","sanctions_pep_identity_alignment"],"sanctions":["status","decision","matches","raw_match_count","display_match_count","discounted_candidate_count","payload","sanctions_pep_identity_alignment"],"ubo":["status","decision","payload","controlled_entities"]},"sanctions_candidate_policy":"Any sanctions candidate forces sanctions_status=potential_match or stronger and review_required=true.","summary_fields":["subject","overall_decision","risk_score","sanctions_status","pep_status","adverse_status","network_status","ubo_status","sector_industry_status","sector_industry_score","sector_industry_factors","sector_industry_risk","business_nature","occupation","review_required","evidence_count","linked_party_count","warnings","errors","provenance","final_report_ready","sanctions_pep_identity_alignment"]},"snapshot_ids":{"data_snapshot_id":"5d04fa08dd18ba09","pep_snapshot_id":"pep-reference-v728","ruleset_version":"rules-v1","sanctions_snapshot_id":"sanctions-reference-v728"},"trace_contract":"a2a_public_trace_v1","trace_surface_enabled":false,"ui_consistency_contract":{"a2a_result_path":"result.screening_result.screen_ui","final_report_ready":"Only treat result.screening_result.screen_ui as terminal when final_report_ready is true.","live_ui_result_path":"result.screen_ui","recommended_flow":"POST /public/a2a/screen/async, then poll GET /public/a2a/jobs/<job_id> until final_report_ready is true.","same_engine_as_live_ui":true,"screen_ui_field_mapping":{"result.screen_ui":"result.screening_result.screen_ui","result.screen_ui.adjudication":"result.screening_result.screen_ui.adjudication","result.screen_ui.modules":"result.screening_result.screen_ui.modules","result.screen_ui.modules.adverse":"result.screening_result.screen_ui.modules.adverse","result.screen_ui.modules.crr":"result.screening_result.screen_ui.modules.crr","result.screen_ui.modules.network":"result.screening_result.screen_ui.modules.network","result.screen_ui.modules.pep":"result.screening_result.screen_ui.modules.pep","result.screen_ui.modules.sanctions":"result.screening_result.screen_ui.modules.sanctions","result.screen_ui.modules.ubo":"result.screening_result.screen_ui.modules.ubo","result.screen_ui.summary":"result.screening_result.screen_ui.summary"},"source_runtime":"/screen/async and /screen/jobs/<job_id>","trace_semantics":{"job_trace_id":"async orchestration trace for the submitted job","screening_trace_id":"final evidence/screening trace inside result.trace.trace_id","trace_id":"backward-compatible alias of job_trace_id on job endpoints"}},"validation_rules":{"json":{"content_type":"application/json; charset=utf-8","encoding":"Request bodies must be UTF-8 encoded JSON. Send Content-Type: application/json; charset=utf-8. Non-UTF-8 body bytes are rejected before job creation with error_code=invalid_utf8 where the backend can detect the decode failure; some client/proxy paths may otherwise surface as invalid_characters.","invalid_utf8":"Rejected before job creation with HTTP 400, ok=false, error_code=invalid_utf8, request_id when request body bytes are not valid UTF-8.","malformed_json":"Rejected before job creation with HTTP 400, ok=false, error_code=malformed_json, request_id.","object_required":"Request body must be a JSON object."},"name":{"accepted_punctuation":["apostrophe","hyphen","period","comma","ampersand","parentheses","spaces"],"accepted_scripts":["CJK","Hangul","Kana","Arabic","Cyrillic","Latin with accents and combining marks"],"max_length":255,"rejected":["null bytes","C0/C1 controls","Unicode format/bidi control characters","HTML/script tokens","SQL-like payloads","names longer than 255 characters"],"required":"Missing, empty, or whitespace-only name is rejected before job creation with error_code=name_required."},"normalization":{"identity_fields":["raw_name","canonical_name","search_key","aliases","transliteration"],"preserved_fields":["name","type","country","mode","dob"]}}}
