Languages: every operation supports cURL, Node.js (TypeScript), Python, Go, Ruby, and PHP. The first 15 operations on this page show all six languages; the remaining 99 show cURL and TypeScript — the two most-used.
Numbers API
Numbers endpoints exposed by the Devotel CPaaS API Base path:/api/v1/numbers
Endpoint count: 114
Worked sequences
The endpoint list below documents each operation with its parameters, but the two flows that integrate against this surface — renting a number and porting one in — span several calls, and their response bodies are what you branch on. These two sequences show every call in order with the body each one returns.Sequence 1 — rent a number
Go from inventory search to an active, capability-checked number in three calls. Step 1 — search inventory. Filter by country, line type, capability, and area code. Each result carries the per-number capability list and monthly price, so you can filter before you buy.200
For a regulated country (most of the EU/EEA, GB, and several others), run
GET /api/v1/numbers/regulatory-preview?country… before this step — it
returns the documents and data fields the carrier requires, and whether a
compliance profile you already hold satisfies them.201 body
returns the owned-number record — save the id, because every follow-up
operation (configure, suspend, release) addresses the number by it. Billing
starts immediately.
201
id
to confirm it is active and that the capabilities you ordered are the ones
the carrier actually provisioned — a regulated country can hold the number at
pending_compliance until the required documents clear.
200
Sequence 2 — port a number in
Move an existing number from a losing carrier onto the platform. A full port runseligibility check → LOA upload → submit → poll status; the check step
is optional but cheap, and it turns a multi-day carrier rejection into an
instant answer.
Step 1 — check eligibility (recommended). Run a live pre-flight against
the losing carrier’s database. The response tells you in seconds whether the
number can port; US and Canadian numbers are checked live, other countries
return check-not-supported and proceed straight to submission.
200
201 body
returns the request id and the starting status — porting requests move
submitted → reviewing → approved → completed, with rejected as the
carrier-declined terminal state. Branch on these values; there is no
pending state.
201
recommendedAction when the port is waiting on you (for example, a
supplement on a rejection). Porting typically takes 7–14 business days
depending on the country and carrier — subscribe to the number.ported
webhook instead of polling once you are past submission.
200
completed, the numbers appear in your
GET /api/v1/numbers/ inventory as active.
Error samples
Two purchase-time rejections account for most failed buys; both return the standard error envelope with a stablecode you can branch on.
Regulated country without a compliance profile — buying a number in a
country that requires verified end-user documents before the carrier will
activate it:
422
compliance_profile_id on the retry. No billing happens on this rejection —
your balance is untouched.
Number already owned — the number sold between your search and your
purchase, or is already on an account:
409
List phone numbers
GET /api/v1/numbers/status, a free-text search over the E.164 number and label, or one or more tags; each row is enriched with a passively-derived liveness state so the inventory table can flag numbers that have stopped receiving inbound traffic. Pass ?fields=id,phone_number,status for a slim projection suited to lightweight sender-id pickers. Org-scoped and read-only.
string
Filter by lifecycle status (e.g.
active, pending_compliance, released, suspended).string
Free-text match against the E.164 number and label.
string
Comma-separated tag slugs; a row matching any supplied tag is returned.
integer
Page size, most-recent first. Clamped server-side to the max page size.
string
Opaque keyset cursor from the previous page’s
meta.pagination.cursor.string
Optional comma-separated slim projection (e.g.
id,phone_number,status).Get a phone number
GET /api/v1/numbers/{id}string
required
The phone number record id.
Get per-DID branded-calling (Rich Call Data) answer-rate uplift
GET /api/v1/numbers/{id}/branded-calling-analyticswindow against the immediately-preceding equal-length baseline window, and surfaces the org’s branded-calling registration status alongside, so a customer who registered a brand profile can see the contact-center answer-rate lift branded calling produces (Twilio / First-Orion parity). Pure read on call_logs plus the org’s branded-calling setting — no carrier round-trip. Org-ownership gated: a sibling subaccount sharing the tenant schema gets 404 on another subaccount’s DID id (enumeration-safe). Answer rates are 0..1 fractions and are null when no outbound calls were placed in the cohort; uplift values are null when a comparable baseline rate is undefined (no misleading 0% lift).
string
required
—
string (enum: 24h|7d|30d|90d)
Comparison window length. The baseline is the equal-length window immediately preceding it, so the effective scan is 2× the token span. Defaults to 30d.
Get a number’s 10DLC campaign assignment
GET /api/v1/numbers/{id}/campaign-assignmentnull when the number is not assigned. Org-ownership is enforced; read-only companion to the PUT/DELETE campaign-assignment writes.
string
required
The phone number record id.
Get a number’s CNAM registration
GET /api/v1/numbers/{id}/cnamnull when none is set. Org-ownership is enforced; read-only. To register or change a name use the PUT verb on this path.
string
required
The phone number record id.
List regulatory documents for a number
GET /api/v1/numbers/{id}/documentsstring
required
—
Get the emergency (E911) address for a number
GET /api/v1/numbers/{id}/emergency-addressstring
required
—
Get the deliverability health score for a number
GET /api/v1/numbers/{id}/healthstring
required
—
Get the deliverability health trend and forecast for a number
GET /api/v1/numbers/{id}/health/trendscore: null, tier: "unknown" and are excluded from the trend fit. Distinct from /api/v1/numbers//health, which serves the daily point-in-time snapshot.
string
required
—
string (enum: 30d|60d|90d)
Lookback window
string (enum: day|week)
Period granularity of the score series
integer
Forecast horizon in days
Get port-out PIN protection status for a number
GET /api/v1/numbers/{id}/port-out-protectionstring
required
—
Get a Mexican number’s active telecom regulator
GET /api/v1/numbers/{id}/regulatorIFT (the default until a number is migrated) or CRT once an operator confirms the transition is live for their inventory; non-MX numbers return null. Org-ownership is enforced per call so a sibling sub-org sharing the tenant schema cannot read another sub-org’s regulator state. Read-only; scoped on numbers:read.
string
required
—
Get the carrier spam-label reputation for a number
GET /api/v1/numbers/{id}/reputationmonitored: false / status: "unknown" until at least one provider observation has been recorded for the number. Distinct from /api/v1/numbers//health, which scores internal deliverability rather than the carrier-displayed label.
string
required
—
Get the scheduled release for a number
GET /api/v1/numbers/{id}/scheduled-releaserelease_on parity). Returns scheduled_release: null when no release is scheduled. Org-ownership is enforced per call so a sibling sub-org sharing the tenant schema cannot read another sub-org’s schedule. Read-only; scoped on numbers:read.
string
required
—
Get SMS spam-complaint feedback loop for a number
GET /api/v1/numbers/{id}/sms-complaintsstring
required
—
Get the predictive spam-likelihood score for a number
GET /api/v1/numbers/{id}/spam-likelihoodspam_likelihood_score: null with label unknown rather than a noisy small-sample number. Read-only over locally-stored rows.
string
required
—
string (enum: 7d|14d|30d)
Lookback window folded into the score
integer
Forecast horizon forwarded to the health-trend input
Get a toll-free number’s verification (TFV) status
GET /api/v1/numbers/{id}/tfvnumbers:read.
string
required
—
Get per-number call and message usage
GET /api/v1/numbers/{id}/usage-analyticsnumbers:read.
string
required
—
string (enum: 24h|7d|30d|90d)
Rollup window length. Defaults to 30d.
Get the 10DLC warming-tier state for a number
GET /api/v1/numbers/{id}/warmingnumbers:read.
string
required
—
Get the number-warming progression forecast
GET /api/v1/numbers/{id}/warming/progressionnumbers:read.
string
required
—
List number applications
GET /api/v1/numbers/applicationsFetch one number application
GET /api/v1/numbers/applications/{id}string
required
Number-application id.
Get a bulk reservation’s status and items
GET /api/v1/numbers/bulk-reserve/{id}expires_at, and the per-item picks. Poll this while deciding whether to finalize or cancel; the row is inline-expired (status expired) once its hold window passes. Org-scoped — a reservation belonging to a sibling subaccount or an unknown id returns 404. Read-only; requires the numbers:read scope.
string
required
Reservation id returned by
POST /numbers/bulk-reserve.Fleet rollup across the SIM estate
GET /api/v1/numbers/connectivity/fleetsfleetId, with SIMs that carry none collapsed under ungrouped).
List eSIM / IoT connectivity data-plans
GET /api/v1/numbers/connectivity/plansvoice:false/sms:false; outbound MT voice/SMS exit only via the Devotel softswitch, never a cellular bearer.
string
Optional ISO 3166-1 alpha-2 coverage filter (case-insensitive).
string (enum: esim|iot-sim)
Optional SIM form-factor filter.
Fetch one connectivity plan
GET /api/v1/numbers/connectivity/plans/{id}string
required
—
Estimate connectivity plan usage cost
GET /api/v1/numbers/connectivity/plans/{id}/cost-estimatestring
required
—
number
Data volume in megabytes; non-positive / non-finite clamps to fee-only.
string
Optional coverage check — does the plan cover this country?
List provisioned SIMs
GET /api/v1/numbers/connectivity/simsstring (enum: ordered|active|suspended|terminated)
—
string
—
string
—
string (enum: esim|iot-sim)
—
Fetch one provisioned SIM
GET /api/v1/numbers/connectivity/sims/{iccid}string
required
—
Get SIM usage and recent sessions
GET /api/v1/numbers/connectivity/sims/{iccid}/usagestring
required
—
Get available-number capabilities for a country
GET /api/v1/numbers/country-capabilitiestwo_way_sms (send-and-receive only), a separate send-only toll_free_sms count, and a US-only local_sms_via_10dlc count so shoppers are not steered to a dead end (e.g. UK locals carry voice but not SMS). Counts are clamped at 100 (rendered “100+”) and cached for about five minutes. Read-only; requires the numbers:read scope.
string
required
ISO 3166-1 alpha-2 country code (e.g.
GB, US).List dormant DID release candidates
GET /api/v1/numbers/dormancy-alerts?days=). Each row carries the reclaimable monthly spend and a suggested_release flag so the dashboard can drive silent-number cost trimming. Companion read surface to the number.dormant webhook. Read-only; scoped on numbers:read.
string
Optional dormancy window override (integer 1–365). When omitted, the per-tenant org setting (or the platform default of 30) is used.
Export the number inventory as CSV or JSON
GET /api/v1/numbers/exportstatus, country_code, and search; CSV timestamps localise to the tz/locale you pass. Capped at 50,000 rows, with the X-Truncated header set when a larger inventory is truncated. Read-only; requires the numbers:read scope. Inbound DID provisioning only (invariant #45 untouched).
string (enum: csv|json)
Output format — a CSV attachment (default) or a JSON array.
string
Status filter (e.g.
active); defaults to all so released/parked-but-still-billable rows are included.string
ISO 3166-1 alpha-2 country filter.
string
Free-text match on the phone number or label.
string
IANA timezone for CSV timestamp columns (e.g.
Europe/Istanbul); JSON stays canonical UTC.string
BCP-47 locale for CSV date formatting (defaults to
en-US).List hosted-messaging orders
GET /api/v1/numbers/hosted-messagingnumbers:read scope.
Get a hosted-messaging order
GET /api/v1/numbers/hosted-messaging/{id}numbers:read scope.
string
required
Hosted-messaging order id.
List low-stock DID inventory alerts
GET /api/v1/numbers/inventory-alerts(country_code, area_code_prefix). One alert row is emitted per bucket whose available count is below the tenant’s configured threshold (default 3; override on the org settings), so the dashboard can warn before a pool runs dry. Rows are sorted worst-first and capped by limit. Read-only; requires the numbers:read scope.
integer
Maximum number of worst-first alert buckets to return (top-N readout for the banner). Defaults to the platform default when omitted or invalid.
Number-Intelligence lookup history & spend analytics
GET /api/v1/numbers/lookup-historypublic.credit_transactions) of every billed number lookup (single, by-number, trust-package, and bulk all debit the wallet via the number_lookup channel). Returns, scoped to the caller’s org: a daily lookup-count + spend series over the requested window, the configured per-tenant daily cost cap with today’s spend against it, and a recent-activity feed. No carrier call and no mutation. Read-only; scoped on numbers:read.
integer
Window length in days for the daily series (1–90, default 30).
integer
Number of entries in the recent-activity feed (1–100, default 25).
Full phone number intelligence lookup
GET /api/v1/numbers/lookup/{phoneNumber}fields= is supplied (comma-separated or JSON array), the response also carries a dataPackages map keyed by the requested field names — each entry carries a discriminated status enum (available | coming_soon | not_implemented | error), a reason string, the intended provider, and an optional data payload when realised. The number_reputation field (Twilio Lookup v2 Number Reputation parity) returns a transparent 0-1 spam/fraud risk score in data.risk_score with a data.risk_bucket (low/medium/high), the data.factors that fired, and the contributing signals (line_type, reachable, ported, sim_swapped) — DERIVED from the same HLR/Telnyx upstream the lookup already fetched (flagged data.derived: true, NOT a paid reputation feed) whenever any usable HLR signal is present, and falls back to not_implemented only when no usable signal exists. call_forwarding returns a DERIVED, best-effort signal in data.call_forwarding (boolean) inferred from the HLR reachability dip — explicitly flagged data.derived: true with data.confidence: low (not an operator-asserted flag; the paid Telnyx forwarding add-on is not contracted) and falling back to coming_soon only when HLR returns no usable reachability signal. cnam and its Twilio-compat alias caller_name resolve against the Telnyx Lookup v2 caller-name dip and return available with the registered caller name, falling back to coming_soon only when Telnyx is not configured. Mirrors the Twilio Lookup v2 add-on selector.
string
required
Phone number in E.164 format. URL-encode the leading
+ (or use %2B). The route also accepts an unencoded + for back-compat — decodeURIComponent runs server-side.string
Optional Twilio-compat data-package selector. Comma-separated list of field names from the enumeration below (case-insensitive, deduped server-side, max 16 fields per request). Unknown field names reject the whole request with 400.
List bulk number-provisioning orders
GET /api/v1/numbers/ordersPOST /numbers/buy-bulk request, with its aggregate delivered/failed/partial outcome so customers can audit partial fulfillment after the fact (Twilio / Bandwidth OrderStatus parity). Org-scoped — a sibling subaccount under the same tenant schema never sees another org’s orders. Inbound DID provisioning only (invariant #45 untouched). Fetch /numbers/orders/{id} for per-line detail.
integer
Max orders to return, most-recent first (defaults to the server page size).
Fetch one bulk number-provisioning order
GET /api/v1/numbers/orders/{id}string
required
Bulk-order record id (returned by
/numbers/buy-bulk and /numbers/orders).List port-in requests
GET /api/v1/numbers/portingnumbers:read scope.
Get a port-in request’s status timeline
GET /api/v1/numbers/porting/{id}/timelinenumbers:read scope.
string
required
The port-in request id.
List port-out requests
GET /api/v1/numbers/porting/outnumbers:read scope.
List recoverable (snapback) numbers
GET /api/v1/numbers/recoverableid and recoverable_until deadline needed to drive POST /api/v1/numbers/{id}/reclaim. Keyset-paginated on the parking deadline so a telco-scale tenant with a large parked inventory never returns an unbounded list. Org-scoped; read-only on numbers:read.
integer
Recoverable numbers per page (default 25). Hard-capped server-side at 100 — larger values are silently clamped, not rejected.
string
Opaque keyset cursor from the previous page’s
data.next_cursor (ordered by the parking deadline). Omit for the first page.List carrier reputation alerts
GET /api/v1/numbers/reputation-alertstruncated: true means only the first 500 were scanned, so the counts are a lower bound.
List tracking pools
GET /api/v1/numbers/tracking-poolsFetch one tracking pool
GET /api/v1/numbers/tracking-pools/{id}string
required
Tracking-pool id.
Preview the DNI swap number for a visitor
GET /api/v1/numbers/tracking-pools/resolve/tracking-pools/{id} so the literal resolve segment is never swallowed by the :id param route. Owner/admin/developer/viewer.
string
—
string
—
string
—
string
—
string
—
string
—
string
Stable per-visitor key (session id / cookie) driving “sticky” picks.
Attach a compliance profile to a number
POST /api/v1/numbers/{id}/attach-compliance-profilepending_compliance, re-submitting the bundle to the carrier for the pending order. The carrier’s verification webhook later flips the number to active once the bundle is accepted — use this to complete a regulated purchase that stalled awaiting documentation. Org-ownership is enforced; owner/admin/developer only.
string
required
The phone number record id.
string
required
Id of an approved tenant compliance profile to attach to the number.
Upload a document for a number’s requirement
POST /api/v1/numbers/{id}/documents/{docId}/uploadstring
required
—
string
required
—
Refresh regulatory document statuses for a number
POST /api/v1/numbers/{id}/documents/refreshstring
required
—
Verify the emergency (E911) address for a number
POST /api/v1/numbers/{id}/emergency-address/verifystring
required
—
Submit a port-out request for a number
POST /api/v1/numbers/{id}/port-outstring
required
—
string
required
Account number with the number’s current carrier.
string
required
Name of the LoA signatory authorizing the release.
string
required
Operating Company Number (OCN) of the winning carrier.
string
Required only when port-out PIN protection is enabled on the number (4-32 characters).
Set or rotate the port-out PIN for a number
POST /api/v1/numbers/{id}/port-out-protectionstring
required
—
string
required
The port-out PIN (4-32 characters).
Reactivate a suspended number
POST /api/v1/numbers/{id}/reactivateactive, re-enabling inbound routing and outbound use (the inverse of POST /api/v1/numbers/{id}/suspend). Only a number in suspended status can be reactivated; any other state returns 409. The row flips back to active, the suspension audit fields are cleared, and routing resumes immediately with no backfill. Org-ownership is enforced per call so a sibling sub-org sharing the tenant schema cannot un-pause a number it does not own. Scoped on numbers:write (owner / admin / developer).
string
required
—
Reassign a number to a sibling subaccount
POST /api/v1/numbers/{id}/reassigntransfer_to_subaccount). Because sibling subaccounts share one tenant schema, only the ownership pointer changes — the number’s config and history stay intact. The target org must be in the same tenant and org family, and the DID must be purchased inventory the caller owns, or the call returns 409. Org-ownership is enforced per call; invariant #45 is untouched (ownership-column write only). Scoped on numbers:write (owner / admin / developer).
string
required
—
string
required
Id of the sibling subaccount (same tenant + org family) to receive ownership of the number.
Reclaim a parked number during its grace window
POST /api/v1/numbers/{id}/reclaimactive with no upstream re-purchase — the DID never left the account. Returns 409 when the number is not reclaimable (not parked, owned by a different org, or the parking window has already elapsed), in which case the caller should fall back to a fresh purchase from inventory. Use GET /api/v1/numbers/recoverable to discover which numbers are still reclaimable and until when. Scoped on numbers:write (owner / admin / developer).
string
required
—
Repair a number’s partial provisioning
POST /api/v1/numbers/{id}/repair-provisioningnumbers:write (owner / admin / developer).
string
required
—
Retry a failed number release
POST /api/v1/numbers/{id}/retry-releaserelease_status='failed'), re-enqueueing the carrier DELETE instead of leaving the DID billing in limbo. The dashboard surfaces this as a “Retry release” action on the Active list when a failed release exists. Responds 202 Accepted — the retry is processed asynchronously. Org-ownership is enforced per call so a sibling sub-org sharing the tenant schema cannot force a release on a number it does not own. Scoped on numbers:write (owner / admin / developer).
string
required
—
Ingest an SMS spam-complaint report for a number
POST /api/v1/numbers/{id}/sms-complaints/reportsstring
required
—
Suspend an active number
POST /api/v1/numbers/{id}/suspendactive status can be suspended; suspending a released / parked / pending number returns 409. The row flips to suspended and every inbound resolver + outbound from-number gate (which already whitelist status='active') stops routing immediately. Org-ownership is enforced per call so a sibling sub-org sharing the tenant schema cannot pause a number it does not own. The inverse of POST /api/v1/numbers/{id}/reactivate. Scoped on numbers:write (owner / admin / developer).
string
required
—
string
Optional free-text suspension note, persisted to the lifecycle audit fields.
Submit or resubmit a toll-free number for verification (TFV)
POST /api/v1/numbers/{id}/tfv-submitnumbers:write (owner / admin).
string
required
—
string
required
Toll-free messaging use case (from the carrier-approved use-case list, e.g. Customer Care).
string
required
40–500 character description of how the number is used.
string[]
required
1–5 representative outbound messages the carrier will review.
string
required
—
string
required
—
string
US Employer Identification Number (xx-xxxxxxx). Supply this OR business_registration_number + business_registration_country.
string
—
string
ISO-3166 alpha-2 country of the business registration number.
string
required
—
string
required
E.164 contact phone (e.g. +14155550123).
string (enum: VERBAL|WEB_FORM|PAPER_FORM|VIA_TEXT|MOBILE_QR_CODE)
required
How subscribers opted in to messaging.
string[]
required
1–5 HTTPS URLs to opt-in proof screenshots.
string
required
Expected monthly message-volume band (e.g. “10,000”).
string
—
boolean
Set true for political messaging; requires cv_token.
string
Campaign Verify authorization token (required for political use cases).
Create a number application
POST /api/v1/numbers/applicationsstring
required
—
string
—
any
—
Bind (or move) a DID to a number application
POST /api/v1/numbers/applications/{id}/bindstring
required
Number-application id.
string
required
The DID to bind, in E.164 (e.g. +14155550123).
Unbind a DID from a number application
POST /api/v1/numbers/applications/{id}/unbindstring
required
Number-application id.
string
required
The DID to unbind, in E.164 (e.g. +14155550123).
Bulk HLR lookup for up to 100 numbers
POST /api/v1/numbers/bulk-lookupnumbers:read scope.
string[]
required
—
Reserve a batch of numbers from a filter
POST /api/v1/numbers/bulk-reserve/numbers/buy-bulk. It polls DIDWW and Telnyx (and platform inventory when provider is unset) and picks the cheapest N; partial holds are returned so you can compare reserved_count against the requested quantity. Inbound DID provisioning only (invariant #45 untouched). Requires the numbers:write scope.
string
required
ISO 3166-1 alpha-2 country code.
string
Optional area-code / prefix filter (2–5 digits).
string (enum: local|mobile|toll_free)
—
integer
required
—
string
Optional digit-only pattern to match within the number.
string (enum: contains|starts_with|ends_with)
—
string
Comma-separated capability filter (e.g.
sms,voice).string (enum: devotel|telnyx|didww)
—
string
—
Cancel a bulk reservation (release held numbers)
POST /api/v1/numbers/bulk-reserve/{id}/cancelnumbers:write scope.
string
required
Reservation id returned by
POST /numbers/bulk-reserve.Finalize a bulk reservation (purchase held numbers)
POST /api/v1/numbers/bulk-reserve/{id}/finalize/numbers/buy-bulk, so partial success is possible — the response carries succeeded_count, failed_count, debited_cents, and a final status of finalized, partial, or failed. Call it before the reservation’s expires_at; an expired or already-settled reservation is rejected. No request body. Inbound DID provisioning only (invariant #45 untouched). Requires the numbers:write scope.
string
required
Reservation id returned by
POST /numbers/bulk-reserve.Buy multiple phone numbers in one request
POST /api/v1/numbers/buy-bulksucceeded[] and per-row carrier failures in failed[] (a failed row is never charged), and the response is 200 even when every row fails — inspect succeeded to decide the UI state. The result is also persisted as a pollable order record (GET /numbers/orders/{id}) so partial fulfillment can be audited later. Inbound DID provisioning only (invariant #45 untouched). Requires the numbers:write scope.
object[]
required
—
string
Compliance profile applied to every item that needs one.
Claim a free trial number from the shared pool
POST /api/v1/numbers/claim-trialPOST /numbers/purchase-trial. Returns 409 if the organization already holds an active trial or already owns purchased numbers, and a pool error when no trial stock is available. No request body. Requires the numbers:write scope.
Order a SIM against a catalog plan
POST /api/v1/numbers/connectivity/simsordered. The plan must be DATA-ONLY (invariant #45) — an MT-capable plan is rejected fail-closed. When iccid is omitted the server mints a synthetic 19-digit ICCID for the manual-mode flow. Requires the numbers:write scope (owner / admin / developer).
string
required
—
string
Aggregator-assigned ICCID; minted server-side when omitted.
string
—
string
—
Activate a SIM
POST /api/v1/numbers/connectivity/sims/{iccid}/activateordered (or suspended) SIM to active. Returns 409 on an illegal transition. Requires the numbers:write scope.
string
required
—
Apply or clear a SIM OTA profile
POST /api/v1/numbers/connectivity/sims/{iccid}/otaotaProfileId: null. Requires the numbers:write scope.
string
required
—
string
required
Profile id to apply, or null to clear the applied profile.
Resume a SIM
POST /api/v1/numbers/connectivity/sims/{iccid}/resumesuspended SIM back to active. Returns 409 on an illegal transition. Requires the numbers:write scope.
string
required
—
Suspend a SIM
POST /api/v1/numbers/connectivity/sims/{iccid}/suspendactive SIM to suspended. Returns 409 on an illegal transition. Requires the numbers:write scope.
string
required
—
Terminate a SIM
POST /api/v1/numbers/connectivity/sims/{iccid}/terminateterminated state). Returns 409 on an illegal transition. Requires the numbers:write scope.
string
required
—
Record a SIM data session
POST /api/v1/numbers/connectivity/sims/{iccid}/usageactive SIM. Advances the authoritative cumulative usageBytes meter and appends to the rolling session window. Descriptive only — it neither rates nor bills the usage. Requires the numbers:write scope.
string
required
—
number
required
Bytes consumed in this session (finite, non-negative).
string
—
string
ISO 3166-1 alpha-2 of the attached network.
Open a hosted-messaging order
POST /api/v1/numbers/hosted-messagingphoneNumber, the voiceCarrier of record, the numberType, and the inboundRoute that inbound SMS should be delivered to once the order is active. The order starts in draft; sign the LOA and submit it to progress. A second in-flight order for the same number is rejected. Requires the numbers:write scope.
Sign the hosted-messaging LOA
POST /api/v1/numbers/hosted-messaging/{id}/loa/signdraft to loa_signed. Supply the signer’s legal name and email, the verbatim acknowledgement text they accepted, and optionally a Devotel-issued signed URL of the signed LOA artefact. The carrier is not notified yet — this gives operators a buffer to revoke before submission. Requires the numbers:write scope.
string
required
Hosted-messaging order id.
Submit a hosted-messaging order
POST /api/v1/numbers/hosted-messaging/{id}/submitloa_signed to submitted. The signed LOA must already be recorded (otherwise the request is rejected) — the carrier then begins ownership verification before the number is activated for inbound SMS. Requires the numbers:write scope.
string
required
Hosted-messaging order id.
Look up phone number intelligence
POST /api/v1/numbers/lookupGET /api/v1/numbers/lookup/{phoneNumber}. Uses Devotel HLR as primary with a Telnyx fallback. Pass an optional Twilio-compatible fields selector to request add-on data packages (e.g. sim_swap, cnam, line_type_intelligence); the response then carries a dataPackages map. Each answered lookup is billed once via the number_lookup wallet channel (sandbox mode is free). Requires the numbers:write scope.
string
required
Phone number to look up, in E.164 format (e.g.
+14155550123).any
Optional Twilio-compatible data-package selector — a comma-separated string or a JSON array of field names (max 16).
string
Prior-express-consent date (YYYY-MM-DD) required to realise the
reassigned_number data package; ignored otherwise.Bulk import port-in requests from CSV
POST /api/v1/numbers/port-in/bulk-csvfile) with the columns phone_number, current_carrier_account_number, current_carrier_name, billing_name, billing_address — one row per number. Each valid row becomes its own manual-mode port-in request so ops can attach the LOA and country code afterwards; invalid rows are skipped and returned with a 1-indexed pointer. Capped at 1000 rows / 2 MB per request. Requires the numbers:write scope.
Submit a port-in request
POST /api/v1/numbers/portingnumbers (a single string or an array), the currentCarrier, and — to dispatch to a destination provider automatically — the country (US/CA route to Telnyx, elsewhere to DIDWW) and a Devotel-issued signed loaFileUrl. Omitting the country stores the request in manual mode for ops to hand-process. Requires the numbers:write scope.
Upload a Letter of Authorization for a port-in
POST /api/v1/numbers/porting/{id}/loafile, up to 10 MB). The file is stored privately, attached to the request, and its signature state moves to draft. Once the LoA is signed or submitted it can no longer be replaced — cancel and re-create the request to attach a different document. Requires the numbers:write scope.
string
required
The port-in request id.
Sign a port-in Letter of Authorization
POST /api/v1/numbers/porting/{id}/loa/signsigned. The request must already have a LoA in draft state; signing again returns 422. Requires the numbers:write scope.
string
required
The port-in request id.
string
required
Authorized signer’s full legal name, matching the losing carrier’s account.
string
required
—
string
required
Verbatim acknowledgement text the signer agreed to (stored for legal reconciliation).
Submit a signed port-in Letter of Authorization
POST /api/v1/numbers/porting/{id}/loa/submitsubmitted. Provider-dispatched requests send the document to the carrier; manual-mode requests transition locally so ops can hand off the signed PDF out of band. The LoA must already be in signed state. A carrier-side failure is logged but does not block the local transition — retry the carrier step via the refresh endpoint. Requires the numbers:write scope.
string
required
The port-in request id.
Refresh a port-in request’s carrier status
POST /api/v1/numbers/porting/{id}/refreshnumbers:write scope.
string
required
The port-in request id.
Supplement a rejected port-in request
POST /api/v1/numbers/porting/{id}/supplementnumbers:write scope.
string
required
The port-in request id.
string
Devotel-issued GCS signed URL for a replacement Letter of Authorization.
string
Devotel-issued GCS signed URL for an updated Customer Service Record.
string
—
object
—
string
—
string
—
string
Free-text note to the carrier explaining the correction.
Check port-in eligibility for a number
POST /api/v1/numbers/porting/checkcheck_status: check-not-supported because the upstream has no synchronous pre-check. Read-only — no LoA, no order, and no carrier state is created. Requires the numbers:read scope.
string
required
Number to check, in E.164 format (e.g.
+14155550123).string
Optional losing-carrier name, recorded for telemetry.
Create a tracking pool
POST /api/v1/numbers/tracking-poolsstring
required
—
string
required
—
string
—
string
—
any
—
string (enum: sticky|fixed)
—
boolean
—
Assign (or move) a tracking DID to a pool
POST /api/v1/numbers/tracking-pools/{id}/assignstring
required
Tracking-pool id.
string
required
The DID to assign, in E.164 (e.g. +14155550123).
Unassign a tracking DID from a pool
POST /api/v1/numbers/tracking-pools/{id}/unassignstring
required
Tracking-pool id.
string
required
The DID to unassign, in E.164 (e.g. +14155550123).
Update a phone number
PUT /api/v1/numbers/{id}label and tags, inbound webhook_url / forwarding_number / sms_forwarding, toggleable capabilities, the attached compliance_profile_id, and the per-number messaging_mps_cap and monthly_spend_cap_cents guardrails. Org-ownership is enforced; owner/admin/developer only.
string
required
The phone number record id.
string
—
string (enum: active|inactive)
—
string (enum: sms|mms|voice|fax)[]
—
string
E.164 number to forward inbound calls to, or an empty string to clear.
string
HTTPS inbound-event webhook for this DID, or null to clear.
string
E.164 number to forward inbound SMS to, or an empty string to clear.
string
Tenant compliance-profile id to attach, or an empty string / null to detach.
integer
Per-DID outbound messages-per-second ceiling, or null to clear.
integer
Per-DID monthly outbound SMS spend ceiling in US cents, or null to clear.
string[]
—
Assign a number to a 10DLC campaign
PUT /api/v1/numbers/{id}/campaign-assignmentstatus: pending; the org-level 10DLC service owns the carrier-side number→campaign assignment. Org-ownership is enforced; owner/admin/developer only.
string
required
The phone number record id.
string
required
TCR (or adapter) campaign id this DID is tied to for 10DLC A2P throughput segregation.
string
Optional TCR (or adapter) brand id recorded alongside the campaign for the dashboard readout.
Set a number’s CNAM registration
PUT /api/v1/numbers/{id}/cnamstatus: pending; a separate dispatch step hands it to the Devotel wholesale CNAM/LIDB provisioning queue. Org-ownership is enforced; owner/admin only.
string
required
The phone number record id.
string
required
Desired branded caller name (letters, digits, spaces, and . , - ’ & only; normalised to upper-case, ≤ 15 chars).
Set the emergency (E911) address for a number
PUT /api/v1/numbers/{id}/emergency-addressstring
required
—
Set a Mexican number’s active telecom regulator
PUT /api/v1/numbers/{id}/regulatorIFT and CRT once the carrier confirms the telecom-regulator transition is in effect for that inventory. The target must be an MX number or the call returns 422; a value other than IFT / CRT is also rejected as 422. Org-ownership is enforced per call so a sibling sub-org sharing the tenant schema cannot re-stamp a number it does not own, and the change is written to the audit trail. Requires admin; scoped on numbers:write.
string
required
—
string (enum: IFT|CRT)
required
The regulator to set as active for this MX number.
Set the scheduled release for a number
PUT /api/v1/numbers/{id}/scheduled-releaserelease_at must be a strictly-future ISO-8601 timestamp within 730 days; an out-of-range or past date returns 422. The number is NOT released on write — it is captured with status: scheduled and actioned later by the due-date sweeper. Org-ownership is enforced; scoped on numbers:write (owner / admin / developer).
string
required
—
string
required
Strictly-future ISO-8601 instant at which the held DID should auto-release back to inventory (within 730 days from now).
string
Optional operator capacity-planning note.
Set a number’s auto-renewal preference
PATCH /api/v1/numbers/{id}/auto-renewstring
required
The phone number record id.
boolean
required
True to re-bill the number each cycle; false to let it lapse at term end.
Schedule or clear a number’s future auto-release
PATCH /api/v1/numbers/{id}/scheduled-releaserelease_on parity). Send release_at as a strictly-future ISO-8601 instant to arm the release, or release_at: null to clear it. The number is NOT released on write — the date is persisted to the row and a separate sweeper drives the existing release lifecycle when it arrives. This is the lightweight metadata toggle; the sibling GET / PUT / DELETE on this path expose the richer operator-set schedule object. Org-ownership is enforced per call so a sibling sub-org sharing the tenant schema cannot arm or clear a release on a number it does not own. Scoped on numbers:write (owner / admin / developer).
string
required
—
string
required
ISO-8601 timestamp at which the held DID should be automatically released back to inventory. Must be strictly in the future; pass null to clear an existing scheduled release.
Override the SMS complaint suppression hold
PATCH /api/v1/numbers/{id}/sms-complaints/suppressionstring
required
—
Update a number application
PATCH /api/v1/numbers/applications/{id}string
required
Number-application id.
string
—
string
—
any
—
Update the hosted-messaging inbound route
PATCH /api/v1/numbers/hosted-messaging/{id}/routeactive the route is locked (open a new order to change live routing) and once it is rejected or cancelled it cannot be edited. Supply the new inboundRoute; the updated order is returned. Requires the numbers:write scope.
string
required
Hosted-messaging order id.
Update a tracking pool
PATCH /api/v1/numbers/tracking-pools/{id}string
required
Tracking-pool id.
string
—
string
—
string
—
string
—
any
—
string (enum: sticky|fixed)
—
boolean
—
Release a phone number
DELETE /api/v1/numbers/{id}POST /api/v1/numbers/{id}/reclaim) before it returns to inventory — and billing for it stops. Org-ownership is enforced; an unknown or not-owned id returns 404. Owner/admin/developer only.
string
required
The phone number record id.
204 No Content
Remove a number’s 10DLC campaign assignment
DELETE /api/v1/numbers/{id}/campaign-assignmentassignment: null.
string
required
The phone number record id.
Remove a number’s CNAM registration
DELETE /api/v1/numbers/{id}/cnamcnam: null.
string
required
The phone number record id.
Remove the emergency (E911) address from a number
DELETE /api/v1/numbers/{id}/emergency-addressstring
required
—
Disable port-out PIN protection for a number
DELETE /api/v1/numbers/{id}/port-out-protectionstring
required
—
Cancel the scheduled release for a number
DELETE /api/v1/numbers/{id}/scheduled-releasenumbers:write (owner / admin / developer).
string
required
—
Delete a number application
DELETE /api/v1/numbers/applications/{id}string
required
Number-application id.
Cancel a hosted-messaging order
DELETE /api/v1/numbers/hosted-messaging/{id}cancelled and the updated record is returned. Use this to abandon a text-enable request before the hosting carrier activates it. Requires the numbers:write scope.
string
required
Hosted-messaging order id.
Cancel a port-in request
DELETE /api/v1/numbers/porting/{id}submitted or reviewing state, withdrawing it from the losing carrier where a provider order was dispatched. Once the carrier has approved the port the request can no longer be cancelled here (409) — cancellation must then go through the losing carrier’s own flow. Requires the numbers:write scope.
string
required
The port-in request id.
Delete a tracking pool
DELETE /api/v1/numbers/tracking-pools/{id}string
required
Tracking-pool id.