Orthogonal
Send an SMS from an agent's phone number
Offering
- Provider
- Orthogonal
- Method
- POST
- Offering type
- Api Endpoint
- Transport type
- http
- Category
- Infrastructure
- Delivery
- Not provided
- Pricing model
- Not provided
- x402 version
- 2
Endpoint context
- URL
https://np.orthogonal.com/agentphone/v1/messages- MIME type
- application/json
- First seen
- 2026-10-16T01:50:03.832Z
- Last seen
- Tags
- X402, paid-api, orthogonal-proxy, agentphone, data-apis, voice, phone, sms, AI-agents, telephony
Payment pricing
x402 payment terms are the authoritative price for calling this endpoint.
- Payment option 1
- 0.03 USDC
Atomic price: 30000 · Network: eip155:8453 · Asset: USDC · Scheme: exact - Payment option 2
- 30000 atomic units
Atomic price: 30000 · Network: eip155:5042 · Asset: 0x3600000000000000000000000000000000000000 · Scheme: exact
Raw x402 terms
[
{
"scheme": "exact",
"network": "eip155:8453",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "30000",
"payTo": "0x0477aeC8513F73adfe6E3C813650b25a28Cba54A"
},
{
"scheme": "exact",
"network": "eip155:5042",
"asset": "0x3600000000000000000000000000000000000000",
"amount": "30000",
"payTo": "0x0477aeC8513F73adfe6E3C813650b25a28Cba54A"
}
]Observed health
- Status
- Healthy
- Latest latency
- 79 ms
- Average latency
- 640 ms
- HTTP status
- 204
- Last checked
- Reachability
- 100% over 9 checks
Latency is measured to the first response headers. A reachable result does not verify response accuracy or merchant identity.
Input schema
{
"body": {
"type": "object",
"title": "SendMessageRequest",
"required": [
"body"
],
"properties": {
"cta": {
"anyOf": [
{
"type": "object"
},
{
"type": "null"
}
],
"title": "Cta",
"examples": [
{
"url": "https://example.com/track/123",
"display_text": "Track order"
}
],
"description": "WhatsApp only: a single tappable link button on an ordinary message. {\"display_text\": \"Track order\", \"url\": \"https://example.com/t/123\", \"footer\": \"Tap to see live status\"} — `footer` is optional. The url must be absolute and https. Unlike a URL button on a template this needs no Meta review, but as an ordinary message it only reaches someone inside the 24h window."
},
"body": {
"type": "string",
"title": "Body"
},
"list": {
"anyOf": [
{
"type": "object"
},
{
"type": "null"
}
],
"title": "List",
"description": "WhatsApp only: a tap-to-open list menu. {\"button\": \"View options\", \"options\": [\"Small\", \"Medium\", \"Large\"]} (max 10 options, 24 chars each), or full form with sections: {\"button\": str, \"sections\": [{\"title\": str, \"rows\": [{\"id\": str, \"title\": str, \"description\": str}]}]}."
},
"buttons": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Buttons",
"examples": [
{
"0": "Confirm",
"1": "Reschedule",
"2": "Cancel"
}
],
"description": "WhatsApp only: up to 3 tappable reply buttons (each max 20 chars). The tapped button's text arrives as a normal inbound message. Pass media_urls alongside buttons to render that image, video, or document as a header above the text, in the same bubble as the buttons (audio has no header form and is rejected)."
},
"channel": {
"enum": [
"whatsapp"
],
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Channel",
"examples": [
"whatsapp"
],
"description": "Optional transport override for numbers connected to multiple channels. Pass \"whatsapp\" to send via the number's WhatsApp connection instead of its default SMS/iMessage transport. WhatsApp-only numbers use WhatsApp automatically."
},
"agent_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Agent Id"
},
"template": {
"anyOf": [
{
"type": "object"
},
{
"type": "null"
}
],
"title": "Template",
"examples": [
{
"name": "order_shipped",
"language": "en_US",
"variables": [
"1234"
]
}
],
"description": "WhatsApp only: send a Meta-approved message template. This is the only way to reach someone outside the 24h customer service window. {\"name\": \"order_shipped\", \"language\": \"en_US\", \"variables\": [\"1234\"]} — `variables` fill the template body, and `header_variables` does the same for a text header. Pass an array for a POSITIONAL template ({{1}}, {{2}}) or an object for a NAMED one, e.g. {\"variables\": {\"first_name\": \"Pablo\"}} for a body reading \"Thanks {{first_name}}!\". The shape must match how the template was authored. `language` defaults to en_US. The template must already be APPROVED (see the templates endpoints). `body` is NOT delivered for template sends — WhatsApp renders the approved template content — it is kept only as a fallback label if we can't render the template for your message history."
},
"media_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Media Url"
},
"number_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Number Id"
},
"to_number": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "To Number",
"description": "Recipient of an existing chat: a phone (any format, normalized to E.164), US short code, email, or a group id (grp_...). Provide this OR `recipients` (to start a new group), not both."
},
"media_urls": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Media Urls"
},
"recipients": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Recipients",
"examples": [
{
"0": "+14155551234",
"1": "+16505551234"
}
],
"description": "Start a NEW iMessage group by listing 2 or more recipients (phones or emails). The first message is delivered to all of them, an iMessage group is created, and the response `to_number` returns the new group id (grp_...) to use for follow-up sends. iMessage numbers only."
},
"send_style": {
"enum": [
"celebration",
"fireworks",
"lasers",
"love",
"confetti",
"balloons",
"spotlight",
"echo",
"invisible",
"gentle",
"loud",
"slam"
],
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Send Style",
"examples": [
"confetti"
],
"description": "Optional iMessage expressive effect. Only valid on iMessage-capable numbers. Supported values: celebration, fireworks, lasers, love, confetti, balloons, spotlight, echo, invisible, gentle, loud, slam."
},
"from_number": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "From Number"
},
"reply_to_message_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Reply To Message Id",
"examples": [
"cmat9x3i20000a2m6y3d9r1u2"
],
"description": "Optional parent message ID (AgentPhone Message.id) to send this message as an inline reply. Supported on iMessage and WhatsApp; the parent must be in the same chat and sent from the same number."
}
}
},
"type": "http",
"method": "POST",
"bodyType": "json"
}Output schema
{
"type": "object",
"title": "SendMessageResponse",
"required": [
"id",
"status",
"channel",
"from_number",
"to_number"
],
"properties": {
"id": {
"type": "string",
"title": "Id"
},
"status": {
"type": "string",
"title": "Status"
},
"channel": {
"type": "string",
"title": "Channel"
},
"to_number": {
"type": "string",
"title": "To Number"
},
"media_urls": {
"type": "array",
"items": {
"type": "string"
},
"title": "Media Urls",
"default": []
},
"from_number": {
"type": "string",
"title": "From Number"
},
"conversation_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Conversation Id"
},
"reply_to_message_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Reply To Message Id"
},
"reply_parent_unresolved": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Reply Parent Unresolved"
}
}
}