EBR and Consent Master
curl --request POST \
--url https://www.dncscrub.com/app/main/rpc/ebr \
--header 'Content-Type: <content-type>' \
--header 'loginId: <loginid>' \
--data '
{
"keepBetterEBR": 123,
"ebrList": [
{
"phoneNumber": "<string>",
"type": "<string>",
"dateOfLastContact": "<string>",
"dateObligationEnds": "<string>",
"referenceNum": "<string>",
"brand": "<string>",
"email": "<string>"
}
]
}
'import requests
url = "https://www.dncscrub.com/app/main/rpc/ebr"
payload = {
"keepBetterEBR": 123,
"ebrList": [
{
"phoneNumber": "<string>",
"type": "<string>",
"dateOfLastContact": "<string>",
"dateObligationEnds": "<string>",
"referenceNum": "<string>",
"brand": "<string>",
"email": "<string>"
}
]
}
headers = {
"loginId": "<loginid>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {loginId: '<loginid>', 'Content-Type': '<content-type>'},
body: JSON.stringify({
keepBetterEBR: 123,
ebrList: [
{
phoneNumber: '<string>',
type: '<string>',
dateOfLastContact: '<string>',
dateObligationEnds: '<string>',
referenceNum: '<string>',
brand: '<string>',
email: '<string>'
}
]
})
};
fetch('https://www.dncscrub.com/app/main/rpc/ebr', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.dncscrub.com/app/main/rpc/ebr",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'keepBetterEBR' => 123,
'ebrList' => [
[
'phoneNumber' => '<string>',
'type' => '<string>',
'dateOfLastContact' => '<string>',
'dateObligationEnds' => '<string>',
'referenceNum' => '<string>',
'brand' => '<string>',
'email' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"loginId: <loginid>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.dncscrub.com/app/main/rpc/ebr"
payload := strings.NewReader("{\n \"keepBetterEBR\": 123,\n \"ebrList\": [\n {\n \"phoneNumber\": \"<string>\",\n \"type\": \"<string>\",\n \"dateOfLastContact\": \"<string>\",\n \"dateObligationEnds\": \"<string>\",\n \"referenceNum\": \"<string>\",\n \"brand\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("loginId", "<loginid>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.dncscrub.com/app/main/rpc/ebr")
.header("loginId", "<loginid>")
.header("Content-Type", "<content-type>")
.body("{\n \"keepBetterEBR\": 123,\n \"ebrList\": [\n {\n \"phoneNumber\": \"<string>\",\n \"type\": \"<string>\",\n \"dateOfLastContact\": \"<string>\",\n \"dateObligationEnds\": \"<string>\",\n \"referenceNum\": \"<string>\",\n \"brand\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.dncscrub.com/app/main/rpc/ebr")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["loginId"] = '<loginid>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"keepBetterEBR\": 123,\n \"ebrList\": [\n {\n \"phoneNumber\": \"<string>\",\n \"type\": \"<string>\",\n \"dateOfLastContact\": \"<string>\",\n \"dateObligationEnds\": \"<string>\",\n \"referenceNum\": \"<string>\",\n \"brand\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true
}
Full Scrub
EBR and Consent Master
Manage Existing Business Relationship records
POST
/
app
/
main
/
rpc
/
ebr
EBR and Consent Master
curl --request POST \
--url https://www.dncscrub.com/app/main/rpc/ebr \
--header 'Content-Type: <content-type>' \
--header 'loginId: <loginid>' \
--data '
{
"keepBetterEBR": 123,
"ebrList": [
{
"phoneNumber": "<string>",
"type": "<string>",
"dateOfLastContact": "<string>",
"dateObligationEnds": "<string>",
"referenceNum": "<string>",
"brand": "<string>",
"email": "<string>"
}
]
}
'import requests
url = "https://www.dncscrub.com/app/main/rpc/ebr"
payload = {
"keepBetterEBR": 123,
"ebrList": [
{
"phoneNumber": "<string>",
"type": "<string>",
"dateOfLastContact": "<string>",
"dateObligationEnds": "<string>",
"referenceNum": "<string>",
"brand": "<string>",
"email": "<string>"
}
]
}
headers = {
"loginId": "<loginid>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {loginId: '<loginid>', 'Content-Type': '<content-type>'},
body: JSON.stringify({
keepBetterEBR: 123,
ebrList: [
{
phoneNumber: '<string>',
type: '<string>',
dateOfLastContact: '<string>',
dateObligationEnds: '<string>',
referenceNum: '<string>',
brand: '<string>',
email: '<string>'
}
]
})
};
fetch('https://www.dncscrub.com/app/main/rpc/ebr', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.dncscrub.com/app/main/rpc/ebr",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'keepBetterEBR' => 123,
'ebrList' => [
[
'phoneNumber' => '<string>',
'type' => '<string>',
'dateOfLastContact' => '<string>',
'dateObligationEnds' => '<string>',
'referenceNum' => '<string>',
'brand' => '<string>',
'email' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"loginId: <loginid>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.dncscrub.com/app/main/rpc/ebr"
payload := strings.NewReader("{\n \"keepBetterEBR\": 123,\n \"ebrList\": [\n {\n \"phoneNumber\": \"<string>\",\n \"type\": \"<string>\",\n \"dateOfLastContact\": \"<string>\",\n \"dateObligationEnds\": \"<string>\",\n \"referenceNum\": \"<string>\",\n \"brand\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("loginId", "<loginid>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.dncscrub.com/app/main/rpc/ebr")
.header("loginId", "<loginid>")
.header("Content-Type", "<content-type>")
.body("{\n \"keepBetterEBR\": 123,\n \"ebrList\": [\n {\n \"phoneNumber\": \"<string>\",\n \"type\": \"<string>\",\n \"dateOfLastContact\": \"<string>\",\n \"dateObligationEnds\": \"<string>\",\n \"referenceNum\": \"<string>\",\n \"brand\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.dncscrub.com/app/main/rpc/ebr")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["loginId"] = '<loginid>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"keepBetterEBR\": 123,\n \"ebrList\": [\n {\n \"phoneNumber\": \"<string>\",\n \"type\": \"<string>\",\n \"dateOfLastContact\": \"<string>\",\n \"dateObligationEnds\": \"<string>\",\n \"referenceNum\": \"<string>\",\n \"brand\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true
}
An Existing Business Relationship (EBR) provides an exemption to DNC rules under certain conditions. The EBR API allows you to add and manage EBR records for phone numbers. In addition the EBR API can be used to store Consent. A consent record is a Permission “P” EBR record — use this type whenever a consumer opts in with express written consent (for example, a signed web consent form or a consent checkbox with the required disclosures). You should ensure you have the proper consent from the customer for the customer’s jurisdiction before sending this. This will allow you to contact the customer for the purposes of marketing and sales until you remove the Permission EBR or Add to Internal DNC.
This adds:
Handling a consumer who opted out and later opts back in? See
Handling Opt-Outs and Opt-Ins
for how Permission EBRs and the Internal DNC list interact.
To add or refresh EBR records and scrub numbers in a single request, use
Scrub + Add EBR instead of calling this
endpoint separately.
Request
Headers
string
required
Your API Key
string
required
Must be
application/jsonRequest Body
integer
When set to
1, if an EBR record already exists for the phone number being
added and the existing EBR is “better” than the one being added, the existing
EBR will not be overwritten. Federal EBR expiration dates are used to
determine which EBR is better (longer remaining validity = better).array
required
Array of EBR records to add.
Show EBR Record Object
Show EBR Record Object
string
required
10-digit phone number(s). For multiple numbers, comma-separate them (e.g.,
"5039367187,7075276405").string
required
EBR type:
S- Sale/PurchaseI- InquiryP- PermissionT- Trial (currently only for Newspaper Trials in North Dakota)
string
required
Date of last contact in
MM/DD/YYYY format (e.g., "11/11/2020").string
Date when written obligation ends (New Jersey only).
string
Your internal tracking string.
string
Company/product/brand name used to establish the EBR.
string
Email address (100 characters max).
Example Request
curl --location 'https://www.dncscrub.com/app/main/rpc/ebr' \
--header 'loginId: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"ebrList": [
{
"phoneNumber": "5039367187",
"type": "I",
"dateOfLastContact": "11/11/2020"
}
]
}'
const response = await fetch("https://www.dncscrub.com/app/main/rpc/ebr", {
method: "POST",
headers: {
loginId: "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
ebrList: [
{
phoneNumber: "5039367187",
type: "I",
dateOfLastContact: "11/11/2020",
},
],
}),
});
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("loginId", "YOUR_API_KEY");
var ebrData = new
{
ebrList = new[]
{
new
{
phoneNumber = "5039367187",
type = "I",
dateOfLastContact = "11/11/2020"
}
}
};
var content = new StringContent(
JsonSerializer.Serialize(ebrData),
Encoding.UTF8,
"application/json"
);
var response = await client.PostAsync(
"https://www.dncscrub.com/app/main/rpc/ebr",
content
);
}
{
"success": true
}
Add Multiple EBRs
Add multiple EBR records in a single request:curl --location 'https://www.dncscrub.com/app/main/rpc/ebr' \
--header 'loginId: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"ebrList": [
{
"phoneNumber": "5039367187",
"type": "S",
"dateOfLastContact": "06/14/2023"
},
{
"phoneNumber": "7072842774",
"type": "I",
"dateOfLastContact": "07/02/2023"
}
]
}'
- Phone
5039367187with a Sale EBR dated 06/14/2023 - Phone
7072842774with an Inquiry EBR dated 07/02/2023
Multiple Phone Numbers Per Record
You can also add the same EBR to multiple phone numbers in one record:{
"ebrList": [
{
"phoneNumber": "5039367187,7075276405",
"type": "I",
"dateOfLastContact": "11/11/2020"
}
]
}
Preserve Better EBR Records
UsekeepBetterEBR to prevent overwriting existing EBR records that have longer remaining validity:
{
"keepBetterEBR": 1,
"ebrList": [
{
"phoneNumber": "5039367187",
"type": "I",
"dateOfLastContact": "11/11/2024"
}
]
}
When
keepBetterEBR is set to 1, the system compares federal and state EBR
expiration dates. If the existing EBR expires later than the new one would,
the existing record is preserved. This is useful when importing EBR data to
avoid accidentally downgrading your compliance coverage.Response
| Status Code | Meaning |
|---|---|
200 | Success |
4xx | Error - response body contains the reason |
EBR Types
| Type | Description |
|---|---|
S | Sale/Purchase — consumer bought or transacted with you |
I | Inquiry — consumer asked about your products or services |
P | Permission — consumer gave express written consent to be contacted (opt-in). Only this type can override an Internal DNC entry |
T | Trial (currently only for Newspaper Trials in North Dakota) |
EBR Expiration
EBR exemptions expire based on federal rules:| EBR Type | Expiration Period |
|---|---|
Sale/Purchase (S) | 18 months from date of last transaction |
Inquiry (I) | 3 months from date of inquiry |
State rules may vary. Some states have shorter exemption periods or additional
requirements.
Best Practices
Track Reference Numbers
Track Reference Numbers
Use the
referenceNum parameter to store your internal tracking ID for
audit purposes.Use Accurate Dates
Use Accurate Dates
The
dateOfLastContact should be the actual date of the business
relationship event, not the current date.Choose Correct Type
Choose Correct Type
Select the appropriate EBR type - using the wrong type could result in
compliance issues. In particular, opt-ins backed by express written
consent must be sent as Permission (
P) — a Sale or Inquiry EBR will not
override an Internal DNC entry.Use keepBetterEBR When Importing
Use keepBetterEBR When Importing
When bulk importing EBR records, use
keepBetterEBR: 1 to preserve existing
records with longer validity periods and avoid accidentally reducing your
compliance coverage.