curl --request POST \
--url https://api.inflection.io/v2/product-events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"eventId": "event-123",
"userId": "user-42",
"eventName": "Viewed Page",
"orgId": "org-7",
"timestamp": "2026-10-21T12:00:00Z",
"properties": {
"page": "/pricing"
}
}
'import requests
url = "https://api.inflection.io/v2/product-events"
payload = {
"eventId": "event-123",
"userId": "user-42",
"eventName": "Viewed Page",
"orgId": "org-7",
"timestamp": "2026-10-21T12:00:00Z",
"properties": { "page": "/pricing" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
eventId: 'event-123',
userId: 'user-42',
eventName: 'Viewed Page',
orgId: 'org-7',
timestamp: '2026-10-21T12:00:00Z',
properties: {page: '/pricing'}
})
};
fetch('https://api.inflection.io/v2/product-events', 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://api.inflection.io/v2/product-events",
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([
'eventId' => 'event-123',
'userId' => 'user-42',
'eventName' => 'Viewed Page',
'orgId' => 'org-7',
'timestamp' => '2026-10-21T12:00:00Z',
'properties' => [
'page' => '/pricing'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.inflection.io/v2/product-events"
payload := strings.NewReader("{\n \"eventId\": \"event-123\",\n \"userId\": \"user-42\",\n \"eventName\": \"Viewed Page\",\n \"orgId\": \"org-7\",\n \"timestamp\": \"2026-10-21T12:00:00Z\",\n \"properties\": {\n \"page\": \"/pricing\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.inflection.io/v2/product-events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"eventId\": \"event-123\",\n \"userId\": \"user-42\",\n \"eventName\": \"Viewed Page\",\n \"orgId\": \"org-7\",\n \"timestamp\": \"2026-10-21T12:00:00Z\",\n \"properties\": {\n \"page\": \"/pricing\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.inflection.io/v2/product-events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"eventId\": \"event-123\",\n \"userId\": \"user-42\",\n \"eventName\": \"Viewed Page\",\n \"orgId\": \"org-7\",\n \"timestamp\": \"2026-10-21T12:00:00Z\",\n \"properties\": {\n \"page\": \"/pricing\"\n }\n}"
response = http.request(request)
puts response.read_bodySubmit one product event
Validates, deduplicates and publishes one product event. Requires WRITE
access for Personal Access Tokens and write-capable OAuth users.
The request body is limited to 256 KiB of UTF-8 JSON. A 202 response means
the event was accepted and durably queued.
This request consumes 1 Product Activity rate-limit unit.
curl --request POST \
--url https://api.inflection.io/v2/product-events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"eventId": "event-123",
"userId": "user-42",
"eventName": "Viewed Page",
"orgId": "org-7",
"timestamp": "2026-10-21T12:00:00Z",
"properties": {
"page": "/pricing"
}
}
'import requests
url = "https://api.inflection.io/v2/product-events"
payload = {
"eventId": "event-123",
"userId": "user-42",
"eventName": "Viewed Page",
"orgId": "org-7",
"timestamp": "2026-10-21T12:00:00Z",
"properties": { "page": "/pricing" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
eventId: 'event-123',
userId: 'user-42',
eventName: 'Viewed Page',
orgId: 'org-7',
timestamp: '2026-10-21T12:00:00Z',
properties: {page: '/pricing'}
})
};
fetch('https://api.inflection.io/v2/product-events', 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://api.inflection.io/v2/product-events",
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([
'eventId' => 'event-123',
'userId' => 'user-42',
'eventName' => 'Viewed Page',
'orgId' => 'org-7',
'timestamp' => '2026-10-21T12:00:00Z',
'properties' => [
'page' => '/pricing'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.inflection.io/v2/product-events"
payload := strings.NewReader("{\n \"eventId\": \"event-123\",\n \"userId\": \"user-42\",\n \"eventName\": \"Viewed Page\",\n \"orgId\": \"org-7\",\n \"timestamp\": \"2026-10-21T12:00:00Z\",\n \"properties\": {\n \"page\": \"/pricing\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.inflection.io/v2/product-events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"eventId\": \"event-123\",\n \"userId\": \"user-42\",\n \"eventName\": \"Viewed Page\",\n \"orgId\": \"org-7\",\n \"timestamp\": \"2026-10-21T12:00:00Z\",\n \"properties\": {\n \"page\": \"/pricing\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.inflection.io/v2/product-events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"eventId\": \"event-123\",\n \"userId\": \"user-42\",\n \"eventName\": \"Viewed Page\",\n \"orgId\": \"org-7\",\n \"timestamp\": \"2026-10-21T12:00:00Z\",\n \"properties\": {\n \"page\": \"/pricing\"\n }\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
Personal Access Token or OAuth 2.1 access token, sent as a bearer
credential (Authorization: Bearer inf_pat_...). Read operations
require a token with the READ scope; write operations
(POST/PATCH/DELETE) require WRITE.
Body
One product event. The encoded event must not exceed 256 KiB. String
limits count Unicode code points. See timestamp for the accepted
formats.
Unique per event within your tenant; used for deduplication. Must not be blank.
1 - 100The product user id, as used by POST /v2/users. Must not be blank.
1 - 100Must not be blank or start with $.
1 - 200When the event happened, as one of:
- An ISO 8601 date-time with an offset:
2026-11-04T10:52:00Z,2026-11-04T10:52:00.123+05:30. - An ISO 8601 date-time without an offset, read as UTC:
2026-11-04T10:52:00. - An integer number of Unix milliseconds:
1793789520000. Seconds resolve to a date in 1970.
Date-times need the T separator and at least hours and minutes;
seconds and up to nine fraction digits are optional, and precision
beyond microseconds is truncated. Offsets are Z, ±HH, ±HH:MM or
±HH:MM:SS (+0530 is rejected). A date alone, a space separator, a numeric string
and a non-integer number are rejected. The result must fall in a UTC
year from 1000 through 9999.
Arbitrary JSON values. Top-level keys contain 1-200 Unicode code points and must not be blank; every string value, at any depth, is limited to 8,192 Unicode code points. Numbers must be within the finite IEEE 754 double-precision range. Nested objects and arrays are stored, but only top-level string, number and boolean values can be used in dynamic lists and triggers.
Optional organization identifier; null is treated as absent and whitespace-only values are rejected.
1 - 100Response
SUCCESS: every event was accepted. PARTIAL_SUCCESS (batch only): at least
one event was accepted and the rejected ones are listed in errors.
Contains only errors and metadata; accepted events are not listed individually.
Missing required fields are grouped into one INVALID_SCHEMA error; a null
value counts as missing. If none are missing, unknown fields are grouped the
same way. Otherwise only the first validation failure is returned. Each
failed event produces at most one public error.
Was this page helpful?