Skip to content

API Architecture — Overview

GrowthOS is API-first. Every feature you see in the dashboard is backed by a public API endpoint — there are no hidden internal routes. If the UI can do it, your code can do it.

This means you can:

  • Build entirely custom growth UIs on top of GrowthOS
  • Automate any workflow with scripts and integrations
  • Embed referral widgets, survey forms, and waitlists in any frontend framework
  • Pipe GrowthOS data into your own analytics stack

GrowthOS splits its API surface into two distinct APIs, each optimized for its use case.

Ingest API

High-volume, low-latency. Accepts events, identifies contacts, and powers embedded widgets. Uses write-only keys safe to expose in client-side code.

Management API

Full CRUD on all resources. Create campaigns, define segments, query analytics, manage settings. Uses secret keys with granular permission scopes. Server-side only.


AspectIngest APIManagement API
Base URLingest.growthos.io/v1api.growthos.io/v1
AuthWrite Key (client-safe)Secret Key + Scopes
Rate Limit1,000 req/s per key100 req/s per key
Use CaseTrack, Identify, Page, GroupCRUD, Query, Admin
Safe for client?YesNo — server-side only
Response styleMinimal (ACK)Full resource payloads
IdempotencyBuilt-in via message_idVia Idempotency-Key header

GrowthOS uses URL-path versioning. The current version is /v1/.

  • Breaking changes (removed fields, changed types, removed endpoints) always ship under a new major version (/v2/)
  • Additive changes (new fields, new endpoints, new enum values) are non-breaking and ship within the current version
  • New optional query parameters are non-breaking
  • New fields in response payloads are non-breaking — your code should ignore unknown fields

Rate limits are enforced per API key and vary by plan tier.

PlanIngest APIManagement API
Free100 req/s10 req/s
Growth500 req/s50 req/s
Scale1,000 req/s100 req/s

Every response includes rate limit headers:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets
Retry-AfterSeconds to wait (only on 429 responses)
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1709712000
Retry-After: 12
Content-Type: application/json
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after 12 seconds.",
"details": []
},
"request_id": "req_abc123def456"
}

All errors follow a consistent JSON envelope, making it straightforward to build generic error handling.

{
"error": {
"code": "validation_error",
"message": "Field 'email' is required.",
"details": [
{
"field": "email",
"reason": "required",
"message": "Email address must be provided for contact identification."
}
]
},
"request_id": "req_7x9k2m4p1n"
}
CodeMeaningWhen
200OKSuccessful read or update
201CreatedResource successfully created
400Bad RequestMalformed JSON or invalid parameters
401UnauthenticatedMissing or invalid API key
403ForbiddenValid key but insufficient scopes
404Not FoundResource does not exist
409ConflictDuplicate resource or version conflict
422Unprocessable EntityValid JSON but fails business logic validation
429Rate LimitedToo many requests — check Retry-After
500Internal Server ErrorSomething broke on our end — retry is safe

All list endpoints use cursor-based pagination for consistent performance regardless of dataset size.

ParameterTypeDefaultDescription
cursorstring(none)Opaque cursor from a previous response
limitinteger25Number of items to return (max: 100)
{
"data": [
{ "id": "cntct_abc", "email": "alice@example.com" },
{ "id": "cntct_def", "email": "bob@example.com" }
],
"has_more": true,
"next_cursor": "eyJpZCI6ImNudGN0X2RlZiJ9"
}

To fetch the next page, pass next_cursor as the cursor parameter:

GET /v1/contacts?cursor=eyJpZCI6ImNudGN0X2RlZiJ9&limit=25

JavaScript SDK

Wraps both Ingest and Management APIs. Auto-batches events, handles retries, and provides TypeScript types. Works in browser and Node.js.

Web Components

Drop-in embeddable widgets for referral forms, waitlist signups, survey popups, and social proof toasts. Framework-agnostic — works with React, Vue, Svelte, or plain HTML.

Server SDKs

Node.js — available now. Python and Go — planned. All server SDKs use the Management API with secret key auth.

REST Direct

No SDK needed — call the REST API directly from any language. All endpoints accept and return JSON with standard HTTP conventions.

Terminal window
npm install @growthos/sdk
import GrowthOS from '@growthos/sdk';
// Client-side — uses Ingest API
const gos = GrowthOS.init({
writeKey: 'gos_wk_your_write_key',
});
gos.identify('user_123', {
email: 'alice@example.com',
plan: 'growth',
});
gos.track('Feature Activated', {
feature: 'referral_program',
});