sondahub / Helpdesk API / Messages
Fake messages API
5,069 messages from the Helpdesk API, a fake helpdesk API. The thread on a ticket, in order. author_type says who wrote it.
Reads with filters, sorting, search and relations; writes that answer like a real server and stay in your session token. Same ids on every build. Free, no key, CORS open.
Connect
- List
- https://api.sondahub.com/v1/helpdesk/messages
- One record
- https://api.sondahub.com/v1/helpdesk/messages/{id}
- OpenAPI 3
- https://api.sondahub.com/v1/helpdesk/openapi.json
- GraphQL
- https://api.sondahub.com/v1/helpdesk/graphql
- JSON file
- https://api.sondahub.com/data/helpdesk/messages.json
- MCP
- https://api.sondahub.com/mcp · list_records
curl "https://api.sondahub.com/v1/helpdesk/messages?limit=3"
Sample records
Records 1 to 3 of 5,069, exactly as GET /v1/helpdesk/messages/{id} answers them. The data file holds all of them.
[
{
"id": 1,
"created_at": "2026-07-24T22:23:40Z",
"updated_at": "2026-07-24T22:23:40Z",
"ticket_id": 1,
"author_type": "customer",
"author_id": null,
"author_name": "Grace Clark",
"body": "This started happening after the last update.",
"internal": false,
"attachments": []
},
{
"id": 2,
"created_at": "2026-07-25T10:49:40Z",
"updated_at": "2026-07-25T10:49:40Z",
"ticket_id": 1,
"author_type": "agent",
"author_id": 6,
"author_name": "Bram Young",
"body": "Here is a workaround while we fix the root cause.",
"internal": false,
"attachments": []
},
{
"id": 3,
"created_at": "2026-07-25T20:10:40Z",
"updated_at": "2026-07-25T20:10:40Z",
"ticket_id": 1,
"author_type": "customer",
"author_id": null,
"author_name": "Grace Clark",
"body": "Is there a workaround in the meantime?",
"internal": false,
"attachments": []
}
]
Fields
| Field | Type | Notes |
|---|---|---|
idread-only | int | Assigned by the server. Seed records keep their ids across restarts; records you create continue after the seed. |
created_atread-only | datetime | When the record was created (ISO 8601, UTC). |
updated_atread-only | datetime | When the record last changed. |
ticket_idrequired | int → tickets | |
author_typerequired | enum | customer agent system |
author_id | int → agents | The agent, when author_type is agent. |
author_name | string | |
bodyrequired | text | |
internal | bool | A private note the customer does not see. |
attachments | json { name, size, content_type }[] |
Relations: ticket → one ticket through ticket_id; author → one agent through author_id. Use ?expand=ticket,author to embed them, or the nested routes.
Endpoints
message_count; an agent’s first message stamps first_response_at; a customer message reopens a pending ticket.Try it
curl "https://api.sondahub.com/v1/helpdesk/messages?author_type=agent&expand=ticket&limit=3"
curl https://api.sondahub.com/v1/helpdesk/messages/1?expand=ticket
curl -i -X POST https://api.sondahub.com/v1/helpdesk/messages \
-H "Content-Type: application/json" \
-d '{"ticket_id":1,"author_type":"customer","body":"A body"}'
curl "https://api.sondahub.com/v1/helpdesk/messages?sort=-id&limit=3" \ -H "X-Sondahub-Session: THE_TOKEN_FROM_THE_CREATE"
curl -X PATCH https://api.sondahub.com/v1/helpdesk/messages/1 \
-H "Content-Type: application/json" \
-d '{"author_type":"agent"}'
curl -X DELETE https://api.sondahub.com/v1/helpdesk/messages/5070 \ -H "X-Sondahub-Session: THE_TOKEN_FROM_THE_CREATE"
Query recipes
Every list option works on messages; these are ready to paste. All the options.
| What | Request |
|---|---|
| Page 2, 50 at a time (of 5,069) | /v1/helpdesk/messages?page=2&limit=50 |
| Only author type = customer | /v1/helpdesk/messages?author_type=customer |
| Newest first by created at | /v1/helpdesk/messages?sort=-created_at&limit=5 |
| Author name contains “grace” | /v1/helpdesk/messages?author_name_like=grace |
| Full-text search | /v1/helpdesk/messages?q=grace |
| Only some fields | /v1/helpdesk/messages?fields=id,author_name&limit=5 |
| Embed the ticket | /v1/helpdesk/messages/1?expand=ticket |
| Just the count | /v1/helpdesk/messages?limit=1&fields=id |
GraphQL
The same messages as the messages query on https://api.sondahub.com/v1/helpdesk/graphql, and one message as message(id: 1). Introspection is on. More on the GraphQL API.
{
messages(limit: 3, sort: "-id", filter: { author_type: customer }) {
total
data {
id ticket_id author_type author_id
ticket { number }
}
}
}
curl https://api.sondahub.com/v1/helpdesk/graphql -H "Content-Type: application/json" -d '{"query": "{ messages(limit: 3, sort: \"-id\", filter: { author_type: customer }) { total data { id ticket_id author_type author_id ticket { number } } } }"}'
From an AI agent (MCP)
The MCP server reaches the same rows with list_records, get_record, create_record, update_record and delete_record, and as the resource sondahub://helpdesk/messages.
curl https://api.sondahub.com/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_records","arguments":{"api":"helpdesk","collection":"messages","filters":{"author_type":"customer"},"limit":3}}}'
More in the Helpdesk API
teams (4) · agents (25) · customers (300) · tickets (2,000)
The live streams, and the whole API on one page: Helpdesk API. Other worlds: fake e-commerce API, fake IoT API, fake banking API, fake social media API, fake flight booking API, fake user directory API.