---
title: "Prepare Data Quality"
method: POST
path: "/data-quality/v1/prepare"
tags: ["Prepare"]
---

# Prepare Data Quality

`POST /data-quality/v1/prepare`

## Request

- Base URL: `https://api.zoominfo.com/gtm`
- URL: `https://api.zoominfo.com/gtm/data-quality/v1/prepare`
- Auth: OAuth 2
  - Authorization code: `https://login.zoominfo.com`
  - Token URL: `https://okta-login.zoominfo.com/oauth2/default/v1/token` scopes: `api:data-quality:execute`

Cleans a batch of values — phone, email, address, company name, URL, job title, or
person name — and returns the prepared results inline.

You choose the attribute, not the operations. Each attribute runs its own fixed set of
default steps in a fixed order; a subset cannot be requested and the order cannot be
changed. Any enrichment you request runs after those defaults complete, adding a stage
rather than replacing one.

    default steps -> Enrichment (optional, paid)

Six of the seven attributes run the same defaults: phone, email, person name, company name,
URL and job title each parse, then validate, then normalize. Email applies typo correction as
part of its normalize step.

Address is the exception and runs parse only. It has no validator — validating a free-text
address is a different problem from validating a phone or an email, and address results carry
no `isValid` at all. Address normalization is not a default either; it arrives one of two ways:
with the `VERIFICATION` enrichment, or from `config.normalizationRules` if you supply custom
rules. Those two are mutually exclusive.

Prepare works only on the values in the request. It does not look up, match, or append
data from ZoomInfo, does not correct wrong values, and does not persist, route, or write
back. To retrieve data you do not already have, use the Enrich endpoints.

Every request is single-typed. `data.type` selects the attribute and `data.attributes.items`
carries values of that attribute only; mixed-attribute requests are not supported. Phone,
email, address and person name accept either a raw string or a pre-structured `components`
object, and each item supplies exactly one of the two. Company name, URL and job title are
string-only and have no `components` alternative. The cap is 30 items per request.

Enrichments are passed once at the batch level, in `data.attributes.enrichments`, and apply
to every item. Custom normalization is not an enrichment — request it through
`data.attributes.config.normalizationRules`, as either inline rules or a saved `configId`,
never both.

Results are positional. `data` is an array in 1:1 order with `items`, so `data[i]` is the
result for `items[i]` and each resource's `id` is that index. The array is never reordered or
filtered. Each element's `type` reports the outcome: a processed item is its attribute
resource, carrying the echoed `input`, the `parsed` and `normalized` stage products, and the
final `value`; an item that failed is a `PrepareError` resource carrying the failure `detail`.
Items are processed independently, so a failed item still occupies its slot while the rest of
the batch succeeds at `200`.

`isValid` reports one thing: whether the input was in good enough shape to normalize and
enrich. It is not a quality judgment — it does not mean the value is correct, deliverable, or
safe. Deliverability comes only from `VERIFICATION`, safety only from `THREAT`. Address results omit
`isValid` entirely; where any non-empty input is normalizable, such as job title, it is
effectively always true.

Not every combination of `enrichments` and `config` is legal, and the illegal ones are
rejected for the whole request. On an address request, supply exactly one of `enrichments` or
`config` — `VERIFICATION` returns its own normalization along with deliverability and address type,
so custom normalization cannot also apply, and supplying both or neither is rejected. On an
email request, `THREAT_TYPE` requires `THREAT` on the same request. The legal `type`/`value`
pairings for custom normalization are documented on each rule-value enum; values are scoped
per attribute, so a value legal for one rule is not legal for every rule.

Only `200` returns results. Every other status returns an error document with no `data` array:
  - `400` — nothing was processed. Causes: an empty `items[]`; more than 30 items; a body that
    does not parse; an unrecognized `data.type`; on an address request, both `enrichments` and
    `config` or neither; `THREAT_TYPE` requested without `THREAT`; both inline `config.rules`
    and a `configId`; a normalization-rule `value` not legal for its `type`. Do not retry
    unchanged.
  - `402` — entitled to the work, but not enough credits to pay for it. Retry after topping up.
  - `403` — refused for the account, not its content: either not enabled for credit-based
    billing, or missing the Data Quality entitlement for the requested work.
  - `429` — rate limit exceeded. 25 requests per second, tenant-wide, shared across every Data
    Quality endpoint and caller in the tenant. Retry with exponential backoff and jitter.
  - `5xx` — server error (`500`) or unavailable dependency (`503`). Retry with backoff.

`errors[].detail` is diagnostic prose and may change; do not pattern-match it.

Parse, validate, and default normalize consume no credits. Each enrichment and custom
normalization costs credits per result returned, and nothing is charged for a result that does
not come back.

This operation is synchronous. There is no job queue, no polling, no webhook, and no cancel.

## Request body

- DataQualityRequest: Data Quality request body. `data` is a SINGLE resource whose `type` selects the domain (document-level discriminator); the batch of values is the `items[]` array inside its attributes. The whole request targets one domain, so homogeneity is structural — `items` is typed to the selected domain and cannot mix domains — and routing is unambiguous. Batch-level levers (`config`, `enrichments`) likewise live in the resource's attributes and apply to every item.
  - `data` union, required: Polymorphic Data Quality request resource, discriminated by `type`. The request's `data` is exactly one of these (the document-level discriminator); the batch of values is the `items[]` array inside its attributes.
    - object: Phone request resource. `data` is a single resource of this type; the batch is in `attributes.items`.
      - `type` string, required: The type of the resource
      - `attributes` PhonePrepareAttributes, required: Phone Data Quality request. Default steps: parse, validate, normalize. Line type and verification enrichments are available via `enrichments`, custom normalization via `config`.
        - `enrichments` PhoneEnrichment[]: Optional signals to compute on top of the phone defaults, applied to every item in the batch. `LINE_TYPE` returns the kind of phone line — mobile, landline, VoIP, toll-free and so on. `VERIFICATION` returns whether the line is in service.
        - `config` object: Optional custom-normalization configuration applied to every item in the batch. Presence of `config.normalizationRules` triggers the custom-normalization leg of the pipeline.
          - `normalizationRules` object: Custom-normalization configuration (inline `rules` or saved `configId`).
            - `rules` PhoneNormalizationRules: Inline phone custom-normalization rules, grouped by rule group.
              - …
            - `configId` string: Identifier of a saved custom-normalization config to apply, resolved per-tenant from the authenticated request. Mutually exclusive with inline `rules`.
        - `items` PhoneInputItem[], required: The phone values to prepare.
          - `phone` string: The phone number to process as raw text. Accepts common formats; non-digit characters are tolerated. Supply exactly one of `phone` or `components` — supplying both, or neither, does not fail the whole request and neither field takes precedence; the individual item fails (its `data[i]` result carries `error` while the rest of the batch still succeeds, HTTP 200).
          - `components` PhoneComponents: Structured phone components, shared by phone input (`components`) and the phone output value.
            - `number` string: The phone number. On input: raw digits in national or full form (non-digit characters are tolerated). On output: the full, formatted number (the exact format depends on the normalization applied) — not a bare national component.
            - `countryCode` string: Country calling code or ISO 3166-1 alpha-2 country, if already known.
            - `extension` string: Extension, if present.
    - object: Email request resource. `data` is a single resource of this type; the batch is in `attributes.items`.
      - `type` string, required: The type of the resource
      - `attributes` EmailPrepareAttributes, required: Email Data Quality request. Default steps: parse, validate, normalize. Verify, threat, and threat-type enrichments are available via `enrichments`. `THREAT_TYPE` cannot be requested without `THREAT` (HTTP 400).
        - `enrichments` EmailEnrichment[]: Optional signals to compute on top of the email defaults, applied to every item in the batch. `VERIFICATION` returns the deliverability of the mailbox. `THREAT` returns whether the address is safe or unsafe to send to. `THREAT_TYPE` names the classification behind an unsafe verdict. Request each signal explicitly; `THREAT_TYPE` without `THREAT` is rejected with HTTP 400.
        - `items` EmailInputItem[], required: The email values to prepare.
          - `email` string: The email address to process as raw text. Supply exactly one of `email` or `components` — supplying both, or neither, does not fail the whole request and neither field takes precedence; the individual item fails (its `data[i]` result carries `error` while the rest of the batch still succeeds, HTTP 200).
          - `components` EmailComponents: Structured email components for input (`components`). `fqdn` is the RFC domain-part after `@`, named to match `value.fqdn` on the way out.
            - `localPart` string: Local part (before the @).
            - `fqdn` string: Fully-qualified domain-part after `@` (e.g. `mail.example.co.uk`). Same field name as `value.fqdn` in the result, so the host is called the same thing in both directions. `registeredDomain`, `subdomain` and `tld` are derived from this and returned on the result; they are not supplied here.
    - object: Address request resource. `data` is a single resource of this type; the batch is in `attributes.items`.
      - `type` string, required: The type of the resource
      - `attributes` AddressPrepareAttributes, required: Address Data Quality request. Default step: parse. Supply exactly one of `enrichments` or `config`: - `enrichments` — the enrichment signals to compute. - `config.normalizationRules` — custom normalization. Supplying both, or neither, is rejected.
        - `enrichments` AddressRequestEnrichment[]: The enrichment signals to compute, applied to every item in the batch. `VERIFICATION` is the only selectable signal and returns several things together: the address normalized, its postal deliverability, whether it is residential or commercial, and its coordinates. Mutually exclusive with `config`.
        - `config` object: Custom-normalization configuration applied to every item in the batch. Mutually exclusive with `enrichments`.
          - `normalizationRules` object: Custom-normalization configuration (inline `rules` or saved `configId`).
            - `rules` AddressNormalizationRules: Inline address custom-normalization rules, grouped by rule group.
              - …
            - `configId` string: Identifier of a saved custom-normalization config to apply, resolved per-tenant from the authenticated request. Mutually exclusive with inline `rules`.
        - `items` AddressInputItem[], required: The address values to prepare.
          - `address` string: The address to process as raw text. May be a single free-text line or a partially structured value. Supply exactly one of `address` or `components` — supplying both, or neither, does not fail the whole request and neither field takes precedence; the individual item fails (its `data[i]` result carries `error` while the rest of the batch still succeeds, HTTP 200).
          - `components` AddressComponents: Structured address components, shared by address input (`components`) and the address output value. All fields optional to support messy/partial values on both sides (for example, separate CRM columns with no country).
            - `streetNumber` string: Street number (e.g., `123`).
            - `street` string: Street name (e.g., `Main St`).
            - `unit` string: Unit / suite / apartment designator (e.g., `Ste 200`).
            - `poBox` string: PO Box identifier, if present.
            - `city` string: City name.
            - `county` string: County or district.
            - `state` string: State / province / region.
            - `postalCode` string: Postal / ZIP code.
            - `postalExtension` string: Postal code extension (e.g., ZIP+4).
            - `country` string: Country name or ISO code.
    - object: Company name request resource. `data` is a single resource of this type; the batch is in `attributes.items`.
      - `type` string, required: The type of the resource
      - `attributes` CompanyNamePrepareAttributes, required: Company Name Data Quality request. Default steps: parse, validate, normalize. Company-name validation applies deterministic junk checks and rejects placeholder values, punctuation-only input, input with no letters, and single-character input. It does not apply blanket URL, email, or phone-number checks. Custom normalization is available via `config`.
        - `config` object: Optional custom-normalization configuration applied to every item in the batch. Without custom-normalization intent, default normalization strips the legal suffix into `corporateIdentifiers`. Supplying `config.normalizationRules` with inline `rules` or a non-blank `configId` routes the batch to custom normalization, which returns a standardized company name and no `corporateIdentifiers`. An empty `normalizationRules` object carries no custom intent and uses default normalization.
          - `normalizationRules` object: Custom-normalization configuration (inline `rules` or saved `configId`).
            - `rules` CompanyNameNormalizationRules: Inline company-name custom-normalization rules, grouped by rule group.
              - …
            - `configId` string: Identifier of a saved custom-normalization config to apply, resolved per-tenant from the authenticated request. Mutually exclusive with inline `rules`.
        - `items` CompanyNameInputItem[], required: The company-name values to prepare.
          - `companyName` string, required: The company name to normalize.
    - object: Url request resource. `data` is a single resource of this type; the batch is in `attributes.items`.
      - `type` string, required: The type of the resource
      - `attributes` UrlPrepareAttributes, required: Url Data Quality request. Default steps: parse, validate, normalize. Custom normalization is available via `config`.
        - `config` object: Optional custom-normalization configuration applied to every item in the batch. Presence of `config.normalizationRules` triggers the custom-normalization leg of the pipeline.
          - `normalizationRules` object: Custom-normalization configuration (inline `rules` or saved `configId`).
            - `rules` UrlNormalizationRules: Inline URL custom-normalization rules, grouped by rule group.
              - …
            - `configId` string: Identifier of a saved custom-normalization config to apply, resolved per-tenant from the authenticated request. Mutually exclusive with inline `rules`.
        - `items` UrlInputItem[], required: The URL values to prepare.
          - `url` string, required: The URL to normalize.
    - object: Job title request resource. `data` is a single resource of this type; the batch is in `attributes.items`.
      - `type` string, required: The type of the resource
      - `attributes` JobTitlePrepareAttributes, required: Job Title Data Quality request. Default steps: parse, validate, normalize. `enrichments` selects the classification signal; `config.normalizationRules` selects custom normalization. Unlike address, the two are not mutually exclusive — classification's own normalize step still honors `config.normalizationRules` when both are supplied.
        - `enrichments` JobTitleRequestEnrichment[]: The enrichment signals to compute, applied to every item in the batch. `CLASSIFICATION` returns the title's department, job function, management level and board-member likeliness.
        - `config` object: Optional custom-normalization configuration applied to every item in the batch. Presence of `config.normalizationRules` triggers the custom-normalization leg of the pipeline. Combinable with `enrichments`.
          - `normalizationRules` object: Custom-normalization configuration (inline `rules` or saved `configId`).
            - `rules` JobTitleNormalizationRules: Inline job-title custom-normalization rules, grouped by rule group.
              - …
            - `configId` string: Identifier of a saved custom-normalization config to apply, resolved per-tenant from the authenticated request. Mutually exclusive with inline `rules`.
        - `items` JobTitleInputItem[], required: The job title values to prepare.
          - `jobTitle` string, required: The job title to normalize.
    - object: Person name request resource. `data` is a single resource of this type; the batch is in `attributes.items`.
      - `type` string, required: The type of the resource
      - `attributes` PersonNamePrepareAttributes, required: Person Name Data Quality request. Default steps: parse, validate, normalize. Custom normalization is available via `config`.
        - `config` object: Optional custom-normalization configuration applied to every item in the batch. Presence of `config.normalizationRules` triggers the custom-normalization leg of the pipeline.
          - `normalizationRules` object: Custom-normalization configuration (inline `rules` or saved `configId`).
            - `rules` PersonNameNormalizationRules: Inline person-name custom-normalization rules, grouped by rule group.
              - …
            - `configId` string: Identifier of a saved custom-normalization config to apply, resolved per-tenant from the authenticated request. Mutually exclusive with inline `rules`.
        - `items` PersonNameInputItem[], required: The person-name values to prepare.
          - `name` string: The full name to process as raw text. Accepts common formats. Supply exactly one of `name` or `components` — supplying both, or neither, does not fail the whole request and neither field takes precedence; the individual item fails (its `data[i]` result carries `error` while the rest of the batch still succeeds, HTTP 200).
          - `components` PersonNameComponents: Structured person-name components, shared by person-name input (`components`) and the person-name output value. All fields optional to support messy/partial values on both sides (for example, separate CRM first/last columns).
            - `prefix` string: Name prefix / salutation (e.g., `Dr`, `Ms`).
            - `first` string: First / given name.
            - `middle` string: Middle name or initial.
            - `last` string: Last / family name.
            - `suffix` string: Name suffix (e.g., `Jr`, `III`, `PhD`).

## Response `200`

Success

- DataQualityResponse: Data Quality response body. `data` is an array of per-item result resources in 1:1 order with the request's `items`, so `data[i]` is the result for `items[i]` and each resource's `id` is that index. The array is never reordered or filtered, and a failed item still occupies its slot. Each element's `type` reports the outcome. A processed item is its attribute resource — `type` is the requested attribute — carrying the echoed `input`, the `parsed` and `normalized` stage products, and the final prepared `value`. An item that failed is a `PrepareError` resource carrying the failure `detail`. An item is never both, and item failures are independent: the rest of the batch still succeeds at `200`. This shape applies only to a `200`. A request-level failure (`400`, `402`, `403`, `429` or `5xx`) returns an error document with no `data` array.
  - `data` DataQualityResultResource[], required: The primary data of the document
    - union: Polymorphic Data Quality result resource, discriminated by `type`. One element of the response `data[]`. `type` encodes the OUTCOME: a successful item is its domain resource (`Phone`/`Email`/`Address`/`CompanyName`/`Url`/`JobTitle`/`PersonName`, prepared value in `attributes`); a failed item is the `PrepareError` resource (`PrepareItemError` in `attributes`). Successful items in one response all share the request domain; failed items are `PrepareError` regardless of domain.
      - object: Phone success result resource — one element of the response `data[]` for a successfully processed phone item. `id` is the request positional index (`items[i]` → `id == i`); the prepared result is in `attributes`.
        - `id` string, required: The unique identifier for the resource
        - `type` string, required: The type of the resource
        - `attributes` PhoneResultAttributes, required: Attributes of a single phone result resource: the echoed input, the parsed and normalized data products, and the final prepared value.
          - `input` PhoneInputItem, required: A single phone value to prepare.
            - `phone` string: The phone number to process as raw text. Accepts common formats; non-digit characters are tolerated. Supply exactly one of `phone` or `components` — supplying both, or neither, does not fail the whole request and neither field takes precedence; the individual item fails (its `data[i]` result carries `error` while the rest of the batch still succeeds, HTTP 200).
            - `components` PhoneComponents: Structured phone components, shared by phone input (`components`) and the phone output value.
              - …
          - `parsed` PhoneValue: Phone value: parsed and normalized components, plus any enrichments you requested.
            - `number` string: The phone number. On input: raw digits in national or full form (non-digit characters are tolerated). On output: the full, formatted number (the exact format depends on the normalization applied) — not a bare national component.
            - `countryCode` string: Country calling code or ISO 3166-1 alpha-2 country, if already known.
            - `extension` string: Extension, if present.
            - `region` string: Region associated with the number.
            - `lineType` 'MOBILE' | 'FIXED_LINE' | 'VOIP' | 'TOLL_FREE' | 'PREMIUM_RATE' | 'SHARED_COST' | 'PERSONAL_NUMBER' | 'PAGER' | 'UAN' | 'UNKNOWN': Phone line-type classification (returned when you request `LINE_TYPE`).
            - `verification` 'ACTIVE' | 'INACTIVE' | 'UNKNOWN': Phone line verification result (returned when you request `VERIFICATION`).
          - `normalized` PhoneValue: Phone value: parsed and normalized components, plus any enrichments you requested.
            - `number` string: The phone number. On input: raw digits in national or full form (non-digit characters are tolerated). On output: the full, formatted number (the exact format depends on the normalization applied) — not a bare national component.
            - `countryCode` string: Country calling code or ISO 3166-1 alpha-2 country, if already known.
            - `extension` string: Extension, if present.
            - `region` string: Region associated with the number.
            - `lineType` 'MOBILE' | 'FIXED_LINE' | 'VOIP' | 'TOLL_FREE' | 'PREMIUM_RATE' | 'SHARED_COST' | 'PERSONAL_NUMBER' | 'PAGER' | 'UAN' | 'UNKNOWN': Phone line-type classification (returned when you request `LINE_TYPE`).
            - `verification` 'ACTIVE' | 'INACTIVE' | 'UNKNOWN': Phone line verification result (returned when you request `VERIFICATION`).
          - `value` PhoneValue: Phone value: parsed and normalized components, plus any enrichments you requested.
            - `number` string: The phone number. On input: raw digits in national or full form (non-digit characters are tolerated). On output: the full, formatted number (the exact format depends on the normalization applied) — not a bare national component.
            - `countryCode` string: Country calling code or ISO 3166-1 alpha-2 country, if already known.
            - `extension` string: Extension, if present.
            - `region` string: Region associated with the number.
            - `lineType` 'MOBILE' | 'FIXED_LINE' | 'VOIP' | 'TOLL_FREE' | 'PREMIUM_RATE' | 'SHARED_COST' | 'PERSONAL_NUMBER' | 'PAGER' | 'UAN' | 'UNKNOWN': Phone line-type classification (returned when you request `LINE_TYPE`).
            - `verification` 'ACTIVE' | 'INACTIVE' | 'UNKNOWN': Phone line verification result (returned when you request `VERIFICATION`).
          - `isValid` boolean: Whether the input passed validation. A result-level verdict about the item as a whole, not a property of any single stage view.
      - object: Email success result resource — one element of the response `data[]` for a successfully processed email item. `id` is the request positional index (`items[i]` → `id == i`); the prepared result is in `attributes`.
        - `id` string, required: The unique identifier for the resource
        - `type` string, required: The type of the resource
        - `attributes` EmailResultAttributes, required: A single email result: the echoed input, the parsed and normalized data products, and the final prepared value.
          - `input` EmailInputItem, required: A single email value to prepare.
            - `email` string: The email address to process as raw text. Supply exactly one of `email` or `components` — supplying both, or neither, does not fail the whole request and neither field takes precedence; the individual item fails (its `data[i]` result carries `error` while the rest of the batch still succeeds, HTTP 200).
            - `components` EmailComponents: Structured email components for input (`components`). `fqdn` is the RFC domain-part after `@`, named to match `value.fqdn` on the way out.
              - …
          - `parsed` EmailValue: Email value: parsed and normalized components, plus any enrichments you requested.
            - `localPart` string: Local part (before the @).
            - `fqdn` string: Fully-qualified domain-part after `@` (e.g. `mail.example.co.uk`). IP literals are not accepted.
            - `registeredDomain` string: The registered (top private) domain — the highest-level domain an entity can register (e.g. `example.co.uk` from `mail.example.co.uk`).
            - `subdomain` string: Subdomain, if present.
            - `tld` string: Top-level domain.
            - `fullEmail` string: Full reassembled email address (serves as the formatted form for email).
            - `verification` 'VALID' | 'INVALID' | 'UNKNOWN' | 'CATCHALL' | 'DISPOSABLE': Mailbox verification result (returned when you request `VERIFICATION`).
            - `threat` 'SAFE' | 'UNSAFE': Threat disposition for an email (returned when you request `THREAT`).
            - `threatType` 'KEY' | 'QUARANTINE' | 'PARKED' | 'BOT' | 'INVALID' | 'MOLE' | 'TRAP' | 'SEED': Threat classification for an unsafe email (returned when you request `THREAT_TYPE`). Populated only when the email is unsafe. Omission does not imply the email is safe. The classifications are not equal risk, and `threat` does not distinguish them — it reports `UNSAFE` for all of them. Ordered from most to least severe: `TRAP`, `MOLE`, `QUARANTINE`, `SEED`, `BOT`, `PARKED`, `INVALID`, `KEY`. Sending to anything in the top half damages sender reputation with the organisations that operate those addresses, which is a different and more lasting cost than a bounce. If you are gating sends, branch on `threatType`, not on `threat` alone.
          - `normalized` EmailValue: Email value: parsed and normalized components, plus any enrichments you requested.
            - `localPart` string: Local part (before the @).
            - `fqdn` string: Fully-qualified domain-part after `@` (e.g. `mail.example.co.uk`). IP literals are not accepted.
            - `registeredDomain` string: The registered (top private) domain — the highest-level domain an entity can register (e.g. `example.co.uk` from `mail.example.co.uk`).
            - `subdomain` string: Subdomain, if present.
            - `tld` string: Top-level domain.
            - `fullEmail` string: Full reassembled email address (serves as the formatted form for email).
            - `verification` 'VALID' | 'INVALID' | 'UNKNOWN' | 'CATCHALL' | 'DISPOSABLE': Mailbox verification result (returned when you request `VERIFICATION`).
            - `threat` 'SAFE' | 'UNSAFE': Threat disposition for an email (returned when you request `THREAT`).
            - `threatType` 'KEY' | 'QUARANTINE' | 'PARKED' | 'BOT' | 'INVALID' | 'MOLE' | 'TRAP' | 'SEED': Threat classification for an unsafe email (returned when you request `THREAT_TYPE`). Populated only when the email is unsafe. Omission does not imply the email is safe. The classifications are not equal risk, and `threat` does not distinguish them — it reports `UNSAFE` for all of them. Ordered from most to least severe: `TRAP`, `MOLE`, `QUARANTINE`, `SEED`, `BOT`, `PARKED`, `INVALID`, `KEY`. Sending to anything in the top half damages sender reputation with the organisations that operate those addresses, which is a different and more lasting cost than a bounce. If you are gating sends, branch on `threatType`, not on `threat` alone.
          - `value` EmailValue: Email value: parsed and normalized components, plus any enrichments you requested.
            - `localPart` string: Local part (before the @).
            - `fqdn` string: Fully-qualified domain-part after `@` (e.g. `mail.example.co.uk`). IP literals are not accepted.
            - `registeredDomain` string: The registered (top private) domain — the highest-level domain an entity can register (e.g. `example.co.uk` from `mail.example.co.uk`).
            - `subdomain` string: Subdomain, if present.
            - `tld` string: Top-level domain.
            - `fullEmail` string: Full reassembled email address (serves as the formatted form for email).
            - `verification` 'VALID' | 'INVALID' | 'UNKNOWN' | 'CATCHALL' | 'DISPOSABLE': Mailbox verification result (returned when you request `VERIFICATION`).
            - `threat` 'SAFE' | 'UNSAFE': Threat disposition for an email (returned when you request `THREAT`).
            - `threatType` 'KEY' | 'QUARANTINE' | 'PARKED' | 'BOT' | 'INVALID' | 'MOLE' | 'TRAP' | 'SEED': Threat classification for an unsafe email (returned when you request `THREAT_TYPE`). Populated only when the email is unsafe. Omission does not imply the email is safe. The classifications are not equal risk, and `threat` does not distinguish them — it reports `UNSAFE` for all of them. Ordered from most to least severe: `TRAP`, `MOLE`, `QUARANTINE`, `SEED`, `BOT`, `PARKED`, `INVALID`, `KEY`. Sending to anything in the top half damages sender reputation with the organisations that operate those addresses, which is a different and more lasting cost than a bounce. If you are gating sends, branch on `threatType`, not on `threat` alone.
          - `isValid` boolean: Whether the input passed validation. A result-level verdict about the item as a whole, not a property of any single stage view.
      - object: Address success result resource — one element of the response `data[]` for a successfully processed address item. `id` is the request positional index (`items[i]` → `id == i`); the prepared result is in `attributes`; `meta` reports any enrichment signal that was not returned.
        - `id` string, required: The unique identifier for the resource
        - `type` string, required: The type of the resource
        - `attributes` AddressResultAttributes, required: A single address result: the echoed input, the parsed and normalized data products, and the final prepared value.
          - `input` AddressInputItem, required: A single address value to prepare.
            - `address` string: The address to process as raw text. May be a single free-text line or a partially structured value. Supply exactly one of `address` or `components` — supplying both, or neither, does not fail the whole request and neither field takes precedence; the individual item fails (its `data[i]` result carries `error` while the rest of the batch still succeeds, HTTP 200).
            - `components` AddressComponents: Structured address components, shared by address input (`components`) and the address output value. All fields optional to support messy/partial values on both sides (for example, separate CRM columns with no country).
              - …
          - `parsed` AddressValue: Address value: parsed and normalized components, plus any enrichments you requested. All component fields optional to support messy/partial input.
            - `streetNumber` string: Street number (e.g., `123`).
            - `street` string: Street name (e.g., `Main St`).
            - `unit` string: Unit / suite / apartment designator (e.g., `Ste 200`).
            - `poBox` string: PO Box identifier, if present.
            - `city` string: City name.
            - `county` string: County or district.
            - `state` string: State / province / region.
            - `postalCode` string: Postal / ZIP code.
            - `postalExtension` string: Postal code extension (e.g., ZIP+4).
            - `country` string: Country name or ISO code.
            - `formattedAddress` string: The full address rendered as a single human-readable string (e.g., `123 Main St, San Francisco, CA 94102, United States`). A flattened convenience view of the component fields; populated on the normalized/final value. This is a single STRING, distinct from the structured components above.
            - `verification` 'CONFIRMED' | 'PARTIAL' | 'NOT_FOUND': Deliverability confirmation result for an address.
            - `addressType` 'RESIDENTIAL' | 'COMMERCIAL' | 'UNKNOWN': Whether an address is residential or commercial.
            - `latitude` number, double: Latitude coordinate.
            - `longitude` number, double: Longitude coordinate.
            - `precision` 'UNKNOWN' | 'NONE' | 'STATE' | 'SCF' | 'CITY_CENTROID' | 'POSTAL_CODE' | 'ZIP5' | 'ZIP6' | 'ZIP7' | 'ZIP8' | 'ZIP9' | 'STREET' | 'STRUCTURE': How precisely the coordinates locate the address.
          - `normalized` AddressValue: Address value: parsed and normalized components, plus any enrichments you requested. All component fields optional to support messy/partial input.
            - `streetNumber` string: Street number (e.g., `123`).
            - `street` string: Street name (e.g., `Main St`).
            - `unit` string: Unit / suite / apartment designator (e.g., `Ste 200`).
            - `poBox` string: PO Box identifier, if present.
            - `city` string: City name.
            - `county` string: County or district.
            - `state` string: State / province / region.
            - `postalCode` string: Postal / ZIP code.
            - `postalExtension` string: Postal code extension (e.g., ZIP+4).
            - `country` string: Country name or ISO code.
            - `formattedAddress` string: The full address rendered as a single human-readable string (e.g., `123 Main St, San Francisco, CA 94102, United States`). A flattened convenience view of the component fields; populated on the normalized/final value. This is a single STRING, distinct from the structured components above.
            - `verification` 'CONFIRMED' | 'PARTIAL' | 'NOT_FOUND': Deliverability confirmation result for an address.
            - `addressType` 'RESIDENTIAL' | 'COMMERCIAL' | 'UNKNOWN': Whether an address is residential or commercial.
            - `latitude` number, double: Latitude coordinate.
            - `longitude` number, double: Longitude coordinate.
            - `precision` 'UNKNOWN' | 'NONE' | 'STATE' | 'SCF' | 'CITY_CENTROID' | 'POSTAL_CODE' | 'ZIP5' | 'ZIP6' | 'ZIP7' | 'ZIP8' | 'ZIP9' | 'STREET' | 'STRUCTURE': How precisely the coordinates locate the address.
          - `value` AddressValue: Address value: parsed and normalized components, plus any enrichments you requested. All component fields optional to support messy/partial input.
            - `streetNumber` string: Street number (e.g., `123`).
            - `street` string: Street name (e.g., `Main St`).
            - `unit` string: Unit / suite / apartment designator (e.g., `Ste 200`).
            - `poBox` string: PO Box identifier, if present.
            - `city` string: City name.
            - `county` string: County or district.
            - `state` string: State / province / region.
            - `postalCode` string: Postal / ZIP code.
            - `postalExtension` string: Postal code extension (e.g., ZIP+4).
            - `country` string: Country name or ISO code.
            - `formattedAddress` string: The full address rendered as a single human-readable string (e.g., `123 Main St, San Francisco, CA 94102, United States`). A flattened convenience view of the component fields; populated on the normalized/final value. This is a single STRING, distinct from the structured components above.
            - `verification` 'CONFIRMED' | 'PARTIAL' | 'NOT_FOUND': Deliverability confirmation result for an address.
            - `addressType` 'RESIDENTIAL' | 'COMMERCIAL' | 'UNKNOWN': Whether an address is residential or commercial.
            - `latitude` number, double: Latitude coordinate.
            - `longitude` number, double: Longitude coordinate.
            - `precision` 'UNKNOWN' | 'NONE' | 'STATE' | 'SCF' | 'CITY_CENTROID' | 'POSTAL_CODE' | 'ZIP5' | 'ZIP6' | 'ZIP7' | 'ZIP8' | 'ZIP9' | 'STREET' | 'STRUCTURE': How precisely the coordinates locate the address.
        - `meta` AddressResultMeta: Per-item metadata for an address result, reporting enrichment signals that were not returned. The item is still a success, and signals that were not returned are not charged.
          - `unfulfilled` AddressUnfulfilledEnrichment[]: Enrichment signals that were not returned for this item. Absent when every signal was returned.
            - `enrichment` 'NORMALIZATION' | 'VERIFICATION' | 'ADDRESS_TYPE' | 'GEOCODE', required: Enrichment signals for the address domain. Only `VERIFICATION` can be requested; it returns normalization, address type and geocode together. Because `VERIFICATION` supplies its own normalization, it cannot be combined with custom normalization — an address request supplies exactly one of `enrichments` or `config`.
            - `reason` string: Why the signal was not returned, for example `Address type is not supported for country CN.`
      - object: Company name success result resource — one element of the response `data[]` for a successfully processed company-name item. `id` is the request positional index (`items[i]` → `id == i`); the prepared result is in `attributes`.
        - `id` string, required: The unique identifier for the resource
        - `type` string, required: The type of the resource
        - `attributes` CompanyNameResultAttributes, required: A single company-name result: the echoed input, the parsed and normalized data products, and the final prepared value.
          - `input` CompanyNameInputItem, required: A single company-name value to prepare.
            - `companyName` string, required: The company name to normalize.
          - `parsed` CompanyNameValue: Company-name value: the company-name string at the stage it describes (parsed or normalized).
            - `companyName` string: The company-name string. Serves as both the canonical value and its formatted form.
            - `corporateIdentifiers` string[]: Canonical corporate forms (legal suffixes) that default normalization extracted from the input, separate from `companyName`. For example, the input `Acme, Inc.` normalizes to `companyName` `Acme` with `corporateIdentifiers` `["Inc."]`. Returned on `normalized` and `value` when the default normalization ran (no custom-normalization intent); an empty array when the input has no corporate form. Omitted on `parsed` and on custom-normalization results (inline `rules` or a non-blank `configId` supplied under `config.normalizationRules`), because neither extracts identifiers. An omitted field does not mean the input has no legal form.
          - `normalized` CompanyNameValue: Company-name value: the company-name string at the stage it describes (parsed or normalized).
            - `companyName` string: The company-name string. Serves as both the canonical value and its formatted form.
            - `corporateIdentifiers` string[]: Canonical corporate forms (legal suffixes) that default normalization extracted from the input, separate from `companyName`. For example, the input `Acme, Inc.` normalizes to `companyName` `Acme` with `corporateIdentifiers` `["Inc."]`. Returned on `normalized` and `value` when the default normalization ran (no custom-normalization intent); an empty array when the input has no corporate form. Omitted on `parsed` and on custom-normalization results (inline `rules` or a non-blank `configId` supplied under `config.normalizationRules`), because neither extracts identifiers. An omitted field does not mean the input has no legal form.
          - `value` CompanyNameValue: Company-name value: the company-name string at the stage it describes (parsed or normalized).
            - `companyName` string: The company-name string. Serves as both the canonical value and its formatted form.
            - `corporateIdentifiers` string[]: Canonical corporate forms (legal suffixes) that default normalization extracted from the input, separate from `companyName`. For example, the input `Acme, Inc.` normalizes to `companyName` `Acme` with `corporateIdentifiers` `["Inc."]`. Returned on `normalized` and `value` when the default normalization ran (no custom-normalization intent); an empty array when the input has no corporate form. Omitted on `parsed` and on custom-normalization results (inline `rules` or a non-blank `configId` supplied under `config.normalizationRules`), because neither extracts identifiers. An omitted field does not mean the input has no legal form.
          - `isValid` boolean: Whether the input passed validation. A result-level verdict about the item as a whole, not a property of any single stage view. For company names, `false` means deterministic junk validation rejected the input (placeholder values, punctuation-only input, input with no letters, or single-character input); blanket URL, email, or phone-number checks are not applied.
      - object: Url success result resource — one element of the response `data[]` for a successfully processed URL item. `id` is the request positional index (`items[i]` → `id == i`); the prepared result is in `attributes`.
        - `id` string, required: The unique identifier for the resource
        - `type` string, required: The type of the resource
        - `attributes` UrlResultAttributes, required: A single URL result: the echoed input, the parsed and normalized data products, and the final prepared value.
          - `input` UrlInputItem, required: A single URL value to prepare.
            - `url` string, required: The URL to normalize.
          - `parsed` UrlValue: Canonical URL string and structured component fields.
            - `url` string: The URL string. Serves as both the canonical value and its formatted form.
            - `protocol` string: URI scheme, for example `http` or `https`.
            - `fqdn` string: Fully-qualified host, including any subdomain (e.g. `mail.example.co.uk`).
            - `registeredDomain` string: Registered domain (eTLD+1).
            - `tld` string: Top-level domain.
            - `subdomain` string: Subdomain, if present.
          - `normalized` UrlValue: Canonical URL string and structured component fields.
            - `url` string: The URL string. Serves as both the canonical value and its formatted form.
            - `protocol` string: URI scheme, for example `http` or `https`.
            - `fqdn` string: Fully-qualified host, including any subdomain (e.g. `mail.example.co.uk`).
            - `registeredDomain` string: Registered domain (eTLD+1).
            - `tld` string: Top-level domain.
            - `subdomain` string: Subdomain, if present.
          - `value` UrlValue: Canonical URL string and structured component fields.
            - `url` string: The URL string. Serves as both the canonical value and its formatted form.
            - `protocol` string: URI scheme, for example `http` or `https`.
            - `fqdn` string: Fully-qualified host, including any subdomain (e.g. `mail.example.co.uk`).
            - `registeredDomain` string: Registered domain (eTLD+1).
            - `tld` string: Top-level domain.
            - `subdomain` string: Subdomain, if present.
          - `isValid` boolean: Whether the input passed validation. A result-level verdict about the item as a whole, not a property of any single stage view.
      - object: Job title success result resource — one element of the response `data[]` for a successfully processed job-title item. `id` is the request positional index (`items[i]` → `id == i`); the prepared result is in `attributes`.
        - `id` string, required: The unique identifier for the resource
        - `type` string, required: The type of the resource
        - `attributes` JobTitleResultAttributes, required: A single job title result: the echoed input, the parsed and normalized data products, and the final prepared value.
          - `input` JobTitleInputItem, required: A single job title value to prepare.
            - `jobTitle` string, required: The job title to normalize.
          - `parsed` JobTitleValue: Job title value: the normalized/standardized title string, plus classification enrichment.
            - `title` string: The job title string. Serves as both the canonical value and its formatted form.
            - `departments` JobTitleDepartment[]: Departments the title belongs to (requested via `CLASSIFICATION`). A title can belong to more than one department, for example a Chief Financial Officer is both `C_SUITE` and `FINANCE`. Omitted if `CLASSIFICATION` was not requested. Empty if requested and no department was identified.
            - `jobFunctions` string[]: Job function names within the department(s), a finer cut than `departments` (requested via `CLASSIFICATION`), e.g. `Software Development`. Omitted if `CLASSIFICATION` was not requested. Empty if requested and no job function was identified.
            - `managementLevel` JobTitleManagementLevel: Management-level classification for a job title, derived from the title's classification codes. When a title's codes span more than one level, the most senior (lowest `rank`) wins.
              - …
            - `boardMember` boolean: Whether the title indicates board membership (requested via `CLASSIFICATION`). `false` means board membership was checked and no evidence was found. Omitted if `CLASSIFICATION` was not requested. Independent of `managementLevel`: a title can be both a board member and carry another level, for example Chairman of the Board.
          - `normalized` JobTitleValue: Job title value: the normalized/standardized title string, plus classification enrichment.
            - `title` string: The job title string. Serves as both the canonical value and its formatted form.
            - `departments` JobTitleDepartment[]: Departments the title belongs to (requested via `CLASSIFICATION`). A title can belong to more than one department, for example a Chief Financial Officer is both `C_SUITE` and `FINANCE`. Omitted if `CLASSIFICATION` was not requested. Empty if requested and no department was identified.
            - `jobFunctions` string[]: Job function names within the department(s), a finer cut than `departments` (requested via `CLASSIFICATION`), e.g. `Software Development`. Omitted if `CLASSIFICATION` was not requested. Empty if requested and no job function was identified.
            - `managementLevel` JobTitleManagementLevel: Management-level classification for a job title, derived from the title's classification codes. When a title's codes span more than one level, the most senior (lowest `rank`) wins.
              - …
            - `boardMember` boolean: Whether the title indicates board membership (requested via `CLASSIFICATION`). `false` means board membership was checked and no evidence was found. Omitted if `CLASSIFICATION` was not requested. Independent of `managementLevel`: a title can be both a board member and carry another level, for example Chairman of the Board.
          - `value` JobTitleValue: Job title value: the normalized/standardized title string, plus classification enrichment.
            - `title` string: The job title string. Serves as both the canonical value and its formatted form.
            - `departments` JobTitleDepartment[]: Departments the title belongs to (requested via `CLASSIFICATION`). A title can belong to more than one department, for example a Chief Financial Officer is both `C_SUITE` and `FINANCE`. Omitted if `CLASSIFICATION` was not requested. Empty if requested and no department was identified.
            - `jobFunctions` string[]: Job function names within the department(s), a finer cut than `departments` (requested via `CLASSIFICATION`), e.g. `Software Development`. Omitted if `CLASSIFICATION` was not requested. Empty if requested and no job function was identified.
            - `managementLevel` JobTitleManagementLevel: Management-level classification for a job title, derived from the title's classification codes. When a title's codes span more than one level, the most senior (lowest `rank`) wins.
              - …
            - `boardMember` boolean: Whether the title indicates board membership (requested via `CLASSIFICATION`). `false` means board membership was checked and no evidence was found. Omitted if `CLASSIFICATION` was not requested. Independent of `managementLevel`: a title can be both a board member and carry another level, for example Chairman of the Board.
          - `isValid` boolean: Whether the input passed validation. A result-level verdict about the item as a whole, not a property of any single stage view.
      - object: Person name success result resource — one element of the response `data[]` for a successfully processed person-name item. `id` is the request positional index (`items[i]` → `id == i`); the prepared result is in `attributes`.
        - `id` string, required: The unique identifier for the resource
        - `type` string, required: The type of the resource
        - `attributes` PersonNameResultAttributes, required: A single person-name result: the echoed input, the parsed and normalized data products, and the final prepared value.
          - `input` PersonNameInputItem, required: A single person-name value to prepare.
            - `name` string: The full name to process as raw text. Accepts common formats. Supply exactly one of `name` or `components` — supplying both, or neither, does not fail the whole request and neither field takes precedence; the individual item fails (its `data[i]` result carries `error` while the rest of the batch still succeeds, HTTP 200).
            - `components` PersonNameComponents: Structured person-name components, shared by person-name input (`components`) and the person-name output value. All fields optional to support messy/partial values on both sides (for example, separate CRM first/last columns).
              - …
          - `parsed` PersonNameValue: Person-name value: parsed/normalized components plus the reassembled full name.
            - `prefix` string: Name prefix / salutation (e.g., `Dr`, `Ms`).
            - `first` string: First / given name.
            - `middle` string: Middle name or initial.
            - `last` string: Last / family name.
            - `suffix` string: Name suffix (e.g., `Jr`, `III`, `PhD`).
            - `fullName` string: Full reassembled name (serves as the formatted form for person name).
          - `normalized` PersonNameValue: Person-name value: parsed/normalized components plus the reassembled full name.
            - `prefix` string: Name prefix / salutation (e.g., `Dr`, `Ms`).
            - `first` string: First / given name.
            - `middle` string: Middle name or initial.
            - `last` string: Last / family name.
            - `suffix` string: Name suffix (e.g., `Jr`, `III`, `PhD`).
            - `fullName` string: Full reassembled name (serves as the formatted form for person name).
          - `value` PersonNameValue: Person-name value: parsed/normalized components plus the reassembled full name.
            - `prefix` string: Name prefix / salutation (e.g., `Dr`, `Ms`).
            - `first` string: First / given name.
            - `middle` string: Middle name or initial.
            - `last` string: Last / family name.
            - `suffix` string: Name suffix (e.g., `Jr`, `III`, `PhD`).
            - `fullName` string: Full reassembled name (serves as the formatted form for person name).
          - `isValid` boolean: Whether the input passed validation. A result-level verdict about the item as a whole, not a property of any single stage view.
      - object: Error result resource — one element of the response `data[]` for an item that failed to process (the value XOR error counterpart to the domain success resources, modeled on the enrich `NoMatch` precedent). `id` is the request positional index (`items[i]` → `id == i`), the link back to the failing item; the failure detail is in `attributes`. A failed item still occupies its ordinal slot, and the rest of the batch still succeeds (partial success, HTTP 200).
        - `id` string, required: The unique identifier for the resource
        - `type` string, required: The type of the resource
        - `attributes` PrepareItemError, required: Attributes of a `PrepareError` result resource — a single item that failed to process. Item-scoped and statusless: the HTTP status belongs to the response as a whole (a per-item failure is still part of a `200`), and the failing item is located by its ordinal position (`data[i].id == i` ↔ `items[i]`). Distinct from the document-level error object used for whole-request failures.
          - `detail` string: Human-readable detail describing why this item could not be processed.

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `402`: Payment Required
- `403`: Forbidden
- `429`: Too Many Requests

---

[API](https://skmtc.dev/zoominfo/apis/data-quality-api-v1.md) - [All operations](https://skmtc.dev/zoominfo/apis/data-quality-api-v1/llms.txt) - [OpenAPI document](https://skmtc.dev/zoominfo/apis/data-quality-api-v1/revisions/7229ed1f3b09?raw)
