Skip to content

Event Collection

The collection endpoint accepts batches of analytics events from client-side JavaScript. It is intentionally public — no authentication is required.

Collect Events

POST /v1/collect/{orgId}

Authentication: None (public endpoint)

Rate Limit: 60 requests/min per IP

Path Parameters

ParameterTypeDescription
orgIdstringYour organization ID (e.g., org_00000a1B2c3D4e5)

Request Body

json
{
  "events": [
    {
      "type": "page_view",
      "url": "https://mystore.com/products/organic-bananas",
      "title": "Organic Bananas - My Store",
      "referrer": "https://mystore.com/",
      "timestamp": 1711468800000
    },
    {
      "type": "click",
      "url": "https://mystore.com/products/organic-bananas",
      "element": "button",
      "element_id": "add-to-cart",
      "element_text": "Add to Cart"
    }
  ]
}

Event Fields

All events share a common set of fields. Additional fields vary by event type.

Common Fields

FieldTypeRequiredDescription
typestringYesEvent type (see Tracked Event Types)
urlstringYesPage URL where the event occurred
timestampintegerNoClient-side Unix timestamp in milliseconds. Server time is used if omitted.

Page View Fields

FieldTypeDescription
titlestringPage title
referrerstringReferring URL

Interaction Fields (click, scroll_depth, form_submit)

FieldTypeDescription
elementstringHTML element tag name
element_idstringElement id attribute
element_classstringElement CSS class(es)
element_textstringVisible text (truncated to 100 characters)
scroll_percentintegerMaximum scroll depth percentage (scroll_depth only)
form_actionstringForm action URL (form_submit only)
form_methodstringForm HTTP method (form_submit only)

Ecommerce Fields

FieldTypeDescription
product_idstringProduct identifier
product_namestringProduct display name
product_pricenumberProduct unit price
product_categorystringProduct category
quantityintegerItem quantity
order_totalnumberTotal order value (purchase events)
itemsarrayOrder line items (purchase events)

Batch Limits

  • Minimum: 1 event per request
  • Maximum: 50 events per request (events beyond 50 are silently dropped)

Server-Side Enrichment

Each batch is automatically enriched with:

  • request_ip — Client IP address (used for GeoIP lookup)
  • user_agent — Browser user agent string
  • received_at — Server-side timestamp

Response

202 Accepted — Events queued for processing:

json
{
  "accepted": 3
}

The accepted count reflects the number of events actually queued (capped at 50).

Error Responses

403 Forbidden — Unknown or inactive organization:

json
{
  "error": "Unknown organization"
}

422 Unprocessable Entity — Empty or missing events array:

json
{
  "error": "Events array is required"
}

429 Too Many Requests — Rate limit exceeded:

json
{
  "error": "Too many requests"
}

Domain Validation

Events are only accepted from domains registered in your site configuration. Requests from unregistered domains are rejected.

CORS

The endpoint returns appropriate CORS headers to allow cross-origin requests from registered domains.

Server-Side Event Collection

An authenticated endpoint for sending events from your backend. Use this for server-side ecommerce tracking (purchase confirmations, refunds), data imports, or any scenario where events originate from your server rather than a browser.

POST /v1/events

Authentication: OAuth Bearer

Scope: insightcore:events.write

Rate Limit: 1,000 requests/min

Request Body

json
{
  "events": [
    {
      "type": "purchase",
      "url": "https://mystore.com/checkout/complete",
      "order_total": 89.97,
      "items": [
        { "product_id": "prd_00000k1L2m3N4o5", "quantity": 3, "price": 29.99 }
      ]
    }
  ],
  "ip": "203.0.113.42",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"
}

Request Fields

The events array accepts the same event fields as the public endpoint.

FieldTypeRequiredDescription
eventsarrayYesArray of event objects (1–500 per request)
ipstringNoEnd-user IP address for GeoIP enrichment. Falls back to the caller's IP if omitted.
user_agentstringNoEnd-user user agent string. Falls back to the caller's user agent if omitted.

Key Differences from Public Endpoint

Public (/v1/collect/{orgId})Authenticated (/v1/events)
AuthNoneOAuth Bearer token
OrganizationPath parameterDerived from JWT
Rate limit60/min per IP1,000/min
Batch size50 events max500 events max
Domain validationYesNo
Use caseBrowser JavaScriptBackend services

Response

202 Accepted:

json
{
  "accepted": 1
}

Error Responses

401 Unauthorized — Missing or invalid token:

json
{
  "error": "unauthenticated",
  "message": "Valid authentication credentials are required."
}

422 Unprocessable Entity — Validation error (empty events, missing organization context):

json
{
  "error": "Organization context is required"
}

Changelog
DateChange
2026-03-28Added authenticated server-side collection endpoint (POST /v1/events).
2026-03-26Initial publication.

ShopHero CommerceCore Platform