Seegnals

Getting started

Quickstart

Create an API token, add your first prospect with one request and receive your first webhook. Ten minutes, no SDK.

Updated 4 September 2026

Seegnals has a small, deliberate public surface: a REST API for getting prospects in and keeping your suppression list in sync, and outgoing webhooks that tell your own systems what happened. Everything here works with curl, a Zap, or any language that can send HTTP.

1. Create an API token

In the app go to Settings → Integrations → API keys, give the token a name (for example Zapier or CRM sync) and press Generate token.

The token starts with sgn_ and is shown once. Seegnals stores only a hash of it. If you lose it, revoke it and generate a new one. One token gives full access to the API for its workspace; there are no scopes.

2. Add a prospect

curl -X POST https://app.seegnals.com/api/v1/prospects \
  -H "Authorization: Bearer sgn_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "anke@nordwind.example",
    "first_name": "Anke",
    "last_name": "Weber",
    "company_name": "Nordwind Logistics",
    "custom_fields": { "plant": "Bremen" }
  }'
const res = await fetch("https://app.seegnals.com/api/v1/prospects", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.SEEGNALS_TOKEN}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "email": "anke@nordwind.example",
    "first_name": "Anke",
    "last_name": "Weber",
    "company_name": "Nordwind Logistics",
    "custom_fields": {
      "plant": "Bremen"
    }
  })
});
const json = await res.json().catch(() => null);
console.log(res.status, json);
import os, requests

res = requests.post(
    "https://app.seegnals.com/api/v1/prospects",
    headers={"Authorization": f"Bearer {os.environ['SEEGNALS_TOKEN']}"}, json={
    "email": "anke@nordwind.example",
    "first_name": "Anke",
    "last_name": "Weber",
    "company_name": "Nordwind Logistics",
    "custom_fields": {
        "plant": "Bremen"
    }
},
    timeout=20,
)
print(res.status_code, res.json() if res.content else None)

Response:

{
  "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "email": "anke@nordwind.example",
  "company_id": "1b4e28ba-2fa1-11d2-883f-0016d3cca427"
}

The prospect lands in your workspace with source = API, grouped under the company derived from company_name and the email domain. Sending the same email again returns 409 instead of creating a duplicate.

3. Add and enrol in one call

Append ?campaign=<campaign id> to add the prospect and put them into a running or draft campaign in one request. The campaign id is in the URL of the campaign page in the app.

curl -X POST "https://app.seegnals.com/api/v1/prospects?campaign=4939897b-02fe-4974-ba88-1ea9c06bb447" \
  -H "Authorization: Bearer sgn_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{ "email": "anke@nordwind.example", "company_name": "Nordwind Logistics" }'
const res = await fetch("https://app.seegnals.com/api/v1/prospects?campaign=4939897b-02fe-4974-ba88-1ea9c06bb447", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.SEEGNALS_TOKEN}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "email": "anke@nordwind.example",
    "company_name": "Nordwind Logistics"
  })
});
const json = await res.json().catch(() => null);
console.log(res.status, json);
import os, requests

res = requests.post(
    "https://app.seegnals.com/api/v1/prospects?campaign=4939897b-02fe-4974-ba88-1ea9c06bb447",
    headers={"Authorization": f"Bearer {os.environ['SEEGNALS_TOKEN']}"}, json={
    "email": "anke@nordwind.example",
    "company_name": "Nordwind Logistics"
},
    timeout=20,
)
print(res.status_code, res.json() if res.content else None)

Enrolment follows the same rules as Add prospects in the app: suppressed addresses, people already in the campaign and prospects missing a field the sequence needs are skipped. The result of each call is visible in Settings → Integrations → History.

4. Receive events

In Settings → Integrations → Webhooks paste an https:// URL and save. Seegnals shows you a signing secret (whsec_…) once, then sends a signed JSON POST every time a message is sent, a prospect replies, a link is clicked, an address bounces or someone unsubscribes. Press Send test event to see the first delivery in your logs.

See Webhooks for the payload and Verifying signatures for the check you should do on every delivery.

5. Read what happened

Every list is paginated the same way and filtered with query parameters:

curl "https://app.seegnals.com/api/v1/campaigns?status=active" \
  -H "Authorization: Bearer sgn_your_token_here"

curl "https://app.seegnals.com/api/v1/replies?classification=interested&since=2026-09-01" \
  -H "Authorization: Bearer sgn_your_token_here"

Responses look like { "data": [ … ], "next_cursor": "…" }. Pass next_cursor back as cursor for the next page; null means you have everything. Reads cover prospects, campaigns, companies, replies, offers, suppressions, subscriptions and mailboxes.

6. Keep your suppression list in sync

When someone opts out in another tool, exclude them here too:

curl -X POST https://app.seegnals.com/api/v1/suppressions \
  -H "Authorization: Bearer sgn_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{ "target": "jane@example.com" }'
const res = await fetch("https://app.seegnals.com/api/v1/suppressions", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.SEEGNALS_TOKEN}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "target": "jane@example.com"
  })
});
const json = await res.json().catch(() => null);
console.log(res.status, json);
import os, requests

res = requests.post(
    "https://app.seegnals.com/api/v1/suppressions",
    headers={"Authorization": f"Bearer {os.environ['SEEGNALS_TOKEN']}"}, json={
    "target": "jane@example.com"
},
    timeout=20,
)
print(res.status_code, res.json() if res.content else None)

target can be an email address or a whole domain (acme.com). The exclusion applies from the next send attempt.

Where to go next