GET
/api/v1/events
scope events:read
Every event on the account, newest first. Use it to find the id you need for the
leads endpoint. No pagination — nobody has enough events for that to matter.
{
"data": [
{
"id": "652f1a...",
"name": "Spring Trade Fair 2026",
"status": "active", // draft | active | closed | archived
"tier": "business",
"venue": "Exhibition Centre",
"city": "Lyon",
"show_start": "2026-11-20T00:00:00.000Z",
"show_end": "2026-11-23T00:00:00.000Z",
"leads": 312
}
]
}
GET
/api/v1/events/{id}/leads
scope leads:read
The leads for one event, oldest first, each with its consent record attached. Blocked
leads — the ones over a tier's quota — are not included.
| Query | Default | |
| limit |
100 |
Capped at 500. |
| since |
— |
ISO timestamp. Returns leads captured strictly after it — pass back the
next_since from the previous page.
|
| verified |
— |
true returns only leads whose consent has been
confirmed. If you are going to email these people, this is the one you want.
|
curl "https://echofair.app/api/v1/events/652f1a.../leads?verified=true&limit=200" \
-H "Authorization: Bearer x360_your_key_here"
{
"data": [
{
"id": "6530bb...",
"event_id": "652f1a...",
"captured_at": "2026-11-21T09:04:11.000Z",
"source": "device", // device | self
"rep": "Alex M.",
"contact": {
"name": "Sam Carter",
"email": "sam.carter@example.com",
"phone": "+441632960123",
"company": "Northwind Hotels"
},
"products": ["range_a"],
"answers": { "notes": "Asked about the conference rooms" },
"form_version": 2,
"status": "new",
"tags": [],
"consent": {
"method": "email_doi",
"text_version": "xenia-2026-v2",
"text": "We will email you to confirm...",
"captured_at": "2026-11-21T09:04:11.000Z",
"confirmed_at": "2026-11-21T09:06:02.000Z",
"unsubscribed_at": null
}
}
],
"has_more": false,
"next_since": "2026-11-21T09:04:11.000Z"
}
The consent record travels with the lead
rather than sitting behind a second call. The whole pitch is that a contact arrives with
its proof attached, and an integration that has to ask twice is one that will end up not
asking. confirmed_at being null means they have not clicked the
link yet — that is not a contact you should be emailing.