curl --request GET \
--url https://api.optimaldial.com/api/v2/contacts/{contact_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.optimaldial.com/api/v2/contacts/{contact_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.optimaldial.com/api/v2/contacts/{contact_id}', 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://api.optimaldial.com/api/v2/contacts/{contact_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.optimaldial.com/api/v2/contacts/{contact_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.optimaldial.com/api/v2/contacts/{contact_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.optimaldial.com/api/v2/contacts/{contact_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"phone": "+15551234567",
"properties": {},
"status": "queued",
"credits_charged": 1,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"optimaldial_status": "1 - Likely Right-Party Answer",
"error_message": "<string>",
"validation_tier": "standard",
"full_name": "Alex Rivera",
"first_name": "<string>",
"last_name": "<string>",
"optimaldial_answer_intent": "Likely Answer",
"optimaldial_identity": "Very High"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Retrieve a contact
curl --request GET \
--url https://api.optimaldial.com/api/v2/contacts/{contact_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.optimaldial.com/api/v2/contacts/{contact_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.optimaldial.com/api/v2/contacts/{contact_id}', 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://api.optimaldial.com/api/v2/contacts/{contact_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.optimaldial.com/api/v2/contacts/{contact_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.optimaldial.com/api/v2/contacts/{contact_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.optimaldial.com/api/v2/contacts/{contact_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"phone": "+15551234567",
"properties": {},
"status": "queued",
"credits_charged": 1,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"optimaldial_status": "1 - Likely Right-Party Answer",
"error_message": "<string>",
"validation_tier": "standard",
"full_name": "Alex Rivera",
"first_name": "<string>",
"last_name": "<string>",
"optimaldial_answer_intent": "Likely Answer",
"optimaldial_identity": "Very High"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
OptimalDial API key, prefixed od_live_, sent as Authorization: Bearer ....
Mint keys in the in-app developer panel; they are scoped to a single organization.
Path Parameters
Response
The contact, with the tier and identity band.
The v2 view of a contact. Identical to Contact except that it echoes
the submitted name fields and reports the identity result:
| Field | v1 | v2 |
|---|---|---|
optimaldial_status | "Likely Answer" | "1 - Likely Right-Party Answer" |
optimaldial_answer_intent | — | "Likely Answer" |
optimaldial_identity | — | "Very High" |
full_name / first_name / last_name | — | As submitted, or null |
E.164-normalized phone number (US/CA only).
"+15551234567"
Arbitrary extra fields echoed back from creation.
queued → processing → one of completed, failed, or
discarded. failed means processing finished without a result
for this contact; discarded means OptimalDial dropped it before
processing. Both refund the credit, both set error_message, and
both are delivered as a contact.failed event to your webhook
endpoints and the contact's callback_url — check status on
the payload to tell them apart.
queued, processing, completed, failed, discarded x >= 0The nine-tier OptimalDial_Status value. Falls back to the Answer Intent value for contacts processed before identity.
"1 - Likely Right-Party Answer"
Why the contact is failed or discarded; null otherwise.
Validation pricing tier this contact was created with.
standard, max The full_name submitted on creation, or null.
"Alex Rivera"
The first_name submitted on creation, or null.
The last_name submitted on creation, or null.
Whether the number is likely to pick up, on its own.
"Likely Answer"
How strongly the signals indicate the number belongs to your contact. Requires a name on creation (full_name, or both first_name and last_name). Null when no contact in the processing batch supplied a name; Unknown when this contact had no name but another contact in its batch did, or when there was no signal either way. Unknown is not "safe".
Very High, High, Medium, Low, Unknown, null