Ingest Event
Ingest a first-party event.
Every well-formed event is accepted and stored, whether or not its subject
can be correlated to a known contact or company: correlation is best-effort
and runs asynchronously. Replaying the same external_event_id (or the
exact same event content) is idempotent: the event is accepted but never
stored or processed twice.
Requires the events:write scope on the API key.
curl --request POST \
--url https://api.topo.io/v1/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event_name": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"subject": {
"email": "<string>",
"linkedin_url": "<string>",
"company_domain": "<string>",
"external_contact_id": "<string>",
"external_company_id": "<string>"
},
"external_event_id": "<string>",
"payload": {}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
event_name: '<string>',
occurred_at: '2023-11-07T05:31:56Z',
subject: {
email: '<string>',
linkedin_url: '<string>',
company_domain: '<string>',
external_contact_id: '<string>',
external_company_id: '<string>'
},
external_event_id: '<string>',
payload: {}
})
};
fetch('https://api.topo.io/v1/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.topo.io/v1/events"
payload = {
"event_name": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"subject": {
"email": "<string>",
"linkedin_url": "<string>",
"company_domain": "<string>",
"external_contact_id": "<string>",
"external_company_id": "<string>"
},
"external_event_id": "<string>",
"payload": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"accepted": true,
"idempotency_key": "<string>"
}Authorizations
Bearer API key issued from Settings → Developers.
Body
Ingest Event payload
Custom event name (1–255 characters).
1 - 255RFC 3339 timestamp when the event occurred.
Event subject identifiers; at least one field is required.
Hide child attributes
Hide child attributes
Email address of the event subject.
LinkedIn profile URL of the event subject.
Company domain associated with the event subject.
Contact identifier in the connected CRM.
Company identifier in the connected CRM.
Optional stable identifier from the caller's system, used for idempotent replays.
255Was this page helpful?
curl --request POST \
--url https://api.topo.io/v1/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event_name": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"subject": {
"email": "<string>",
"linkedin_url": "<string>",
"company_domain": "<string>",
"external_contact_id": "<string>",
"external_company_id": "<string>"
},
"external_event_id": "<string>",
"payload": {}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
event_name: '<string>',
occurred_at: '2023-11-07T05:31:56Z',
subject: {
email: '<string>',
linkedin_url: '<string>',
company_domain: '<string>',
external_contact_id: '<string>',
external_company_id: '<string>'
},
external_event_id: '<string>',
payload: {}
})
};
fetch('https://api.topo.io/v1/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.topo.io/v1/events"
payload = {
"event_name": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"subject": {
"email": "<string>",
"linkedin_url": "<string>",
"company_domain": "<string>",
"external_contact_id": "<string>",
"external_company_id": "<string>"
},
"external_event_id": "<string>",
"payload": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"accepted": true,
"idempotency_key": "<string>"
}