Endpoint Reference
Every v1 endpoint is scoped to the API key’s owner and lives under
https://app.synaptyx.pro/api/v1. The read endpoints are all GET; the one write
endpoint is POST /events (Server-Side Events). The
interactive explorer at /api/v1/docs lets you
try them live.
Full endpoint list
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET | /conversions | read:conversions | Cursor-paginated conversions (CPA + revenue merged) |
GET | /conversions/search | search:conversions | Substring search across conversion + click fields |
GET | /clicks | read:clicks | Cursor-paginated clicks (geo, device, sub-IDs) |
GET | /campaigns | read:campaigns | List campaigns (lean — no flow/graph) |
GET | /campaigns/:id | read:campaigns | A single campaign |
GET | /campaigns/search | search:campaigns | Substring search across campaigns |
GET | /offers | read:offers | List offers |
GET | /offers/:id | read:offers | A single offer |
GET | /landing-pages | read:landing-pages | List landing pages |
GET | /landing-pages/:id | read:landing-pages | A single landing page |
GET | /traffic-sources | read:traffic-sources | List traffic sources |
GET | /traffic-sources/:id | read:traffic-sources | A single traffic source |
GET | /stats/overview | read:stats | Aggregate totals + resource counts over a window |
GET | /stats/daily | read:stats | Daily clicks / conversions / revenue series |
GET | /reports | read:reports | Grouped performance report (CR, EPC, …) |
POST | /events | write:events | Ingest a server-side event (login/signup/checkout…) — never creates a conversion |
Key parameters
Conversions — GET /conversions
| Param | Notes |
|---|---|
limit | 1–200 (default 50) |
cursor | Opaque pagination cursor |
campaign_id | Filter to one campaign |
status | approved, pending, declined, hold… |
source | cpa, revenue, or all |
from / to | Date range |
include_test_mode | Include test conversions |
Clicks — GET /clicks
| Param | Notes |
|---|---|
limit, cursor | Pagination |
campaign_id, offer_id | Filters |
from / to | Date range (clickedAt) |
converted | Only converted clicks |
Stats — GET /stats/overview & /stats/daily
| Param | Notes |
|---|---|
days | 1–90 (default 30) |
tz | IANA timezone for daily (default UTC) |
campaign_id | Filter daily to one campaign |
Reports — GET /reports
| Param | Notes |
|---|---|
group_by | Required. One of: campaign, country, device, os, browser, offer, landing, traffic_source, day |
days | 1–365 (default 30) |
from / to | Explicit range |
campaign_id | Filter |
Reports return up to the top 1,000 buckets, sorted by clicks descending.
Search — /conversions/search, /campaigns/search
| Param | Notes |
|---|---|
q | The query, 2–100 chars (%/_ are escaped, not wildcards) |
fields | Comma-separated whitelist of fields to search |
limit, cursor | Pagination |
from / to | Date range (conversions search) |
Server-side events — POST /events
JSON body (not query params). Full guide: Server-Side Events.
| Field | Notes |
|---|---|
click_id | Attribution key for paid traffic. Must resolve to a click your account owns (else 404). Required unless you send visitor_id. |
visitor_id + campaign_id | Attribution key for organic / direct traffic (no click). Read visitor_id from the _syx_vid cookie; the campaign must be yours (else 404). |
event_name | Required. ^[a-zA-Z][a-zA-Z0-9_]{0,63}$ |
value / currency | Optional numeric signal (not revenue) + ISO-4217 currency |
properties | Optional object — max 20 keys, primitive values only |
event_id | Optional idempotency key (24h dedup window) |
timestamp | Optional ISO-8601; clamped to [now − 30d, now + 5m] |
Returns 200 { "accepted": true }. Never writes a conversion.
Response shapes
List endpoints return a paginated envelope:
{
"data": [ /* … rows … */ ],
"nextCursor": "eyJ0cyI6…",
"hasMore": true
}Search endpoints add the query context and per-row match info:
{
"query": "acme",
"searchedFields": ["name", "couponCode"],
"data": [
{ "id": "…", "name": "Acme FR", "matched": true,
"matches": [{ "field": "name", "value": "Acme FR" }] }
],
"nextCursor": null,
"hasMore": false
}Examples
cURL
# Last 7 days overview
curl "https://app.synaptyx.pro/api/v1/stats/overview?days=7" \
-H "Authorization: ApiKey syx_live_your_key_here"
# Conversions for one campaign, paginated
curl "https://app.synaptyx.pro/api/v1/conversions?campaign_id=abc&limit=100" \
-H "Authorization: ApiKey syx_live_your_key_here"Single-item lookups (/:id) return 404 not_found for both nonexistent and
not-owned rows — so the API never leaks whether another user’s resource exists.