Seegnals

REST API

Replies

Read classified inbox replies across all connected mailboxes, and correct a classification from the outside the same way the inbox menu does.

Updated 4 September 2026

The inbox in Seegnals gathers replies from every connected mailbox and classifies them. This endpoint gives you the same list, without the message bodies.

GET /api/v1/replies

Query: classification (interested, neutral, not_interested, unclassified, autoresponder), since (ISO 8601, on received_at), campaign_id, prospect_id, limit, cursor.

Without classification, autoresponders are left out, exactly like the All replies folder in the app. classification=autoresponder returns only those. unclassified returns replies the classifier has not processed yet.

curl "https://app.seegnals.com/api/v1/replies?classification=interested&since=2026-09-01" \
  -H "Authorization: Bearer $SEEGNALS_TOKEN"
const res = await fetch("https://app.seegnals.com/api/v1/replies?classification=interested&since=2026-09-01", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.SEEGNALS_TOKEN}`
  }
});
const json = await res.json().catch(() => null);
console.log(res.status, json);
import os, requests

res = requests.get(
    "https://app.seegnals.com/api/v1/replies?classification=interested&since=2026-09-01",
    headers={"Authorization": f"Bearer {os.environ['SEEGNALS_TOKEN']}"},
    timeout=20,
)
print(res.status_code, res.json() if res.content else None)
{
  "data": [
    {
      "id": "20000000-0000-0000-0000-000000000001",
      "prospect": { "id": "7c9e…", "email": "ada@example.com", "first_name": "Ada", "last_name": null },
      "company": { "id": "1b4e…", "name": "Example Ltd", "domain": "example.com" },
      "campaign": { "id": "3f2b…", "name": "Q3 outbound" },
      "mailbox_id": "…",
      "from_email": "ada@example.com",
      "subject": "Re: Quick question",
      "classification": "interested",
      "classification_overridden": false,
      "is_autoresponder": false,
      "is_read": false,
      "received_at": "2026-09-03T10:00:00.000+00:00",
      "snippet": "Sounds good, let's talk next week. Does Tuesday 10:00 work?"
    }
  ],
  "next_cursor": null
}
  • snippet is the first 160 characters of the body on one line, the same shortening the inbox column uses. The full text is not available through the API.
  • classification_overridden is true when a person corrected the classifier in the app.
  • prospect.email can be null when the prospect was deleted; company is null for an address without a company.

If you want to be told about replies instead of polling, use the replied webhook or a new_reply / positive_reply subscription.

Errors: 400 for a bad classification, since, uuid, limit or cursor; 401; 429.

PATCH /api/v1/replies/{id}

A human correction of the classification, the same write as the menu in the inbox: classification is set, classification_overridden becomes true (the classifier will not touch this reply again, even if it is mid-flight), and the reply is marked as classified by a person. It works on a reply that has not been classified yet.

Body (max 4 KiB):

{ "classification": "interested" }

classification is one of interested, neutral, not_interested.

Response 200: the reply in the list shape, with "classification_overridden": true.

Errors: 400 `classification` must be one of: interested, neutral, not_interested.; 404 { "error": "Reply not found." } for an unknown id, another workspace’s id or a non-UUID; 401; 429.