curl --request GET \
--url https://{host}/api/v1/contacts/lookup \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/api/v1/contacts/lookup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{host}/api/v1/contacts/lookup"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"contact": {
"attributes": {},
"call_count": 123,
"created_at": "2023-11-07T05:31:56Z",
"dnc": true,
"e164": "<string>",
"external_ref": "<string>",
"first_seen": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"last_seen": "2023-11-07T05:31:56Z",
"name": "<string>",
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"last_call": {
"billsec": 123,
"call_uuid": "<string>",
"direction": "<string>",
"started_at": "2023-11-07T05:31:56Z"
},
"open_tickets": [
{
"id": "<string>",
"priority": "<string>",
"ref": 123,
"status": "<string>",
"subject": "<string>"
}
],
"recent_conversations": [
{
"call_uuid": "<string>",
"id": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"summary": "<string>"
}
]
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}Who is this number
For a screen-pop: the contact behind a number in any form it is typed (national or international), with its open tickets, the last five conversation summaries and the last call. 404 when nobody has the number. Requires contacts:read.
curl --request GET \
--url https://{host}/api/v1/contacts/lookup \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/api/v1/contacts/lookup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{host}/api/v1/contacts/lookup"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"contact": {
"attributes": {},
"call_count": 123,
"created_at": "2023-11-07T05:31:56Z",
"dnc": true,
"e164": "<string>",
"external_ref": "<string>",
"first_seen": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"last_seen": "2023-11-07T05:31:56Z",
"name": "<string>",
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"last_call": {
"billsec": 123,
"call_uuid": "<string>",
"direction": "<string>",
"started_at": "2023-11-07T05:31:56Z"
},
"open_tickets": [
{
"id": "<string>",
"priority": "<string>",
"ref": 123,
"status": "<string>",
"subject": "<string>"
}
],
"recent_conversations": [
{
"call_uuid": "<string>",
"id": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"summary": "<string>"
}
]
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}Authorizations
Every request sends Authorization: Bearer <token>. The token is either a panel session (a JWT from /auth/login, 12 hours) or an API key ft_<id>_<secret>. An API key is accepted only from an address on its IP allowlist (403 ip_not_allowed otherwise; 403 ip_allowlist_required for an old key that has none), is limited to its rate per minute (429 rate_limited with Retry-After; X-RateLimit-Limit/Remaining/Reset on every response), and at most 60 call placements a minute.
Query Parameters
Narrow to one organisation. Outside your scope returns 403.