{"openapi":"3.1.0","info":{"title":"DNC LATAM API","version":"2.1.0","description":"Scrub phone-number arrays against the selected country's Do Not Call registry with zero data retention for synchronous v1 and encrypted, time-limited storage for durable v2 jobs. Registry type, provider, chunking, retries, cost, and capacity are internal implementation details. URL versions /v1/ and /v2/ are both current. Deprecation and sunset policy: https://docs.dnclatam.com/guides/versioning","contact":{"name":"DNC LATAM","email":"hello@dnclatam.com","url":"https://dnclatam.com/contact/"},"termsOfService":"https://dnclatam.com/privacy/"},"externalDocs":{"description":"DNC LATAM API versioning and deprecation policy","url":"https://docs.dnclatam.com/guides/versioning"},"servers":[{"url":"https://api.dnclatam.com"}],"x-dnc-contract":{"rate_limit":{"requests_per_window":60,"min_requests_per_window":1,"max_requests_per_window":60000,"window_seconds":60},"sync":{"max_phones":10000,"max_phone_length":64,"max_body_bytes":26214400,"deadline_seconds":15,"complete_result_only":true,"retention_mode":"zero"},"async":{"max_phones":500000,"max_body_bytes":26214400,"admission_deadline_seconds":5,"active_job_hard_cap_seconds":86400,"complete_result_only":true,"retention_mode":"transient-encrypted"},"retention":{"v1_mode":"zero","v1_input_and_result":"request_memory_only","v1_error_responses":"same_zero_retention_headers","v1_idempotency_ttl_seconds":604800,"v2_input_ttl_seconds":86400,"v2_active_job_hard_cap_seconds":86400,"v2_result_ttl_seconds":604800,"v2_metadata_ttl_seconds":2592000,"input_purge":"due_at_terminalization_or_hard_cap_revalidation","input_purge_description":"Attached encrypted input becomes due for purge at terminalization; an unconfirmed or unknown upload becomes due for exact-identity revalidation at the 24-hour hard cap. Failed cleanup remains retryable and observable until absence is verified.","result_ttl_anchor":"successful_terminalization","metadata_ttl_anchor":"terminalization","policy_note":"These are the initial service policy values. A country or legal requirement may require a shorter TTL; a longer TTL requires an explicit privacy decision before launch."},"job_states":{"active":["queued","running"],"terminal":["succeeded","failed","cancelled","expired"],"all":["queued","running","succeeded","failed","cancelled","expired"],"expires_at":"queued/running: admission plus 24-hour active hard cap; succeeded: successful terminalization plus 7-day result TTL; failed/cancelled/expired: terminalization plus 30-day metadata TTL. Attached input is eligible at terminalization; an unconfirmed or unknown upload is revalidated at the hard cap."},"durable_error_mapping":{"description":"Internal durable classifications map to a closed public JobError vocabulary. These mappings never expose provider, balance, cost, capacity, credential, or raw internal error details.","country_maintenance":"country_service_maintenance","country_transient":"country_service_temporarily_unavailable","platform_failure":"platform_failure","active_job_hard_cap":"job_expired","cancelled":null}},"paths":{"/v1/health":{"get":{"summary":"Health check","operationId":"health","description":"Liveness probe. Returns { ok: true } while the process is up. No authentication.","responses":{"200":{"description":"API is available","headers":{"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse","type":"object"}}}}}}},"/v1/ready":{"get":{"summary":"Readiness check","operationId":"readiness","description":"Returns 200 only while the process is accepting work and can reach Postgres.","responses":{"200":{"description":"API is ready to accept traffic","headers":{"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadyResponse","type":"object"}}}},"503":{"description":"API is draining or Postgres is unavailable","headers":{"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotReadyResponse","type":"object"}}}}}}},"/v1/scrub":{"post":{"summary":"Scrub a small batch of phone numbers synchronously","operationId":"scrubPhones","description":"Use v1 for batches of up to 10,000 inputs and 25 MiB of JSON body, whichever limit is reached first, that should complete within the 15-second synchronous execution budget. The response is one complete result or an error; no partial result is returned. Every v1 response, including 4xx and 5xx errors, carries x-retention: zero and Cache-Control: no-store, max-age=0. Phone Input and per-number Scrub Result exist only in request memory; bounded non-phone request metadata (including idempotency digests and quota state) and approved aggregate usage data may remain. Country examples are contractual and still require a matching Country Purchase and operational/activation gates. Use v2 for larger batches or work that may wait on a country service.","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrubRequest","type":"object"},"examples":{"mexico":{"value":{"country":"mx","phones":["+52 55 1234 5678","55 8765 4321","abc"]}},"colombia":{"description":"Colombia is sellable and operational. A real request requires an active Country Purchase; successful initial payment activates access immediately without manual approval. Normal quota and operational availability checks still apply.","value":{"country":"co","phones":["+57 300 555 0101","+57 601 555 0102"]}}}}}},"responses":{"200":{"description":"Scrub completed","headers":{"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."},"Idempotency-Replayed":{"schema":{"type":"string","const":"true"},"description":"Present when an exact completed retry returns without charging or recording usage again."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrubResult","type":"object"}}}},"400":{"description":"The request body, country, or idempotency key is invalid","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"401":{"description":"Missing, invalid, or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidKeyError"}}},"headers":{"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}}},"402":{"description":"The country subscription is inactive","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionInactiveError"}}}},"403":{"description":"The organization is suspended or has no country entitlement","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AccountSuspendedError"},{"$ref":"#/components/schemas/ActivationIncompleteError"},{"$ref":"#/components/schemas/CountryNotInPlanError"}]}}}},"405":{"description":"The HTTP method is not supported for this resource","headers":{"Allow":{"schema":{"type":"string"},"description":"Comma-separated methods supported by the resource."},"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MethodNotAllowedError"}}}},"409":{"description":"The idempotency key is still processing or was reused with a different payload","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Seconds before retrying an in-progress request. Present only for `idempotency_request_in_progress`."},"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/IdempotencyInProgressError"},{"$ref":"#/components/schemas/IdempotencyConflictError"}]}}}},"413":{"description":"The request is too large. For v1 this means the raw HTTP or canonical JSON body exceeds 25 MiB; for v2 it can also mean the canonical durable input or conservative complete-result estimate exceeds 25 MiB. The 500,000-entry limit is a separate hard ceiling and is conditional on these byte checks.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayloadTooLargeError"}}}},"429":{"description":"The technical request rate limit or the country Customer Quota was exceeded","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60}},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Seconds until another technical request may be attempted. Not present for Customer Quota exhaustion."},"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/RateLimitError"},{"$ref":"#/components/schemas/QuotaError"},{"$ref":"#/components/schemas/TemporaryBlockError"}]}}}},"500":{"description":"Unexpected internal failure","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}},"503":{"description":"The platform or selected country cannot complete a complete scrub at this time","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Seconds before a bounded retry may be attempted."},"x-retention":{"schema":{"type":"string","const":"zero"},"description":"Synchronous v1 never persists Phone Input or the per-number Scrub Result after the request completes. The guarantee also applies to error responses."},"cache-control":{"schema":{"type":"string","const":"no-store, max-age=0"},"description":"The response contains customer Scrub data and must not be cached by browsers, CDNs, or shared proxies."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/CountryServiceError"},{"$ref":"#/components/schemas/PlatformFailure"}]}}}}}}},"/v2/scrub":{"post":{"summary":"Admit a durable Scrub Job","operationId":"createScrubJob","description":"Accepts a phone-number array up to a hard 500,000-entry ceiling and returns within a 5-second admission budget with a durable job resource. The raw HTTP body, canonical durable input, and conservative complete-result estimate each have a 25 MiB guard; the first reached limit controls admission. The admission budget covers authentication, validation, entitlement, quota reservation, and enqueueing; it does not include job execution. The job is processed internally in bounded units and succeeds or fails as one complete batch. Admission still requires Country Purchase, availability/activation, quota, and operational availability. CSV is not accepted by the corporate API.","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DurableScrubRequest","type":"object"},"examples":{"durableBatch":{"description":"Contract-only Singapore example. Singapore is planned product coverage, end of September 2026, and is not sellable at checkout; a real 202 requires a future catalog/runtime release and all admission gates.","value":{"country":"sg","phones":["+65 6123 4567","+65 6123 4568"]}}}}}},"responses":{"200":{"description":"Terminal idempotent replay of an already succeeded, failed, cancelled, or expired job","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."},"Idempotency-Replayed":{"schema":{"type":"string","const":"true"},"description":"Present when the exact idempotent request returns an already terminal job"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrubJobStatus","type":"object"}}}},"202":{"description":"Job admitted and queued","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."},"Idempotency-Replayed":{"schema":{"type":"string","const":"true"},"description":"Present when the exact idempotent request returns the already accepted job."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrubJobAccepted","type":"object"}}}},"400":{"description":"The request body, country, or idempotency key is invalid","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"401":{"description":"Missing, invalid, or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidKeyError"}}},"headers":{"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}}},"402":{"description":"The country subscription is inactive","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionInactiveError"}}}},"403":{"description":"The organization is suspended or has no country entitlement","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AccountSuspendedError"},{"$ref":"#/components/schemas/ActivationIncompleteError"},{"$ref":"#/components/schemas/CountryNotInPlanError"}]}}}},"405":{"description":"The HTTP method is not supported for this resource","headers":{"Allow":{"schema":{"type":"string"},"description":"Comma-separated methods supported by the resource."},"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MethodNotAllowedError"}}}},"409":{"description":"The idempotency key is still processing or was reused with a different payload","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Seconds before retrying an in-progress request. Present only for `idempotency_request_in_progress`."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/IdempotencyInProgressError"},{"$ref":"#/components/schemas/IdempotencyConflictError"}]}}}},"413":{"description":"The raw HTTP body, canonical durable input, or conservative complete-result estimate exceeds 25 MiB; the 500,000-entry ceiling is also enforced independently.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayloadTooLargeError"}}}},"429":{"description":"The technical request rate limit or the country Customer Quota was exceeded","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60}},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Seconds until another technical request may be attempted. Not present for Customer Quota exhaustion."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/RateLimitError"},{"$ref":"#/components/schemas/QuotaError"},{"$ref":"#/components/schemas/TemporaryBlockError"}]}}}},"500":{"description":"Unexpected internal failure","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}},"503":{"description":"Country availability or an internal platform component does not permit accepting the job. Registry Capacity and other provider capacity causes are intentionally mapped to a generic country or platform error.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1}},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/CountryServiceError"},{"$ref":"#/components/schemas/PlatformFailure"}]}}}}}}},"/v2/scrub/{job_id}":{"parameters":[{"name":"job_id","in":"path","required":true,"description":"Opaque lowercase UUID returned at admission.","schema":{"$ref":"#/components/schemas/JobId"}}],"get":{"summary":"Get Scrub Job status","operationId":"getScrubJob","description":"Return the public state of one durable Scrub Job. Authenticate with a Bearer API key. The job is identified by the path parameter job_id.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Current public job state","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrubJobStatus","type":"object"}}}},"401":{"description":"Missing, invalid, or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidKeyError"}}},"headers":{"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}}},"404":{"description":"Job does not exist for this organization","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobNotFoundError"}}}},"405":{"description":"The HTTP method is not supported for this resource","headers":{"Allow":{"schema":{"type":"string"}},"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MethodNotAllowedError"}}}},"429":{"description":"The organization exceeded its configured shared technical window (default 60, bounded 1-60000 requests per 60 seconds) or triggered the abuse guard","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1}},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/RateLimitError"},{"$ref":"#/components/schemas/TemporaryBlockError"}]}}}},"500":{"description":"Unexpected internal failure","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}},"503":{"description":"The platform could not complete the control operation","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1}},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformFailure"}}}}}}},"/v2/scrub/{job_id}/result":{"parameters":[{"name":"job_id","in":"path","required":true,"description":"Opaque lowercase UUID returned at admission.","schema":{"$ref":"#/components/schemas/JobId"}}],"get":{"summary":"Get a complete Scrub Job result","operationId":"getScrubJobResult","description":"Return the complete Scrub Result for a succeeded durable job. Authenticate with a Bearer API key. Queued or running jobs return 409; expired results return 410.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Scrub completed successfully","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrubResult","type":"object"}}}},"401":{"description":"Missing, invalid, or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidKeyError"}}},"headers":{"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}}},"404":{"description":"Job does not exist for this organization","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobNotFoundError"}}}},"405":{"description":"The HTTP method is not supported for this resource","headers":{"Allow":{"schema":{"type":"string"}},"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MethodNotAllowedError"}}}},"409":{"description":"The job is queued, running, failed, or cancelled. Queued/running jobs may be polled again; failed/cancelled jobs have no complete result. Expired jobs use 410 job_expired.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Present when a bounded retry may help, especially while the job is queued or running."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResultNotReadyError"}}}},"410":{"description":"The result is gone because the successful result retention window elapsed or the active job hard cap elapsed.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/JobResultExpiredError"},{"$ref":"#/components/schemas/JobExpiredError"}]}}}},"429":{"description":"The organization exceeded its configured shared technical window (default 60, bounded 1-60000 requests per 60 seconds) or triggered the abuse guard","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1}},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/RateLimitError"},{"$ref":"#/components/schemas/TemporaryBlockError"}]}}}},"500":{"description":"Unexpected internal failure","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}},"503":{"description":"The platform could not complete the control operation","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1}},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformFailure"}}}}}}},"/v2/scrub/{job_id}/cancel":{"parameters":[{"name":"job_id","in":"path","required":true,"description":"Opaque lowercase UUID returned at admission.","schema":{"$ref":"#/components/schemas/JobId"}}],"post":{"summary":"Request cancellation of a Scrub Job","operationId":"cancelScrubJob","description":"Cancellation is an explicit idempotent action. A queued job can be cancelled immediately. For a running provider call, the job remains running until the provider effect is reconciled; once reconciled, the job becomes cancelled, discards the result, and releases Customer Quota. An already-terminal job keeps its state. The API never returns a partial result or silently claims that an uncertain call was cancelled.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The job is already terminal or cancellation completed","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrubJobStatus","type":"object"}}}},"202":{"description":"Cancellation was accepted and reconciliation is still in progress","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrubJobStatus","type":"object"}}}},"401":{"description":"Missing, invalid, or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidKeyError"}}},"headers":{"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}}},"404":{"description":"Job does not exist for this organization","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobNotFoundError"}}}},"405":{"description":"The HTTP method is not supported for this resource","headers":{"Allow":{"schema":{"type":"string"}},"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MethodNotAllowedError"}}}},"429":{"description":"The organization exceeded its configured shared technical window (default 60, bounded 1-60000 requests per 60 seconds) or triggered the abuse guard","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1}},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/RateLimitError"},{"$ref":"#/components/schemas/TemporaryBlockError"}]}}}},"500":{"description":"Unexpected internal failure","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}},"503":{"description":"The platform could not complete the control operation","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"Effective maximum authenticated requests in the current 60-second window for this organization. The safe default is 60; operator overrides are bounded from 1 to 60000."},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"Requests remaining in the current technical window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the current technical window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1,"maximum":60000,"default":60},"description":"IETF RateLimit-Limit. Same value as X-RateLimit-Limit."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0,"maximum":60000},"description":"IETF RateLimit-Remaining. Same value as X-RateLimit-Remaining."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"IETF RateLimit-Reset. Same Unix timestamp as X-RateLimit-Reset."},"Retry-After":{"schema":{"type":"integer","minimum":1}},"x-retention":{"schema":{"type":"string","const":"transient-encrypted"},"description":"v2 may retain encrypted input, result, and non-phone metadata only for the published lifecycle. This is distinct from v1 zero-data-retention."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformFailure"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"dnc_live_*"}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":true,"description":"Opaque key for one logical request, scoped to the authenticated API key. Use a high-entropy value and never include phone numbers or other PII. Exact retries are protected for at least 7 days for v1; v2 keeps the accepted job identity for the job metadata lifetime.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x21-\\x7e]+$"},"example":"018f47c2-9b0d-7c95-bf47-cd84c12f8912"}},"schemas":{"CountryCode":{"type":"string","enum":["mx","ar","co","es","au","sg"],"description":"Technical country code. The current sellable catalog is mx/ar/co. es/au/sg are planned product coverage, end of September 2026, and are not sellable at checkout until their catalog and runtime are released together. Every real request requires a matching Country Purchase and country availability/activation. Colombia is sellable and operational, and a successful initial payment activates its complete API access immediately without manual approval; entitlement and operational availability are still evaluated at admission."},"JobId":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$","description":"Opaque lowercase UUIDv4 generated by DNC LATAM. It carries no country, tenant, provider, or execution meaning; tenant identity remains internal and is never returned."},"HealthResponse":{"type":"object","additionalProperties":false,"required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}},"ReadyResponse":{"type":"object","additionalProperties":false,"required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}},"NotReadyResponse":{"type":"object","additionalProperties":false,"required":["ok"],"properties":{"ok":{"type":"boolean","const":false}}},"ScrubRequest":{"type":"object","description":"The v1 body is limited by both 10,000 phone entries and a 25 MiB JSON body. The first limit reached controls admission.","properties":{"country":{"$ref":"#/components/schemas/CountryCode"},"phones":{"type":"array","minItems":1,"maxItems":10000,"items":{"type":"string","maxLength":64},"description":"Phone numbers in international or supported local formats. Invalid and duplicate entries count toward Customer Quota."}},"required":["country","phones"],"additionalProperties":false},"DurableScrubRequest":{"type":"object","description":"The public API accepts arrays only. Admission has a hard 500,000-entry ceiling and three independent 25 MiB byte guards: raw HTTP body, canonical durable input, and conservative complete-result estimate. The first reached limit controls admission. CSV uploads are available only through the authenticated panel and are not accepted here.","properties":{"country":{"$ref":"#/components/schemas/CountryCode"},"phones":{"type":"array","minItems":1,"maxItems":500000,"items":{"type":"string","maxLength":64},"description":"Phone numbers in international or supported local formats. Durable jobs accept up to 500,000 entries, but admission may reject earlier when the raw HTTP body, canonical durable input, or conservative complete-result estimate exceeds 25 MiB. Invalid and duplicate entries count toward Customer Quota."}},"required":["country","phones"],"additionalProperties":false},"InvalidPhone":{"type":"object","description":"An original input that failed structural validation for the selected registry country or was explicitly rejected by that registry. Invalid inputs do not fail the batch.","properties":{"input":{"type":"string","description":"Original input exactly as submitted."},"reason":{"type":"string","description":"`empty`: blank or separators only. `unparseable`: not recognizable as a phone number. `wrong_country`: explicit country code does not match the requested registry. `too_short` or `too_long`: normalized national number has the wrong number of digits. `provider_rejected`: the selected registry did not return an acceptable determination for this otherwise structurally valid input; it is not classified as safe.","enum":["empty","unparseable","wrong_country","too_short","too_long","provider_rejected"]}},"required":["input","reason"],"additionalProperties":false},"ScrubRecord":{"type":"object","description":"Phone-free evidence of one Scrub. Public name: Screening record / comprobante de screening. Counts and metadata only; never phone inputs or per-number determinations.","additionalProperties":false,"required":["record_id","record_version","surface","organization","country","registry","status","counts","submitted_at","completed_at","record_issued_at"],"properties":{"record_id":{"$ref":"#/components/schemas/JobId"},"record_version":{"type":"string","const":"1"},"surface":{"type":"string","enum":["api_v1","api_v2","panel_csv"]},"request_id":{"type":"string","description":"Present only for api_v1."},"job_id":{"$ref":"#/components/schemas/JobId","description":"Present only for api_v2."},"client_scrub_reference":{"type":"string","format":"uuid","description":"Optional UUIDv4 Client Scrub Reference on the record when supplied. Not an idempotency key. Request-body acceptance is not published in this contract version."},"organization":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200}}},"country":{"$ref":"#/components/schemas/CountryCode"},"registry":{"type":"object","additionalProperties":false,"required":["authority","mode"],"properties":{"authority":{"type":"string"},"mode":{"type":"string","enum":["snapshot","live_consult"]},"source_observed_at":{"type":"string","format":"date-time"},"consulted_at":{"type":"string","format":"date-time"}}},"status":{"type":"string","enum":["succeeded","failed","cancelled","expired"]},"failure":{"type":"object","additionalProperties":false,"required":["error","country"],"properties":{"error":{"type":"string"},"country":{"$ref":"#/components/schemas/CountryCode"}}},"counts":{"type":"object","additionalProperties":false,"required":["submitted","prohibited","safe","invalid"],"properties":{"submitted":{"type":"integer","minimum":1},"prohibited":{"type":"integer","minimum":0},"safe":{"type":"integer","minimum":0},"invalid":{"type":"integer","minimum":0}}},"submitted_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"},"record_issued_at":{"type":"string","format":"date-time"}}},"ScrubResult":{"type":"object","description":"One complete result for the submitted Scrub Batch. No provider chunks or partial result are exposed.","properties":{"prohibited_numbers_to_call":{"type":"array","items":{"type":"string"},"description":"Original, structurally valid inputs found in the selected DNC registry. Do not call these numbers. Original formatting and relative order within this category are preserved; duplicates are returned once per occurrence."},"safe_numbers_to_call":{"type":"array","items":{"type":"string"},"description":"Original, structurally valid inputs not found in the selected DNC registry at the time of the check. `safe` is limited to this registry result; it does not confirm that a number is active or reachable, prove consent, or grant universal legal permission to call."},"invalid_numbers":{"type":"array","items":{"$ref":"#/components/schemas/InvalidPhone"},"description":"Inputs that failed structural validation or were explicitly rejected by the selected registry, in their original relative order."},"summary":{"type":"object","description":"Aggregate counts for this request. `summary.total_checked` equals `summary.prohibited_numbers + summary.safe_numbers + summary.invalid_numbers`.","properties":{"total_checked":{"type":"integer","minimum":0,"description":"Total inputs submitted, including invalid inputs and duplicates."},"prohibited_numbers":{"type":"integer","minimum":0,"description":"Number of entries returned in `prohibited_numbers_to_call`, including repeated inputs."},"safe_numbers":{"type":"integer","minimum":0,"description":"Number of entries returned in `safe_numbers_to_call`, including repeated inputs."},"invalid_numbers":{"type":"integer","minimum":0,"description":"Number of entries returned in `invalid_numbers`."}},"required":["total_checked","prohibited_numbers","safe_numbers","invalid_numbers"],"additionalProperties":false},"scrub_record":{"$ref":"#/components/schemas/ScrubRecord","description":"Phone-free Screening record for this successful Scrub. Delivered with the Scrub Result; v1 does not persist it."}},"required":["prohibited_numbers_to_call","safe_numbers_to_call","invalid_numbers","summary"],"additionalProperties":false},"Error":{"type":"object","description":"Base error envelope. It is only composed into a concrete public error schema; every concrete error closes unknown fields with additionalProperties or unevaluatedProperties.","properties":{"error":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string","description":"Opaque support identifier. It never contains phone data."}},"required":["error"]},"ValidationError":{"type":"object","properties":{"error":{"type":"string","enum":["missing_idempotency_key","invalid_idempotency_key","invalid_body","unsupported_country","too_many_phones","phone_too_long"]},"message":{"type":"string"},"max":{"type":"integer","minimum":1},"max_chars":{"type":"integer","minimum":1}},"required":["error","message"],"additionalProperties":false},"InvalidKeyError":{"type":"object","properties":{"error":{"type":"string","const":"invalid_key"}},"required":["error"],"additionalProperties":false},"MethodNotAllowedError":{"type":"object","properties":{"error":{"type":"string","const":"method_not_allowed"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false},"CountryServiceError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","enum":["country_service_maintenance","country_service_temporarily_unavailable"]},"country":{"$ref":"#/components/schemas/CountryCode"},"retry_after":{"type":"integer","minimum":1,"description":"Seconds before a bounded retry may be attempted."}},"required":["error","country","message"]}],"unevaluatedProperties":false,"description":"The selected country could not produce a complete determination. A paid prepaid country that is pending activation maps to country_service_temporarily_unavailable; the public API never exposes pending_activation, Registry Capacity, provider balance, or prepaid credits. No partial result is returned and Customer Quota is not consumed."},"PlatformFailure":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"platform_failure"}},"required":["error","message"]}],"unevaluatedProperties":false,"description":"DNC LATAM could not complete the batch because an internal platform component failed. No partial result is returned and Customer Quota is not consumed."},"QuotaError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"customer_quota_exceeded"},"country":{"$ref":"#/components/schemas/CountryCode"},"limit":{"type":"integer","minimum":0},"used":{"type":"integer","minimum":0},"requested":{"type":"integer","minimum":1},"upgrade_url":{"type":"string","format":"uri"}},"required":["error","message","country","limit","used","requested","upgrade_url"]}],"unevaluatedProperties":false,"description":"The requested number of inputs would exceed the organization's Customer Quota for the selected country. No provider call starts and no quota is consumed."},"RateLimitError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"rate_limit_exceeded"},"limit":{"type":"integer","minimum":1,"maximum":60000},"window_seconds":{"type":"integer","const":60},"retry_after":{"type":"integer","minimum":1}},"required":["error","message","limit","window_seconds","retry_after"]}],"unevaluatedProperties":false,"description":"The organization exceeded its configured shared technical request limit across its API keys. The safe default is 60 requests per 60 seconds; an operator may configure 1 to 60,000."},"TemporaryBlockError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"temporarily_blocked"},"retry_after":{"type":"integer","minimum":1,"maximum":900}},"required":["error","message","retry_after"]}],"unevaluatedProperties":false,"description":"The source temporarily triggered the API abuse guard. This is separate from Customer Quota and country availability."},"PayloadTooLargeError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"payload_too_large"},"max_bytes":{"type":"integer","const":26214400}},"required":["error","max_bytes"]}],"unevaluatedProperties":false},"SubscriptionInactiveError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"subscription_inactive"}},"required":["error","message"]}],"unevaluatedProperties":false},"AccountSuspendedError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"account_suspended"}},"required":["error","message"]}],"unevaluatedProperties":false},"ActivationIncompleteError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"activation_incomplete"}},"required":["error","message"]}],"unevaluatedProperties":false,"description":"The organization has not completed its required privacy/onboarding configuration. This is not a prepaid-country capacity signal."},"CountryNotInPlanError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"country_not_in_plan"},"country":{"$ref":"#/components/schemas/CountryCode"}},"required":["error","message","country"]}],"unevaluatedProperties":false},"IdempotencyInProgressError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"idempotency_request_in_progress"}},"required":["error","message"]}],"unevaluatedProperties":false},"IdempotencyConflictError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"idempotency_key_reused"}},"required":["error","message"]}],"unevaluatedProperties":false},"JobNotFoundError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"job_not_found"}},"required":["error","message"]}],"unevaluatedProperties":false,"description":"The job does not exist or belongs to another organization. Both cases use the same response to prevent cross-tenant enumeration."},"JobResultNotReadyError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"job_result_not_ready"},"status":{"type":"string","enum":["queued","running","failed","cancelled"],"description":"Queued and running jobs may still complete; failed and cancelled jobs are terminal and have no complete result. Expired jobs use 410 job_expired instead."},"retry_after":{"type":"integer","minimum":1}},"required":["error","message","status"]}],"unevaluatedProperties":false},"JobResultExpiredError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"job_result_expired"},"job_id":{"$ref":"#/components/schemas/JobId"}},"required":["error","message","job_id"]}],"unevaluatedProperties":false,"description":"The encrypted result exceeded its seven-day result retention window measured from successful terminalization. Job metadata may remain available until its metadata TTL measured from terminalization."},"JobExpiredError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"job_expired"},"job_id":{"$ref":"#/components/schemas/JobId"}},"required":["error","message","job_id"]}],"unevaluatedProperties":false,"description":"The job could not terminalize before its 24-hour encrypted-input hard cap. Its quota reservation was released. An attached input becomes due for purge at terminalization; an unconfirmed or unknown upload becomes due for exact-identity revalidation at this cap. Failed cleanup remains retryable and observable until absence is verified."},"InternalError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"string","const":"internal"}},"required":["error","request_id"]}],"unevaluatedProperties":false,"description":"An unexpected failure outside the public taxonomy. The request_id is safe to share with support."},"JobError":{"type":"object","description":"Closed terminal public error vocabulary for a durable job. Internal country, worker, storage, lease, and retry classifications map to these values; provider names, balances, capacity causes, and raw internal codes are never exposed. A country service failure never consumes Customer Quota and never includes a partial result.","properties":{"error":{"type":"string","enum":["country_service_maintenance","country_service_temporarily_unavailable","platform_failure","job_expired"]},"message":{"type":"string"},"country":{"$ref":"#/components/schemas/CountryCode"},"retry_after":{"type":"integer","minimum":1},"request_id":{"type":"string"}},"required":["error","message"],"allOf":[{"if":{"properties":{"error":{"enum":["country_service_maintenance","country_service_temporarily_unavailable"]}},"required":["error"]},"then":{"required":["country"]}}],"additionalProperties":false},"ScrubJobAccepted":{"type":"object","description":"The durable job was admitted. Admission reserves Customer Quota; the reservation is finalized exactly once on complete success or released on failure, cancellation, or hard-cap expiration. Attached encrypted input becomes due for purge at terminalization; an unconfirmed or unknown upload becomes due for exact-identity revalidation at the 24-hour hard cap. Failed cleanup remains retryable and observable until absence is verified.","properties":{"job_id":{"$ref":"#/components/schemas/JobId"},"status":{"type":"string","const":"queued"},"country":{"$ref":"#/components/schemas/CountryCode"},"submitted_count":{"type":"integer","minimum":1},"created_at":{"type":"string","format":"date-time"},"status_url":{"type":"string","format":"uri"},"result_url":{"type":"string","format":"uri"},"cancel_url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time","description":"The admission timestamp plus the 24-hour active job/input hard cap. If the job terminalizes sooner, an attached input becomes due for purge at terminalization; an unconfirmed or unknown upload becomes due for exact-identity revalidation at this hard cap. Failed cleanup remains retryable and observable until absence is verified. Later status responses publish the state-dependent result or metadata expiration."}},"required":["job_id","status","country","submitted_count","created_at","status_url","result_url","cancel_url","expires_at"],"additionalProperties":false},"ScrubJobStatus":{"type":"object","description":"Public job state. Provider names, retries, chunks, cost, balance, credentials, and raw provider errors are never included.","properties":{"job_id":{"$ref":"#/components/schemas/JobId"},"status":{"type":"string","enum":["queued","running","succeeded","failed","cancelled","expired"]},"country":{"$ref":"#/components/schemas/CountryCode"},"submitted_count":{"type":"integer","minimum":1},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"State-dependent expiration: queued/running = admission plus the 24-hour active job/input hard cap; succeeded = successful terminalization plus the seven-day result TTL; failed/cancelled/expired = terminalization plus the 30-day metadata TTL. Attached input is eligible for purge at terminalization; an unconfirmed or unknown upload is revalidated at the 24-hour hard cap. This field does not signal input availability."},"status_url":{"type":"string","format":"uri"},"result_url":{"type":"string","format":"uri","description":"Available as a link when a result can still be retrieved."},"error":{"$ref":"#/components/schemas/JobError","description":"Required when status is failed (or expired) and contains the closed public JobError mapping. Cancelled jobs never include this field: cancellation is not an error."},"scrub_record":{"$ref":"#/components/schemas/ScrubRecord","description":"Phone-free Screening record once the job is terminal and within the metadata TTL. Cancelled records omit failure. Owning organization only."}},"required":["job_id","status","country","submitted_count","created_at","updated_at","expires_at","status_url"],"allOf":[{"if":{"properties":{"status":{"enum":["failed","expired"]}},"required":["status"]},"then":{"required":["error"]}},{"if":{"properties":{"status":{"const":"cancelled"}},"required":["status"]},"then":{"not":{"required":["error"]}}}],"additionalProperties":false},"ScrubJobRetention":{"type":"object","description":"Initial public retention policy. Legal or country-specific constraints can shorten these values; a longer retention needs an explicit privacy decision.","properties":{"input_ttl_seconds":{"type":"integer","const":86400,"description":"Maximum encrypted-input lifetime while a job is active, measured from admission. Attached input is eligible for purge at terminalization; an unconfirmed or unknown upload is revalidated at the 24-hour hard cap."},"active_job_hard_cap_seconds":{"type":"integer","const":86400,"description":"Queued/running jobs must terminalize by admission plus this hard cap. On expiry, attached input is already due for purge; an unconfirmed or unknown upload becomes due for exact-identity revalidation, and the reservation is released. Failed cleanup remains retryable and observable until absence is verified."},"result_ttl_seconds":{"type":"integer","const":604800,"description":"Encrypted successful result lifetime measured from the successful terminalization timestamp."},"metadata_ttl_seconds":{"type":"integer","const":2592000,"description":"Non-phone job metadata lifetime measured from terminalization, including failed, cancelled, expired, and succeeded jobs."},"input_purge":{"type":"string","const":"due_at_terminalization_or_hard_cap_revalidation","description":"Attached encrypted input becomes due for purge at terminalization; an unconfirmed or unknown upload becomes due for exact-identity revalidation at the 24-hour hard cap. Failed cleanup remains retryable and observable until absence is verified."},"result_ttl_anchor":{"type":"string","const":"successful_terminalization"},"metadata_ttl_anchor":{"type":"string","const":"terminalization"}},"required":["input_ttl_seconds","active_job_hard_cap_seconds","result_ttl_seconds","metadata_ttl_seconds","input_purge","result_ttl_anchor","metadata_ttl_anchor"],"additionalProperties":false}}}}