> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dnclatam.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Admit a durable Scrub Job

> 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.



## OpenAPI

````yaml https://api.dnclatam.com/openapi.json post /v2/scrub
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.
servers:
  - url: https://api.dnclatam.com
security: []
paths:
  /v2/scrub:
    post:
      summary: Admit a durable Scrub Job
      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.
      operationId: createScrubJob
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DurableScrubRequest'
            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.
            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'
        '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.
            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'
        '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.
            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.
            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.
            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.
            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.
            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.
            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.
            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.
            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.
            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'
      security:
        - bearerAuth: []
components:
  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:
    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
    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
    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
    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
    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
    MethodNotAllowedError:
      type: object
      properties:
        error:
          type: string
          const: method_not_allowed
        message:
          type: string
      required:
        - error
        - message
      additionalProperties: 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
    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
    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.
    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.
    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.
    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.
    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.
    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.
    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
    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
    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
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: dnc_live_*

````