Questions · Published 2026-10-20 · Updated 2026-10-20 · AgentiSend
How do I get email events without a public webhook URL?
Get email events without a public webhook URL by polling GET /emails/{id}/events with cursor until next_cursor is null.
Get email events without a public webhook URL by polling GET /emails/{id}/events with cursor until next_cursor is null. That list is the delivery record for one message. GET /logs is the request log, a separate list, and it does not return email.delivered.
One message
POST /emails returns the id. GET /emails/{id} reports status and last_event. GET /emails/{id}/events is every event for that id, oldest first. Each row has type, occurred_at, detail and provider_message_id. The query parameters are limit, cursor and after. after is the same cursor. Pass cursor from the previous next_cursor and stop when has_more is false.
curl -sS -X GET https://api.agentisend.com/emails/9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42/events \
-H "Authorization: Bearer $AGENTISEND_API_KEY"200
{
"data": [],
"has_more": false,
"next_cursor": "example",
"object": "list"
}A webhook is the path that does not poll. POST /webhooks takes an https address, so it needs a public URL. Webhooks has the signature check. This page is the path without one.
The request log
GET /logs returns one row per API request: method, path, status, error_code and created_at. Use it to see which calls ran. Do not use it as the email event list.
Parameters that exist are since, until, status, status_class, method, route, error_code, api_key_id, source, q, limit, cursor, after and before. since and until are timestamps with an offset. status_class is 2xx, 4xx or 5xx. source is api, console or all. cursor and before together are refused. Start with since. On the next call pass cursor set to next_cursor and keep the same since. The read returns at most 500 matching rows, plus one extra row so the page can say whether more exist, and then pages inside that set. A cursor does not walk past that window.
curl -sS -X GET https://api.agentisend.com/logs \
-H "Authorization: Bearer $AGENTISEND_API_KEY"200
{
"data": [],
"has_more": false,
"next_cursor": "example",
"object": "list"
}One row is GET /logs/{id}.
Received mail
receiving listen is not open for mail that has not arrived. Receiving is available once the MX host is published, and the status page says when it is live. The command polls GET /emails/receiving and prints one JSON object per line, oldest first. The flags are --limit, --interval, --to and --once. --once prints one page and stops. Receiving and replying is the rest of that API.