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
- Authentication for token handling and the two
401responses. - Rate limits and errors for the 60 requests per minute budget and every error body.
- Prospects for the full field list and the
PATCHsemantics. - Zapier if you would rather click than code.
- MCP server to give Claude Code or Cursor the same tools.
- The OpenAPI 3.1 specification for Postman, code generators and assistants.