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

# Output Guide

> Complete reference for result codes and response fields both for API and Batch Scrub

This guide provides a complete reference for understanding the Scrub API response fields and result codes. These fields
are also the same as in our batch scrub processing that can be either done thru the DNCScrub web portal or SFTP.

Whether a call is permissible depends on the call's content. We recommend each caller review the [Consent
Chart](https://www.dncscrub.com/compliance-guide/consent-chart) in our compliance guide with their legal counsel. Our responses are oriented around the call's content being a marketing message.

## Result Codes

The `ResultCode` field indicates the overall scrub result for a phone number:

### Clean

| Code | Name | Description |
| - | - | - |
| `C` | Clean | Phone number is not on any DNC list, is not Wireless or VoP, and is safe to call |
| `X` | Industry Exemption | Industry exemption applied to an otherwise DNC number |

### Wireless \ VoIP Indicators

| Code | Name | Description |
| - | - | - |
| `W` | Wireless | Wireless number not in any DNC database. Not in a state that restricts solicitations to wireless numbers. |
| `L` | Wireless Prohibited | Wireless number in a US state that does not allow telephone solicitation to wireless numbers, even if manually dialed (States: WY, NJ, TX, LA, and AZ) |
| `F` | EBR + Wireless Restricted | Valid EBR and Wireless number in a US state that does not allow telephone solicitation to wireless numbers, even if manually dialed (States: WY, NJ, TX, LA, and AZ) |
| `G` | EBR + Wireless/VoIP | Valid EBR and US Wireless or VoIP number, not on any DNC database (version 2+). Still cannot be called from a predictive dialer as EBRs do not constitute an exemption to those rules |
| `H` | EBR Override + Wireless/VoIP | Wireless or VoIP number that is also a valid EBR, overriding an otherwise DNC number |
| `V` | EBR Override + Wireless Restricted | Valid EBR overriding an otherwise DNC number that is also a Wireless number in a US state that does not allow telephone solicitation to wireless numbers, even if manually dialed (States: WY, NJ, TX, LA, and AZ) |

### EBR (Existing Business Relationship)

| Code | Name | Description |
| - | - | - |
| `E` | EBR Valid | Currently valid EBR, not on a Do Not Call list. Number can be called |
| `O` | EBR Override | EBR Override was applied to an otherwise Do Not Call number (including an explicit EBR overriding a number in Project DNC). Number can be called |

### VoIP

VoIP should be treated the same way as wireless. Federal and state laws that apply to Wireless
apply to VoIP as well.

| Code | Name | Description |
| - | - | - |
| `Y` | VoIP | VoIP number not in any DNC databases (or it has been overridden by an industry exemption). Requires VoIP scrubbing to be purchased |

### Industry Exemptions

| Code | Name | Description |
| - | - | - |
| `X` | Industry Exemption | Industry exemption applied to an otherwise DNC number |

### Do Not Call

| Code | Name | Description |
| - | - | - |
| `D` | Do Not Call | Phone number is on a DNC database. The `Reason` field provides additional details. Litigator numbers have "Litigator" in the Reason field |
| `P` | Internal DNC | Internal DNC (also called Project DNC) database match. No further checks are performed once a number is found as Internal DNC |

### Invalid or Blocked

| Code | Name | Description |
| - | - | - |
| `B` | Blocked | Number is in an area code not covered by the National Subscription on this project, is in a configured no-call area code, or no exemption was available in a pre-recorded call campaign |
| `I` | Invalid | Area code is not active, reserved, or is a special use phone number pattern (e.g., 555-5555) |
| `M` | Malformed | Number is not 10 numerical digits |

## Response Fields

Types below are for `version=8` JSON (see [JSON response
shape](#json-response-shape)); earlier versions return every value as a string.

### Phone Information

| Field | Type | Description |
| - | - | - |
| `Phone` | String | The phone number that was scrubbed |
| `ResultCode` | String | The scrub result code (see above) |
| `Reserved` | String / null | Your unique identifier if provided, otherwise `null` (v5–7: empty string) |
| `Reason` | String | Detailed reason for the result code |

### Location Information

| Field | Type | Description |
| - | - | - |
| `RegionAbbrev` | String | State/province abbreviation for the number's **area code** — where the number is geographically from (e.g., "CA", "NY"). This is not necessarily the state DNC registry it is listed on; see [Reason Field Format](#reason-field-format). |
| `Country` | String | Country code (e.g., "US", "CA") |
| `Locale` | String | City or locality name |

### Carrier Information

| Field | Type | Description |
| - | - | - |
| `CarrierInfo` | String | Carrier information in format: `ID;TYPE;"Name:Name"` |
| `LineType` | String | `Wireless`, `VoIP`, or `AllOther` |
| `IsWirelessOrVoIP` | Boolean | `true` if wireless or VoIP |

### Timezone Information

| Field | Type | Description |
| - | - | - |
| `TZCode` | Integer | Timezone code (see [Timezone Codes](#timezone-codes)) |
| `UTCOffset` | Integer | UTC offset in minutes, adjusted for DST (e.g., `-420` for Pacific Daylight Time) |
| `CallingWindow` | String / null | `null` when no window applies. Permitted calling hours in the destination's local time, `HH:MM-HH:MM`, three semicolon-separated windows: weekday;Saturday;Sunday |
| `CallingTimeRestrictions` | Integer | Bit field: `1` = currently outside the calling window, `2` = an EBR exemption to the calling window is available, `4` = the state does not specify its own window (or you are exempt), so the federal 8 AM–9 PM window applies |
| `DoNotCallToday` | Boolean | `true` if should not be called today (state holiday or state of emergency) |
| `PostalCode` | String / null | Normalized postal code used for the time zone calculation (`10001`, `M5V`). `null` if none was supplied. API only, requires `version=8+` |
| `TZSource` | String | `postalCode` if the fields above were derived from a supplied postal code, otherwise `areaCode`. API only, requires `version=8+` |
| `IsCallAllowedNonATDS` | Boolean | `true` if a manually dialed, live-agent marketing call may be placed right now. See [Is the call allowed?](#is-the-call-allowed). API only, requires `version=8+` |
| `IsCallAllowedATDS` | Boolean | Same, for autodialed calls. Wireless and VoIP return `false` unless a Permission EBR is on file. API only, requires `version=8+` |
| `IsCallAllowedAI` | Boolean | Same, for AI / artificial / prerecorded voice. `true` only with a valid Permission EBR (`EBRType` `P`). See [AI Voice Agents](/api-reference/scrub/ai-voice-agents). API only, requires `version=8+` |

#### How the time zone and calling window are determined

1. By default the destination is located from the phone number's area code and
   prefix (NPA-NXX). That gives the time zone (`TZCode`, `UTCOffset`) and the
   state whose calling hours, holidays and state-of-emergency blocks are applied
   (`CallingWindow`, `CallingTimeRestrictions`, `DoNotCallToday`).
2. API callers may supply the contact's postal code per number, as
   `PHONE|ID|POSTALCODE` in `phoneList`. When the
   postal code is recognized (5-digit US ZIP or Canadian postal code / FSA), the
   destination time zone and state come from the postal code instead, and
   `TZSource` is `postalCode`. Mobile numbers keep their area code when their
   owner moves, so this is the more reliable choice when you know where the
   contact lives.
3. If the postal code is missing or not recognized, step 1 applies and
   `TZSource` is `areaCode`.

The postal code never changes `ResultCode`, `Reason`, `RegionAbbrev`,
`Country`, `Locale`, DNC list matching or EBR handling — those always follow the
phone number. Batch scrubs (portal upload and SFTP) do not accept a postal code.

### EBR Information

| Field | Type | Description |
| - | - | - |
| `EBRType` | String / null | Type of EBR applied: `S` (Sale), `I` (Inquiry), `P` (Permission). `null` if none (v5–7: empty string) |
| `EBRExpiresOn` | Date / null | Date the EBR expires, `YYYY-MM-DD`, inclusive. The earlier of the federal and state expiration dates. `null` if no EBR. Requires `version=6+` (v6–7: `YYYY-MM-DD 23:59:00` string) |

### Line Type Dates

| Field | Type | Description |
| - | - | - |
| `WirelessPortDate` | Date / null | Date the number was ported to wireless. `null` if no port record (v7: `0` or empty). Requires `version=7+` |
| `VoIPDate` | Date / null | Date the number was identified as VoIP, `YYYY-MM-DD`. `null` if not VoIP. Requires `version=7+` |

### Other Fields

| Field | Type | Description |
| - | - | - |
| `NewReassignedAreaCode` | String / null | New area code if the area code was split or overlaid, otherwise `null` |

<Note>
  `EBRExpiresOn` is returned only with `version=6` or higher;
  `WirelessPortDate` and `VoIPDate` only with `version=7` or higher;
  `PostalCode`, `TZSource`, `IsCallAllowedNonATDS`, `IsCallAllowedATDS` and
  `IsCallAllowedAI` only with `version=8` or higher. Use `version=8` to receive
  all fields.

  In versions 6–7, `EBRExpiresOn` is not an ISO 8601 timestamp: the time
  portion is always `23:59:00` (end of day) and no timezone is included. Treat
  it as a date — compare `YYYY-MM-DD` against your local calendar date rather
  than parsing it as a UTC timestamp. Version 8 returns the date only.
</Note>

## Is the call allowed?

`ResultCode` has many values because the right action depends on how you place
the call. With `version=8` the response includes three flags that collapse
`ResultCode`, `EBRType`, `DoNotCallToday` and the calling window into one
yes/no answer for **a marketing call placed right now**. They differ in how
wireless numbers and consent are treated, because that is where the law forks.

| Flag | Use it when | DNC-status condition for `1` |
| - | - | - |
| `IsCallAllowedNonATDS` | A live agent dials, and the equipment is not an autodialer under the law that applies to you (see below) | `ResultCode` in `C`, `X`, `E`, `O`, `W`, `G`, `H`, `Y` — wireless treated like landlines |
| `IsCallAllowedATDS` | An autodialer places the call (federal or state definition) — TCPA §227(b) requires prior express written consent to call **wireless** numbers | `ResultCode` in `C`, `X`, `E`, `O`; or `G`, `H` when `EBRType` is `P` (consent on file). Wireless without consent is `false` |
| `IsCallAllowedAI` | The call uses an **artificial, prerecorded or AI-generated voice** (including ringless voicemail) — §227(b) requires prior express written consent for **wireless and residential landlines**, with no EBR exemption | `EBRType` is `P` **and** `ResultCode` in `E`, `O`, `G`, `H`. A clean number with no consent (`C`) is `false` |

All three also require every check below:

| Check | Condition |
| - | - |
| Wireless-prohibited states | `ResultCode` is not `L`, `F` or `V` |
| Holidays / emergencies | `DoNotCallToday` is `false` |
| Calling window | The destination's current local time is inside `CallingWindow` (`CallingTimeRestrictions` bit `1` is clear), or an after-hours EBR exemption applies under your campaign's settings |

Everything else — `D`, `P`, `B`, `I`, `M` — returns `false` on all three. The
flags are nested: `IsCallAllowedAI` implies `IsCallAllowedATDS` implies
`IsCallAllowedNonATDS`.

Consent is a Permission (`P`) EBR stored through the [EBR and Consent
API](/api-reference/scrub/ebr-list). Sale and Inquiry EBRs are DNC exemptions,
not consent, and do not satisfy the ATDS or AI flags.

### Which flag applies to you

Under the federal TCPA, an autodialer (ATDS) is equipment that stores or
produces telephone numbers **using a random or sequential number generator**
(*Facebook v. Duguid*, U.S. Supreme Court, 2021). Since that decision, courts
have consistently held that a dialer — including a predictive dialer — that
calls numbers from a list you loaded is not an ATDS, even if it uses a
sequential counter to work through the list (e.g. *Soliman v. Subway*, 2d Cir.
2024\). For a live-agent call from your own list, `IsCallAllowedNonATDS` is
therefore usually the right flag under federal law.

Three things move a call to a stricter flag regardless of the dialer:

1. **Voice.** An artificial, prerecorded or AI-generated voice, or a voicemail
   drop, requires prior express written consent for marketing on its own — use
   `IsCallAllowedAI`. The FCC confirmed in February 2024 that AI-generated
   voices are artificial voices under the TCPA.
2. **State law.** Florida, Oklahoma, Washington, Maryland and a growing list of
   states define "autodialer" more broadly than the federal test (typically any
   *automated system for the selection or dialing* of numbers) and attach
   their own consent and calling-hour rules. If the contact is in one of those
   states — use `RegionAbbrev`, or `PostalCode` when you supplied one — use
   `IsCallAllowedATDS`.
3. **Your equipment actually generates numbers**, or your counsel has not
   confirmed otherwise — use `IsCallAllowedATDS`.

<Warning>
  These flags encode DNC status, stored consent, line type and calling hours —
  the data DNCScrub holds. They do not know how you obtained the number, whether
  your consent language meets a given state's standard, or what your dialer
  does. Which flag is correct for your operation is a determination for you and
  your counsel; when in doubt, use the stricter flag. A `false` on any flag does not
  mean the call is illegal for every use case (for example informational or
  non-marketing calls); use `ResultCode`, `LineType` and `CallingWindow` for
  those.
</Warning>

<Note>
  All flags are evaluated at scrub time. The calling-window check makes them
  change during the day, so for lists you scrub in advance rely on
  `CallingWindow` and `UTCOffset` at dial time rather than a stored flag.
</Note>

## JSON response shape

With `output=json`, **version 8** returns an object:

```json theme={null}
{
  "version": 8,
  "results": [ { "Phone": "7075276405", "ResultCode": "D", ... } ]
}
```

`results` has one row per number, in the order submitted. Errors (HTTP 4xx/5xx)
are also objects (`{"message": "..."}`), so a client never has to test whether
the body is an array. Values are typed:

| JSON type | Fields |
| - | - |
| string | `Phone`, `ResultCode`, `Reason`, `RegionAbbrev`, `Country`, `Locale`, `CarrierInfo`, `LineType`, `TZSource` |
| string or `null` | `Reserved`, `NewReassignedAreaCode`, `EBRType`, `PostalCode`, `CallingWindow` |
| integer | `TZCode`, `UTCOffset`, `CallingTimeRestrictions` (`null` only for non-NANP destinations with no time zone) |
| boolean | `DoNotCallToday`, `IsWirelessOrVoIP`, `IsCallAllowedNonATDS`, `IsCallAllowedATDS`, `IsCallAllowedAI` — never `null` |
| date string `YYYY-MM-DD` or `null` | `EBRExpiresOn`, `WirelessPortDate`, `VoIPDate` |

`Phone` stays a string: it is an identifier, not a quantity. Field names are
unchanged from earlier versions, so a v7 client moving to v8 changes only where
it reads the array and how it compares booleans.

<Note>
  **Versions 5–7** return a bare JSON array with every value quoted as a string
  (`"UTCOffset": "-420"`, `"IsWirelessOrVoIP": "1"`, `"WirelessPortDate": "0"`
  for none, `"EBRExpiresOn": "2027-02-09 23:59:00"`, and `"DoNotCallToday": ""`
  when no calling window applies — treat empty as `0`). Those versions are
  unchanged. CSV output is identical across versions apart from the added
  columns.
</Note>

## Reason Field Format

The `Reason` field provides detail about why a number was flagged. For a Do
Not Call result (`ResultCode` `D` or `O`), it is a **fixed set of
semicolon-separated positions**, one per database. Each position is always
present and always in the same order; a position is left **empty** when the
number is not on that database. Parse by position — for example, the state
entry is always the second position.

| Position | Database | When present | When absent |
| - | - | - | - |
| 1 | National DNC | `National (Country) YYYY-MM-DD` | empty |
| 2 | State DNC | `State (StateList) YYYY-MM-DD` | empty |
| 3 | TPS | `DMA TPS` (US) or `CMA TPS` (Canada) | empty |
| 4 | Wireless | `W` | empty |

`Country` is `USA` or `CAN`. The date is the date the number was added to that
registry.

<Note>
  The `StateList` in `State (StateList)` is the **state DNC registry the number is
  listed on** — not where the number is geographically from. Those differ more
  often than you might expect: a number can be on one state's registry while its
  area code belongs to another (a ported number, or a state that publishes
  out-of-state area codes). For example, `2036295673` has a Connecticut area code
  but is on Florida's registry, so it returns `State (FL)`.

  Use the separate `RegionAbbrev` field for the number's geographic
  state/province. A number listed on several state registries reports one of
  them; the `Reason` field has a single State position by design, so parsing by
  position stays reliable.
</Note>

### Examples

National DNC only:

```
National (USA) 2003-06-01;;;
```

State DNC only (note the leading empty National position):

```
;State (CA) 2020-01-15;;
```

On National, State, and TPS:

```
National (USA) 2003-06-01;State (CA) 2020-01-15;DMA TPS;
```

Wireless number with no DNC-list match (position 4 set, others empty). The
`ResultCode` is `W`, or `L` when the number is wireless in a state that
prohibits solicitation to wireless numbers:

```
;;;W
```

Wireless number that is also on a state DNC list (positions 2 and 4 set). This
number has a New Jersey area code but is listed on Florida's registry, so the
State position reports `FL` while `RegionAbbrev` returns `NJ`:

```
;State (FL) 2022-01-21;;W
```

### Standalone reasons

Some results set the entire `Reason` to a single value instead of the
positional format above:

| `Reason` | `ResultCode` | Meaning |
| - | - | - |
| `Litigator` | `D` | Number belongs to a known TCPA litigator |
| `VoIP` | `Y` | Flagged as VoIP (VoIP scrubbing must be purchased) |
| `RequiresEWC` | `D` | Requires express written consent |

<Note>
  For these standalone reasons, the single value replaces the positional
  databases — the number may also be on other DNC databases that the `Reason`
  field does not list in this case. Wireless is **not** a standalone reason; it
  appears in position 4 as `W` (see the examples above).
</Note>

## Carrier Information Format

The `CarrierInfo` field contains three parts separated by semicolons:

```
9740;RBOC;"AT&T California:AT&T California"
```

| Part | Description |
| - | - |
| `9740` | Carrier ID |
| `RBOC` | Carrier Type (RBOC, WIRELESS, CLEC, etc.) |
| `"AT&T California:AT&T California"` | Carrier name(s) |

### Carrier Types

| Type | Description |
| - | - |
| `RBOC` | Regional Bell Operating Company (major landline carriers) |
| `WIRELESS` | Wireless/cellular carrier |
| `CLEC` | Competitive Local Exchange Carrier |
| `VOIP` | Voice over IP provider |
| `CABLE` | Cable company providing phone service |

## Line Types

| Value | Description |
| - | - |
| `Wireless` | Mobile/cellular phone |
| `VoIP` | Voice over IP line |
| `AllOther` | Landline or other non-wireless |

## Timezone Codes

`TZCode` values for US and Canadian destinations. `UTCOffset` is returned
separately and already accounts for DST, so most integrations only need
`UTCOffset` and `CallingWindow`.

| Code | Timezone | Observes DST |
| - | - | - |
| `1` | Samoa | No |
| `2` | Hawaii | No |
| `3` | Alaska | Yes |
| `4` | Pacific | Yes |
| `6` | Alaska, Aleutians West | Yes |
| `7` | Pacific Standard (no DST) | No |
| `10` | Mountain | Yes |
| `15` | Arizona | No |
| `17` | Mountain Standard (no DST) | No |
| `20` | Central | Yes |
| `25` | Saskatchewan | No |
| `27` | Central Standard (no DST) | No |
| `35` | Eastern | Yes |
| `37` | Eastern Standard (no DST) | No |
| `40` | Indiana Eastern | Yes |
| `47` | Atlantic Standard (no DST) | No |
| `50` | Atlantic | Yes |
| `60` | Newfoundland | Yes |
| `275` | West Pacific (Guam, Northern Marianas) | No |

## Example Response Analysis

```json theme={null}
{
  "version": 8,
  "results": [
    {
      "Phone": "7075276405",
      "ResultCode": "D",
      "Reserved": null,
      "Reason": "National (USA) 2003-06-01;;;",
      "RegionAbbrev": "CA",
      "Country": "US",
      "Locale": "Santa Rosa",
      "CarrierInfo": "9740;RBOC;\"AT&T California:AT&T California\"",
      "NewReassignedAreaCode": null,
      "TZCode": 4,
      "CallingWindow": null,
      "UTCOffset": -420,
      "DoNotCallToday": false,
      "CallingTimeRestrictions": 4,
      "EBRType": null,
      "IsWirelessOrVoIP": false,
      "LineType": "AllOther",
      "EBRExpiresOn": null,
      "WirelessPortDate": null,
      "VoIPDate": null,
      "PostalCode": null,
      "TZSource": "areaCode",
      "IsCallAllowedNonATDS": false,
      "IsCallAllowedATDS": false,
      "IsCallAllowedAI": false
    }
  ]
}
```

**Analysis:**

* **Result**: `D` = Do Not Call
* **Reason**: On National DNC since June 1, 2003
* **Location**: Santa Rosa, CA, USA
* **Carrier**: AT\&T California (landline)
* **Line Type**: Landline (`AllOther`, `IsWirelessOrVoIP` = `false`)
* **Timezone**: Pacific (code `4`, UTC-420 minutes, derived from the area code)
* **Callable now?**: No on all three flags — the number is on the National DNC


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.