Api Endpoint

Orthogonal

Send an SMS from an agent's phone number

Open interactive test console

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"
    }
  }
}