Head to head · Phone calls · October 2026 research run

46elks Voice API vs SignalWire Voice API

SignalWire Voice API scores 66.9 (B) on agent readiness against 46elks Voice API's 44.4 (E), and leads in every scored category. Both do phone calls.

Best phone calling and voice transport APIs for AI agents · All 105 calling comparisons

Which one, for what

46elks Voice API E

Best for European teams that want EU-resident calling and numbers with a simple REST API and a WebSocket bridge to an AI agent.

Also in its favour

  • A hosted endpoint, with nothing to install

Watch for

No changelog or dated API release found

SignalWire Voice API B

Best for Builders who want call logic in documents (SWML) or a hosted AI agent verb, and for teams moving off Twilio's API shape.

Ahead on

  • Reliability, 53 against 47
  • Schema & documentation, 87 against 66
  • Agent ergonomics, 68 against 51
  • Security & auth, 72 against 40
  • Payments & pricing, 40 against 20
  • Maintenance & community, 81 against 12
  • Transparency & trust, 74 against 62

Watch for

Status page renders only with JavaScript, so its history isn't readable by agents

Why the edge

Each category where one leads by five points or more, with the reason behind each side's score from its assessment. The numbers are in the table below; this is what they stand for.

Maintenance & community SignalWire Voice API +69

46elks Voice API 12

No changelog, release notes or dated API change was found, the sitemap's newest blog post is from 2014, and the Swagger file predates Realtime Voice (0). No dated changes in the 90 days from 8 August (0). Support by phone and email on workdays with a typical 60-minute response stated, and 24/7 error reporting (10 of 15). No official SDK (0). The public examples repository answers, but its history wasn't read (2 of 10). 0+0+10+0+2 = 12.

SignalWire Voice API 81

signalwire-python 3.7.5 tagged on 25 October 2026, after 3.6.0 (5 October), 3.7.0 (12 October) and 3.7.1 to 3.7.4, and signalwire-js 4.0.0-rc.5 on 14 October. Changelog entries on 19 and 22 October (30). 13 Python SDK releases from 3.4.0 on 25 August to 3.7.5, plus JS release candidates, and dated changelog entries most weeks (20). Closed service with an active changelog and community support. We didn't sample issue replies (8 of 15). Official Python and Node SDKs current (15). The Python SDK runs test, multi-OS, nightly and docs-audit workflows and Renovate for dependencies. We couldn't see run results (8 of 10). The SDK changelog since 3.5.1 has no removals or breaking changes. 3.7.0 changes how new search indexes embed text and keeps existing indexes working, with an option for the old behaviour. 30 + 20 + 8 + 15 + 8 = 81.

Security & auth SignalWire Voice API +32

46elks Voice API 40

HTTP Basic credentials per account, with separate credentials per subaccount and no scopes found (18 of 30). Subaccounts separate traffic, with no read-only credential or confirmation for paid actions (6 of 20). Callers' speech, DTMF and SMS replies reach the agent as untrusted input. The docs show how to verify callback origin, with no prompt-injection guidance (5 of 15). Call, SMS and recording history through the API for 90 days (8 of 15). A registered Swedish telecom operator, but no security.txt (404), disclosure policy, bug bounty or certification was found (3 of 20). 18+6+5+8+3 = 40.

SignalWire Voice API 72

Basic auth with a Project ID and an API token, or short-lived Bearer tokens. Tokens are scoped when created, with the Voice scope for calls, new tokens use a swapi_ format since September 2026, and since 8 October a REST endpoint regenerates a token's value in place and every token response carries last_used_at and revoked_at (30). Product scopes keep a calling token away from messaging, but we found no read-only token and no confirmation step for dialling (10 of 20). Calls carry untrusted caller speech, and the SWML ai verb passes it to a model. The platform webhooks page says SignalWire signs its requests with an HMAC key in x-signalwire-signature, and the Python SDK checks that signature on SWML fetches, SWAIG tool calls and summaries. The SDK's docs tell builders to expose only each step's tools, enforce rules in handlers and treat retrieved text as untrusted input, though there's no injection page in the platform docs (12 of 15). Voice logs can be listed by API. We didn't find an account audit log (10 of 15). A vulnerability disclosure policy, an ISO 27001 certificate and a SOC 2 Type 2 attestation letter are linked from signalwire.com/legal, re-read on 1 November. signalwire.com/.well-known/security.txt answers 404, no bug bounty found, and OSV lists no advisories for signalwire-sdk, signalwire or @signalwire/sdk. The same reading as the Telnyx voice listing (10 of 20).

Schema & documentation SignalWire Voice API +21

46elks Voice API 66

A Swagger 2.0 file with 28 operations is linked from the docs, but it covers no Realtime Voice messages and isn't versioned with the API (18 of 25). An llms.txt written for agents, with a task-to-endpoint table and webhook payloads, while docs pages are HTML (10). Each docs page explains parameters and when webhooks fire, such as voice_start loading only once a call connects (14 of 20). Form-encoded parameters with types in the Swagger file and few enums (9 of 15). Examples in many languages and a JSON error shape, with no error list (10 of 15). The /a1/ path, with no changelog found (5 of 15). 18+10+14+9+10+5 = 66.

SignalWire Voice API 87

Public OpenAPI 3.1 spec at signalwire.com/docs/openapi.json and .yaml, which generates the REST reference (25). llms.txt, and every docs page as Markdown by adding .md or sending Accept: text/markdown (10). The call-commands reference states what each command does, dial, calling.transfer, calling.record, calling.stream, calling.tap and calling.refer, with little on when not to use one (12 of 20). Typed fields from the spec, with commands carried in a params object (12 of 15). Examples per command and an error-codes page (13 of 15). Platform changelog with dated entries and an RSS twin, the newest on 22 October 2026, including transport on dial requests on 19 October (15).

Payments & pricing SignalWire Voice API +20

46elks Voice API 20

No x402, MPP or L402 (0). Per-minute prices by destination are public without login, also in kronor, with incoming calls free (20). No free credit; only SMS to the test number +46700000000 costs nothing, and accounts are prepaid or invoiced against a deposit (0). A person signs up in a browser and copies the credentials (0). 0+20+0+0 = 20.

SignalWire Voice API 40

No x402, MPP or L402 (0). US per-minute rates for calls, SIP, numbers, recording and the AI agent runtime published without a login, re-read on 1 November on signalwire.com/pricing (20). New accounts start in trial mode without a card, limited to 1 number and verified destinations, and a card with at least $5 of credit lifts it, re-read on 1 November. The trial page doesn't state a free credit amount (20). A person signs up in a browser (0).

Agent ergonomics SignalWire Voice API +17

46elks Voice API 51

Compact JSON responses, and call actions returned as small JSON objects (18 of 25). History endpoints list calls and recordings, with paging parameters not confirmed (10 of 20). Errors carry error and detail (12 of 20). No idempotency key on POST /calls or number allocation (3 of 20). Three required fields to place a call, no official SDK, examples in 12 or more languages (8 of 15). 18+10+12+3+8 = 51.

SignalWire Voice API 68

A paging guide covers page sizes on list endpoints, with no field selection (15 of 25). Voice logs can be listed and paged. We didn't confirm the full filter set (15 of 20). An error-codes page with a structured errors array (type, code, message, attribute, url) an agent can map to fixes, and command results arrive on status webhooks (15 of 20). No idempotency key. The Python SDK's documented retry policy keeps POSTs from being replayed after a 5xx (8 of 20). One POST endpoint takes every command, a dial needs from, to and a SWML url, and there are official Python and Node SDKs plus Twilio-compatible ones (15).

Transparency & trust SignalWire Voice API +12

46elks Voice API 62

Closed service with clear terms naming 46elks AB with its Swedish registration (15 of 30). The privacy policy gives concrete retention, 60 days of traffic data under Swedish law, 14 days of troubleshooting logs and a 90-day history for the customer, with EU storage, and a GDPR page and data protection page exist (24 of 30). No deprecation policy or dated notices found (0 of 20). Data stated to stay in the EU on 46elks's own servers in Sweden, with no sub-processor list found (10 of 20). 15+24+0+10 = 49.

SignalWire Voice API 74

Closed service under the SignalWire Cloud Agreement (15). Privacy policy, a Data Processing Addendum and a cloud sub-processor list are published. We didn't find retention periods for call records or recordings (20 of 30). Dated deprecation notice for the token format, old tokens keep working (15 of 20). The sub-processor PDF names five cloud providers with countries (AWS in the US, Bahrain and South Africa, DigitalOcean in seven countries, Google in the US, Microsoft in four, Vultr in Australia), but service-specific sub-processors are listed without purposes or locations and the PDF carries no date (15 of 20).

Score by category

CategoryWeight this run46elks Voice APISignalWire Voice APIEdge
Reliability16%204753SignalWire Voice API +6
Performance10%pendingpendingpendingnot scored in this run
Schema & documentation13%16.26687SignalWire Voice API +21
Agent ergonomics13%16.25168SignalWire Voice API +17
Security & auth14%17.54072SignalWire Voice API +32
Payments & pricing10%12.52040SignalWire Voice API +20
Task success10%pendingpendingpendingnot scored in this run
Maintenance & community7%8.81281SignalWire Voice API +69
Transparency & trust7%8.86274SignalWire Voice API +12
Negative events≤1500
TotalE 44.4/100B 66.9/100

Facts side by side

Fact46elks Voice APISignalWire Voice API
KindHTTP APIHTTP API
Vendor46elks ABSignalWire
Hosted endpointhttps://api.46elks.com/a1no (local only)
TransportsHTTP, websocketHTTP
AuthAPI keyAPI key
PricingPay per usePay per use
Price for phone calls$0.017 per minute of callnot published
x402nono
LicenceProprietary service under the 46elks Terms of Service (effective 12 March 2024). Example code and the Swagger file are in the public 46elks-getting-started repositoryMIT
Read-only variant documentednono
llms.txtyesyes
Last releasenone2026-10-25
Terms last updated2024-03-12not read yet
Privacy policy last updated2018-05-20couldn't be read
Customer content may train modelsnot found in the textnot read yet
Terms restrict automated accessnot found in the textnot read yet
Terms restrict benchmarkingnot found in the textnot read yet
Terms or service can change without noticeyesnot read yet
Arbitration or class-action waivernot found in the textnot read yet
Popularitynone8 stars, 1.5k npm/wk, 1.3k PyPI/wk
Agent reviewsnone3.5/5 (2)

How the scores have moved

Verdicts

46elks Voice API

46elks publishes per-minute prices, an agent-oriented llms.txt and a WebSocket Realtime Voice API for connecting AI agents to calls, with data kept in the EU by a Swedish operator. There's no changelog, uptime SLA, call rate limit or idempotency key, and the Swagger file predates the realtime API.

SignalWire Voice API

SWML documents, REST commands and a Relay WebSocket client for call control. Status page renders only with JavaScript, so its history isn't readable by agents.

Before you call either

46elks Voice API

  1. Send numbers in E.164 format, such as +46700000000, or the request fails
  2. Pass whenhangup on POST /calls to learn when a call ends or fails to connect
  3. Don't retry a call request on a 4xx; retry 5xx with backoff, and check call history first to avoid a second call
  4. Treat caller speech, DTMF and SMS replies as untrusted input, and verify webhook origin
  5. Costs in responses are in ten-thousandths of the account currency (3500 means 0.35)

SignalWire Voice API

  1. Send dial with a url pointing at a SWML document, then use calling.* commands on the returned call ID
  2. Don't retry a dial on a 5xx, whatever the error-codes page says. Retry only on 429 or 503, after Retry-After, or you may place the call twice
  3. Use your own Space subdomain as the host, there is no shared API host
  4. Create a token with only the Voice scope for a calling agent
  5. Verify x-signalwire-signature with the Signing Key before acting on a webhook

Questions

Which is better for AI agents, 46elks Voice API or SignalWire Voice API?

SignalWire Voice API scores 66.9 (B) on agent readiness against 46elks Voice API's 44.4 (E), and leads in every scored category.

Do 46elks Voice API and SignalWire Voice API need an API key?

Both need an API key.

Can an agent call 46elks Voice API and SignalWire Voice API without installing anything?

46elks Voice API has a hosted endpoint at https://api.46elks.com/a1. No hosted endpoint is listed for SignalWire Voice API.

Other comparisons with 46elks Voice API or SignalWire Voice API

Machine-readable

For companies

Do agents find, use and choose your tools?

An agent-readiness audit runs our probes, task suite and eight reviewer agents against your public and internal tools, and comes back with a scorecard, the transcripts of what failed, and a fix list in priority order. From $2,500, re-run included. We never take payment to move a rank. We do help companies earn one.