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

# Scrub Multiple Numbers

> Scrub multiple phone numbers in a single API call

Submit multiple phone numbers in a single request for efficient batch processing.

<Note>
  To add or refresh EBR records in the same call as a scrub, use
  [Scrub + Add EBR](/api-reference/scrub/scrub-ebr).
</Note>

<Warning>
  If you scrub more than 10 phone numbers, use HTTP POST instead of HTTP GET. If
  you do not know your batch size, safest option is always use HTTP POST. The
  maximum number of records that can be scrubbed per requests is 10,000. If you
  have larger batches, consider using SFTP.
</Warning>

## Request

### Headers

<ParamField header="loginId" type="string" required>
  Your API Key
</ParamField>

### Request Body

<ParamField body="phoneList" type="string" required>
  Comma-separated list of 10-digit phone numbers (e.g.,
  `5039367187,7075276405,7072842774`). To include a system identifier with each
  result, append `|{id}` to the phone number (e.g.,
  `5039367187|abc-10232,7075276405|abc-10233,7072842774|abc-10234`).
</ParamField>

<ParamField body="version" type="string" required default="5">
  API version. Use `5`
</ParamField>

<ParamField body="output" type="string" default="json">
  Response format: `json` or `csv`
</ParamField>

<ParamField body="projId" type="string">
  Optional. Project ID
</ParamField>

<ParamField body="campaignId" type="string">
  Optional. Campaign ID
</ParamField>

## Example Request

<CodeGroup>
  ```bash cURL (POST - for 10+ numbers) theme={null}
  curl --location --request POST \
    'https://www.dncscrub.com/app/main/rpc/scrub' \
    --header 'loginId: YOUR_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{
      "phoneList": "5039367187,7075276405,7072842774",
      "version": "5",
      "output": "json"
    }'
  ```

  ```javascript JavaScript theme={null}
  const phoneNumbers = ["5039367187", "7075276405", "7072842774"];
  const phoneList = phoneNumbers.join(",");

  const response = await fetch("https://www.dncscrub.com/app/main/rpc/scrub", {
    method: "POST",
    headers: {
      loginId: "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      phoneList: phoneList,
      version: "5",
      output: "json",
    }),
  });

  const results = await response.json();
  results.forEach((result) => {
    console.log(`${result.Phone}: ${result.ResultCode}`);
  });
  ```

  ```csharp C# theme={null}
  System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

  using (var client = new HttpClient())
  {
      client.DefaultRequestHeaders.Add("loginId", "YOUR_API_KEY");

      var requestBody = new
      {
          phoneList = "5039367187,7075276405,7072842774",
          version = "5",
          output = "json"
      };

      var json = System.Text.Json.JsonSerializer.Serialize(requestBody);
      var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

      var response = await client.PostAsync(
          "https://www.dncscrub.com/app/main/rpc/scrub",
          content
      );
      var responseString = await response.Content.ReadAsStringAsync();
  }
  ```
</CodeGroup>

<ResponseExample>
  ```json Response theme={null}
  [
    {
      "Phone": "5039367187",
      "ResultCode": "D",
      "Reserved": "",
      "Reason": "Litigator",
      "RegionAbbrev": "OR",
      "Country": "US",
      "Locale": "Portland",
      "CarrierInfo": "5820;WIRELESS;\"Verizon Wireless:Verizon Wireless\"",
      "NewReassignedAreaCode": "",
      "TZCode": "4",
      "CallingWindow": "",
      "UTCOffset": "-420",
      "DoNotCallToday": "",
      "CallingTimeRestrictions": "4",
      "EBRType": "",
      "IsWirelessOrVoIP": "1",
      "LineType": "Wireless"
    },
    {
      "Phone": "7075276405",
      "ResultCode": "D",
      "Reserved": "",
      "Reason": "National (USA) 2003-06-01;;;",
      "RegionAbbrev": "CA",
      "Country": "US",
      "Locale": "Santa Rosa",
      "CarrierInfo": "9740;RBOC;\"AT&T California:AT&T California\"",
      "NewReassignedAreaCode": "",
      "TZCode": "4",
      "CallingWindow": "",
      "UTCOffset": "-420",
      "DoNotCallToday": "",
      "CallingTimeRestrictions": "4",
      "EBRType": "",
      "IsWirelessOrVoIP": "0",
      "LineType": "AllOther"
    }
  ]
  ```
</ResponseExample>

## Response Fields

<ResponseField name="Phone" type="string">
  The phone number that was scrubbed
</ResponseField>

<ResponseField name="ResultCode" type="string">
  The scrub result code (see [Result
  Codes](/api-reference/scrub/overview#result-codes))
</ResponseField>

<ResponseField name="Reserved" type="string">
  Reserved field (used for unique identifiers)
</ResponseField>

<ResponseField name="Reason" type="string">
  Explanation of why the number is flagged
</ResponseField>

<ResponseField name="RegionAbbrev" type="string">
  State/region abbreviation (e.g., "CA")
</ResponseField>

<ResponseField name="Country" type="string">
  Country code (e.g., "US")
</ResponseField>

<ResponseField name="Locale" type="string">
  City or locality
</ResponseField>

<ResponseField name="CarrierInfo" type="string">
  Carrier information in format: `ID;TYPE;"Name"`
</ResponseField>

<ResponseField name="TZCode" type="string">
  Timezone code
</ResponseField>

<ResponseField name="UTCOffset" type="string">
  UTC offset in minutes
</ResponseField>

<ResponseField name="IsWirelessOrVoIP" type="string">
  `1` if wireless/VoIP, `0` otherwise
</ResponseField>

<ResponseField name="LineType" type="string">
  Line type: `Wireless`, `VoIP`, or `AllOther`
</ResponseField>

## Processing Multiple Results

```javascript theme={null}
const results = await response.json();

const clean = results.filter((r) => r.ResultCode === "C");
const doNotCall = results.filter((r) => r.ResultCode === "D");
const wireless = results.filter((r) => r.IsWirelessOrVoIP === "1");

console.log(`Clean numbers: ${clean.length}`);
console.log(`Do Not Call: ${doNotCall.length}`);
console.log(`Wireless: ${wireless.length}`);
```

## Using HTTP POST for Large Batches

For more than 10 phone numbers, use HTTP POST with a JSON body:

```csharp theme={null}
using (var client = new HttpClient())
{
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

    client.DefaultRequestHeaders.Add("loginId", "YOUR_API_KEY");

    var requestBody = new
    {
        phoneList = "5039367187,7075276405,...",
        version = "5",
        output = "csv"  // Recommended for large batches
    };

    var json = System.Text.Json.JsonSerializer.Serialize(requestBody);
    var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

    var response = await client.PostAsync(
        "https://www.dncscrub.com/app/main/rpc/scrub",
        content
    );
    var responseString = await response.Content.ReadAsStringAsync();
}
```

## Best Practices

<AccordionGroup>
  <Accordion title="Batch Size">
    While the API can handle large batches, consider breaking very large lists
    into batches of 1,000-5,000 numbers for optimal performance.
  </Accordion>

  <Accordion title="Output Format">
    Use `output=csv` for large batches. CSV parsing is more efficient for
    high-volume processing.
  </Accordion>

  <Accordion title="Error Handling">
    Operations are atomic. If one phone number is invalid, the entire batch
    fails. Validate phone numbers before sending.
  </Accordion>
</AccordionGroup>
