API Reference
Track a single event
Accepts a single event object and records it for ingestion.
If messageId is not provided, the server will generate one automatically.
POST
/
track
Track a single event
curl --request POST \
--url https://{host}/v1/track \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"event": "signup",
"timestamp": "2025-10-29T22:00:00.778Z",
"properties": {
"plan": "basic",
"accountType": "email",
"freeTrial": true
},
"messageId": "8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2"
}
'import requests
url = "https://{host}/v1/track"
payload = {
"event": "signup",
"timestamp": "2025-10-29T22:00:00.778Z",
"properties": {
"plan": "basic",
"accountType": "email",
"freeTrial": True
},
"messageId": "8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
event: 'signup',
timestamp: '2025-10-29T22:00:00.778Z',
properties: {plan: 'basic', accountType: 'email', freeTrial: true},
messageId: '8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2'
})
};
fetch('https://{host}/v1/track', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{host}/v1/track",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'event' => 'signup',
'timestamp' => '2025-10-29T22:00:00.778Z',
'properties' => [
'plan' => 'basic',
'accountType' => 'email',
'freeTrial' => true
],
'messageId' => '8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{host}/v1/track"
payload := strings.NewReader("{\n \"event\": \"signup\",\n \"timestamp\": \"2025-10-29T22:00:00.778Z\",\n \"properties\": {\n \"plan\": \"basic\",\n \"accountType\": \"email\",\n \"freeTrial\": true\n },\n \"messageId\": \"8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{host}/v1/track")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"event\": \"signup\",\n \"timestamp\": \"2025-10-29T22:00:00.778Z\",\n \"properties\": {\n \"plan\": \"basic\",\n \"accountType\": \"email\",\n \"freeTrial\": true\n },\n \"messageId\": \"8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/v1/track")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"event\": \"signup\",\n \"timestamp\": \"2025-10-29T22:00:00.778Z\",\n \"properties\": {\n \"plan\": \"basic\",\n \"accountType\": \"email\",\n \"freeTrial\": true\n },\n \"messageId\": \"8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2\"\n}"
response = http.request(request)
puts response.read_body{
"status": "ok",
"messageId": "8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2"
}{
"error": "Invalid event format."
}{
"error": "Unauthorized"
}{
"error": "Payload exceeds maximum allowed size (10MB)."
}{
"error": "Rate limit exceeded. Please retry later."
}{
"error": "Internal server error. Please try again later."
}Authorizations
Include your API key as:
Authorization: Bearer YOUR_API_KEYBody
application/json
The name/type of the event.
Example:
"signup"
When the event occurred.
Example:
"2025-10-29T22:00:00.778Z"
Event-specific key/value pairs.
Example:
{
"plan": "basic",
"accountType": "email",
"freeTrial": true
}Unique identifier for this event. If not provided by the client, the server will generate one automatically. Used for deduplication and traceability through downstream systems.
Example:
"8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2"
Was this page helpful?
Previous
Track multiple events in bulkAccepts an array of event objects and records them in bulk.
Clients may optionally gzip the request body.
The total uncompressed request size must not exceed 10 MB.
Next
⌘I
Track a single event
curl --request POST \
--url https://{host}/v1/track \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"event": "signup",
"timestamp": "2025-10-29T22:00:00.778Z",
"properties": {
"plan": "basic",
"accountType": "email",
"freeTrial": true
},
"messageId": "8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2"
}
'import requests
url = "https://{host}/v1/track"
payload = {
"event": "signup",
"timestamp": "2025-10-29T22:00:00.778Z",
"properties": {
"plan": "basic",
"accountType": "email",
"freeTrial": True
},
"messageId": "8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
event: 'signup',
timestamp: '2025-10-29T22:00:00.778Z',
properties: {plan: 'basic', accountType: 'email', freeTrial: true},
messageId: '8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2'
})
};
fetch('https://{host}/v1/track', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{host}/v1/track",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'event' => 'signup',
'timestamp' => '2025-10-29T22:00:00.778Z',
'properties' => [
'plan' => 'basic',
'accountType' => 'email',
'freeTrial' => true
],
'messageId' => '8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{host}/v1/track"
payload := strings.NewReader("{\n \"event\": \"signup\",\n \"timestamp\": \"2025-10-29T22:00:00.778Z\",\n \"properties\": {\n \"plan\": \"basic\",\n \"accountType\": \"email\",\n \"freeTrial\": true\n },\n \"messageId\": \"8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{host}/v1/track")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"event\": \"signup\",\n \"timestamp\": \"2025-10-29T22:00:00.778Z\",\n \"properties\": {\n \"plan\": \"basic\",\n \"accountType\": \"email\",\n \"freeTrial\": true\n },\n \"messageId\": \"8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/v1/track")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"event\": \"signup\",\n \"timestamp\": \"2025-10-29T22:00:00.778Z\",\n \"properties\": {\n \"plan\": \"basic\",\n \"accountType\": \"email\",\n \"freeTrial\": true\n },\n \"messageId\": \"8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2\"\n}"
response = http.request(request)
puts response.read_body{
"status": "ok",
"messageId": "8b0f62f9-1e8e-4f15-8c2a-9d23c9c6c0e2"
}{
"error": "Invalid event format."
}{
"error": "Unauthorized"
}{
"error": "Payload exceeds maximum allowed size (10MB)."
}{
"error": "Rate limit exceeded. Please retry later."
}{
"error": "Internal server error. Please try again later."
}