curl --request GET \
--url https://api.messages.dev/v1/outbox \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.messages.dev/v1/outbox"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.messages.dev/v1/outbox', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.messages.dev/v1/outbox",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.messages.dev/v1/outbox"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.messages.dev/v1/outbox")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.messages.dev/v1/outbox")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"line_id": "<string>",
"status": "pending",
"payload": {},
"completed_at": 123,
"error": "<string>",
"attempts": 123,
"max_attempts": 123,
"created_at": 123,
"request_id": "<string>"
}{
"error": {
"type": "invalid_request_error",
"code": "missing_required_parameter",
"message": "The 'from' query parameter is required.",
"param": "from"
},
"request_id": "req_abc123"
}{
"error": {
"type": "authentication_error",
"code": "missing_api_key",
"message": "Missing Authorization header. Use 'Authorization: Bearer sk_live_...'"
},
"request_id": "req_abc123"
}{
"error": {
"type": "not_found_error",
"code": "line_not_found",
"message": "Line not found.",
"param": "from"
},
"request_id": "req_abc123"
}Get delivery status
Returns the current delivery status of a write operation. Use this to poll for completion after sending a message, reaction, etc.
curl --request GET \
--url https://api.messages.dev/v1/outbox \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.messages.dev/v1/outbox"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.messages.dev/v1/outbox', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.messages.dev/v1/outbox",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.messages.dev/v1/outbox"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.messages.dev/v1/outbox")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.messages.dev/v1/outbox")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"line_id": "<string>",
"status": "pending",
"payload": {},
"completed_at": 123,
"error": "<string>",
"attempts": 123,
"max_attempts": 123,
"created_at": 123,
"request_id": "<string>"
}{
"error": {
"type": "invalid_request_error",
"code": "missing_required_parameter",
"message": "The 'from' query parameter is required.",
"param": "from"
},
"request_id": "req_abc123"
}{
"error": {
"type": "authentication_error",
"code": "missing_api_key",
"message": "Missing Authorization header. Use 'Authorization: Bearer sk_live_...'"
},
"request_id": "req_abc123"
}{
"error": {
"type": "not_found_error",
"code": "line_not_found",
"message": "Line not found.",
"param": "from"
},
"request_id": "req_abc123"
}Authorizations
Use an API key as a bearer token: Authorization: Bearer sk_live_...
Each key has a set of scopes that gate which endpoints it can call:
messages:read, messages:write, chats:read, lines:read,
reactions:read, reactions:write, typing:read, typing:write,
receipts:read, receipts:write, webhooks:read, webhooks:write,
outbox:read, files:read, files:write. Keys can also be restricted
to a subset of lines.
Query Parameters
Outbox item ID (prefixed with obx_)
"obx_abc123"
Response
Outbox item
Delivery ID (e.g. obx_abc123)
pending: queued for deliveryclaimed: being processedsent: delivered successfullyfailed: delivery failed (seeerrorfield)
pending, claimed, sent, failed The original request payload
Unix timestamp (ms) when delivery completed
Error message if delivery failed
Number of delivery attempts made
Maximum number of delivery attempts
Unix timestamp (ms) when the request was created