uChecker · OpenAPI Overlay 1.0.0

API Evangelist enhancement overlay for uChecker Валидация Email API

6 actions 6 updates update extends openapi/uchecker-email-api-openapi.yml
Generated by API Evangelist Written by API Evangelist tooling for uChecker's API. It is a proposal applied on top of the contract, not a document uChecker publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

x-idempotencyx-asyncx-api-evangelistx-meteringx-rate-limitsx-error-envelopex-languagex-callback

Targets 6

$.info
$.paths['/api/v1/validate/bulk'].post
$.paths['/api/v1/validate/single'].post
$.components.schemas.BulkValidationDto.properties.webhook_url
$.components.schemas.ValidationResultItem
$.components.schemas.PaginationInfo

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancement overlay for uChecker Валидация Email API
  version: 1.0.0
extends: openapi/uchecker-email-api-openapi.yml
x-generated: '2026-08-16'
x-method: generated
x-source: >-
  openapi/uchecker-email-api-openapi.yml, conventions/uchecker-conventions.yml,
  errors/uchecker-problem-types.yml, asyncapi/uchecker-webhooks.yml,
  rate-limits/uchecker-rate-limits.yml, mcp/uchecker-tool-crosswalk.yml
x-rationale: >-
  uChecker's published contract carries its integration guidance in one large Russian-language
  info.description blob: the credit model, the "no rate limits" statement, the task lifecycle,
  the error envelope and the polling advice are all prose. None of it is attached to the
  operations it governs, and none of it is in English. This overlay attaches the runtime
  semantics to the operations themselves, in machine-readable extensions, WITHOUT mutating the
  original spec. It also records the two contract defects found during enrichment (single
  validation has no idempotency key; the callback payload is unspecified) so a consumer sees
  them at the point of use. Apply with any Overlay 1.0.0 processor.
actions:
  - target: $.info
    description: Record the runtime conventions of the API as structured extensions.
    update:
      x-api-evangelist:
        conventions: conventions/uchecker-conventions.yml
        errors: errors/uchecker-problem-types.yml
        webhooks: asyncapi/uchecker-webhooks.yml
        rate-limits: rate-limits/uchecker-rate-limits.yml
        data-model: data-model/uchecker-data-model.yml
        mcp: mcp/uchecker-mcp.yml
      x-metering:
        model: prepaid-credits
        unit: 1 email = 1 credit
        charged_at: enqueue
        not_charged: syntactically invalid addresses in a bulk submission
        balance_operation: ValidationController_getBalance
        exhaustion_status: 403
      x-rate-limits:
        published: false
        provider_statement: There are no rate limits; throughput is governed by credit balance.
        response_headers: []
        status_on_exhaustion: 403
      x-error-envelope:
        format: custom-json
        rfc9457: false
        fields:
          success: boolean, always false
          error: human-readable string, Russian
        machine_readable_code: false
      x-language:
        contract: ru
        error_messages: ru
        note: >-
          The reference, the tag names and every error string are Russian. An English
          product surface exists at https://uchecker.net/en but the contract is not
          translated.
  - target: $.paths['/api/v1/validate/bulk'].post
    description: Surface the idempotency contract on the one operation that supports it.
    update:
      x-idempotency:
        supported: true
        mechanism: request-body-field
        field: idempotency_key
        header: null
        behavior: >-
          A repeat submission carrying an existing key returns the current status of the
          existing task instead of creating a new one and re-charging credits.
        retention: undocumented
      x-async:
        pattern: submit-then-poll
        poll_operation: ValidationController_getTask
        recommended_interval_seconds: 5-10
        push_alternative: webhook_url
  - target: $.paths['/api/v1/validate/single'].post
    description: >-
      Flag that the single-address endpoint has no idempotency protection — a retry
      double-charges.
    update:
      x-idempotency:
        supported: false
        note: >-
          Unlike POST /api/v1/validate/bulk, this operation accepts no idempotency_key. A
          network-level retry creates a second task and debits a second credit. Prefer the
          bulk endpoint with a single-element array when a retry is possible.
      x-async:
        pattern: submit-then-poll
        poll_operation: ValidationController_getTask
        push_alternative: webhook_url
  - target: $.components.schemas.BulkValidationDto.properties.webhook_url
    description: Record that the callback payload is unspecified and unsigned.
    update:
      x-callback:
        payload_schema: unpublished
        signing: none
        retries: undocumented
        expected_response: 200
        note: >-
          uChecker POSTs results to this URL on completion but publishes no payload schema
          and no signature. Verify the outcome out-of-band via
          ValidationController_getTaskResults before acting on a callback.
  - target: $.components.schemas.ValidationResultItem
    description: Record the contract/marketing discrepancy in the result model.
    update:
      x-result-model:
        contract: binary — validation_result is good | bad
        marketing: >-
          The website and dashboard describe Good / Bad / Risk archives and a five-way read
          (deliverable, undeliverable, catch-all, disposable, role-based) plus an "unknown"
          bucket.
        guidance: >-
          Build against the contract. Expect good|bad from the API and treat the richer
          taxonomy as a dashboard-only presentation until the provider documents it.
  - target: $.components.schemas.PaginationInfo
    description: Name the pagination style explicitly.
    update:
      x-pagination:
        style: page-number
        params: [page, limit]
        limit_min: 1
        limit_max: 100
        limit_default: 10
        cursor: false