API access
Pull your projects and leads out of SignalsAPI programmatically — the same data you see in the app, available as JSON or CSV over a small REST API. Build it into a script, a scheduled sync, or your own dashboard.
The API is read-only and returns exactly what you can already see and download in the app: your own projects, their leads, and a full per‑project export that is identical to the project’s Download CSV button.
Building an AI agent, or want the underlying hiring panel rather than your own leads? That is a separate machine-facing surface — see the Agent data plane.
Base URL
https://api.signalsapi.com
Authentication
Every request uses your personal API key as a Bearer token:
Authorization: Bearer YOUR_API_KEY
Find your key in the app under Settings → API Key (you can regenerate it there at any time — regenerating invalidates the old key). Every request is scoped to your own account: you can only ever see your own projects and leads.
| Situation | Response |
|---|---|
| Missing or invalid key | 403 |
| Expired or deactivated key | 403 |
| A project that isn’t yours, or doesn’t exist | 404 |
An unsupported format value | 422 |
List your projects
GET /projects/
Returns all of your projects, newest first, each with a usable_lead_count (the number of leads in that project that are ready to use).
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.signalsapi.com/projects/
{
"projects": [
{
"id": 654,
"name": "Customer Success",
"export_name": null,
"created_at": "2026-05-12T09:31:00",
"updated_at": "2026-06-28T14:02:11",
"usable_lead_count": 85
}
],
"total": 1
}
Browse a project’s leads
GET /projects/{project_id}/leads
Page through a project’s usable leads as structured JSON. Each lead carries its nested person and company.
| Query parameter | Default | Notes |
|---|---|---|
limit | 50 | Page size, 1–500 |
offset | 0 | Number of leads to skip |
unlocked_only | false | Return only unlocked leads |
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.signalsapi.com/projects/654/leads?limit=2&offset=0"
{
"leads": [
{
"id": 90217,
"project_id": 654,
"created_at": "2026-06-20T08:14:00",
"updated_at": "2026-06-20T08:14:00",
"unlocked_at": null,
"email": null,
"email_status": "verified",
"is_usable": true,
"person": {
"id": null,
"first_name": "Matteo",
"last_name": "Attems-Thonet",
"name": "Matteo Attems-Thonet",
"title": "Head of Customer Success",
"headline": null,
"linkedin_url": "https://www.linkedin.com/in/…"
},
"company": {
"id": 4412,
"name": "zollsoft GmbH",
"domain": "zollsoft.de",
"industry": "Software",
"country": "DE",
"headcount": 180
}
}
],
"total": 85,
"limit": 2,
"offset": 0
}
total is the full count of usable leads in the project (not just the current page) — use it to drive pagination. To pull every lead at once, use the export endpoint below instead of paging.
Export a whole project
GET /projects/{project_id}/leads/export?format=json|csv
Streams all usable leads of a project in one response — no page limit. The CSV is byte‑for‑byte the same file you get from the project’s Download CSV button in the app, so any importer mapping you already have keeps working.
| Query parameter | Default | Values |
|---|---|---|
format | json | json, csv |
# CSV, streamed straight to a file
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.signalsapi.com/projects/654/leads/export?format=csv" \
-o leads.csv
# JSON array of rich rows
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.signalsapi.com/projects/654/leads/export?format=json"
The CSV columns are:
website,decision_maker_linkedin_url,decision_maker_email,decision_maker_phone,signal_job_title
The JSON export returns the same rows with the full set of person, company, and signal fields. A project with no usable leads exports cleanly — a header‑only CSV or an empty [] — rather than an error.
The export is streamed, so even very large projects download in constant memory on both ends. It is read‑only and never consumes credits.
Notes & limits
- Usable leads only. All three endpoints return the same usable‑lead set you see in the app; the export matches the web CSV download exactly.
- Read‑only. Nothing here unlocks leads, runs enrichment, or spends credits.
- Your data only. Requests are always scoped to your account; another user’s project id returns
404. - Rate limiting on the export endpoint is not yet enforced — be reasonable with very frequent full pulls.
See Limits for every pagination default and rate limit stated across the API in one place.
Recent changes
-
2026-06-30 — API access launches: a read-only REST API for pulling your own projects and leads out of SignalsAPI as JSON or CSV.
-
2026-04-16 — Company name in CSV exports – the company name column was missing from CSV downloads; now included.
-
2025-01-14 — Fewer fields in CSV export
-
2024-12-03 — Bugfix: not exporting leads that are in process of unlocking email
-
2024-11-29 — Showing integration type in export list
-
2024-06-20 — Export showing integration name and exports per day stats.
-
2024-05-18 — List views of searches, filters, personas, lead lists and exports show where they are taking data from and where they are sending it to.
-
2024-05-13 — Leads are downloaded based on the applied filters
-
2024-05-01 — Fixed: lead status does not change to “exported” after exporting happens
-
2024-04-30 — Fixed: it is now possible to approve a lead before emails finished unlocking, export will happen automatically when unlocking is finished
-
2024-04-29 — Leads will get exported after you approve them by clicking “Approve” or “Reject” buttons, or enabling auto-approval in lead list settings.
-
2024-04-28 — New tab “Leads” for working with leads in a mailbox-style with folders, downloading, unlocking emails, etc
-
2024-04-25 — Showing people counts in filters, personas, exports
-
2024-04-23 — Each page (searches, filters, personas, export) showing running status automatically updates when running is finished
-
2024-03-20 — Matches are downloadable as CSV, go to Matches -> Download