Dynamic Number Allocation (DNA)
The DNA API provisions tracking numbers on demand and routes inbound calls to a
target_phone_number. Base URL: https://next.logimeter.com/v1/tns/.
Tracking numbers are looked up by number (E.164) in the URL path.
PATCH is the recommended update method (partial). DELETE ends the
tracking number immediately by setting end_stamp to now (returns 204 with no body;
no request body is accepted). List endpoints are paginated (default page size 50, max
1000 via ?page_size=). Filter by Aggregator AI state with
?ai_enabled=true or ?ai_enabled=false.
Visibility: GET /v1/tns/ and GET /v1/tns/{number}/ only return
tracking numbers where you are the rental_user on an active rental (lifespan
contains now). A 404 on detail does not mean the number is unknown to Logimeter — use
is_logimeter_tracking_number for a global existence check.
Endpoints
Tracking numbers
Utilities
Request examples
GET — list tracking numbers
curl -s "https://next.logimeter.com/v1/tns/?ai_enabled=false" -H "Authorization: Token xxxxxxx_your_token_xxxxx"
await fetch('https://next.logimeter.com/v1/tns/?ai_enabled=false', { headers: { Authorization: 'Token xxxxxxx_your_token_xxxxx' } });
requests.get('https://next.logimeter.com/v1/tns/', params={'ai_enabled': 'false'}, headers={'Authorization': 'Token xxxxxxx_your_token_xxxxx'})
GET — retrieve one tracking number
curl -s "https://next.logimeter.com/v1/tns/27879437575/" -H "Authorization: Token xxxxxxx_your_token_xxxxx"
await fetch('https://next.logimeter.com/v1/tns/27879437575/', { headers: { Authorization: 'Token xxxxxxx_your_token_xxxxx' } });
requests.get('https://next.logimeter.com/v1/tns/27879437575/', headers={'Authorization': 'Token xxxxxxx_your_token_xxxxx'})
POST — provision tracking number
curl -sX POST "https://next.logimeter.com/v1/tns/" \
-H "Authorization: Token xxxxxxx_your_token_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"target_phone_number": "27825555555",
"company": {
"name": "Trask Industries",
"reference": "fec03257-9a55-4763-884f-e56fcf05cabb"
},
"reference": "lead-ref-001",
"features": {
"lead_alert_sms": ["27823334444", "27843334444"]
}
}'
const response = await fetch('https://next.logimeter.com/v1/tns/', {
method: 'POST',
headers: { Authorization: 'Token xxxxxxx_your_token_xxxxx', 'Content-Type': 'application/json' },
body: JSON.stringify({
target_phone_number: '27825555555',
company: { name: 'Trask Industries', reference: 'fec03257-9a55-4763-884f-e56fcf05cabb' },
reference: 'lead-ref-001',
features: { lead_alert_sms: ['27823334444'] },
}),
});
const tn = await response.json();
import requests
resp = requests.post(
'https://next.logimeter.com/v1/tns/',
headers={'Authorization': 'Token xxxxxxx_your_token_xxxxx', 'Content-Type': 'application/json'},
json={
'target_phone_number': '27825555555',
'company': {'name': 'Trask Industries', 'reference': 'fec03257-9a55-4763-884f-e56fcf05cabb'},
'reference': 'lead-ref-001',
'features': {'lead_alert_sms': ['27823334444']},
},
)
resp.raise_for_status()
tn = resp.json()
PATCH — update features / routing
curl -sX PATCH "https://next.logimeter.com/v1/tns/27879437575/" \
-H "Authorization: Token xxxxxxx_your_token_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"target_phone_number": "27825555555",
"features": {
"lead_alert_sms": ["27812344444", "27841234445"]
},
"end_stamp": "2026-12-31T00:00:00+02:00"
}'
await fetch('https://next.logimeter.com/v1/tns/27879437575/', {
method: 'PATCH',
headers: { Authorization: 'Token xxxxxxx_your_token_xxxxx', 'Content-Type': 'application/json' },
body: JSON.stringify({
target_phone_number: '27825555555',
features: { lead_alert_sms: ['27812344444'] },
}),
});
requests.patch(
'https://next.logimeter.com/v1/tns/27879437575/',
headers={'Authorization': 'Token xxxxxxx_your_token_xxxxx', 'Content-Type': 'application/json'},
json={
'target_phone_number': '27825555555',
'features': {'lead_alert_sms': ['27812344444']},
},
)
PUT — full update
curl -sX PUT "https://next.logimeter.com/v1/tns/27879437575/" \
-H "Authorization: Token xxxxxxx_your_token_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"target_phone_number": "27825555555",
"features": {
"lead_alert_sms": ["27812344444", "27841234445"]
},
"end_stamp": "2026-12-31T00:00:00+02:00"
}'
await fetch('https://next.logimeter.com/v1/tns/27879437575/', {
method: 'PUT',
headers: { Authorization: 'Token xxxxxxx_your_token_xxxxx', 'Content-Type': 'application/json' },
body: JSON.stringify({
target_phone_number: '27825555555',
features: { lead_alert_sms: ['27812344444'] },
end_stamp: '2026-12-31T00:00:00+02:00',
}),
});
requests.put(
'https://next.logimeter.com/v1/tns/27879437575/',
headers={'Authorization': 'Token xxxxxxx_your_token_xxxxx', 'Content-Type': 'application/json'},
json={
'target_phone_number': '27825555555',
'features': {'lead_alert_sms': ['27812344444']},
'end_stamp': '2026-12-31T00:00:00+02:00',
},
)
DELETE — end tracking number
curl -sX DELETE "https://next.logimeter.com/v1/tns/27879437575/" -H "Authorization: Token xxxxxxx_your_token_xxxxx"
await fetch('https://next.logimeter.com/v1/tns/27879437575/', { method: 'DELETE', headers: { Authorization: 'Token xxxxxxx_your_token_xxxxx' } });
requests.delete('https://next.logimeter.com/v1/tns/27879437575/', headers={'Authorization': 'Token xxxxxxx_your_token_xxxxx'})
GET — check Logimeter TN exists (global)
curl -s -o /dev/null -w "%{http_code}" "https://next.logimeter.com/v1/tns/is_logimeter_tracking_number/27879437575/" -H "Authorization: Token xxxxxxx_your_token_xxxxx"
await fetch('https://next.logimeter.com/v1/tns/is_logimeter_tracking_number/27879437575/', { headers: { Authorization: 'Token xxxxxxx_your_token_xxxxx' } });
requests.get('https://next.logimeter.com/v1/tns/is_logimeter_tracking_number/27879437575/', headers={'Authorization': 'Token xxxxxxx_your_token_xxxxx'})
GET — ZA prefixes
curl -s "https://next.logimeter.com/v1/tn_prefixes/" -H "Authorization: Token xxxxxxx_your_token_xxxxx"
await fetch('https://next.logimeter.com/v1/tn_prefixes/', { headers: { Authorization: 'Token xxxxxxx_your_token_xxxxx' } });
requests.get('https://next.logimeter.com/v1/tn_prefixes/', headers={'Authorization': 'Token xxxxxxx_your_token_xxxxx'})
GET — global prefixes (Ireland)
curl -s "https://next.logimeter.com/v1/global_tn_prefixes/IE/" -H "Authorization: Token xxxxxxx_your_token_xxxxx"
await fetch('https://next.logimeter.com/v1/global_tn_prefixes/IE/', { headers: { Authorization: 'Token xxxxxxx_your_token_xxxxx' } });
requests.get('https://next.logimeter.com/v1/global_tn_prefixes/IE/', headers={'Authorization': 'Token xxxxxxx_your_token_xxxxx'})
Responses
GET detail, PATCH, or PUT — tracking number object.
{
"url": "https://next.logimeter.com/v1/tns/27879437575/",
"id": 42,
"number": "27879437575",
"target_phone_number": "27825555555",
"call_term_callbacks": ["https://ops.example.com/calls/"],
"mcs_call_term_callbacks": [],
"inbound": null,
"recorded": false,
"start_stamp": "2026-06-01T00:00:00+02:00",
"end_stamp": null,
"partner": {
"name": "IX Online",
"reference": "ix-partner-ref"
},
"company": {
"id": 12727,
"name": "Trask Industries (Pty) Ltd",
"reference": "fec03257-9a55-4763-884f-e56fcf05cabb",
"logimeter_reference": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
"partner_company": {
"id": 12727,
"name": "Trask Industries",
"reference": "fec03257-9a55-4763-884f-e56fcf05cabb",
"logimeter_reference": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
"features": {
"lead_alert_email": ["mike@example.com"],
"lead_alert_sms": ["278322334444"],
"missed_call_alert_email": [],
"missed_call_alert_sms": [],
"call_summary_reports_email": [],
"missed_call_response": {
"text": "Sorry we missed your call.",
"enabled": true
},
"meeting_tracker_enabled": false
},
"reference": "lead-ref-001",
"stock_item": null,
"call2lead": {
"call2lead_enabled": false,
"call2lead_ivr_in_office": null,
"call2lead_ivr_out_of_office": null,
"call2lead_out_of_office_number": ""
},
"enabled_product": "Lead Tracker",
"dna_rental": true,
"suspended": null,
"suspension_comments": "",
"ai_enabled": false,
"brands": null
}
GET list — paginated.
{
"count": 1,
"next": null,
"previous": null,
"results": [{
"url": "https://next.logimeter.com/v1/tns/27879437575/",
"id": 42,
"number": "27879437575",
"target_phone_number": "27825555555",
"call_term_callbacks": ["https://ops.example.com/calls/"],
"mcs_call_term_callbacks": [],
"inbound": null,
"recorded": false,
"start_stamp": "2026-06-01T00:00:00+02:00",
"end_stamp": null,
"partner": {
"name": "IX Online",
"reference": "ix-partner-ref"
},
"company": {
"id": 12727,
"name": "Trask Industries (Pty) Ltd",
"reference": "fec03257-9a55-4763-884f-e56fcf05cabb",
"logimeter_reference": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
"partner_company": {
"id": 12727,
"name": "Trask Industries",
"reference": "fec03257-9a55-4763-884f-e56fcf05cabb",
"logimeter_reference": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
"features": {
"lead_alert_email": ["mike@example.com"],
"lead_alert_sms": ["278322334444"],
"missed_call_alert_email": [],
"missed_call_alert_sms": [],
"call_summary_reports_email": [],
"missed_call_response": {
"text": "Sorry we missed your call.",
"enabled": true
},
"meeting_tracker_enabled": false
},
"reference": "lead-ref-001",
"stock_item": null,
"call2lead": {
"call2lead_enabled": false,
"call2lead_ivr_in_office": null,
"call2lead_ivr_out_of_office": null,
"call2lead_out_of_office_number": ""
},
"enabled_product": "Lead Tracker",
"dna_rental": true,
"suspended": null,
"suspension_comments": "",
"ai_enabled": false,
"brands": null
}
]
}
POST — newly provisioned tracking number (same shape as GET detail; number is assigned by Logimeter).
{
"url": "https://next.logimeter.com/v1/tns/27879437575/",
"id": 42,
"number": "27879437575",
"target_phone_number": "27825555555",
"call_term_callbacks": ["https://ops.example.com/calls/"],
"mcs_call_term_callbacks": [],
"inbound": null,
"recorded": false,
"start_stamp": "2026-06-01T00:00:00+02:00",
"end_stamp": null,
"partner": {
"name": "IX Online",
"reference": "ix-partner-ref"
},
"company": {
"id": 12727,
"name": "Trask Industries (Pty) Ltd",
"reference": "fec03257-9a55-4763-884f-e56fcf05cabb",
"logimeter_reference": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
"partner_company": {
"id": 12727,
"name": "Trask Industries",
"reference": "fec03257-9a55-4763-884f-e56fcf05cabb",
"logimeter_reference": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
"features": {
"lead_alert_email": ["mike@example.com"],
"lead_alert_sms": ["278322334444"],
"missed_call_alert_email": [],
"missed_call_alert_sms": [],
"call_summary_reports_email": [],
"missed_call_response": {
"text": "Sorry we missed your call.",
"enabled": true
},
"meeting_tracker_enabled": false
},
"reference": "lead-ref-001",
"stock_item": null,
"call2lead": {
"call2lead_enabled": false,
"call2lead_ivr_in_office": null,
"call2lead_ivr_out_of_office": null,
"call2lead_out_of_office_number": ""
},
"enabled_product": "Lead Tracker",
"dna_rental": true,
"suspended": null,
"suspension_comments": "",
"ai_enabled": false,
"brands": null
}
DELETE — tracking number ended. No response body.
is_logimeter_tracking_number — empty body when the number exists in Logimeter (any partner).
GET /v1/tns/{number}/ — tracking number not in your active assigned list (may still exist in Logimeter).
is_logimeter_tracking_number — number is not a Logimeter tracking number (empty body).
POST — no tracking number available for the requested prefix pool:
["No available Tracking Number found. Unable to assign Tracking Number."]
GET /v1/tn_prefixes/ — flat array of available ZA prefix strings.
["087", "2781", "2782"]
GET /v1/global_tn_prefixes/IE/ — nested array (one prefix per inner array).
[["3531"], ["3532"], ["5678"]]
GET /v1/global_tn_prefixes/ without country code:
{
"detail": [
"Need to pass any of the country codes in the URL mentioned here to proceed.",
"URL: https://next.logimeter.com/v1/global_tn_prefixes/ZA",
"Country codes: ZA, GB, IE"
]
}
Validation errors
| Scenario | Response |
|---|---|
| Missing company | No company information sent. |
| Partner equals company | Tracking Number Company cannot be the same as the Partner… |
| Invalid target number | Target telephone number … is not valid for any supported country. |
| TN as target | Target telephone number … is a Tracking Number and may not be used as a target telephone number. |
| No TN in prefix pool | 400 — ["No available Tracking Number found. Unable to assign Tracking Number."] |
| Provisioning conflict (retry) | 400 — A Tracking Number could not be assigned for the given target phone number. This is a temporary error and the request may be repeated. |
| Missing sales_executive | 400 when lead_vehicle sent without sales_executive |
| Call2Lead enabled, no IVR | {"Error": "Cannot enable Call2Lead without setting an in-hours IVR."} |
| Call2Lead, no out-of-hours | {"Error": "Cannot enable Call2Lead without setting an out-of-hours IVR or number."} |
| Call2Lead IVR partner mismatch | {"Error": "In Hours IVR Menu Partner: … does not match Rental Partner: …"} (similar for out-of-hours) |
| Call2Lead IVR company mismatch | {"Error": "In Hours IVR Menu Partner: … and Company: … do not match Rental Partner: … and Company: …"} |
| end_stamp too soon | {"end_stamp": "End stamp must be at least 1 day(s) after start date."} |
| Cannot create company | 403 Forbidden when partner lacks can_create_companies |
| User not linked to partner | 403 Forbidden on POST when authenticated user has no partner |
| end_stamp permission denied | 403 Forbidden on PATCH/PUT when partner cannot modify end_stamp for this TN |
| Country code mismatch | Target number needs to have the same country code as the country_code provided. |
| Unsupported country code | The country code … is not supported |
| Global TN not permitted | The following company, …. cannot provision global tracking numbers |
| Global TN country not permitted | … cannot provision global tracking numbers for … |
end_stamp values are rounded up to the start of the next day in SAST (Africa/Johannesburg).
Writable fields (POST / PATCH / PUT)
| Field | Type | Required | Description |
|---|---|---|---|
| company | object | yes (POST) | {name, reference} — company that owns this TN. Created if permitted and reference is new. partner_company is an accepted alias with the same shape. |
| partner_company | object | alias | Write alias for company — same {name, reference} object. |
| target_phone_number | string | yes (POST)* | Routing destination (E.164 or local format; 9–15 digits after normalisation). Must not be a tracking number. *Must be blank ("") when features.meeting_tracker_enabled is true. |
| prefix | string | optional | 3–4 digit prefix (POST only). Falls back to target prefix, then 087. Unavailable pool → 400. Not returned in responses. |
| reference | string | optional | Your lead/session reference for call matching across DNA requests. Returned on GET from the active rental. |
| features | object | optional | Alert emails/SMS, missed-call response, meeting tracker — see appendix. |
| call_term_callbacks | array | optional | URLs for call metadata webhooks. Writable on POST/PATCH/PUT; returned on GET. |
| mcs_call_term_callbacks | array | optional | URLs for Missed Call Saver webhooks. Writable on POST/PATCH/PUT; returned on GET. |
| contact | object | optional | {name, reference} — sales contact for this TN (write only; not returned on GET). |
| lead_vehicle | object | optional | Lead context (POST only; not returned on GET). Requires sales_executive when provided — see appendix. |
| stock_item | object | optional | {reference, details} — stock item metadata. |
| call2lead | object | optional | call2lead_enabled, IVR menu IDs, out-of-office number. |
| end_stamp | datetime | optional | Suspension date (ISO 8601). null = active indefinitely. Writable on PATCH/PUT only (DELETE sets to now automatically). |
| suspended | boolean | optional | Rental suspension flag (nullable). PATCH/PUT only. |
| suspension_comments | string | optional | Comments for suspension. PATCH/PUT only. |
| inbound | boolean | optional | Whether TN is for inbound calls (default null). POST only. |
| country_code | string | optional | ISO country for global TN provisioning (e.g. GB, IE). POST only; not returned on GET. Requires company global-TN permission. |
| ai_enabled | boolean | optional | Partner external DNA only. Sets aggregator AI on rental. Omit to leave unchanged. Returned on GET. |
Read-only fields (responses)
| Field | Type | Description |
|---|---|---|
| id | integer | Internal tracking number ID. |
| number | string | Provisioned tracking number (E.164). |
| url | string | API URL for this resource. |
| start_stamp | datetime | When the TN was first activated. |
| end_stamp | datetime | Suspension date; null if active indefinitely. |
| recorded | boolean | Whether calls are recorded. |
| partner | object | Authenticated partner reference ({name, reference}). |
| company | object | Company on the rental — name is the company legal name; includes id, reference, logimeter_reference. |
| partner_company | object | Partner company reference — name is the PCR display name (may differ from company.name); includes id, reference, logimeter_reference. |
| reference | string | Lead/session reference from the active rental. |
| call_term_callbacks | array | Call metadata webhook URLs on the active rental. |
| mcs_call_term_callbacks | array | Missed Call Saver webhook URLs on the active rental. |
| features | object | Rental feature flags and alert destinations — see appendix. |
| call2lead | object | Call2Lead configuration on the rental. |
| stock_item | object | Linked stock item, if any. |
| enabled_product | string | Product name, e.g. Lead Tracker or Call2Lead type. |
| dna_rental | boolean | true for Lead Tracker rentals. |
| suspended | boolean | Rental suspension state (nullable). |
| suspension_comments | string | Suspension comments on the rental. |
| inbound | boolean | Whether TN is for inbound calls (null if unknown). |
| ai_enabled | boolean | Current aggregator AI setting. |
| brands | array | Brand attribution on the rental, if configured. |
Appendix: features object
| Field | Type | Description |
|---|---|---|
| lead_alert_email | string[] | Email addresses for lead alerts. |
| lead_alert_sms | string[] | SMS numbers for lead alerts. |
| missed_call_alert_email | string[] | Email addresses for missed-call alerts. |
| missed_call_alert_sms | string[] | SMS numbers for missed-call alerts. |
| call_summary_reports_email | string[] | Read-only in responses — not writable via API. |
| missed_call_response | object | {text, enabled} — auto-SMS to missed callers. |
| meeting_tracker_enabled | boolean | When true, target_phone_number must be blank. |
Appendix: lead_vehicle object
| Field | Type | Description |
|---|---|---|
| sales_executive | object | Required when lead_vehicle is sent — {id, name, surname}. |
| enquiry | string | buy_vehicle (default), service, form, or insurance. |
| id | string | Your unique lead ID. |
| received_time | datetime | When the lead was created (UTC). |
| source, prospect, vehicle, trade_in | object | Free-form key/value objects. |
Appendix: call2lead object
| Field | Type | Description |
|---|---|---|
| call2lead_enabled | boolean | Enable Call2Lead on this rental. |
| call2lead_ivr_in_office | integer | IVR menu ID for in-hours (required when enabled; must match rental partner/company). |
| call2lead_ivr_out_of_office | integer | IVR menu ID for out-of-hours (must match rental partner/company). |
| call2lead_out_of_office_number | string | Fallback number when out-of-hours and no IVR. |