API reference

The Ripllo API is a REST API that uses JSON for both requests and responses. It's the same API our portal and SDKs use; if you want to integrate Ripllo directly without an SDK, this section covers everything you need.

Base URL

https://ripllo.com

All API routes live under /api/v1. There's no separate api. subdomain — the marketing site and the API share the apex.

For staging:

https://staging.ripllo.com

Staging keys are minted separately from production keys; they don't cross.

Authentication

Every request must be signed. The Ripllo API uses HMAC-SHA256 request signing with an access key ID + secret pair.

Two headers per request:

Header What it is
Authorization Ripllo-HMAC-SHA256 keyId=<id>, scope=*, signature=<hex>
X-Ripllo-Timestamp Current epoch seconds (must be within 300 seconds of server time)

Optional headers:

Header When to use
Idempotency-Key For mutating endpoints you might retry. Must be in the string-to-sign if present.
X-Ripllo-On-Behalf-Of Only for keys with ripllo:platform:admin scope. Rescopes the call to a downstream merchant.

The signing string is:

<METHOD>
<path>             (without query string)
<timestamp>
<sha256-hex(body)>
[<idempotency-key>]    (optional, if present)

See Authentication for the full signing recipe with worked examples.

The SDKs handle all this transparently. You only need to compute signatures manually with raw HTTP.

Response envelope

Every successful API response is wrapped in a uniform envelope — the same @forjio/sdk/http shape every Forjio product uses:

{
  "data": { /* the response payload */ },
  "error": null,
  "meta": {
    "requestId": "req_01H...",
    "timestamp": "2026-05-12T10:42:00Z"
  }
}

List endpoints have a paginated variant with meta.page.nextCursor and meta.page.hasMore.

Errors keep the envelope shape but set error:

{
  "data": null,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "value must be a positive integer",
    "field": "value"
  },
  "meta": { "requestId": "...", "timestamp": "..." }
}

Resources

The API is organized by resource. Each maps to a section of the dashboard:

Resource Path prefix
Discount codes /api/v1/discount-codes
Referrals /api/v1/referrals
Abandoned cart /api/v1/abandoned-cart
Pixels /api/v1/pixels
Feeds /api/v1/feeds
Blog /api/v1/blog
Marketing campaigns /api/v1/marketing-campaigns
Contacts /api/v1/contacts
Contact lists /api/v1/contact-lists
Audience segments /api/v1/audience-segments
Funnels /api/v1/funnels
Channels /api/v1/channels
Integrations /api/v1/integrations
Campaigns (creator marketplace) /api/v1/campaigns
Programs (affiliate marketplace) /api/v1/programs
Collaborations /api/v1/collaborations
Inbox /api/v1/inbox
Insights /api/v1/insights
API keys /api/v1/api-keys
Webhooks /api/v1/webhooks
Audit log /api/v1/audit-log
Billing /api/v1/billing
Admin (partners) /api/v1/admin

Each resource follows a CRUD-like surface (GET list, GET :id, POST create, PATCH update, DELETE archive) with extras specific to that resource. See the SDK source for the exact method list per resource — the Node SDK is the most readable reference.

Idempotency

Mutating endpoints (POST, PUT, PATCH) accept an Idempotency-Key header. If you send the same key twice within 24 hours, you get back the same response — no duplicate operation. The SDKs auto-generate keys for create-style methods.

Internal flows that take an externalRef (e.g. discount-codes/redeem, abandoned-cart/reminders) are also idempotent on that field — retried partner webhooks won't double-write.

Rate limits

Default limits per workspace:

Endpoint class Limit
Read (GET) 100 req/sec
Write (POST/PUT/PATCH/DELETE) 20 req/sec

Limits are returned in response headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset). On exceeding the limit you get 429 Too Many Requests.

Partner billing (X-Ripllo-On-Behalf-Of)

If you're a platform (Storlaunch is the canonical example) calling Ripllo on behalf of one of your merchants, you mint a key with the ripllo:platform:admin scope and set the X-Ripllo-On-Behalf-Of header to the merchant's account ID (acc_<storlaunchAccountId>). Ripllo rescopes the entire request to that merchant's workspace and stamps both the partner ID and the on-behalf-of ID in the audit log.

Ordinary merchant keys (no admin scope) cannot use this header — you get 403 FORBIDDEN_ONBEHALF. See Authentication for the full mechanics.

Next

  • Authentication — the full HMAC signing recipe with worked examples.
  • SDKs — per-language guides.
  • Concepts — the data model the API exposes.