openapi: 3.1.0
info:
  title: Zorro API
  version: 1.0.0
  summary: "UK company data: resolve one company, or enrich a list as a job."
  description: The /v1 REST API. Every value comes back in an envelope that says
    where it came from, how current it is and whether to review it.
  contact:
    name: Zorro support
    email: support@getzorro.ai
    url: https://getzorro.ai/docs/api
servers:
  - url: https://api.getzorro.ai
    description: Production
security:
  - ApiKey: []
tags:
  - name: Spec
    description: This description, served from the API host. No key needed.
  - name: Key
    description: Check a key and read the catalogue.
  - name: Resolve
    description: Resolve one company in one request.
  - name: Jobs
    description: Run a list of companies in the background.
  - name: Usage
    description: See what your account has used.
externalDocs:
  description: Documentation
  url: https://getzorro.ai/docs/api
paths:
  /v1/openapi.json:
    get:
      operationId: getOpenapi
      tags:
        - Spec
      summary: Fetch this description
      description: >-
        This description, from the host it describes. The response is a 302 to
        where the file is published, which is the same document you are reading
        now; follow redirects, as every HTTP client and code generator does by
        default.


        No key is needed, and the answer is the same for every account. `/v1/openapi` answers identically.
      security: []
      responses:
        "302":
          description: Redirect to the published description.
          headers:
            Location:
              description: Where the file is served.
              schema:
                type: string
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /v1/whoami:
    get:
      operationId: getWhoami
      tags:
        - Key
      summary: Check a key and see its access
      description: >-
        This call confirms the key works and returns what it can do: its scopes,
        every block with its availability and tier, the row cap and the
        per-minute request allowance. The call is not billed and does not change
        data.


        Required scope: `read`.
      x-required-scope: read
      security:
        - ApiKey: []
      responses:
        "200":
          description: The key is valid.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WhoAmI"
              examples:
                whoami_200:
                  $ref: "#/components/examples/whoami_200"
        "401":
          description: The key is missing, malformed, revoked or wrong. The message is the
            same in every case.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              examples:
                whoami_401_invalid:
                  $ref: "#/components/examples/whoami_401_invalid"
                whoami_401_missing:
                  $ref: "#/components/examples/whoami_401_missing"
        "403":
          description: The key lacks the scope this endpoint needs; the message names it.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /v1/blocks:
    get:
      operationId: listBlocks
      tags:
        - Key
      summary: List the block catalogue
      description: >-
        This call returns every block with its description, source, availability
        for this key, tier, latency class and coverage, plus the confidence
        contract and the option vocabularies. The call is not billed and does
        not change data.


        Required scope: `read`.
      x-required-scope: read
      security:
        - ApiKey: []
      responses:
        "200":
          description: The catalogue is returned.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BlockCatalog"
        "401":
          description: The key is missing, malformed, revoked or wrong. The message is the
            same in every case.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: The key lacks the scope this endpoint needs; the message names it.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /v1/resolve:
    get:
      operationId: resolveCompany
      tags:
        - Resolve
      summary: Resolve one company
      description: >-
        Send one company and get its blocks back. The response carries a job_id,
        so the row can also be read from the job endpoints. The limit is 60
        requests a minute per key.


        With defer_live=true the response comes at once; blocks still being checked are {"status":"pending"} and are collected from results_url.


        Required scope: `enrich`.
      x-required-scope: enrich
      security:
        - ApiKey: []
      parameters:
        - name: company_number
          in: query
          required: false
          description: This is the Companies House number. Give exactly one of
            company_number, company_name or domain.
          schema:
            type: string
            maxLength: 20
        - name: company_name
          in: query
          required: false
          description: This is the registered name. More than one live match answers 409
            with candidates.
          schema:
            type: string
            maxLength: 500
        - name: domain
          in: query
          required: false
          description: Provide a bare host or URL. A register, directory, social or
            site-builder host answers 404 not_own_site.
          schema:
            type: string
            maxLength: 255
        - name: blocks
          in: query
          required: false
          description: Provide comma-separated block keys. By default, every block enabled
            for the key is returned. Blocks the key cannot have come back
            not_enabled with a warning; if none is left, the request answers
            403.
          schema:
            type: string
          style: form
          explode: false
        - name: validation
          in: query
          required: false
          description: The domain_validation modes are none, rules, live, officers, ai.
            The default modes are rules,live.
          schema:
            type: string
          style: form
          explode: false
        - name: min_confidence
          in: query
          required: false
          description: Set your threshold from 0 to 1. The default is 0.5.
          schema:
            type: number
            minimum: 0
            maximum: 1
        - name: defer_live
          in: query
          required: false
          description: When true, the response contains the available blocks; live blocks
            are pending and collected from results_url. This cannot be combined
            with wait=false or store=false.
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - name: wait
          in: query
          required: false
          description: When false, the response is 202 with the job and results_url;
            collect the row from there.
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - name: store
          in: query
          required: false
          description: When false, the row is not kept for later reads (expires_at null,
            stored false).
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - name: discover
          in: query
          required: false
          description: Specify the blocks to look up when the company has no value on
            file. This is off by default on resolve.
          schema:
            type: string
          style: form
          explode: false
        - name: max_live_lookups
          in: query
          required: false
          description: This sets the number of website searches allowed and defaults to 1
            when discover is given.
          schema:
            type: integer
            minimum: 0
        - name: ref
          in: query
          required: false
          description: This is your reference, which is echoed back.
          schema:
            type: string
            maxLength: 120
        - name: read_accounts_pdf
          in: query
          required: false
          description: For financials_live, this reads PDF-only accounts. It is off by
            default.
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - name: web_search
          in: query
          required: false
          description: This is a Premium option enabled per account.
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - name: google_business
          in: query
          required: false
          description: For trading_address, this adds the listing check.
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - name: contact_roles
          in: query
          required: false
          description: For contacts, the values are owner, director, finance, operations,
            in order of preference.
          schema:
            type: string
          style: form
          explode: false
        - name: max_contacts
          in: query
          required: false
          description: For contacts, use 1 to 5; the default is 3.
          schema:
            type: integer
            minimum: 1
            maximum: 5
        - name: verify_emails
          in: query
          required: false
          description: For contacts, the default is true.
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - name: contacts_lookup
          in: query
          required: false
          description: For contacts, use cached_only or live; the default is live.
          schema:
            type: string
            enum:
              - cached_only
              - live
        - name: include_phone
          in: query
          required: false
          description: For contacts, this returns a phone number per person. With
            contacts_lookup=live, it needs defer_live=true or wait=false;
            otherwise, the response is 400.
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - name: include_linkedin
          in: query
          required: false
          description: For contacts, the default is true.
          schema:
            type: string
            enum:
              - "true"
              - "false"
        - $ref: "#/components/parameters/IdempotencyKey"
      responses:
        "200":
          description: The company is returned. With defer_live, the response may be
            incomplete.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ResolveResponse"
              examples:
                resolve_progressive_first_200:
                  $ref: "#/components/examples/resolve_progressive_first_200"
                resolve_warning_200:
                  $ref: "#/components/examples/resolve_warning_200"
        "202":
          description: With wait=false, the job is returned for you to poll.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Job"
        "400":
          description: The input is invalid because it contains two identifiers, a
            conflicting flag pair, an unknown block or an invalid option
            (FieldErrors), or no usable identifier.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/Error"
                  - $ref: "#/components/schemas/FieldErrors"
              examples:
                resolve_400_defer_live_store:
                  $ref: "#/components/examples/resolve_400_defer_live_store"
                resolve_400_min_confidence:
                  $ref: "#/components/examples/resolve_400_min_confidence"
                resolve_400_two_keys:
                  $ref: "#/components/examples/resolve_400_two_keys"
                resolve_400_unknown_block:
                  $ref: "#/components/examples/resolve_400_unknown_block"
                resolve_400_validation_mode:
                  $ref: "#/components/examples/resolve_400_validation_mode"
        "401":
          description: The key is missing, malformed, revoked or wrong. The message is the
            same in every case.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: The key lacks the enrich scope, or none of the requested blocks is
            enabled for it.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/NotEnabledError"
                  - $ref: "#/components/schemas/Error"
              examples:
                resolve_403_not_enabled:
                  $ref: "#/components/examples/resolve_403_not_enabled"
        "404":
          description: No company matched.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ResolveNotFound"
              examples:
                resolve_404_not_matched:
                  $ref: "#/components/examples/resolve_404_not_matched"
                resolve_404_not_own_site:
                  $ref: "#/components/examples/resolve_404_not_own_site"
                resolve_404_site_unreachable:
                  $ref: "#/components/examples/resolve_404_site_unreachable"
        "409":
          description: More than one live company matched, with candidates; or the
            X-Idempotency-Key was used for a different request.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/AmbiguousMatch"
                  - $ref: "#/components/schemas/Error"
              examples:
                resolve_409_ambiguous:
                  $ref: "#/components/examples/resolve_409_ambiguous"
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              examples:
                resolve_429:
                  $ref: "#/components/examples/resolve_429"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "502":
          description: We could not resolve the row (detail gives a reason such as
            resolver_error or source_unavailable). Retry the request.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /v1/enrich/jobs:
    post:
      operationId: createJob
      tags:
        - Jobs
      summary: Submit a list as a job
      description: >-
        Send up to 250,000 rows (or the key's own max_rows_per_job) and the
        requested blocks. The response is returned before the asynchronous job
        is complete. Poll the job, then page through its results.


        Required scope: `enrich`.
      x-required-scope: enrich
      security:
        - ApiKey: []
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/JobCreateRequest"
            examples:
              websites:
                summary: Three companies, website and website check
                value:
                  rows:
                    - ref: crm-1001
                      company_number: "02805730"
                    - ref: crm-1002
                      company_number: "08130873"
                    - ref: crm-1003
                      company_number: "07706156"
                  blocks:
                    - domain
                    - domain_validation
                  options:
                    validation:
                      - rules
                      - live
      responses:
        "200":
          description: A replay with the same X-Idempotency-Key and the same body. You get
            the original job and nothing new runs.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Job"
              examples:
                jobs_create_replay_200:
                  $ref: "#/components/examples/jobs_create_replay_200"
        "202":
          description: The job was created.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Job"
              examples:
                jobs_create_202:
                  $ref: "#/components/examples/jobs_create_202"
        "400":
          description: The request body is invalid.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/FieldErrors"
        "401":
          description: The key is missing, malformed, revoked or wrong. The message is the
            same in every case.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: The key lacks the enrich scope, no requested block is enabled, or a
            premium option is not enabled.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/NotEnabledError"
                  - $ref: "#/components/schemas/Error"
        "409":
          description: The X-Idempotency-Key was used for a different body.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              examples:
                jobs_create_409_idempotency:
                  $ref: "#/components/examples/jobs_create_409_idempotency"
        "413":
          description: The request contains more rows than the job or key allows. Split
            the file.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/FieldErrors"
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  "/v1/enrich/jobs/{job_id}":
    get:
      operationId: getJob
      tags:
        - Jobs
      summary: Get a job's status
      description: >-
        This call returns the job's state and progress counters. While the job
        has not finished, retry_after_ms says when to poll again.


        Required scope: `read`.
      x-required-scope: read
      security:
        - ApiKey: []
      parameters:
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: The job is returned.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Job"
              examples:
                jobs_status_completed_200:
                  $ref: "#/components/examples/jobs_status_completed_200"
                jobs_status_queued_200:
                  $ref: "#/components/examples/jobs_status_queued_200"
        "401":
          description: The key is missing, malformed, revoked or wrong. The message is the
            same in every case.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: The key lacks the scope this endpoint needs; the message names it.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: There is no such job for this account.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              examples:
                jobs_404:
                  $ref: "#/components/examples/jobs_404"
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  "/v1/enrich/jobs/{job_id}/results":
    get:
      operationId: getJobResults
      tags:
        - Jobs
      summary: Page through a job's rows
      description: >-
        This call returns every row in submission order, whatever its status,
        one page at a time by cursor. A row that is still pending keeps its
        place in the page. It is also how you collect a defer_live resolve.


        Required scope: `read`.
      x-required-scope: read
      security:
        - ApiKey: []
      parameters:
        - $ref: "#/components/parameters/JobId"
        - $ref: "#/components/parameters/Cursor"
        - $ref: "#/components/parameters/Limit"
      responses:
        "200":
          description: A page is returned.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ResultsPage"
              examples:
                jobs_results_page1_200:
                  $ref: "#/components/examples/jobs_results_page1_200"
                jobs_results_page2_200:
                  $ref: "#/components/examples/jobs_results_page2_200"
                resolve_progressive_poll_200:
                  $ref: "#/components/examples/resolve_progressive_poll_200"
                resolve_progressive_results_200:
                  $ref: "#/components/examples/resolve_progressive_results_200"
        "400":
          description: The cursor is malformed.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              examples:
                jobs_results_400_cursor:
                  $ref: "#/components/examples/jobs_results_400_cursor"
        "401":
          description: The key is missing, malformed, revoked or wrong. The message is the
            same in every case.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: The key lacks the scope this endpoint needs; the message names it.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: There is no such job for this account.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "410":
          description: The rows are no longer available (after expires_at).
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Gone"
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  "/v1/enrich/jobs/{job_id}/errors":
    get:
      operationId: getJobErrors
      tags:
        - Jobs
      summary: Page through a job's quarantined rows
      description: >-
        This call returns the rows that could not be resolved at all, each with
        a reason and whether a retry is worthwhile.


        Required scope: `read`.
      x-required-scope: read
      security:
        - ApiKey: []
      parameters:
        - $ref: "#/components/parameters/JobId"
        - $ref: "#/components/parameters/Cursor"
        - $ref: "#/components/parameters/Limit"
      responses:
        "200":
          description: A page is returned.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorsPage"
              examples:
                jobs_errors_200:
                  $ref: "#/components/examples/jobs_errors_200"
        "400":
          description: The cursor is malformed.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: The key is missing, malformed, revoked or wrong. The message is the
            same in every case.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: The key lacks the scope this endpoint needs; the message names it.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: There is no such job for this account.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "410":
          description: The rows are no longer available (after expires_at).
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Gone"
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  "/v1/enrich/jobs/{job_id}/cancel":
    post:
      operationId: cancelJob
      tags:
        - Jobs
      summary: Cancel a job
      description: >-
        Rows that have started are delivered; rows that have not started are
        skipped and never billed. Cancelling a finished job returns it
        unchanged, so a retried cancel is safe.


        Required scope: `enrich`.
      x-required-scope: enrich
      security:
        - ApiKey: []
      parameters:
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: The job is returned in its current state.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Job"
              examples:
                jobs_cancel_200:
                  $ref: "#/components/examples/jobs_cancel_200"
        "401":
          description: The key is missing, malformed, revoked or wrong. The message is the
            same in every case.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: The key lacks the scope this endpoint needs; the message names it.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: There is no such job for this account.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /v1/usage:
    get:
      operationId: getUsage
      tags:
        - Usage
      summary: Usage by block or by day
      description: >-
        This call returns the counts your invoices are built from, over a date
        range (by default the last 30 days, at most 366). Until contract prices
        are set up for the account, it returns counts only.


        Required scope: `read`.
      x-required-scope: read
      security:
        - ApiKey: []
      parameters:
        - name: from
          in: query
          required: false
          description: This is the first day, in YYYY-MM-DD format and UTC.
          schema:
            type: string
            format: date
        - name: to
          in: query
          required: false
          description: This is the last day, inclusive. The default is today.
          schema:
            type: string
            format: date
        - name: granularity
          in: query
          required: false
          description: Use block (default) or day.
          schema:
            type: string
            enum:
              - block
              - day
            default: block
        - name: job_id
          in: query
          required: false
          description: Narrow to one job.
          schema:
            type: string
      responses:
        "200":
          description: Usage.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Usage"
              examples:
                usage_day_200:
                  $ref: "#/components/examples/usage_day_200"
                usage_job_200:
                  $ref: "#/components/examples/usage_job_200"
        "400":
          description: The request contains an invalid date, a from date later than the to
            date, a range over 366 days, or an unknown granularity.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              examples:
                usage_400_granularity:
                  $ref: "#/components/examples/usage_400_granularity"
        "401":
          description: The key is missing, malformed, revoked or wrong. The message is the
            same in every case.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: The key lacks the scope this endpoint needs; the message names it.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: job_id is not a job on this account.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: The key sent more requests than its per-minute allowance. Wait for
            the number of seconds in Retry-After.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: The request failed on Zorro's side. The body carries request_id
            when available; the X-Request-ID header always does.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
components:
  securitySchemes:
    ApiKey:
      type: http
      scheme: bearer
      bearerFormat: zk_live_<key_id>_<secret> or zk_test_<key_id>_<secret>
      description: "Authorization: Bearer <key>. Scopes are carried by the key: read
        (whoami, blocks, job status, results, errors, usage) and enrich
        (resolve, submit and cancel jobs)."
  parameters:
    JobId:
      name: job_id
      in: path
      required: true
      description: The job id from job creation or from a resolve. An id that is not
        yours, or not an id, answers 404.
      schema:
        type: string
    Cursor:
      name: cursor
      in: query
      required: false
      description: Use next_cursor from the previous page. Omit it to start.
      schema:
        type: string
    Limit:
      name: limit
      in: query
      required: false
      description: The page size defaults to 100 and is at most 1000. A missing or
        invalid value uses the default.
      schema:
        type: integer
        minimum: 1
        maximum: 1000
        default: 100
    IdempotencyKey:
      name: X-Idempotency-Key
      in: header
      required: false
      description: This makes a submit safe to retry. The same key with the same
        request returns the original job (200); with a different request, 409.
        It is scoped to the account and kept with the job.
      schema:
        type: string
        maxLength: 255
  schemas:
    BlockKey:
      type: string
      description: A block in the catalogue. GET /v1/blocks lists all 37 and shows
        which ones your key may request.
      enum:
        - domain
        - related_company_domain
        - domain_validation
        - nature_of_business
        - registered_address
        - corporate_owners
        - controllers
        - charges
        - property
        - officers
        - company_identity
        - filing_status
        - registry_events
        - financials_filed
        - ultimate_owner
        - employees_filed
        - industry
        - contacts
        - signals
        - news_signals
        - financials_live
        - employees_live
        - web_traffic
        - web_presence
        - technologies
        - employees
        - planning
        - financial_benchmarks
        - revenue_estimate
        - scores
        - funding
        - trading_address
        - subsidiaries
        - firmographics
        - comparables
        - business_intelligence
        - company_summary
    ReasonCode:
      type: string
      description: This lists every reason the API may give on a block envelope, a row
        or an error body. Any reason outside the published list is returned as
        `error`. New codes may be added within /v1, so treat a code you do not
        recognise as `error`.
      enum:
        - error
        - not_matched
        - no_company_key
        - ambiguous_match
        - source_unavailable
        - resolver_error
        - worker_lost
        - invalid_company_number
        - no_company_identified_on_site
        - site_lookup_not_run
        - only_related_company_domain
        - inheritance_flag_without_a_related_url
        - provenance_uncertain_but_validated
        - not_found_after_search
        - search_unavailable
        - no_domain_found
        - no_corporate_owner_on_the_register
        - owner_has_no_website
        - no_psc_data_on_file
        - ultimate_owner_not_resolved
        - no_address_on_file
        - no_charges_data_on_file
        - no_property_titles_on_file
        - no_officers_on_file
        - no_identity_on_file
        - no_filing_dates_on_file
        - no_registry_dates_on_file
        - no_headcount_on_file
        - no_employee_estimate_on_file
        - not_available_yet
        - owner_not_on_file
        - domain_name_mismatch
        - not_own_site
        - validation_not_requested
        - site_unreachable
        - name_matches_no_address_evidence
        - filed_value_implausible
        - no_entitlement
        - not_for_demo_key
        - site_not_readable
        - site_blocked
        - no_description_on_file
        - no_domain_to_read
        - site_unreadable
        - site_read_unavailable
        - no_accounts_filed
        - accounts_not_machine_readable
        - register_unavailable
        - accounts_unreadable
        - no_events_in_window
        - events_unavailable
        - accounts_ocr_unavailable
        - contacts_disabled
        - contacts_unavailable
        - no_people_found
        - no_emails_found
        - no_domain_for_email
        - no_domain_for_phone
        - no_email_found
        - no_phone_found
        - non_uk_only
        - shared_number_only
        - lookup_failed
        - no_planning_applications
        - no_planning_on_file
        - planning_register_unavailable
        - no_scores_on_file
        - no_website_to_match
        - no_funding_on_record
        - enrichment_unavailable
        - no_validated_website
        - no_address_on_site
        - insufficient_corroboration
        - conflicting_sources
        - postcode_register_unavailable
        - google_business_unavailable
        - lookups_incomplete
        - not_completed
        - no_sic_on_file
        - no_financials_on_file
        - no_modelled_revenue
        - no_ratios_to_benchmark
        - cohort_too_small
        - benchmark_unavailable
        - accounts_read_failed
        - financials_in_live_filing_only
        - bank_income_line_unconfirmed
        - bank_profit_line_unconfirmed
        - holding_company_no_trading_revenue
        - share_capital_as_equity
        - equity_implausible_against_balance_sheet
        - balance_sheet_breaks_from_adjacent_year
        - modelled_implausible_against_filed_turnover
        - subsidiary_search_unavailable
        - no_profile_on_file
        - no_comparables_found
        - peer_search_unavailable
        - few_comparable_peers
        - label_contradicts_filed_sic
        - no_business_intelligence_on_file
        - site_describes_another_company
        - no_summary_on_file
        - summary_unavailable
        - no_signals_on_file
        - no_signals_on_record
        - signals_unavailable
        - web_profile_not_enabled
        - no_web_profile_found
        - web_profile_unavailable
        - no_web_traffic_on_profile
        - no_technologies_on_file
        - no_web_presence_on_file
        - no_employee_figures_on_file
        - web_profile_outside_uk
        - no_accounts_reading_on_file
        - no_headcount_in_accounts_reading
        - no_workforce_on_profile
        - org_enrichment_not_held
        - website_not_validated
        - website_needs_review
        - website_unverified
        - website_not_verifiable
        - accounts_made_up_date_off_reference_date
        - bank_no_modelled_turnover
        - none_on_register
        - first_accounts_not_yet_due
        - accounts_overdue
        - group_site_prefer_uk_domain
        - not_confirmed
        - source_busy
        - not_looked_up
        - owner_website_is_this_companys_own
        - no_majority_controller
        - dormant_company
        - modelled_profit_implausible
        - modelled_repeated_across_periods
        - ratio_implausible
        - accounts_read_no_figures
        - sources_disagree
        - estimate_input_failed_balance_sheet_check
      x-enumDescriptions:
        error: This is a generic failure with no more specific public reason. Retry
          once; if it repeats, include the X-Request-ID when contacting support.
        not_matched: No company was found under the number, name or domain given.
        no_company_key: The row carried no usable company_number, company_name or domain.
        ambiguous_match: The name or domain matches more than one live company; the
          candidates are returned and the row is not billed.
        source_unavailable: The requested data was unavailable. This says nothing about
          the company. On a block, retry_suggested is set; a failed row can be
          resubmitted.
        resolver_error: The row could not be resolved because of an error on Zorro's
          side. Resubmit the row.
        worker_lost: The row was not resolved and can be resubmitted.
        invalid_company_number: The company_number is not a UK company number (8
          characters, for example 07706156 or SC123456). GET /v1/resolve answers
          400; in a job, only that row goes to the errors page.
        no_company_identified_on_site: The website names no active company by number or exact legal name.
        site_lookup_not_run: The live site lookup for an unknown domain runs only on a
          single resolve or a job of ten rows or fewer, and this row was in a
          larger job.
        only_related_company_domain: The only website on file belongs to a related
          (owning) company; it is returned under related_company_domain, never
          as this company's domain.
        inheritance_flag_without_a_related_url: The website on file may belong to a
          related company and cannot be confirmed, so it is returned flagged for
          review.
        provenance_uncertain_but_validated: The website's provenance was uncertain, but
          domain_validation on the same row accepted it; the flag is cleared.
        not_found_after_search: No website was found for the company.
        search_unavailable: No website result was available. This says nothing about the
          company; retry_suggested is set.
        no_domain_found: No website is on file and no live search was asked for.
        no_corporate_owner_on_the_register: The PSC register names no current corporate
          owner, so there is no owner to follow.
        owner_has_no_website: The register names a corporate owner, but no website is on
          file for it (or its number is not usable).
        no_psc_data_on_file: No PSC register is on file for the company. This is not the
          same as a register that names nobody, which returns an empty list.
        ultimate_owner_not_resolved: The register names a corporate owner, but the chain
          above it could not be resolved.
        no_address_on_file: No registered office address is on file for the company.
        no_charges_data_on_file: No charge information is in the company file.
        no_property_titles_on_file: No HM Land Registry title matched the company
          number. This does not prove the company owns no property.
        no_officers_on_file: No officers are on file for the company.
        no_identity_on_file: No incorporation date, category or status is on file for the company.
        no_filing_dates_on_file: No accounts or confirmation statement dates are on file
          for the company.
        no_registry_dates_on_file: No register event dates are on file for the company.
        no_headcount_on_file: No usable filed employee count is on file.
        no_employee_estimate_on_file: No third-party headcount estimate is on file.
        not_available_yet: The block is in the catalogue but cannot be answered yet.
        owner_not_on_file: The register names an owner with no company file (for example
          a foreign entity), so there is no description to give.
        domain_name_mismatch: The owner's website shares no distinctive word with the
          owner's name, so it is returned with that doubt stated.
        not_own_site: "The domain is a register, directory, social or site-builder host
          (host_type says which): a page about the company, not its own site."
        validation_not_requested: "validation was set to none: the domain comes back
          unscored and flagged."
        site_unreachable: The site gave no HTTP response at all (no DNS, connection
          refused or timeout). Not scored and not rejected.
        name_matches_no_address_evidence: The company's name is on the site and nothing
          contradicts it, but no address, postcode, director or phone is shown;
          the outcome is not lowered below review.
        filed_value_implausible: Every filed headcount on file is between 0 and 1 and is
          marked as implausible; the affected years are listed.
        no_entitlement: The block or option is not enabled for this account.
        not_for_demo_key: This block is not available to a demo key (named people and
          paid lookups).
        site_not_readable: The site answered, but with no readable text (for example a
          JavaScript stub).
        site_blocked: The site answered and refused the request (HTTP 401, 403, 429 or
          503). retry_suggested is set.
        no_description_on_file: No written description of the company is on file.
        no_domain_to_read: The company has no website for the requested live read.
        site_unreadable: The live site read could not extract usable text from the site.
        site_read_unavailable: The website could not be read for this request. This says
          nothing about the company; retry later.
        no_accounts_filed: The company has no accounts on file at Companies House.
        accounts_not_machine_readable: The latest accounts were filed on paper or as
          PDF, with no machine-readable version.
        register_unavailable: Companies House did not answer the filing request. Retry.
        accounts_unreadable: The filing was retrieved but could not be read.
        no_events_in_window: There were no register or company events in the last year.
        events_unavailable: The event sources could not be read for this request. Retry later.
        accounts_ocr_unavailable: PDF accounts could not be read for this request. Retry later.
        contacts_disabled: The contacts block is not available.
        contacts_unavailable: The contact lookup could not run for this request. Retry later.
        no_people_found: No decision-maker matching the requested roles was found.
        no_emails_found: People were found, but no business email was found for any of them.
        no_domain_for_email: No company website is on file against which to look up an
          email address.
        no_domain_for_phone: No company website is on file against which to look up a phone number.
        no_email_found: The lookup ran and found no email for this person.
        no_phone_found: The lookup ran and found no phone number for this person.
        non_uk_only: Only non-UK phone numbers were found; none is returned.
        shared_number_only: The only number found was already given to another contact
          in the same answer.
        lookup_failed: The lookup for this person failed on Zorro's side. Retry later.
        no_planning_applications: The planning register holds no applications naming the company.
        no_planning_on_file: No planning answer is on file and none was searched for.
          This does not prove there are no applications.
        planning_register_unavailable: The planning register could not be searched.
        no_scores_on_file: No scores are on file for the company.
        no_website_to_match: The block matches on the company's own website, and none is on file.
        no_funding_on_record: The matched record has no funding rounds.
        enrichment_unavailable: The organisation data could not be read for this request. Retry later.
        no_validated_website: The company's website was rejected by domain_validation
          (now or in the last 30 days), so it is not read for an address.
        no_address_on_site: The site was read and shows no address.
        insufficient_corroboration: A candidate address was found but not confirmed by
          an independent source.
        conflicting_sources: The sources disagree; every candidate is listed for review.
        postcode_register_unavailable: The postcode register could not be read.
        google_business_unavailable: google_business was asked for and the listing check could not run.
        lookups_incomplete: Not every lookup finished; partial is set and the contacts
          found so far are returned.
        not_completed: The pending block was not completed because the row ended after a
          failure or cancellation. The block's status is error, with
          retry_suggested set.
        no_sic_on_file: The register has no SIC code for the company (including entries
          that read "None Supplied").
        no_financials_on_file: No accounts history, figures from PDF accounts or
          estimated revenue are on file.
        no_modelled_revenue: No estimated revenue is available for the company.
        no_ratios_to_benchmark: The company has no ratio from filed figures, or from
          figures read from PDF accounts, to place among peers.
        cohort_too_small: The peer cohort contains fewer than twenty companies.
        benchmark_unavailable: The peer comparison could not be computed for this
          request. Retry later.
        accounts_read_failed: financials_live ran in the same request and could not read
          the accounts, so there is nothing to place among peers yet. Retry
          later.
        financials_in_live_filing_only: No accounts history is on file; the figures are
          in the filing that financials_live read in the same request.
        bank_income_line_unconfirmed: "A bank's turnover figure is withheld: the printed
          income line it came from is not confirmed."
        bank_profit_line_unconfirmed: "A bank's operating profit figure is withheld: the
          printed line it came from is not confirmed."
        holding_company_no_trading_revenue: A holding company, fund or head office is
          not given an estimated trading revenue.
        share_capital_as_equity: The equity figure is the share capital line, so it is
          withheld rather than corrected.
        equity_implausible_against_balance_sheet: The equity figure cannot be right
          given the rest of the balance sheet, so it is withheld.
        balance_sheet_breaks_from_adjacent_year: The balance sheet cannot belong to the
          same company as the adjacent year's, so it is flagged or withheld,
          never corrected.
        modelled_implausible_against_filed_turnover: The filed turnover contradicts the
          estimated turnover, so the estimate is withheld.
        subsidiary_search_unavailable: No subsidiary result is available. No empty list
          is returned because this does not show that the company owns nothing.
        no_profile_on_file: No company profile field is on file.
        no_comparables_found: The peer search found no companies.
        peer_search_unavailable: The peer search could not run.
        few_comparable_peers: Fewer than three comparable companies were found; those
          companies are returned flagged.
        label_contradicts_filed_sic: The industry label sits in a different SIC section
          from every code the company filed, so it is returned flagged.
        no_business_intelligence_on_file: No website-derived company information is on file.
        site_describes_another_company: The site names another company's number and
          name; the text is returned as flagged.
        no_summary_on_file: No summary is available for the company.
        summary_unavailable: The summary could not be produced for this request. Retry later.
        no_signals_on_file: No event timeline is on file and no lookup was asked for.
        no_signals_on_record: A lookup ran and found no events.
        signals_unavailable: The event lookup could not run for this request. Retry later.
        web_profile_not_enabled: Web profile data is not available.
        no_web_profile_found: No web profile was found for the company's own site.
        web_profile_unavailable: The web profile could not be retrieved for this request. Retry later.
        no_web_traffic_on_profile: A profile was found but carries no traffic figures.
        no_technologies_on_file: No detected technologies are on file.
        no_web_presence_on_file: No web presence facts are on file.
        no_employee_figures_on_file: No headcount figure from any source is on file.
        web_profile_outside_uk: The answer was built on a profile headquartered outside
          the UK, so it is returned flagged, with the country in detail.
        no_accounts_reading_on_file: No figures read from PDF accounts are on file.
        no_headcount_in_accounts_reading: Figures read from PDF accounts are on file, without a headcount.
        no_workforce_on_profile: The matched web profile has no workforce figure.
        org_enrichment_not_held: Organisation data is not on file for the company; this
          block does not look it up.
        website_not_validated: "The website was rejected, or scored under
          min_confidence: website-derived data is not served."
        website_needs_review: The website's outcome is review, at or above
          min_confidence, so website-derived data is returned with
          flagged_for_review.
        website_unverified: There is no verdict on the website (validation was declined,
          or the check did not finish), so website-derived data is returned with
          flagged_for_review.
        website_not_verifiable: "The site could not be read for this request, so it
          could not be checked: website-derived data is withheld."
        accounts_made_up_date_off_reference_date: The accounts made-up date is not on
          the company's accounting reference date, so the value is returned
          flagged, with the expected date beside it.
        bank_no_modelled_turnover: No estimated turnover is returned for a bank or
          building society (SIC 64110, 64191, 64192).
        none_on_register: The Companies House register was checked and holds none.
        first_accounts_not_yet_due: No accounts are filed and the first accounts are not
          due yet (detail.first_accounts_due_on).
        accounts_overdue: No accounts are filed and the register says the due date has passed.
        group_site_prefer_uk_domain: The site is a group's global one and the company
          runs a UK site of its own that passes the same check
          (detail.preferred_domain). The outcome is review, never accept.
        not_confirmed: There is no value, and the absence could not be confirmed for
          this request. This says nothing about the company; retry later.
        source_busy: The requested data was unavailable for this request.
          retry_suggested is set.
        not_looked_up: When contacts_lookup=cached_only, no email address or phone
          number is available for this person.
        owner_website_is_this_companys_own: The owner's website on file is this
          company's own website, so it is not returned as the owner's.
        no_majority_controller: The register names corporate owners and none holds
          majority control (more than half of the shares or votes, or the right
          to appoint the board). The largest holder is in detail.largest_holder.
        dormant_company: The latest accounts filed are dormant accounts, so no estimated
          trading revenue or profit is returned.
        modelled_profit_implausible: An estimated profit is withheld if it is larger
          than the revenue beside it or has no revenue beside it.
        modelled_repeated_across_periods: An estimated figure repeated unchanged across periods is withheld.
        ratio_implausible: A ratio whose inputs cannot describe one company's year (a
          denominator too small, or a value far outside any real range) is
          withheld.
        accounts_read_no_figures: The machine-readable filing carried no figure for its latest period.
        sources_disagree: The two headcount figures on the row differ by a factor of
          three or more; both are returned as flagged.
        estimate_input_failed_balance_sheet_check: The estimated figures for that period
          are withheld because the balance sheet they depend on failed a
          consistency check.
    RowFailureReason:
      type: string
      description: Why a whole row failed. Carried by GET
        /v1/enrich/jobs/{job_id}/errors and by the GET /v1/resolve error bodies.
      enum:
        - error
        - not_matched
        - no_company_key
        - ambiguous_match
        - source_unavailable
        - resolver_error
        - worker_lost
        - invalid_company_number
      x-enumDescriptions:
        error: This is a generic failure with no more specific public reason. Retry
          once; if it repeats, include the X-Request-ID when contacting support.
        not_matched: No company was found under the number, name or domain given.
        no_company_key: The row carried no usable company_number, company_name or domain.
        ambiguous_match: The name or domain matches more than one live company; the
          candidates are returned and the row is not billed.
        source_unavailable: The requested data was unavailable. This says nothing about
          the company. On a block, retry_suggested is set; a failed row can be
          resubmitted.
        resolver_error: The row could not be resolved because of an error on Zorro's
          side. Resubmit the row.
        worker_lost: The row was not resolved and can be resubmitted.
        invalid_company_number: The company_number is not a UK company number (8
          characters, for example 07706156 or SC123456). GET /v1/resolve answers
          400; in a job, only that row goes to the errors page.
    BlockStatus:
      type: string
      enum:
        - available
        - not_found
        - not_enabled
        - error
        - pending
      description: "`available`: `value` is present. `not_found`: there is no value;
        `reason` says what kind of absence it is. `not_enabled`: the key may not
        run this block. `error`: the block failed on Zorro's side, usually with
        `retry_suggested`. `pending`: a progressive resolve (defer_live) is
        still working on it."
    RowStatus:
      type: string
      enum:
        - pending
        - done
        - not_found
        - error
        - skipped
      description: "`done`: at least one block is available. `not_found`: the company
        matched and no block holds a value. `error`: the row could not be
        resolved (see the errors endpoint). `skipped`: the job was cancelled
        before this row ran. `pending`: not finished yet."
    JobStatus:
      type: string
      enum:
        - queued
        - running
        - completed
        - partially_completed
        - cancelling
        - cancelled
        - failed
      description: A job is `queued` until every row is settled, then `completed`, or
        `partially_completed` when at least one row failed. A cancel moves it
        through `cancelling` to `cancelled`. The job is `failed` when it could
        not finish; `failure_reason` says why. `running` is reserved. The
        terminal states are `completed`, `partially_completed`, `cancelled` and
        `failed`.
    Scope:
      type: string
      enum:
        - read
        - enrich
    Error:
      type: object
      description: The body of every error that is not a field validation error.
      properties:
        detail:
          type: string
          description: A human-readable message, or a reason slug on the resolve error
            bodies. Branch on the HTTP status and on slugs, never on the wording
            of a message.
        request_id:
          type: string
          description: "On a 500: the X-Request-ID of the failed request, to quote to
            support."
        documentation:
          type: string
          description: "On a 404 for a path that does not exist: where the documentation
            is. Absent from a 404 raised by an endpoint that does exist, such as
            a job id that is not yours."
        openapi:
          type: string
          description: "On the same 404: the path this description is served from."
      required:
        - detail
      additionalProperties: true
    FieldErrors:
      type: object
      description: 'A 400 from input validation: each invalid field maps to a list of
        messages, nested by row number or option name, e.g. {"options":
        {"min_confidence": ["Ensure this value is less than or equal to 1.0."]}}
        or {"rows": {"0": {"non_field_errors": ["..."]}}}. The 413 row-count
        refusal uses the same shape under `rows`.'
      minProperties: 1
      additionalProperties: true
    NotEnabledError:
      type: object
      description: "403 when every block asked for is outside the key's entitlement,
        or a premium option is not enabled. A request that mixes enabled and
        not-enabled blocks is not refused: it answers 200 with a
        `blocks_not_enabled` warning."
      properties:
        detail:
          type: string
          description: Names the refused blocks or options.
        blocks:
          type: object
          description: "Present when blocks were refused: each refused block with status
            not_enabled and a reason (no_entitlement, or not_for_demo_key)."
          additionalProperties:
            type: object
            properties:
              status:
                const: not_enabled
              reason:
                $ref: "#/components/schemas/ReasonCode"
            required:
              - status
              - reason
            additionalProperties: true
        options:
          type: object
          description: Present when a premium option was refused on job creation
            (web_search).
          additionalProperties:
            type: object
            properties:
              status:
                const: not_enabled
              reason:
                $ref: "#/components/schemas/ReasonCode"
            required:
              - status
              - reason
            additionalProperties: true
      required:
        - detail
      additionalProperties: true
    ResolveNotFound:
      type: object
      description: "404 from GET /v1/resolve: no company matched."
      properties:
        detail:
          const: not_matched
        reason:
          type: string
          description: "For a lookup by domain: why the domain matched no company. One of
            not_own_site, no_company_identified_on_site, site_unreachable,
            site_blocked or site_not_readable."
        host_type:
          type: string
          enum:
            - register
            - directory
            - social
            - site_builder
          description: "With reason not_own_site: what kind of host it is."
        site_lookup:
          $ref: "#/components/schemas/SiteLookup"
      required:
        - detail
      additionalProperties: true
    AmbiguousMatch:
      type: object
      properties:
        detail:
          const: ambiguous_match
        candidates:
          type: array
          items:
            $ref: "#/components/schemas/Candidate"
          description: The live companies the name or domain matched. Retry with one
            company_number.
      required:
        - detail
        - candidates
      additionalProperties: true
    Candidate:
      type: object
      properties:
        company_number:
          type: string
          description: Companies House number.
        company_name:
          anyOf:
            - type: string
              description: Registered name.
            - type: "null"
      required:
        - company_number
      additionalProperties: true
    SiteLookup:
      type: object
      description: "For a domain with no company on file: what its landing and legal
        pages gave."
      properties:
        reason:
          type: string
          description: Why the site named no company, or ambiguous_match.
        domain:
          type: string
          description: The domain as normalised.
        final_url:
          anyOf:
            - type: string
              description: Where the read landed after redirects.
            - type: "null"
        pages_read:
          type: array
          items: {}
          description: The pages read.
      additionalProperties: true
    Gone:
      type: object
      description: 410 on results or errors of a job whose rows are no longer
        available (after expires_at). The job itself still answers GET
        /v1/enrich/jobs/{job_id}.
      properties:
        detail:
          type: string
          description: Says the rows are no longer available.
        job_id:
          type: string
          format: uuid
        purged_at:
          type: string
          format: date-time
      required:
        - detail
        - job_id
        - purged_at
      additionalProperties: true
    WhoAmI:
      type: object
      properties:
        key_id:
          type: string
          description: The public part of the key. Safe to log and to quote to support.
          pattern: ^[a-z2-9]{12}$
        name:
          type: string
          description: The label the key was minted with.
        environment:
          type: string
          enum:
            - live
            - test
          description: A label on the key (zk_live_ or zk_test_). A test key reads the
            same data and is billed the same way; it is not a sandbox.
        scopes:
          type: array
          items:
            $ref: "#/components/schemas/Scope"
        account:
          type: object
          properties:
            id:
              type: integer
              description: The account the key acts as.
            email:
              type: string
              description: The account's email.
          required:
            - id
            - email
          additionalProperties: true
        blocks:
          type: array
          items:
            $ref: "#/components/schemas/BlockAccess"
          description: Every block in catalog order with its availability for this key and
            its tier.
        blocks_enabled_count:
          type: integer
          description: How many blocks this key may request.
        blocks_total:
          type: integer
          description: How many blocks the catalog has.
        limits:
          $ref: "#/components/schemas/KeyLimits"
        docs:
          type: object
          properties:
            url:
              type: string
              description: This documentation.
            openapi:
              type: string
              description: Where this description is served, as a path on the API host.
            catalog:
              type: string
              description: Where the full catalogue is.
          required:
            - url
            - openapi
            - catalog
          additionalProperties: true
      required:
        - key_id
        - name
        - environment
        - scopes
        - account
        - blocks
        - blocks_enabled_count
        - blocks_total
        - limits
        - docs
      additionalProperties: true
    BlockAccess:
      type: object
      properties:
        key:
          $ref: "#/components/schemas/BlockKey"
        availability:
          type: string
          enum:
            - available
            - not_enabled
        tier:
          type: string
          enum:
            - core
            - premium
      required:
        - key
        - availability
        - tier
      additionalProperties: true
    KeyLimits:
      type: object
      properties:
        max_rows_per_job:
          type: integer
          description: The most rows one job may carry for this key.
        max_rows_per_job_source:
          type: string
          enum:
            - key
            - default
          description: "`key` when this key has its own, lower cap; `default` when the
            global cap applies."
        rate_limits:
          type: object
          properties:
            requests_per_minute:
              anyOf:
                - type: integer
                  description: Every endpoint, per key.
                - type: "null"
            resolve_per_minute:
              anyOf:
                - type: integer
                  description: GET /v1/resolve, per key.
                - type: "null"
          required:
            - requests_per_minute
            - resolve_per_minute
          additionalProperties: true
        expires_at:
          anyOf:
            - type: string
              format: date-time
              description: "Always null today: keys do not expire."
            - type: "null"
      required:
        - max_rows_per_job
        - max_rows_per_job_source
        - rate_limits
        - expires_at
      additionalProperties: true
    BlockCatalog:
      type: object
      properties:
        blocks:
          type: array
          items:
            $ref: "#/components/schemas/CatalogEntry"
        available:
          type: array
          items:
            $ref: "#/components/schemas/BlockKey"
          description: The blocks this key may request, in catalog order.
        confidence:
          type: object
          additionalProperties: true
          description: "How to read `confidence`: the scale, the domain_validation routing
            cuts (accept / review / reject), what the number is made of and what
            it is not."
        validation_modes:
          type: object
          additionalProperties:
            type: string
          description: "What each validation mode adds: none, rules, live, officers and ai."
        discovery_options:
          type: object
          additionalProperties:
            type: string
        contact_options:
          type: object
          additionalProperties:
            type: string
        latency_classes:
          type: object
          properties:
            instant:
              type: string
            live:
              type: string
          required:
            - instant
            - live
          additionalProperties: true
        premium_options:
          type: object
          additionalProperties:
            type: object
            properties:
              description:
                type: string
              what_it_buys:
                type: string
              default:
                type: boolean
              billable:
                type: boolean
              availability:
                type: string
                enum:
                  - available
                  - not_enabled
            required:
              - description
              - what_it_buys
              - default
              - billable
              - availability
            additionalProperties: true
      required:
        - blocks
        - available
        - confidence
        - validation_modes
        - discovery_options
        - contact_options
        - latency_classes
        - premium_options
      additionalProperties: true
    CatalogEntry:
      type: object
      properties:
        key:
          $ref: "#/components/schemas/BlockKey"
        description:
          type: string
          description: What the block returns.
        source:
          type: string
          description: Where the data comes from, in words.
        availability:
          type: string
          enum:
            - available
            - not_enabled
          description: For the calling key.
        tier:
          type: string
          enum:
            - core
            - premium
        experimental:
          type: boolean
          description: Refused by default and switched on per account.
        billable:
          type: boolean
          description: Charged when it delivers a value.
        page_fields:
          type: array
          items:
            type: string
          description: The field names on getzorro.ai/api this block delivers.
        latency:
          type: string
          enum:
            - instant
            - live
        latency_note:
          type: string
          description: When the latency class changes for a company.
        live_deadline_s:
          type: number
          description: Seconds this block may take in a progressive answer; past it the
            block answers `error` with `source_busy`.
        website_gate:
          type: string
          description: "For blocks built from the company's website: how the website
            verdict gates them."
        coverage:
          type: number
          description: The catalog's coverage figure for the block, 0 to 1.
        coverage_measured_on:
          type: string
          description: The date of the coverage figure. YYYY-MM-DD.
      required:
        - key
        - description
        - source
        - availability
        - tier
        - experimental
        - billable
        - page_fields
        - latency
      additionalProperties: true
    BlockEnvelope:
      type: object
      description: Every block on every row comes back in this envelope, from GET
        /v1/resolve and from a job alike. Keys that do not apply are absent, not
        null. New keys may be added within /v1.
      properties:
        status:
          $ref: "#/components/schemas/BlockStatus"
        value:
          description: This is present only when status is available. Its shape depends on
            the block; see the block schemas.
        source:
          type: string
          description: "Where the value came from: `companies_house`,
            `companies_house_live`, `companies_house_psc`,
            `companies_house_accounts`, `companies_house_accounts_ocr`,
            `zorro_modelled_from_filings`, `hm_land_registry`, `cache`,
            `live_site_read`, `zorro_validator`, `zorro_from_website`,
            `zorro_peer_model`, `third_party_profile` and others named in the
            catalogue."
        as_of:
          type: string
          description: "The date of the information: a date (YYYY-MM-DD), a year (YYYY)
            for a filing year, or the time the value was checked. Absent when no
            date exists."
        confidence:
          type: number
          description: A number from 0 to 1, present only on blocks that produce one. The
            scale differs between blocks; see `confidence` in GET /v1/blocks.
          minimum: 0
          maximum: 1
        flagged_for_review:
          type: boolean
          description: When `true`, read `reason` before relying on the value. The value
            is still returned.
        reason:
          $ref: "#/components/schemas/ReasonCode"
        detail:
          $ref: "#/components/schemas/EnvelopeDetail"
        partial:
          type: object
          additionalProperties: true
          description: For not_found or error, this contains available information, such
            as the domain and whether the site answered.
        retry_suggested:
          type: boolean
          description: This indicates that the block was not completed or confirmed for
            the request.
        derived:
          type: boolean
          description: The value is a Zorro-derived value rather than a filed fact.
        derived_from:
          type: string
          enum:
            - company_website_short
            - company_website_detailed
            - search_description
            - company_website
            - zorro_enrichment
          description: For nature_of_business, this identifies the associated description.
        contains_modelled:
          type: boolean
          description: "financials_filed: part of the value is modelled (under `modelled`,
            or with a `*_basis` of `modelled`)."
        contains_ocr_read:
          type: boolean
          description: For financials_filed, part of the value was read from PDF accounts.
        contains_derived:
          type: boolean
          description: For financials_filed, ratios computed from filed figures or figures
            read from PDF accounts are present.
        host_type:
          type: string
          enum:
            - register
            - directory
            - social
            - site_builder
        verification_profile:
          type: string
          description: For domain, this contains website verification information.
        final_url:
          type: string
          description: "domain: the address actually read after redirects, when a block on
            the row opened the site."
        affected_years:
          type: array
          items:
            type: string
          description: For employees_filed with filed_value_implausible, these are the
            years whose filed figures were refused.
      required:
        - status
      additionalProperties: true
    EnvelopeDetail:
      type: object
      description: How the answer was built. Blocks can add their own keys.
      properties:
        freshness:
          $ref: "#/components/schemas/Freshness"
        website_verdict:
          $ref: "#/components/schemas/WebsiteVerdict"
        evidence:
          type: object
          additionalProperties: true
          description: "domain_validation: where on the site each hard match and the name
            were found (url and snippet)."
        preferred_domain:
          type: string
          description: "domain_validation with group_site_prefer_uk_domain: the UK domain
            that passes."
        redirected_from:
          type: string
          description: The domain on file that forwards to the served one.
        items_returned:
          type: integer
          description: Rows returned when the register holds more.
        items_on_register:
          type: integer
          description: Rows the register holds.
        first_accounts_due_on:
          type: string
          description: "No accounts filed yet: when the first are due. YYYY-MM-DD."
        extraction_confidence:
          type: number
          description: "nature_of_business: the confidence reported for the description."
        markets_stated:
          $ref: "#/components/schemas/MarketsStated"
      additionalProperties: true
    MarketsStated:
      type: object
      description: nature_of_business.detail.markets_stated, an experimental field.
        The countries the company's own website states it serves (country sites
        or pages, shipping lists, offices, customers, currencies or languages
        offered), each with a basis. scope is worldwide when the site says it
        serves customers worldwide, and countries is then empty. This is not
        trade data. Absent when the site states none.
      properties:
        experimental:
          type: boolean
          description: Always `true` while this field is experimental.
        scope:
          type: string
          enum:
            - countries
            - worldwide
          description: "`worldwide` when the site says it serves customers worldwide;
            `countries` is then empty."
        countries:
          type: array
          maxItems: 15
          items:
            type: object
            properties:
              country:
                type: string
                description: ISO 3166-1 alpha-2 country code.
              name:
                type: string
                description: The country name.
              basis:
                type: string
                enum:
                  - country_site
                  - shipping
                  - office
                  - customers
                  - currency_or_language
                description: "What the site states: a country site or page, shipping there, an
                  office there, customers there, or a currency or language
                  offered for that country."
            required:
              - country
              - name
              - basis
            additionalProperties: true
          description: The countries named on the site, at most 15.
      required:
        - scope
        - countries
      additionalProperties: true
    Freshness:
      type: object
      description: How current a register answer is.
      properties:
        checked_live:
          type: boolean
          description: "`true`: Companies House was checked for this request. `false`: the
            answer was not checked live for this request; `as_of` gives the date
            of the information."
        checked_at:
          type: string
          format: date-time
          description: When the live check was made. Present only when `checked_live` is
            `true`.
      required:
        - checked_live
      additionalProperties: true
    WebsiteVerdict:
      type: object
      description: The verdict on the company's website a website-derived block was
        built on.
      properties:
        domain:
          type: string
          description: The website the verdict is about.
        outcome:
          anyOf:
            - type: string
              enum:
                - accept
                - review
                - reject
            - type: "null"
        score:
          anyOf:
            - type: number
              description: domain_validation score, 0 to 100.
            - type: "null"
        confidence:
          anyOf:
            - type: number
              description: domain_validation confidence, 0 to 1.
            - type: "null"
        checked_at:
          type: string
          description: When the verdict was reached.
        basis:
          type: string
          description: Why there is no verdict.
        auto_run:
          type: boolean
          description: The check was run for this block without being requested, and left
            out of the response.
        served:
          type: boolean
          description: Whether website data was served on this verdict.
      required:
        - domain
        - auto_run
      additionalProperties: true
    CompanyIdentityValue:
      type: object
      description: company_identity.value
      properties:
        incorporated_on:
          type: string
          description: Incorporation date. YYYY-MM-DD.
        company_category:
          type: string
          description: This is the register's category, e.g. Private Limited Company.
        country_of_origin:
          type: string
          description: This is shown as filed.
        legal_form:
          type: string
        company_status:
          type: string
          description: "The register's label verbatim: Active, Dissolved, Liquidation,
            Active - Proposal to Strike off, ..."
        status_group:
          type: string
          enum:
            - active
            - proposal_to_strike_off
            - insolvency
            - dissolved
            - closed
            - other
        dissolved_on:
          type: string
          description: Where a dissolution date is on file. YYYY-MM-DD.
        trading_name:
          type: string
          description: From a company profile field, not Companies House (which records
            none).
        trading_name_source:
          type: string
          const: third_party_profile
        other_trading_names:
          type: array
          items:
            type: string
          description: Further distinct trading names from the same profile fields.
        trading_name_withheld:
          type: string
          description: Why a profile name was not served (it names another organisation).
        previous_names:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
                description: A former registered name.
              changed_on_as_filed:
                type: string
                description: The change date exactly as the source holds it (day-first,
                  DD/MM/YYYY). Not reformatted.
            required:
              - name
            additionalProperties: true
      additionalProperties: true
    RegisteredAddressValue:
      type: object
      description: "registered_address.value: only the lines the register holds."
      properties:
        address_line_1:
          type: string
        address_line_2:
          type: string
        locality:
          type: string
          description: This is the post town.
        region:
          type: string
          description: This is the county.
        postal_code:
          type: string
        country:
          type: string
        po_box:
          type: string
        care_of:
          type: string
      additionalProperties: true
    Officer:
      type: object
      properties:
        name:
          type: string
        role:
          anyOf:
            - type: string
              description: Director, Secretary, Corporate Secretary, LLP Member ...
            - type: "null"
        appointed_on:
          anyOf:
            - type: string
              description: Appointment date. YYYY-MM-DD.
            - type: "null"
        resigned_on:
          anyOf:
            - type: string
              description: former[] only. YYYY-MM-DD.
            - type: "null"
        nationality:
          anyOf:
            - type: string
            - type: "null"
        country_of_residence:
          anyOf:
            - type: string
            - type: "null"
        occupation:
          anyOf:
            - type: string
            - type: "null"
        person_number:
          type: string
          description: The register's identifier for the officer.
        person_key:
          type: string
          description: First eight digits of a 12-digit person number, shared by one
            person's appointments.
        date_of_birth:
          $ref: "#/components/schemas/MonthYear"
        is_corporate:
          type: boolean
          description: The officer is a company.
      required:
        - name
      additionalProperties: true
    MonthYear:
      type: object
      description: Month and year only, as Companies House publishes. Never the day.
      properties:
        month:
          type: integer
          description: 1-12
          minimum: 1
          maximum: 12
        year:
          type: integer
          description: Four digits.
      additionalProperties: true
    OfficersValue:
      type: object
      description: officers.value. as_of says how current the list is.
      properties:
        total:
          anyOf:
            - type: integer
              description: This is the number of officers ever appointed.
            - type: "null"
        active:
          anyOf:
            - type: integer
              description: This is the number of current officers.
            - type: "null"
        resigned:
          type: integer
          description: This is the number of resigned officers.
        current:
          type: array
          items:
            $ref: "#/components/schemas/Officer"
          description: Current officers, directors first, at most 25.
        former:
          type: array
          items:
            $ref: "#/components/schemas/Officer"
          description: Resigned officers, newest resignation first, at most 50.
        former_truncated:
          type: boolean
          description: former[] was cut at 50.
        ages:
          type: object
          properties:
            average:
              type: number
              description: Years.
            youngest:
              type: number
              description: Years.
            oldest:
              type: number
              description: Years.
          additionalProperties: true
      additionalProperties: true
    Controller:
      type: object
      properties:
        type:
          type: string
          enum:
            - company
            - person
            - statement
        name:
          anyOf:
            - type: string
            - type: "null"
        company_number:
          type: string
          description: Companies and legal entities, where a usable number is filed.
        country_registered:
          anyOf:
            - type: string
            - type: "null"
        nationality:
          anyOf:
            - type: string
            - type: "null"
        country_of_residence:
          anyOf:
            - type: string
            - type: "null"
        date_of_birth:
          anyOf:
            - $ref: "#/components/schemas/MonthYear"
            - type: "null"
        natures_of_control:
          type: array
          items:
            type: string
          description: As filed, e.g. ownership-of-shares-75-to-100-percent.
        notified_on:
          anyOf:
            - type: string
              description: When the register was notified. YYYY-MM-DD.
            - type: "null"
        statement:
          anyOf:
            - type: string
              description: "type statement: the filed wording, or null."
            - type: "null"
        ceased_on:
          anyOf:
            - type: string
              description: ceased_controllers[] only. YYYY-MM-DD.
            - type: "null"
      required:
        - type
      additionalProperties: true
    ControllersValue:
      type: object
      description: controllers.value
      properties:
        controllers:
          type: array
          items:
            $ref: "#/components/schemas/Controller"
          description: Live PSC entries; ceased ones are excluded.
        has_corporate_owner:
          type: boolean
          description: A company or legal entity is among the live entries.
        control:
          type: object
          properties:
            has_corporate_controller:
              type: boolean
            has_individual_controller:
              type: boolean
            no_controller_on_register:
              type: boolean
              description: Neither a company nor a person is named.
            statement:
              anyOf:
                - type: string
                - type: "null"
            statement_notified_on:
              type: string
              description: A live statement entry exists. YYYY-MM-DD.
          required:
            - has_corporate_controller
            - has_individual_controller
            - no_controller_on_register
            - statement
          additionalProperties: true
        ceased_controllers:
          type: array
          items:
            $ref: "#/components/schemas/Controller"
          description: Ceased entries, newest first, each with ceased_on.
      required:
        - controllers
        - has_corporate_owner
        - control
        - ceased_controllers
      additionalProperties: true
    CorporateOwnersValue:
      type: object
      description: corporate_owners.value. Each owner may carry its own
        nature_of_business envelope (what the owner does).
      properties:
        has_corporate_owner:
          type: boolean
        owners:
          type: array
          items:
            type: object
            properties:
              name:
                anyOf:
                  - type: string
                  - type: "null"
              company_number:
                type: string
                description: As filed, where usable.
              country_registered:
                anyOf:
                  - type: string
                  - type: "null"
              natures_of_control:
                type: array
                items:
                  type: string
                description: This is shown as filed.
              notified_on:
                anyOf:
                  - type: string
                    description: YYYY-MM-DD.
                  - type: "null"
              nature_of_business:
                $ref: "#/components/schemas/BlockEnvelope"
            additionalProperties: true
      required:
        - has_corporate_owner
        - owners
      additionalProperties: true
    UltimateOwnerValue:
      type: object
      description: ultimate_owner.value
      properties:
        company_name:
          anyOf:
            - type: string
            - type: "null"
        company_number:
          anyOf:
            - type: string
            - type: "null"
        depth:
          type: integer
          description: This is the number of steps from this company to the top.
        resolved_by:
          type: string
          description: This is the resolution category for the top of the chain.
        chain:
          type: array
          items:
            type: object
            properties:
              company_name:
                anyOf:
                  - type: string
                  - type: "null"
              company_number:
                anyOf:
                  - type: string
                  - type: "null"
            additionalProperties: true
      additionalProperties: true
    Charge:
      type: object
      properties:
        charge_code:
          anyOf:
            - type: string
            - type: "null"
        status:
          anyOf:
            - type: string
              description: outstanding, satisfied, part-satisfied ... as classified.
            - type: "null"
        created_on:
          anyOf:
            - type: string
            - type: "null"
        registered_on:
          anyOf:
            - type: string
            - type: "null"
        satisfied_on:
          type: string
          description: Where satisfied. YYYY-MM-DD.
        persons_entitled:
          type: array
          items:
            type: string
          description: Holders verbatim, capacity included (", AS SECURITY AGENT").
        type:
          type: string
          description: The filed description, e.g. DEBENTURE.
        particulars:
          type: string
          description: Particulars as filed.
        contains:
          type: array
          items:
            type: string
            enum:
              - fixed_charge
              - floating_charge
              - floating_charge_covers_all
              - negative_pledge
        secured_on:
          type: string
          description: General description of the property, where filed.
        amount_secured:
          description: This is shown as filed.
      additionalProperties: true
    ChargesValue:
      type: object
      description: charges.value. as_of is the latest registration date.
      properties:
        outstanding_count:
          type: integer
          description: Counted from the charge records.
        satisfied_count:
          type: integer
        total_count:
          type: integer
        unclassified_count:
          type: integer
          description: This is the number of charges with no classification.
        holders:
          type: array
          items:
            type: string
          description: These are the distinct holders of outstanding charges, shown
            verbatim.
        charges:
          type: array
          items:
            $ref: "#/components/schemas/Charge"
          description: Outstanding charges.
        satisfied_charges:
          type: array
          items:
            $ref: "#/components/schemas/Charge"
          description: Newest satisfaction first, at most 50.
        satisfied_truncated:
          type: boolean
        past_holders:
          type: array
          items:
            type: string
          description: These are the holders of satisfied charges.
        latest_created_on:
          type: string
        latest_satisfied_on:
          type: string
      required:
        - outstanding_count
        - satisfied_count
        - total_count
        - holders
        - charges
      additionalProperties: true
    FilingStatusValue:
      type: object
      description: filing_status.value
      properties:
        accounts_last_made_up_on:
          type: string
          description: YYYY-MM-DD.
        accounts_next_due_on:
          type: string
          description: YYYY-MM-DD.
        accounts_next_made_up_to:
          type: string
          description: YYYY-MM-DD.
        accounts_category:
          type: string
          description: This is the register's accounts category, e.g. FULL, SMALL, MICRO
            ENTITY, NO ACCOUNTS FILED.
        accounts_overdue:
          type: boolean
          description: The register's overdue flag.
        confirmation_statement_last_made_up_on:
          type: string
          description: YYYY-MM-DD.
        confirmation_statement_next_due_on:
          type: string
          description: YYYY-MM-DD.
        confirmation_statement_overdue:
          type: boolean
          description: The register's overdue flag.
        accounts_last_made_up_on_expected:
          type: object
          description: This is given with reason accounts_made_up_date_off_reference_date
            and contains the date implied by the accounting reference date. The
            date above is left unchanged.
          properties:
            date:
              type: string
              format: date
            rule:
              type: string
            note:
              type: string
          additionalProperties: true
        corrections:
          type: object
          additionalProperties:
            type: object
            properties:
              previous_value:
                type: string
              rule:
                type: string
            additionalProperties: true
          description: This is a corrected due date because accounts on the register had
            already met the earlier date.
      additionalProperties: true
    RegistryEventsValue:
      type: object
      description: "registry_events.value: each date absent when nothing of that kind
        is on file. as_of is the latest of them."
      properties:
        officer_appointed_on:
          type: string
          description: YYYY-MM-DD.
        officer_resigned_on:
          type: string
          description: YYYY-MM-DD.
        officer_details_changed_on:
          type: string
          description: YYYY-MM-DD.
        psc_added_on:
          type: string
          description: YYYY-MM-DD.
        psc_ceased_on:
          type: string
          description: YYYY-MM-DD.
        psc_changed_on:
          type: string
          description: YYYY-MM-DD.
        shares_allotted_on:
          type: string
          description: YYYY-MM-DD.
      additionalProperties: true
    FinancialPeriod:
      type: object
      properties:
        year:
          type: string
          description: The year key.
        period_start:
          anyOf:
            - type: string
            - type: "null"
        period_end:
          anyOf:
            - type: string
            - type: "null"
        period_end_basis:
          type: string
          description: year_key_only when no date is on file; ocr_read when read from the
            filing.
        filed:
          type: object
          additionalProperties: true
          description: Figures as filed (turnover and profit_loss only where a P&L was
            filed; net_worth and working_capital alias the filed figures).
        modelled:
          type: object
          additionalProperties: true
          description: Modelled turnover, profit_loss, profit_margin_pct,
            turnover_growth_pct.
        ocr_read:
          type: object
          additionalProperties: true
          description: "Figures read from PDF accounts: page and confidence per field,
            always flagged."
        derived:
          type: object
          additionalProperties: true
          description: Ratios from filed or read figures, each with formula, basis and
            inputs.
        not_derivable:
          type: object
          additionalProperties: true
        filed_withheld:
          type: object
          additionalProperties: true
        modelled_withheld:
          type: string
        flagged_for_review:
          type: boolean
      required:
        - year
        - filed
        - modelled
      additionalProperties: true
    FinancialsFiledValue:
      type: object
      description: financials_filed.value
      properties:
        revenue_gbp:
          type: number
          description: This is the newest filed or ocr_read turnover, or the modelled
            turnover only when nothing was filed. Check revenue_basis.
        revenue_basis:
          type: string
          description: The value is filed, ocr_read or modelled.
        revenue_period_end:
          type: string
        profit_loss_gbp:
          type: number
          description: This is the headline profit and follows the same rule.
        profit_loss_basis:
          type: string
        profit_loss_period_end:
          type: string
        turnover_change_pct:
          type: number
        turnover_change_basis:
          type: string
        turnover_change_period_end:
          type: string
        best_turnover_growth_pct:
          type: number
        best_turnover_growth_basis:
          type: string
        profit_margin_stable:
          type: boolean
        filed_revenue:
          type: object
          additionalProperties: true
        filed_profit_loss:
          type: object
          additionalProperties: true
        modelled_profit_loss:
          type: object
          additionalProperties: true
        modelled_revenue:
          type: object
          additionalProperties: true
          description: This is the modelled revenue with its band.
        modelled_revenue_withheld:
          $ref: "#/components/schemas/ReasonCode"
        turnover_definition:
          type: object
          additionalProperties: true
        withheld:
          type: array
          items:
            type: object
            additionalProperties: true
          description: These are withheld figures, each with period_end, side, field and
            reason.
        years:
          type: integer
          description: This is the number of periods.
        periods:
          type: array
          items:
            $ref: "#/components/schemas/FinancialPeriod"
          description: Newest first.
      additionalProperties: true
    DomainValidationValue:
      type: object
      description: domain_validation.value. With validation=none only domain is present.
      properties:
        domain:
          type: string
          description: This is the website checked or, after a passing redirect, the final
            domain.
        dns_resolves:
          anyOf:
            - type: boolean
              description: In live mode, the name resolves. null means that the check could
                not be completed.
            - type: "null"
        email_deliverable:
          anyOf:
            - type: boolean
              description: In live mode, the domain accepts mail. null means that the check
                could not be completed.
            - type: "null"
        site_live:
          anyOf:
            - type: boolean
              description: In live mode, the site answered over HTTP(S).
            - type: "null"
        http_status:
          anyOf:
            - type: integer
              description: This is the HTTP status returned for the website.
            - type: "null"
        final_url:
          type: string
          description: This is the final URL after redirects.
        final_domain:
          type: string
          description: The domain that the domain on file forwards to.
        note:
          type: string
        director_check:
          type: string
          enum:
            - companies_house
            - source_busy
          description: This identifies the source of the director check.
        score:
          type: integer
          description: This is the score, with a maximum of 100.
          minimum: 0
          maximum: 100
        outcome:
          type: string
          enum:
            - accept
            - review
            - reject
          description: "The verdict. accept: score >= 50 with a hard match and no
            objection. review: 40–49, or >= 50 without a hard match. reject:
            under 40."
        reason:
          type: string
          description: name_matches_no_address_evidence when only the name tied the site
            to the company.
        checks:
          type: object
          additionalProperties: true
          description: This object may contain legal_name_exact, business_name,
            same_postcode, similar_postcode, city_match, county_match,
            address_match, director_match, company_number, other_company_number,
            foreign_registration, uk_domain, phone_present, generic_platform and
            parked.
        contributions:
          type: object
          additionalProperties:
            type: number
          description: This object contains the contribution associated with each check.
        reasons:
          type: array
          items:
            type: string
          description: These are short notes about the checks.
        ai_outcome:
          type: string
          enum:
            - pass
            - fail
          description: "ai mode: reported beside the score; it does not change the score."
        ai_reason:
          type: string
      required:
        - domain
      additionalProperties: true
    NatureOfBusinessValue:
      type: object
      description: "nature_of_business.value: a description of what the company does,
        written from its website."
      properties:
        one_liner:
          type: string
          description: This is a short description.
        product_service:
          type: string
          description: This describes the offering in detail.
      additionalProperties: true
    IndustryValue:
      type: object
      description: industry.value
      properties:
        sic:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
              description:
                type: string
              scheme:
                type: string
                enum:
                  - sic_2007
                  - sic_2003
              is_primary:
                type: boolean
            required:
              - code
              - is_primary
            additionalProperties: true
        label:
          type: string
          description: This is a plain-English industry label.
        label_source:
          type: string
          enum:
            - sic
            - nace
            - unknown
            - other
        nace:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
              from_sic:
                type: string
              description:
                type: string
            required:
              - code
              - from_sic
            additionalProperties: true
        tags:
          type: object
          description: These are activity tags from the website; they are withheld when
            the website is not validated.
          properties:
            level_1:
              type: array
              items:
                type: string
              description: ""
            level_2:
              type: array
              items:
                type: string
              description: ""
            level_3:
              type: array
              items:
                type: string
              description: ""
          additionalProperties: true
        tags_source:
          type: string
          const: zorro_from_website
        sic_is_generic:
          type: boolean
          description: None of the filed codes names a trade (dormant, holding, n.e.c.).
        declared_activity:
          type: string
          description: This is the nature_of_business one-liner for comparison when that
            block is on the same row.
      required:
        - sic
        - sic_is_generic
      additionalProperties: true
    SubsidiariesValue:
      type: object
      description: "subsidiaries.value: direct holdings only."
      properties:
        subsidiaries:
          type: array
          items:
            type: object
            properties:
              company_number:
                anyOf:
                  - type: string
                  - type: "null"
              company_name:
                anyOf:
                  - type: string
                  - type: "null"
              company_status:
                anyOf:
                  - type: string
                  - type: "null"
              natures_of_control:
                type: array
                items:
                  type: string
                description: ""
              ownership_band:
                anyOf:
                  - type: string
                  - type: "null"
              notified_on:
                anyOf:
                  - type: string
                  - type: "null"
              matched_on:
                type: string
                enum:
                  - registration_number
                  - name
            additionalProperties: true
        count:
          type: integer
        active_count:
          type: integer
        truncated:
          type: boolean
          description: This is true when there are more than 100 matching companies.
      required:
        - subsidiaries
        - count
        - active_count
      additionalProperties: true
    PropertyValue:
      type: object
      description: property.value (HM Land Registry, England and Wales).
      properties:
        title_count:
          anyOf:
            - type: integer
            - type: "null"
        total_price_paid_gbp:
          type: number
          description: The sum paid for the titles when bought. Not a valuation.
        tenure:
          type: array
          items:
            type: string
          description: ""
        postcodes:
          type: array
          items:
            type: string
          description: ""
        addresses:
          type: array
          items:
            type: string
          description: ""
      additionalProperties: true
    RelatedCompanyDomainValue:
      type: object
      properties:
        domain:
          type: string
        company_name:
          anyOf:
            - type: string
            - type: "null"
        company_number:
          type: string
      required:
        - domain
      additionalProperties: true
    ContactsValue:
      type: object
      additionalProperties: true
      description: "contacts.value: people with role, email and status. Personal data;
        see the catalog description."
    RowBlocks:
      type: object
      description: One envelope per requested block, keyed by block.
      properties:
        company_identity:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/CompanyIdentityValue"
        registered_address:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/RegisteredAddressValue"
        officers:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/OfficersValue"
        controllers:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/ControllersValue"
        corporate_owners:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/CorporateOwnersValue"
        ultimate_owner:
          description: Premium.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/UltimateOwnerValue"
        industry:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/IndustryValue"
        charges:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/ChargesValue"
        filing_status:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/FilingStatusValue"
        registry_events:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/RegistryEventsValue"
        financials_filed:
          description: Premium.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/FinancialsFiledValue"
        employees_filed:
          description: Premium.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  type: integer
                  description: Average employees as filed; as_of is the year.
        domain:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  type: string
                  description: The registrable domain.
        domain_validation:
          description: Core.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/DomainValidationValue"
        nature_of_business:
          description: Premium.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/NatureOfBusinessValue"
        subsidiaries:
          description: Premium.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/SubsidiariesValue"
        property:
          description: Premium.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/PropertyValue"
        related_company_domain:
          description: Premium.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/RelatedCompanyDomainValue"
        contacts:
          description: Premium.
          allOf:
            - $ref: "#/components/schemas/BlockEnvelope"
            - type: object
              properties:
                value:
                  $ref: "#/components/schemas/ContactsValue"
      additionalProperties:
        $ref: "#/components/schemas/BlockEnvelope"
    Matched:
      type: object
      properties:
        company_number:
          type: string
        company_name:
          anyOf:
            - type: string
            - type: "null"
        match_confidence:
          anyOf:
            - type: number
            - type: "null"
        matched_on:
          anyOf:
            - type: string
              enum:
                - company_number
                - company_name
                - domain
                - website_legal_page
            - type: "null"
        evidence:
          type: object
          additionalProperties: true
          description: "matched_on website_legal_page: the page and snippet the match
            rests on."
      required:
        - company_number
        - company_name
        - match_confidence
        - matched_on
      additionalProperties: true
    Row:
      type: object
      properties:
        ref:
          type: string
          description: This is your reference, which is echoed back.
        status:
          $ref: "#/components/schemas/RowStatus"
        blocks:
          $ref: "#/components/schemas/RowBlocks"
        matched:
          anyOf:
            - $ref: "#/components/schemas/Matched"
            - type: "null"
        pending_blocks:
          type: array
          items:
            $ref: "#/components/schemas/BlockKey"
          description: Blocks still being worked on (progressive resolve).
      required:
        - ref
        - status
        - blocks
        - matched
      additionalProperties: true
      examples:
        - ref: ""
          status: done
          blocks:
            company_identity:
              status: available
              value:
                incorporated_on: 1993-04-01
                company_category: Private Limited Company
                country_of_origin: United Kingdom
                legal_form: Limited
                company_status: Active
                status_group: active
                trading_name: Hotel Chocolat
                trading_name_source: third_party_profile
              source: companies_house
            registered_address:
              status: available
              value:
                address_line_1: MINT HOUSE
                address_line_2: NEWARK CLOSE
                locality: ROYSTON
                region: HERTFORDSHIRE
                postal_code: SG8 5HL
              source: companies_house
            filing_status:
              status: available
              value:
                accounts_last_made_up_on: 2024-12-28
                accounts_next_due_on: 2026-09-28
                accounts_category: AUDIT EXEMPTION SUBSIDIARY
                confirmation_statement_last_made_up_on: 2026-03-31
                confirmation_statement_next_due_on: 2027-04-14
              source: companies_house
              detail:
                freshness:
                  checked_live: false
              as_of: 2026-07-01
            officers:
              status: available
              value:
                total: 21
                active: 4
                current:
                  - name: NICOLA LACEY
                    role: Director
                    appointed_on: 2024-08-23
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: DIRECTOR
                    person_number: "184966970001"
                    person_key: "18496697"
                    date_of_birth:
                      month: 10
                      year: 1972
                  - name: DANIEL MARK JENKS
                    role: Director
                    appointed_on: 2026-02-28
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: null
                    person_number: "346063570001"
                    person_key: "34606357"
                    date_of_birth:
                      month: 7
                      year: 1983
                  - name: Isabel Louise STATON
                    role: Director
                    appointed_on: 2026-04-20
                    nationality: British
                    country_of_residence: United Kingdom
                    occupation: null
                    person_number: XlZ47f6Fh_bvCYU-tcCitVk7d6w
                    date_of_birth:
                      month: 12
                      year: 1978
                  - name: INDIGO CORPORATE SECRETARY LIMITED
                    role: Secretary
                    appointed_on: 2021-06-30
                    nationality: null
                    country_of_residence: null
                    occupation: null
                    person_number: "281695990002"
                    person_key: "28169599"
                    is_corporate: true
                resigned: 17
                former:
                  - name: GREGOIRE ALEXANDRE GAILLOT
                    role: Director
                    appointed_on: 2024-01-25
                    nationality: FRENCH
                    country_of_residence: UNITED STATES
                    occupation: FINANCE DIRECTOR
                    person_number: "318583360001"
                    person_key: "31858336"
                    date_of_birth:
                      month: 12
                      year: 1980
                    resigned_on: 2026-04-20
                  - name: LYSA MARIA HARDY
                    role: Director
                    appointed_on: 2024-08-23
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: DIRECTOR
                    person_number: "165408450002"
                    person_key: "16540845"
                    date_of_birth:
                      month: 4
                      year: 1970
                    resigned_on: 2025-08-27
                  - name: PAULA KELLY
                    role: Director
                    appointed_on: 2024-01-25
                    nationality: AMERICAN
                    country_of_residence: UNITED STATES
                    occupation: LAWYER
                    person_number: "318580620001"
                    person_key: "31858062"
                    date_of_birth:
                      month: 7
                      year: 1967
                    resigned_on: 2024-08-23
                  - name: ANGUS THIRLWELL
                    role: Director
                    appointed_on: 1993-04-01
                    nationality: BRITISH
                    country_of_residence: ENGLAND
                    occupation: DIRECTOR
                    person_number: "033391700002"
                    person_key: "03339170"
                    date_of_birth:
                      month: 4
                      year: 1963
                    resigned_on: 2024-08-23
                  - name: JONATHAN FIRTH AKEHURST
                    role: Director
                    appointed_on: 2023-05-15
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: COMPANY DIRECTOR
                    person_number: "309030640001"
                    person_key: "30903064"
                    date_of_birth:
                      month: 1
                      year: 1983
                    resigned_on: 2024-01-25
                  - name: LYSA MARIA HARDY
                    role: Director
                    appointed_on: 2020-09-18
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: CHIEF MARKETING OFFICER
                    person_number: "165408450002"
                    person_key: "16540845"
                    date_of_birth:
                      month: 4
                      year: 1970
                    resigned_on: 2024-01-25
                  - name: MATTHEW PAUL MARGERESON
                    role: Director
                    appointed_on: 2007-02-07
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: COMPANY DIRECTOR
                    person_number: "118935720001"
                    person_key: "11893572"
                    date_of_birth:
                      month: 12
                      year: 1970
                    resigned_on: 2024-01-25
                  - name: PETER MARK HARRIS
                    role: Director
                    appointed_on: 1993-04-01
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: DIRECTOR
                    person_number: "033391720002"
                    person_key: "03339172"
                    date_of_birth:
                      month: 2
                      year: 1955
                    resigned_on: 2024-01-25
                  - name: MATTHEW ROBERT PHILLIP PRITCHARD
                    role: Director
                    appointed_on: 2014-11-20
                    nationality: BRITISH
                    country_of_residence: ENGLAND
                    occupation: COMPANY DIRECTOR
                    person_number: "192967640001"
                    person_key: "19296764"
                    date_of_birth:
                      month: 5
                      year: 1974
                    resigned_on: 2023-01-31
                  - name: PETER MARK HARRIS
                    role: Secretary
                    appointed_on: 1993-04-01
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: DIRECTOR
                    person_number: "033391720002"
                    person_key: "03339172"
                    date_of_birth:
                      month: 2
                      year: 1955
                    resigned_on: 2021-06-30
                  - name: HEATHER FRANCES BLACKMAN
                    role: Director
                    appointed_on: 2008-11-18
                    nationality: BRITISH
                    country_of_residence: ENGLAND
                    occupation: COMPANY DIRECTOR
                    person_number: "206665810001"
                    person_key: "20666581"
                    date_of_birth:
                      month: 2
                      year: 1963
                    resigned_on: 2015-05-31
                  - name: MICHAEL CHRISTOPHER DOYLE
                    role: Director
                    appointed_on: 2011-09-05
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: COMPANY DIRECTOR
                    person_number: "138725480001"
                    person_key: "13872548"
                    date_of_birth:
                      month: 6
                      year: 1972
                    resigned_on: 2013-12-31
                  - name: EMIL FREDRIK CHRISTER AHLIN
                    role: Director
                    appointed_on: 2008-11-17
                    nationality: SWEDISH
                    country_of_residence: ENGLAND
                    occupation: COMPANY DIRECTOR
                    person_number: "134700840002"
                    person_key: "13470084"
                    date_of_birth:
                      month: 10
                      year: 1970
                    resigned_on: 2012-04-13
                  - name: PETER ARTHUR KLAUBER
                    role: Director
                    appointed_on: 2008-09-01
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: COMPANY DIRECTOR
                    person_number: "133070060001"
                    person_key: "13307006"
                    date_of_birth:
                      month: 4
                      year: 1955
                    resigned_on: 2011-06-30
                  - name: LYNN CUNNINGHAM
                    role: Director
                    appointed_on: 2005-01-10
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: COMPANY DIRECTOR
                    person_number: "102522780003"
                    person_key: "10252278"
                    date_of_birth:
                      month: 1
                      year: 1968
                    resigned_on: 2011-05-20
                  - name: JOHN CYRIL HADLEY
                    role: Director
                    appointed_on: 2004-05-17
                    nationality: BRITISH
                    country_of_residence: UNITED KINGDOM
                    occupation: COMPANY DIRECTOR
                    person_number: "163797310001"
                    person_key: "16379731"
                    date_of_birth:
                      month: 3
                      year: 1946
                    resigned_on: 2009-01-28
                  - name: SWIFT INCORPORATIONS LIMITED
                    role: Secretary
                    appointed_on: 1993-04-01
                    nationality: BRITISH
                    country_of_residence: null
                    occupation: null
                    person_number: "900008300001"
                    person_key: "90000830"
                    is_corporate: true
                    resigned_on: 1993-04-01
                ages:
                  average: 57.9
                  youngest: 43
                  oldest: 80
              source: companies_house
              as_of: 2026-06-01
              detail:
                freshness:
                  checked_live: false
            controllers:
              status: available
              value:
                controllers:
                  - type: company
                    name: Hotel Chocolat Group Ltd
                    country_registered: England And Wales
                    natures_of_control:
                      - ownership-of-shares-75-to-100-percent
                      - voting-rights-75-to-100-percent
                    notified_on: 2016-04-06
                    company_number: "08612206"
                has_corporate_owner: true
                control:
                  has_corporate_controller: true
                  has_individual_controller: false
                  no_controller_on_register: false
                  statement: null
                ceased_controllers: []
              source: companies_house_psc
              detail:
                freshness:
                  checked_live: false
              as_of: 2026-07-01
            corporate_owners:
              status: available
              value:
                has_corporate_owner: true
                owners:
                  - name: Hotel Chocolat Group Ltd
                    natures_of_control:
                      - ownership-of-shares-75-to-100-percent
                      - voting-rights-75-to-100-percent
                    notified_on: 2016-04-06
                    country_registered: England And Wales
                    company_number: "08612206"
                    nature_of_business:
                      status: not_found
                      reason: no_description_on_file
              source: companies_house_psc
            ultimate_owner:
              status: available
              value:
                company_name: HOTEL CHOCOLAT GROUP LIMITED
                company_number: "08612206"
                depth: 1
                resolved_by: self
                chain:
                  - company_name: HOTEL CHOCOLAT GROUP LIMITED
                    company_number: "08612206"
              source: companies_house_psc
            charges:
              status: available
              value:
                outstanding_count: 0
                satisfied_count: 17
                total_count: 17
                holders: []
                charges: []
                satisfied_charges:
                  - charge_code: "028057300017"
                    status: satisfied
                    created_on: 2021-07-16
                    registered_on: 2021-07-21
                    persons_entitled:
                      - LLOYDS BANK PLC AS SECURITY TRUSTEE FOR THE SECURED
                        PARTIES
                    particulars: N/A CONTAINS FIXED CHARGE. CONTAINS FLOATING CHARGE. FLOATING
                      CHARGE COVERS ALL THE PROPERTY OR UNDERTAKING OF THE
                      COMPANY. CONTAINS NEGATIVE PLEDGE.
                    contains:
                      - fixed_charge
                      - floating_charge
                      - floating_charge_covers_all
                      - negative_pledge
                    satisfied_on: 2024-02-23
                  - charge_code: "028057300016"
                    status: satisfied
                    created_on: 2021-04-13
                    registered_on: 2021-04-19
                    persons_entitled:
                      - LLOYDS BANK CORPORATE MARKETS PLC
                    particulars: NOT APPLICABLE. CONTAINS FIXED CHARGE. CONTAINS FLOATING CHARGE.
                      FLOATING CHARGE COVERS ALL THE PROPERTY OR UNDERTAKING OF
                      THE COMPANY. CONTAINS NEGATIVE PLEDGE.
                    contains:
                      - fixed_charge
                      - floating_charge
                      - floating_charge_covers_all
                      - negative_pledge
                    satisfied_on: 2021-07-28
                  - charge_code: "028057300015"
                    status: satisfied
                    created_on: 2020-05-04
                    registered_on: 2020-05-07
                    persons_entitled:
                      - LLOYDS BANK PLC
                    particulars: NOT APPLICABLE. CONTAINS FIXED CHARGE. CONTAINS FLOATING CHARGE.
                      FLOATING CHARGE COVERS ALL THE PROPERTY OR UNDERTAKING OF
                      THE COMPANY. CONTAINS NEGATIVE PLEDGE.
                    contains:
                      - fixed_charge
                      - floating_charge
                      - floating_charge_covers_all
                      - negative_pledge
                    satisfied_on: 2021-07-26
                  - charge_code: "028057300014"
                    status: satisfied
                    created_on: 2015-07-02
                    registered_on: 2015-07-09
                    persons_entitled:
                      - LLOYDS BANK PLC
                    particulars: CONTAINS FIXED CHARGE. CONTAINS NEGATIVE PLEDGE.
                    contains:
                      - fixed_charge
                      - negative_pledge
                    satisfied_on: 2021-07-26
                  - charge_code: "028057300013"
                    status: satisfied
                    created_on: 2014-11-05
                    registered_on: 2014-11-11
                    persons_entitled:
                      - LLOYDS BANK PLC
                    particulars: CONTAINS FIXED CHARGE. CONTAINS NEGATIVE PLEDGE.
                    contains:
                      - fixed_charge
                      - negative_pledge
                    satisfied_on: 2021-07-26
                  - charge_code: "028057300012"
                    status: satisfied
                    created_on: 2014-10-13
                    registered_on: 2014-10-21
                    persons_entitled:
                      - LLOYDS BANK PLC
                    particulars: CONTAINS FIXED CHARGE. CONTAINS NEGATIVE PLEDGE.
                    contains:
                      - fixed_charge
                      - negative_pledge
                    satisfied_on: 2021-07-26
                  - charge_code: "028057300010"
                    status: satisfied
                    created_on: 2014-04-02
                    registered_on: 2014-04-04
                    persons_entitled:
                      - LLOYDS BANK PLC
                    particulars: CONTAINS FIXED CHARGE. CONTAINS NEGATIVE PLEDGE.
                    contains:
                      - fixed_charge
                      - negative_pledge
                    satisfied_on: 2021-07-26
                  - charge_code: "028057300007"
                    status: satisfied
                    created_on: 2010-01-26
                    registered_on: 2010-01-27
                    persons_entitled:
                      - LLOYDS TSB BANK PLC
                    amount_secured: ALL MONIES DUE OR TO BECOME DUE FROM THE COMPANY AND/OR ALL OR
                      ANY OF THE COMPANIES NAMED THEREIN TO THE CHARGEE ON ANY
                      ACCOUNT WHATSOEVER
                    type: A DEED OF ADMISSION TO AN OMNIBUS GUARANTEE AND SET-OFF AGREEMENT
                    particulars: ANY SUM OR SUMS FOR THE TIME BEING STANDING TO THE CREDIT OF ANY
                      PRESENT OR FUTURE ACCOUNT OF THE COMPANY WITH THE BANK
                    satisfied_on: 2021-07-26
                  - charge_code: "028057300006"
                    status: satisfied
                    created_on: 2009-10-06
                    registered_on: 2009-10-08
                    persons_entitled:
                      - LLOYDS TSB BANK PLC
                    amount_secured: ALL MONIES DUE OR TO BECOME DUE FROM THE COMPANY AND/OR ALL OR
                      ANY OF THE COMPANIES NAMED THEREIN TO THE CHARGEE ON ANY
                      ACCOUNT WHATSOEVER
                    type: DEED OF ADMISSION TO AN OMNIBUS GUARANTEE AND SET-OFF AGREEMENT DATED 8TH
                      AUGUST 2006 AND
                    particulars: ANY SUM OR SUMS FOR THE TIME BEING STANDING TO THE CREDIT OF ANY
                      ONE OR MORE OF ANY PRESENT OR FUTURE ACCOUNTS OF THE
                      COMPANIES OR ANY OF THEM WITH THE BANK
                    satisfied_on: 2021-07-26
                  - charge_code: "028057300004"
                    status: satisfied
                    created_on: 2006-08-08
                    registered_on: 2006-08-21
                    persons_entitled:
                      - LLOYDS TSB BANK PLC
                    amount_secured: ALL MONIES DUE OR TO BECOME DUE FROM THE COMPANY AND/OR ALL OR
                      ANY OF THE OTHER COMPANIES NAMED THEREIN TO THE CHARGEE ON
                      ANY ACCOUNT WHATSOEVER
                    type: AN OMNIBUS GUARANTEE AND SET-OFF AGREEMENT
                    particulars: ANY SUM OR SUMS FROM TIME TO TIME BEING STANDING TO THE CREDIT OF
                      ANY ONE OR MORE OF ANY PRESENT OR FUTURE ACCOUNTS OF THE
                      COMPANIES OR ANY OF THEM WITH THE BANK (INCLUDING ANY
                      ACCOUNTS HELD IN THE BANK'S NAME WITH ANY DESIGNATION
                      WHICH INCLUDES THE NAME (S) OF THE COMPANIES OR ANY OF
                      THEM) WHETHER SUCH ACCOUNTS BE DENOMINATED IN STERLING OR
                      IN A CURRENCY OR CURRENCIES OTHER THAN STERLING
                    satisfied_on: 2021-07-26
                  - charge_code: "028057300002"
                    status: satisfied
                    created_on: 1996-07-01
                    registered_on: 1996-07-05
                    persons_entitled:
                      - TSB BANK PLC
                    amount_secured: ALL MONIES DUE OR TO BECOME DUE FROM THE COMPANY TO THE CHARGEE
                      ON ANY ACCOUNT WHATSOEVER
                    type: MORTGAGE DEBENTURE
                    particulars: . FIXED AND FLOATING CHARGES OVER THE UNDERTAKING AND ALL PROPERTY
                      AND ASSETS PRESENT AND FUTURE INCLUDING GOODWILL BOOKDEBTS
                      UNCALLED CAPITAL BUILDINGS FIXTURES FIXED PLANT AND
                      MACHINERY SEE THE MORTGAGE CHARGE DOCUMENT FOR FULL
                      DETAILS
                    satisfied_on: 2021-07-26
                  - charge_code: "028057300009"
                    status: satisfied
                    created_on: 2013-07-17
                    registered_on: 2013-07-31
                    persons_entitled:
                      - LOMBARD NORTH CENTRAL PLC
                    particulars: CONTAINS FIXED CHARGE. NOTIFICATION OF ADDITION TO OR AMENDMENT OF
                      CHARGE.
                    contains:
                      - fixed_charge
                    satisfied_on: 2020-05-01
                  - charge_code: "028057300008"
                    status: satisfied
                    created_on: 2012-11-27
                    registered_on: 2012-11-30
                    persons_entitled:
                      - LOMBARD NORTH CENTRAL PLC
                    amount_secured: ALL MONIES DUE OR TO BECOME DUE FROM THE COMPANY TO THE CHARGEE
                      ON ANY ACCOUNT WHATSOEVER
                    type: CHATTEL MORTGAGE
                    particulars: USED 2009 KNOBEL KCM 9/18 OMEGA SERIAL NO. 07-KCM-39, USED 2009
                      KNOBEL VIBRATION TABLE VT/H, USED 2009 KNOBEL 16/32 ONE
                      SHOT CENTRE FILLING SERIAL NO 09-KCM-21 AND USED 2009
                      KNOBEL 16/32 CAD - ALPHA SERIAL NO HD09-KCM-22
                    satisfied_on: 2020-05-01
                  - charge_code: "028057300005"
                    status: satisfied
                    created_on: 2007-09-05
                    registered_on: 2007-09-19
                    persons_entitled:
                      - LLOYDS TSB BANK PLC
                    amount_secured: ALL MONIES DUE OR TO BECOME DUE FROM THE COMPANY TO THE CHARGEE
                      ON ANY ACCOUNT WHATSOEVER
                    type: MORTGAGE
                    particulars: F/H PROPERTY K/A OR BEING 1 GLEBE ROAD OFF ST PETERS ROAD
                      HUNTINGDON T/NO CB2001 TOGETHER WITH ALL BUILDINGS AND
                      FIXTURES (INCLUDING TRADE FIXTURES) FIXED PLANT AND
                      MACHINERY BY WAY OF FIXED CHARGE ALL PRESENT AND FUTURE
                      BOOK AND OTHER DEBTS FLOATING CHARGE OVER ALL MOVEABLE
                      PLANT MACHINERY IMPLEMENTS UTENSILS FURNITURE AND
                      EQUIPMENT BY WAY OF ASSIGNMENT THE GOODWILL OF THE
                      BUSINESS (IF ANY) THE FULL BENEFIT OF ALL LICENCES AND ALL
                      GUARANTEES
                    satisfied_on: 2017-05-30
                  - charge_code: "028057300003"
                    status: satisfied
                    created_on: 2004-07-30
                    registered_on: 2004-08-04
                    persons_entitled:
                      - LLOYDS TSB BANK PLC
                    amount_secured: ALL MONIES DUE OR TO BECOME DUE FROM THE COMPANY TO THE CHARGEE
                      ON ANY ACCOUNT WHATSOEVER
                    type: MORTGAGE
                    particulars: F/H PROPERTY K/A 3 REDWONGS WAY, HUNTINGDON T/NO. HN920 TOGETHER
                      WITH ALL BUILDINGS AND FIXTURES (INCLUDING TRADE FIXTURES)
                      FIXED PLANT AND MACHINERY BY WAY OF FIXED CHARGE ALL
                      PRESENT AND FUTURE BOOK AND OTHER DEBTS FLOATING CHARGE
                      OVER ALL MOVEABLE PLANT MACHINERY IMPLEMENTS UTENSILS
                      FURNITURE AND EQUIPMENT BY WAY OF ASSIGNMENT THE GOODWILL
                      OF THE BUSINESS (IF ANY) THE FULL BENEFIT OF ALL LICENCES
                      AND ALL GUARANTEES
                    satisfied_on: 2017-05-30
                  - charge_code: "028057300011"
                    status: satisfied
                    created_on: 2014-10-13
                    registered_on: 2014-10-21
                    persons_entitled:
                      - LLOYDS BANK PLC
                    particulars: L/H UNIT SU31, SOUTHGATE, BATH T/NO ST307022 CONTAINS FIXED CHARGE.
                      CONTAINS FLOATING CHARGE. CONTAINS NEGATIVE PLEDGE.
                    contains:
                      - fixed_charge
                      - floating_charge
                      - negative_pledge
                    satisfied_on: 2017-02-01
                  - charge_code: "028057300001"
                    status: satisfied
                    created_on: 1994-09-13
                    registered_on: 1994-09-16
                    persons_entitled:
                      - BARCLAYS BANK PLC
                    amount_secured: ALL MONIES DUE OR TO BECOME DUE FROM THE COMPANY TO THE CHARGEE
                      ON ANY ACCOUNT WHATSOEVER
                    type: DEBENTURE
                    particulars: FIXED AND FLOATING CHARGES OVER THE UNDERTAKING AND ALL PROPERTY
                      AND ASSETS PRESENT AND FUTURE INCLUDING GOODWILL BOOKDEBTS
                      UNCALLED CAPITAL BUILDINGS FIXTURES FIXED PLANT AND
                      MACHINERY SEE THE MORTGAGE CHARGE DOCUMENT FOR FULL
                      DETAILS
                    satisfied_on: 1996-09-19
                past_holders:
                  - LLOYDS BANK PLC AS SECURITY TRUSTEE FOR THE SECURED PARTIES
                  - LLOYDS BANK CORPORATE MARKETS PLC
                  - LLOYDS BANK PLC
                  - LLOYDS TSB BANK PLC
                  - TSB BANK PLC
                  - LOMBARD NORTH CENTRAL PLC
                  - BARCLAYS BANK PLC
                latest_created_on: 2021-07-16
                latest_satisfied_on: 2024-02-23
              source: companies_house
              as_of: 2021-07-21
              detail:
                freshness:
                  checked_live: false
            industry:
              status: available
              value:
                sic:
                  - code: "10821"
                    description: Manufacture of cocoa and chocolate confectionery
                    scheme: sic_2007
                    is_primary: true
                label: food and beverage manufacturing
                label_source: sic
                nace:
                  - code: "10.82"
                    from_sic: "10821"
                sic_is_generic: false
              source: companies_house
              derived: true
          matched:
            company_number: "02805730"
            company_name: HOTEL CHOCOLAT LIMITED
            match_confidence: 1
            matched_on: company_number
    Warning:
      type: object
      description: Some requested blocks are not enabled for the key; they come back
        not_enabled and every other block is unaffected.
      properties:
        code:
          type: string
          const: blocks_not_enabled
        blocks:
          type: array
          items:
            $ref: "#/components/schemas/BlockKey"
        detail:
          type: string
      required:
        - code
        - blocks
        - detail
      additionalProperties: true
    ResolveResponse:
      description: The row for one company, with its job id. With defer_live=true also
        complete, pending_blocks, results_url, status_url and, while pending,
        retry_after_ms.
      allOf:
        - $ref: "#/components/schemas/Row"
        - type: object
          properties:
            job_id:
              type: string
              format: uuid
            expires_at:
              anyOf:
                - type: string
                  format: date-time
                  description: When the row stops being available; null while the row is
                    unfinished, or with store=false.
                - type: "null"
            stored:
              type: boolean
              const: false
              description: "store=false: the row is not kept after answering."
            warnings:
              type: array
              items:
                $ref: "#/components/schemas/Warning"
            complete:
              type: boolean
              description: "defer_live: every block has answered."
            results_url:
              type: string
              format: uri
            status_url:
              type: string
              format: uri
            retry_after_ms:
              type: integer
              description: "defer_live and not complete: wait this long before polling
                results_url."
          required:
            - job_id
            - expires_at
          additionalProperties: true
    JobCounts:
      type: object
      properties:
        total:
          type: integer
        processed:
          type: integer
        succeeded:
          type: integer
        not_found:
          type: integer
        failed:
          type: integer
        site_unreachable:
          type: integer
          description: Rows whose website would not open (not a subset of the other counts).
      required:
        - total
        - processed
        - succeeded
        - not_found
        - failed
        - site_unreachable
      additionalProperties: true
    Job:
      type: object
      properties:
        job_id:
          type: string
          format: uuid
        status:
          $ref: "#/components/schemas/JobStatus"
        blocks:
          type: array
          items:
            $ref: "#/components/schemas/BlockKey"
        counts:
          $ref: "#/components/schemas/JobCounts"
        delivery:
          type: object
          properties:
            mode:
              type: string
              enum:
                - pull
                - webhook
          required:
            - mode
          additionalProperties: true
        results_ready:
          type: boolean
          description: "The job is terminal: every row is final."
        expires_at:
          anyOf:
            - type: string
              format: date-time
              description: When the job's rows stop being available. It is `null` while the
                job is running.
            - type: "null"
        created_at:
          type: string
          format: date-time
        finished_at:
          anyOf:
            - type: string
              format: date-time
            - type: "null"
        warnings:
          type: array
          items:
            $ref: "#/components/schemas/Warning"
        retry_after_ms:
          type: integer
          description: For a job that is not terminal, this is the polling delay in
            milliseconds.
        results_url:
          type: string
          format: uri
          description: This is present only on a job created by GET /v1/resolve?wait=false.
      required:
        - job_id
        - status
        - blocks
        - counts
        - delivery
        - results_ready
        - expires_at
        - created_at
        - finished_at
      additionalProperties: true
    RowInput:
      type: object
      description: Exactly one of company_number, company_name or domain.
      properties:
        ref:
          type: string
          description: This is your reference, which is echoed back.
          maxLength: 120
        company_number:
          type: string
          description: Companies House number.
          maxLength: 20
        company_name:
          type: string
          description: Registered name. A name that is plainly a website (no spaces, a
            dot) is treated as domain.
          maxLength: 500
        domain:
          type: string
          description: A bare host or a URL. Cannot be combined with number or name.
          maxLength: 255
      additionalProperties: false
    JobOptions:
      type: object
      description: Unknown option names are ignored.
      properties:
        validation:
          type: array
          items:
            type: string
            enum:
              - none
              - rules
              - live
              - officers
              - ai
          description: domain_validation modes. Default rules and live.
        min_confidence:
          type: number
          description: Your threshold for domain_validation and the website-derived
            blocks. Default 0.5.
          minimum: 0
          maximum: 1
        discover:
          type: array
          items:
            $ref: "#/components/schemas/BlockKey"
          description: Blocks to look up when the company has no value on file. Jobs
            default to ["domain"]; pass [] to skip the lookup.
        force_refresh:
          type: array
          items:
            $ref: "#/components/schemas/BlockKey"
          description: Blocks to look up again although a value is on file.
        max_live_lookups:
          type: integer
          description: How many rows may run a website search; rows past it answer
            `source_busy`. 0 means no searches.
          minimum: 0
        web_search:
          type: boolean
          description: This is a Premium option enabled per account. Refused with 403 when
            not enabled.
        read_accounts_pdf:
          type: boolean
          description: "financials_live: read accounts filed only as PDF. Off by default."
        google_business:
          type: boolean
          description: For trading_address, this adds the listing check. Off by default.
        ai_apply_multiplier:
          type: boolean
          description: "ai validation mode: apply the AI factor to the score (off by
            default)."
        contact_roles:
          type: array
          items:
            type: string
            enum:
              - owner
              - director
              - finance
              - operations
        max_contacts:
          type: integer
          description: Default 3.
          minimum: 1
          maximum: 5
        verify_emails:
          type: boolean
        contacts_lookup:
          type: string
          enum:
            - cached_only
            - live
        include_phone:
          type: boolean
        include_linkedin:
          type: boolean
        delivery:
          type: string
          enum:
            - pull
            - webhook
          description: "pull (default): collect results from the results endpoint. webhook
            is accepted; no callback is sent."
        callback_url:
          type: string
          format: uri
          description: Accepted with delivery webhook; not called.
      additionalProperties: true
    JobCreateRequest:
      type: object
      properties:
        rows:
          type: array
          items:
            $ref: "#/components/schemas/RowInput"
          minItems: 1
          maxItems: 250000
        blocks:
          type: array
          items:
            $ref: "#/components/schemas/BlockKey"
          minItems: 1
        options:
          $ref: "#/components/schemas/JobOptions"
      required:
        - rows
        - blocks
      additionalProperties: true
    ResultsPage:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: "#/components/schemas/Row"
          description: Every row in seq order, whatever its status.
        next_cursor:
          anyOf:
            - type: string
              description: Pass as cursor for the next page; null at the end.
            - type: "null"
        remaining:
          type: integer
          description: Rows after this page.
        results_ready:
          type: boolean
        expires_at:
          anyOf:
            - type: string
              format: date-time
            - type: "null"
        retry_after_ms:
          type: integer
          description: While the job is not terminal.
      required:
        - results
        - next_cursor
        - remaining
        - results_ready
        - expires_at
      additionalProperties: true
    QuarantinedRow:
      type: object
      properties:
        ref:
          type: string
        key:
          type: object
          properties:
            company_number:
              type: string
            company_name:
              type: string
            domain:
              type: string
          required:
            - company_number
            - company_name
            - domain
          additionalProperties: true
        reason:
          $ref: "#/components/schemas/RowFailureReason"
        retryable:
          type: boolean
        candidates:
          type: array
          items:
            $ref: "#/components/schemas/Candidate"
        host_type:
          type: string
          enum:
            - register
            - directory
            - social
            - site_builder
        site_lookup:
          $ref: "#/components/schemas/SiteLookup"
      required:
        - ref
        - key
        - reason
        - retryable
      additionalProperties: true
    ErrorsPage:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: "#/components/schemas/QuarantinedRow"
        next_cursor:
          anyOf:
            - type: string
            - type: "null"
        retryable_count:
          type: integer
          description: Failed rows worth resubmitting.
        expires_at:
          anyOf:
            - type: string
              format: date-time
            - type: "null"
      required:
        - errors
        - next_cursor
        - retryable_count
        - expires_at
      additionalProperties: true
    UsageOutcomes:
      type: object
      description: Events by outcome. Only delivered is charged.
      properties:
        delivered:
          type: integer
        not_found:
          type: integer
        ambiguous_match:
          type: integer
        not_enabled:
          type: integer
        error:
          type: integer
        cancelled:
          type: integer
      additionalProperties:
        type: integer
    Usage:
      type: object
      properties:
        range:
          type: object
          properties:
            from:
              type: string
              format: date
            to:
              type: string
              format: date
          required:
            - from
            - to
          additionalProperties: true
        granularity:
          type: string
          enum:
            - block
            - day
        pricing_status:
          type: string
          enum:
            - not_priced
            - agreed
          description: "not_priced: counts only. agreed: contract prices are loaded, and
            amount and currency appear."
        pricing_note:
          type: string
          description: With not_priced.
        blocks:
          type: array
          description: granularity block.
          items:
            type: object
            properties:
              block:
                $ref: "#/components/schemas/BlockKey"
              events:
                type: integer
              billed_events:
                type: integer
              outcomes:
                $ref: "#/components/schemas/UsageOutcomes"
              currency:
                type: string
                description: Only when priced.
              price_is_provisional:
                type: boolean
                const: false
              amount:
                type: string
                description: "Only when priced: a decimal string."
            required:
              - block
              - events
              - billed_events
              - outcomes
            additionalProperties: true
        days:
          type: array
          description: "granularity day: every UTC day in the range, a quiet day at zero."
          items:
            type: object
            properties:
              date:
                type: string
                format: date
              events:
                type: integer
              billed_events:
                type: integer
              outcomes:
                $ref: "#/components/schemas/UsageOutcomes"
              blocks:
                type: object
                additionalProperties:
                  type: integer
                description: Billed events by block.
            required:
              - date
              - events
              - billed_events
              - outcomes
              - blocks
            additionalProperties: true
        totals:
          type: object
          properties:
            events:
              type: integer
            billed_events:
              type: integer
            rows:
              type: integer
              description: "granularity block: rows accounted for (a cancel counts the skipped
                remainder)."
            billed_rows:
              type: integer
            invoiceable:
              type: boolean
              description: "granularity block: prices are agreed."
            currencies:
              type: array
              items:
                type: string
              description: Only when priced.
            price_is_provisional:
              type: boolean
              const: false
            amount:
              type: string
              description: Only when priced.
          required:
            - events
            - billed_events
          additionalProperties: true
        billing_rule:
          type: string
        job_id:
          type: string
          format: uuid
      required:
        - range
        - granularity
        - pricing_status
        - totals
        - billing_rule
      additionalProperties: true
  examples:
    jobs_404:
      summary: GET /v1/enrich/jobs/00000000-0000-0000-0000-000000000000 (404)
      value:
        detail: Not found.
    jobs_cancel_200:
      summary: POST /v1/enrich/jobs/d99ba955-f280-4723-b49a-fbb3dd872875/cancel (200)
      description: Cancelling a job that already finished returns it unchanged; a
        retried cancel is safe.
      value:
        job_id: d99ba955-f280-4723-b49a-fbb3dd872875
        status: completed
        blocks:
          - domain
          - domain_validation
        counts:
          total: 3
          processed: 3
          succeeded: 3
          not_found: 0
          failed: 0
          site_unreachable: 0
        delivery:
          mode: pull
        results_ready: true
        expires_at: 2026-10-15T07:09:32.659195Z
        created_at: 2026-09-15T07:07:47.705727Z
        finished_at: 2026-09-15T07:09:32.659195Z
    jobs_create_202:
      summary: POST /v1/enrich/jobs (202)
      value:
        job_id: d99ba955-f280-4723-b49a-fbb3dd872875
        status: queued
        blocks:
          - domain
          - domain_validation
        counts:
          total: 3
          processed: 0
          succeeded: 0
          not_found: 0
          failed: 0
          site_unreachable: 0
        delivery:
          mode: pull
        results_ready: false
        expires_at: null
        created_at: 2026-09-15T07:07:47.705727Z
        finished_at: null
    jobs_create_409_idempotency:
      summary: POST /v1/enrich/jobs (409)
      description: The same X-Idempotency-Key with a different body.
      value:
        detail: This idempotency key was already used for a different request. Use a new
          key, or resend the original body.
    jobs_create_replay_200:
      summary: POST /v1/enrich/jobs (200)
      description: "The same body with the same X-Idempotency-Key: the original job,
        200 instead of 202."
      value:
        job_id: d99ba955-f280-4723-b49a-fbb3dd872875
        status: queued
        blocks:
          - domain
          - domain_validation
        counts:
          total: 3
          processed: 0
          succeeded: 0
          not_found: 0
          failed: 0
          site_unreachable: 0
        delivery:
          mode: pull
        results_ready: false
        expires_at: null
        created_at: 2026-09-15T07:07:47.705727Z
        finished_at: null
    jobs_errors_200:
      summary: GET /v1/enrich/jobs/d99ba955-f280-4723-b49a-fbb3dd872875/errors (200)
      value:
        errors: []
        next_cursor: null
        retryable_count: 0
        expires_at: 2026-10-15T07:09:32.659195Z
    jobs_results_400_cursor:
      summary: GET /v1/enrich/jobs/d99ba955-f280-4723-b49a-fbb3dd872875/results (400)
      value:
        detail: Malformed cursor. Use the next_cursor from the previous page, or omit it
          to start.
    jobs_results_page1_200:
      summary: GET /v1/enrich/jobs/d99ba955-f280-4723-b49a-fbb3dd872875/results (200)
      description: With limit=2, the page holds two rows and a next_cursor.
      value:
        results:
          - ref: crm-1001
            status: done
            blocks:
              domain:
                status: available
                value: hotelchocolat.com
                source: cache
                final_url: https://www.hotelchocolat.com/uk
              domain_validation:
                status: available
                value:
                  domain: hotelchocolat.com
                  dns_resolves: true
                  email_deliverable: true
                  site_live: true
                  http_status: 200
                  final_url: https://www.hotelchocolat.com/uk
                  director_check: companies_house
                  score: 100
                  outcome: accept
                  checks:
                    legal_name_exact: 0.5
                    business_name: true
                    same_postcode: true
                    similar_postcode: true
                    city_match: true
                    county_match: true
                    address_match: true
                    director_match: false
                    company_number: true
                    other_company_number: false
                    foreign_registration: false
                    uk_domain: false
                    phone_present: true
                    generic_platform: false
                    parked: false
                  contributions:
                    legal_name_exact: 15
                    business_name: 15
                    same_postcode: 25
                    similar_postcode: 8
                    city_match: 10
                    county_match: 5
                    address_match: 15
                    phone_present: 3
                    company_number: 50
                  reasons:
                    - all checks passed
                source: zorro_validator
                confidence: 1
                flagged_for_review: false
                detail:
                  evidence:
                    hard_matches:
                      company_number:
                        url: https://www.hotelchocolat.com/uk/i/terms-and-conditions.html
                        snippet: …ngdom. Registered in England and Wales under company number 2805730.
                          VAT number 945695766 (“Hotel Chocolat”) 2. Information
                          Abo…
                      postcode:
                        url: https://www.hotelchocolat.com/uk
                        snippet: …pp © Hotel Chocolat 2026. Mint House, Newark Close, Royston SG8 5HL,
                          UK An Affiliate of Mars, Incorporated Terms &
                          Conditions S…
                      registered_address:
                        url: https://www.hotelchocolat.com/uk
                        snippet: …s Sign Up Follow Us Download Our App © Hotel Chocolat 2026. Mint
                          House, Newark Close, Royston SG8 5HL, UK An Affiliate
                          of Mars, In…
                    name_match:
                      kind: trading_name
                      url: https://www.hotelchocolat.com/uk
                      snippet: Luxury Chocolates | Chocolate Gifts & Hampers | Hotel Chocolat Skip to
                        Content Help Help & Support FREE Standard Delivery…
            matched:
              company_number: "02805730"
              company_name: HOTEL CHOCOLAT LIMITED
              match_confidence: 1
              matched_on: company_number
          - ref: crm-1002
            status: done
            blocks:
              domain:
                status: available
                value: gymshark.com
                source: cache
                final_url: https://www.gymshark.com/
              domain_validation:
                status: available
                value:
                  domain: gymshark.com
                  dns_resolves: true
                  email_deliverable: true
                  site_live: true
                  http_status: 200
                  final_url: https://www.gymshark.com/
                  director_check: companies_house
                  score: 95
                  outcome: accept
                  checks:
                    legal_name_exact: true
                    business_name: true
                    same_postcode: false
                    similar_postcode: false
                    city_match: true
                    county_match: false
                    address_match: true
                    director_match: true
                    company_number: false
                    other_company_number: false
                    foreign_registration: false
                    uk_domain: false
                    phone_present: false
                    generic_platform: false
                    parked: false
                  contributions:
                    legal_name_exact: 30
                    business_name: 15
                    city_match: 10
                    address_match: 15
                    director_match: 25
                  reasons:
                    - all checks passed
                source: zorro_validator
                confidence: 0.95
                flagged_for_review: false
                detail:
                  evidence:
                    hard_matches:
                      director:
                        url: https://www.gymshark.com/pages/about-us
                        snippet: "…e do today to prepare for tomorrow. Gymshark is led by: Ben Francis -
                          Founder & Chief Executive Officer Noel Mack - Chief
                          Brand…"
                        surname: francis
                    name_match:
                      kind: legal_name
                      url: https://www.gymshark.com/pages/terms-and-conditions
                      snippet: …Language Selector dropdown English English Español © 2026 | Gymshark
                        Limited | All Rights Reserved. | We Do Gym.
            matched:
              company_number: "08130873"
              company_name: GYMSHARK LTD
              match_confidence: 1
              matched_on: company_number
        next_cursor: eyJzZXEiOjJ9
        remaining: 1
        results_ready: true
        expires_at: 2026-10-15T07:09:32.659195Z
    jobs_results_page2_200:
      summary: GET /v1/enrich/jobs/d99ba955-f280-4723-b49a-fbb3dd872875/results (200)
      description: This page was fetched with cursor set to the previous next_cursor;
        on the last page, next_cursor is null.
      value:
        results:
          - ref: crm-1003
            status: done
            blocks:
              domain:
                status: available
                value: allica.bank
                source: cache
                flagged_for_review: false
                verification_profile: verifiable
                reason: provenance_uncertain_but_validated
                final_url: https://www.allica.bank/
              domain_validation:
                status: available
                value:
                  domain: allica.bank
                  dns_resolves: true
                  email_deliverable: true
                  site_live: true
                  http_status: 200
                  final_url: https://www.allica.bank/
                  director_check: companies_house
                  score: 100
                  outcome: accept
                  checks:
                    legal_name_exact: true
                    business_name: true
                    same_postcode: true
                    similar_postcode: true
                    city_match: true
                    county_match: false
                    address_match: true
                    director_match: false
                    company_number: true
                    other_company_number: false
                    foreign_registration: false
                    uk_domain: false
                    phone_present: true
                    generic_platform: false
                    parked: false
                  contributions:
                    legal_name_exact: 30
                    business_name: 15
                    same_postcode: 25
                    similar_postcode: 8
                    city_match: 10
                    address_match: 15
                    phone_present: 3
                    company_number: 50
                  reasons:
                    - all checks passed
                source: zorro_validator
                confidence: 1
                flagged_for_review: false
                detail:
                  evidence:
                    hard_matches:
                      company_number:
                        url: https://www.allica.bank/
                        snippet: …2A 2DT. Registered in England and Wales with company number 07706156.
                          Allica Bank savings accounts and business current
                          account…
                      postcode:
                        url: https://www.allica.bank/
                        snippet: "…Registered office: 4th/5th Floor, 15 Worship Street, London EC2A 2DT.
                          Registered in England and Wales with company number
                          077061…"
                      registered_address:
                        url: https://www.allica.bank/
                        snippet: "…tial Regulation Authority (FRN: 821851). Registered office: 4th/5th
                          Floor, 15 Worship Street, London EC2A 2DT. Registered
                          in England and Wales with comp…"
                    name_match:
                      kind: legal_name
                      url: https://www.allica.bank/
                      snippet: …ints Tariff of fees Fraud advice Trustpilot Connect with us Allica
                        Bank Limited is authorised by the Prudential Regulation
                        Authority and re…
            matched:
              company_number: "07706156"
              company_name: ALLICA BANK LIMITED
              match_confidence: 1
              matched_on: company_number
        next_cursor: null
        remaining: 0
        results_ready: true
        expires_at: 2026-10-15T07:09:32.659195Z
    jobs_status_completed_200:
      summary: GET /v1/enrich/jobs/d99ba955-f280-4723-b49a-fbb3dd872875 (200)
      value:
        job_id: d99ba955-f280-4723-b49a-fbb3dd872875
        status: completed
        blocks:
          - domain
          - domain_validation
        counts:
          total: 3
          processed: 3
          succeeded: 3
          not_found: 0
          failed: 0
          site_unreachable: 0
        delivery:
          mode: pull
        results_ready: true
        expires_at: 2026-10-15T07:09:32.659195Z
        created_at: 2026-09-15T07:07:47.705727Z
        finished_at: 2026-09-15T07:09:32.659195Z
    jobs_status_queued_200:
      summary: GET /v1/enrich/jobs/d99ba955-f280-4723-b49a-fbb3dd872875 (200)
      value:
        job_id: d99ba955-f280-4723-b49a-fbb3dd872875
        status: queued
        blocks:
          - domain
          - domain_validation
        counts:
          total: 3
          processed: 0
          succeeded: 0
          not_found: 0
          failed: 0
          site_unreachable: 0
        delivery:
          mode: pull
        results_ready: false
        expires_at: null
        created_at: 2026-09-15T07:07:47.705727Z
        finished_at: null
        retry_after_ms: 1000
    resolve_400_defer_live_store:
      summary: GET /v1/resolve (400)
      value:
        detail: "defer_live=true cannot be combined with store=false: the live blocks
          are delivered through the stored job, so it has to be kept until you
          collect them."
    resolve_400_min_confidence:
      summary: GET /v1/resolve (400)
      value:
        options:
          min_confidence:
            - Ensure this value is less than or equal to 1.0.
    resolve_400_two_keys:
      summary: GET /v1/resolve (400)
      value:
        detail: Give exactly one of company_number, company_name, or domain.
    resolve_400_unknown_block:
      summary: GET /v1/resolve (400)
      value:
        blocks:
          - "Unknown block(s): not_a_block. Available: domain,
            related_company_domain, domain_validation, nature_of_business,
            registered_address, corporate_owners, controllers, charges,
            property, officers, company_identity, filing_status,
            registry_events, financials_filed, ultimate_owner, employees_filed,
            industry, contacts."
    resolve_400_validation_mode:
      summary: GET /v1/resolve (400)
      value:
        options:
          validation:
            "1":
              - '"psychic" is not a valid choice.'
    resolve_403_not_enabled:
      summary: GET /v1/resolve (403)
      value:
        detail: "Not enabled for this account: company_summary."
        blocks:
          company_summary:
            status: not_enabled
            reason: no_entitlement
    resolve_404_not_matched:
      summary: GET /v1/resolve (404)
      value:
        detail: not_matched
    resolve_404_not_own_site:
      summary: GET /v1/resolve (404)
      value:
        detail: not_matched
        reason: not_own_site
        host_type: register
    resolve_404_site_unreachable:
      summary: GET /v1/resolve (404)
      value:
        detail: not_matched
        reason: site_unreachable
        site_lookup:
          reason: site_unreachable
          domain: zzqq-not-a-real-company-2026.co.uk
          final_url: null
          pages_read: []
    resolve_409_ambiguous:
      summary: GET /v1/resolve (409)
      value:
        detail: ambiguous_match
        candidates:
          - company_number: "00445790"
            company_name: TESCO PLC
          - company_number: "00519500"
            company_name: TESCO STORES LIMITED
          - company_number: "08730224"
            company_name: TESCO SECRETARIES LIMITED
          - company_number: "00243011"
            company_name: TESCO HOLDINGS LIMITED
          - company_number: "04345023"
            company_name: TESCO FREETIME LIMITED
    resolve_429:
      summary: GET /v1/resolve (429)
      description: Past 60 resolves a minute on one key. The response also carries a
        Retry-After header in seconds.
      value:
        detail: Request was throttled. Expected available in 1 second.
    resolve_progressive_first_200:
      summary: GET /v1/resolve (200)
      description: With defer_live=true, domain, property, subsidiaries and
        nature_of_business are answered at once; domain_validation opens the
        site and is pending.
      value:
        ref: ""
        status: pending
        blocks:
          domain:
            status: available
            value: hotelchocolat.com
            source: cache
          domain_validation:
            status: pending
          nature_of_business:
            status: not_found
            reason: no_description_on_file
            detail:
              website_verdict:
                domain: hotelchocolat.com
                outcome: accept
                score: 100
                confidence: 1
                checked_at: 2026-09-15T07:07:48Z
                auto_run: false
                served: false
          property:
            status: available
            value:
              title_count: 6
              tenure:
                - Freehold
                - Leasehold
              postcodes:
                - PE29 7HA
                - PE19 8JJ
                - PE29 7DQ
              addresses:
                - Land lying to the west of Sallowbush Road, Huntingdon
                - 3 Redwongs Way, Huntingdon, (PE29 7HA)
                - 1a and, 2b Alpha Drive, Eaton Socon, St Neots (PE19 8JJ)
                - Topper Cases Ltd, 1 Glebe Road, Huntingdon (PE29 7DQ)
                - Land lying to the west of Sallowbush Road, Huntingdon
                - Unit SU31, Block E/F, Southgate, Bath
            source: hm_land_registry
          subsidiaries:
            status: available
            value:
              subsidiaries:
                - company_number: "10487072"
                  company_name: RABOT 1745 LIMITED
                  company_status: Dissolved
                  natures_of_control:
                    - ownership-of-shares-75-to-100-percent
                    - voting-rights-75-to-100-percent
                  ownership_band: 75–100%
                  notified_on: 2017-10-30
                  matched_on: registration_number
                - company_number: "02174370"
                  company_name: HOTEL CHOCOLAT CORPORATE LTD
                  company_status: Dissolved
                  natures_of_control:
                    - ownership-of-shares-75-to-100-percent
                    - voting-rights-75-to-100-percent
                  ownership_band: 75–100%
                  notified_on: 2016-04-06
                  matched_on: registration_number
              count: 2
              active_count: 0
            source: companies_house_psc
            as_of: 2017-10-30
        pending_blocks:
          - domain_validation
        matched:
          company_number: "02805730"
          company_name: HOTEL CHOCOLAT LIMITED
          match_confidence: 1
          matched_on: company_number
        job_id: 4d107210-fa63-49f6-be73-446f989a6f2e
        expires_at: null
        complete: false
        results_url: https://api.getzorro.ai/v1/enrich/jobs/4d107210-fa63-49f6-be73-446f989a6f2e/results
        status_url: https://api.getzorro.ai/v1/enrich/jobs/4d107210-fa63-49f6-be73-446f989a6f2e
        retry_after_ms: 1000
    resolve_progressive_poll_200:
      summary: GET /v1/enrich/jobs/4d107210-fa63-49f6-be73-446f989a6f2e/results (200)
      description: "A poll while domain_validation is still pending: results_ready
        false, retry_after_ms set."
      value:
        results:
          - ref: ""
            status: pending
            blocks:
              domain:
                status: available
                value: hotelchocolat.com
                source: cache
              domain_validation:
                status: pending
              nature_of_business:
                status: not_found
                reason: no_description_on_file
                detail:
                  website_verdict:
                    domain: hotelchocolat.com
                    outcome: accept
                    score: 100
                    confidence: 1
                    checked_at: 2026-09-15T07:07:48Z
                    auto_run: false
                    served: false
              property:
                status: available
                value:
                  title_count: 6
                  tenure:
                    - Freehold
                    - Leasehold
                  postcodes:
                    - PE29 7HA
                    - PE19 8JJ
                    - PE29 7DQ
                  addresses:
                    - Land lying to the west of Sallowbush Road, Huntingdon
                    - 3 Redwongs Way, Huntingdon, (PE29 7HA)
                    - 1a and, 2b Alpha Drive, Eaton Socon, St Neots (PE19 8JJ)
                    - Topper Cases Ltd, 1 Glebe Road, Huntingdon (PE29 7DQ)
                    - Land lying to the west of Sallowbush Road, Huntingdon
                    - Unit SU31, Block E/F, Southgate, Bath
                source: hm_land_registry
              subsidiaries:
                status: available
                value:
                  subsidiaries:
                    - company_number: "10487072"
                      company_name: RABOT 1745 LIMITED
                      company_status: Dissolved
                      natures_of_control:
                        - ownership-of-shares-75-to-100-percent
                        - voting-rights-75-to-100-percent
                      ownership_band: 75–100%
                      notified_on: 2017-10-30
                      matched_on: registration_number
                    - company_number: "02174370"
                      company_name: HOTEL CHOCOLAT CORPORATE LTD
                      company_status: Dissolved
                      natures_of_control:
                        - ownership-of-shares-75-to-100-percent
                        - voting-rights-75-to-100-percent
                      ownership_band: 75–100%
                      notified_on: 2016-04-06
                      matched_on: registration_number
                  count: 2
                  active_count: 0
                source: companies_house_psc
                as_of: 2017-10-30
            pending_blocks:
              - domain_validation
            matched:
              company_number: "02805730"
              company_name: HOTEL CHOCOLAT LIMITED
              match_confidence: 1
              matched_on: company_number
        next_cursor: null
        remaining: 0
        results_ready: false
        expires_at: null
        retry_after_ms: 1000
    resolve_progressive_results_200:
      summary: GET /v1/enrich/jobs/4d107210-fa63-49f6-be73-446f989a6f2e/results (200)
      description: The same resolve collected from results_url once results_ready is true.
      value:
        results:
          - ref: ""
            status: done
            blocks:
              domain:
                status: available
                value: hotelchocolat.com
                source: cache
                final_url: https://www.hotelchocolat.com/uk
              domain_validation:
                status: available
                value:
                  domain: hotelchocolat.com
                  dns_resolves: true
                  email_deliverable: true
                  site_live: true
                  http_status: 200
                  final_url: https://www.hotelchocolat.com/uk
                  director_check: companies_house
                  score: 100
                  outcome: accept
                  checks:
                    legal_name_exact: 0.5
                    business_name: true
                    same_postcode: true
                    similar_postcode: true
                    city_match: true
                    county_match: true
                    address_match: true
                    director_match: false
                    company_number: true
                    other_company_number: false
                    foreign_registration: false
                    uk_domain: false
                    phone_present: true
                    generic_platform: false
                    parked: false
                  contributions:
                    legal_name_exact: 15
                    business_name: 15
                    same_postcode: 25
                    similar_postcode: 8
                    city_match: 10
                    county_match: 5
                    address_match: 15
                    phone_present: 3
                    company_number: 50
                  reasons:
                    - all checks passed
                source: zorro_validator
                confidence: 1
                flagged_for_review: false
                detail:
                  evidence:
                    hard_matches:
                      company_number:
                        url: https://www.hotelchocolat.com/uk/i/terms-and-conditions.html
                        snippet: …ngdom. Registered in England and Wales under company number 2805730.
                          VAT number 945695766 (“Hotel Chocolat”) 2. Information
                          Abo…
                      postcode:
                        url: https://www.hotelchocolat.com/uk
                        snippet: …pp © Hotel Chocolat 2026. Mint House, Newark Close, Royston SG8 5HL,
                          UK An Affiliate of Mars, Incorporated Terms &
                          Conditions S…
                      registered_address:
                        url: https://www.hotelchocolat.com/uk
                        snippet: …s Sign Up Follow Us Download Our App © Hotel Chocolat 2026. Mint
                          House, Newark Close, Royston SG8 5HL, UK An Affiliate
                          of Mars, In…
                    name_match:
                      kind: trading_name
                      url: https://www.hotelchocolat.com/uk
                      snippet: Luxury Chocolates | Chocolate Gifts & Hampers | Hotel Chocolat Skip to
                        Content Help Help & Support FREE Standard Delivery…
              nature_of_business:
                status: not_found
                reason: no_description_on_file
                detail:
                  website_verdict:
                    domain: hotelchocolat.com
                    outcome: accept
                    score: 100
                    confidence: 1
                    checked_at: 2026-09-15T07:07:48Z
                    auto_run: false
                    served: false
              property:
                status: available
                value:
                  title_count: 6
                  tenure:
                    - Freehold
                    - Leasehold
                  postcodes:
                    - PE29 7HA
                    - PE19 8JJ
                    - PE29 7DQ
                  addresses:
                    - Land lying to the west of Sallowbush Road, Huntingdon
                    - 3 Redwongs Way, Huntingdon, (PE29 7HA)
                    - 1a and, 2b Alpha Drive, Eaton Socon, St Neots (PE19 8JJ)
                    - Topper Cases Ltd, 1 Glebe Road, Huntingdon (PE29 7DQ)
                    - Land lying to the west of Sallowbush Road, Huntingdon
                    - Unit SU31, Block E/F, Southgate, Bath
                source: hm_land_registry
              subsidiaries:
                status: available
                value:
                  subsidiaries:
                    - company_number: "10487072"
                      company_name: RABOT 1745 LIMITED
                      company_status: Dissolved
                      natures_of_control:
                        - ownership-of-shares-75-to-100-percent
                        - voting-rights-75-to-100-percent
                      ownership_band: 75–100%
                      notified_on: 2017-10-30
                      matched_on: registration_number
                    - company_number: "02174370"
                      company_name: HOTEL CHOCOLAT CORPORATE LTD
                      company_status: Dissolved
                      natures_of_control:
                        - ownership-of-shares-75-to-100-percent
                        - voting-rights-75-to-100-percent
                      ownership_band: 75–100%
                      notified_on: 2016-04-06
                      matched_on: registration_number
                  count: 2
                  active_count: 0
                source: companies_house_psc
                as_of: 2017-10-30
            matched:
              company_number: "02805730"
              company_name: HOTEL CHOCOLAT LIMITED
              match_confidence: 1
              matched_on: company_number
        next_cursor: null
        remaining: 0
        results_ready: true
        expires_at: 2026-10-15T07:16:26.303575Z
    resolve_warning_200:
      summary: GET /v1/resolve (200)
      description: "company_summary is not enabled for the key: the other block
        resolves, and one warning names the refused block."
      value:
        ref: ""
        status: done
        blocks:
          company_summary:
            status: not_enabled
            reason: no_entitlement
        matched:
          company_number: "02805730"
          company_name: HOTEL CHOCOLAT LIMITED
          match_confidence: 1
          matched_on: company_number
        job_id: a223350b-c286-4562-a524-1239a575ebef
        expires_at: 2026-10-15T07:07:30.594324Z
        warnings:
          - code: blocks_not_enabled
            blocks:
              - company_summary
            detail: "Not enabled for your key: company_summary. Returned as not_enabled;
              every other block is unaffected."
        complete: true
        pending_blocks: []
        results_url: https://api.getzorro.ai/v1/enrich/jobs/a223350b-c286-4562-a524-1239a575ebef/results
        status_url: https://api.getzorro.ai/v1/enrich/jobs/a223350b-c286-4562-a524-1239a575ebef
    usage_400_granularity:
      summary: GET /v1/usage (400)
      value:
        detail: "`granularity` is one of: block, day."
    usage_day_200:
      summary: GET /v1/usage (200)
      value:
        range:
          from: 2026-09-14
          to: 2026-09-15
        granularity: day
        pricing_status: not_priced
        pricing_note: Counts only; amounts appear once contract prices are set.
        days:
          - date: 2026-09-14
            events: 0
            billed_events: 0
            outcomes: {}
            blocks: {}
          - date: 2026-09-15
            events: 6
            billed_events: 6
            outcomes:
              delivered: 6
            blocks:
              domain: 3
              domain_validation: 3
        totals:
          events: 6
          billed_events: 6
        billing_rule: Charged once per row per block, and only where the block delivered
          a value. not_found, ambiguous_match, not_enabled, provider errors and
          rows skipped by a cancel are recorded at zero.
        job_id: d99ba955-f280-4723-b49a-fbb3dd872875
    usage_job_200:
      summary: GET /v1/usage (200)
      description: Until contract prices are set up for the account, usage shows
        counts only.
      value:
        range:
          from: 2026-08-17
          to: 2026-09-15
        granularity: block
        pricing_status: not_priced
        pricing_note: Counts only; amounts appear once contract prices are set.
        blocks:
          - block: domain
            events: 3
            billed_events: 3
            outcomes:
              delivered: 3
          - block: domain_validation
            events: 3
            billed_events: 3
            outcomes:
              delivered: 3
        totals:
          events: 6
          billed_events: 6
          rows: 6
          billed_rows: 6
          invoiceable: false
        billing_rule: Charged once per row per block, and only where the block delivered
          a value. not_found, ambiguous_match, not_enabled, provider errors and
          rows skipped by a cancel are recorded at zero.
        job_id: d99ba955-f280-4723-b49a-fbb3dd872875
    whoami_200:
      summary: GET /v1/whoami (200)
      value:
        key_id: abcdefghjkmn
        name: Example Bank production
        environment: live
        scopes:
          - read
          - enrich
        account:
          id: 1234
          email: api-owner@example.com
        blocks:
          - key: domain
            availability: available
            tier: core
          - key: related_company_domain
            availability: available
            tier: premium
          - key: domain_validation
            availability: available
            tier: core
          - key: nature_of_business
            availability: available
            tier: premium
          - key: registered_address
            availability: available
            tier: core
          - key: corporate_owners
            availability: available
            tier: core
          - key: controllers
            availability: available
            tier: core
          - key: charges
            availability: available
            tier: core
          - key: property
            availability: available
            tier: premium
          - key: officers
            availability: available
            tier: core
          - key: company_identity
            availability: available
            tier: core
          - key: filing_status
            availability: available
            tier: core
          - key: registry_events
            availability: available
            tier: core
          - key: financials_filed
            availability: available
            tier: premium
          - key: ultimate_owner
            availability: available
            tier: premium
          - key: employees_filed
            availability: available
            tier: premium
          - key: industry
            availability: available
            tier: core
          - key: contacts
            availability: available
            tier: premium
          - key: signals
            availability: available
            tier: premium
          - key: news_signals
            availability: available
            tier: premium
          - key: financials_live
            availability: available
            tier: premium
          - key: employees_live
            availability: available
            tier: premium
          - key: web_traffic
            availability: available
            tier: premium
          - key: web_presence
            availability: available
            tier: premium
          - key: technologies
            availability: available
            tier: premium
          - key: employees
            availability: available
            tier: premium
          - key: planning
            availability: available
            tier: premium
          - key: financial_benchmarks
            availability: available
            tier: premium
          - key: revenue_estimate
            availability: available
            tier: premium
          - key: scores
            availability: available
            tier: premium
          - key: funding
            availability: available
            tier: premium
          - key: trading_address
            availability: available
            tier: premium
          - key: subsidiaries
            availability: available
            tier: premium
          - key: firmographics
            availability: available
            tier: premium
          - key: comparables
            availability: available
            tier: premium
          - key: business_intelligence
            availability: available
            tier: premium
          - key: company_summary
            availability: not_enabled
            tier: premium
        blocks_enabled_count: 36
        blocks_total: 37
        limits:
          max_rows_per_job: 250000
          max_rows_per_job_source: default
          rate_limits:
            requests_per_minute: 600
            resolve_per_minute: 60
          expires_at: null
        docs:
          url: https://getzorro.ai/docs/api
          openapi: /v1/openapi.json
          catalog: /v1/blocks
    whoami_401_invalid:
      summary: GET /v1/whoami (401)
      value:
        detail: Invalid API key.
    whoami_401_missing:
      summary: GET /v1/whoami (401)
      value:
        detail: Authentication credentials were not provided.
