Changelog
All notable changes to the Referral Reactor API are documented here in reverse chronological order. Entries are categorized as Added, Changed, Deprecated, or Removed. Breaking changes are marked with a [Breaking] label.
v1.11.0 — 2026-10-14
Added
- Admin notes on CRM customers:
GETandPOST /api/v1/customers/{id}/admin-notes,PATCHandDELETE /api/v1/customers/{id}/admin-notes/{noteId}. They work like user and referral notes: admins only, organization keys may read (withcustomers:read) but not write, and only a note's author can edit or delete it. Returns 403 when the organization's CRM is turned off. - Organization key scope
referrals:delete(not granted by default).
Changed
- Organization API keys can now edit referrals:
PATCH /api/v1/referrals/{id}(details, custom fields, status, referrer),POST /api/v1/referrals/{id}/restamp-company, and the photo endpoints (POST /photos/upload-url,POST /photos,DELETE /photos/{storageId}) needreferrals:write. Changes made with an organization key show no person in the referral's history, and the referrer's notification names your organization. DELETE /api/v1/referrals/{id}with an organization key needs the newreferrals:deletescope, which isn't granted by default. Personal keys are unchanged: super admins only.
v1.10.0 — 2026-10-13
Added
- Invitation codes:
GETandPOST /api/v1/invitation-codes,GET,PATCHandDELETE /api/v1/invitation-codes/{id}, andGET /api/v1/invitation-codes/{id}/qr(a PNG QR code of the code'sjoin_url). Admins and organization keys manage every code; a marketer manages the codes they created. A used code can only be deactivated. New scopes:invitation-codes:read,invitation-codes:write. - Public referral links:
GETandPOST /api/v1/public-links. Organization links and the caller's own links, each with its fullurl. New scopes:public-links:read,public-links:write. - Associations:
GETandPOST /api/v1/users/{id}/associationsandDELETE /api/v1/users/{id}/associations/{associationId}. Ending an association keeps it as ended (is_active: false,ended_at). Writes are for admins and organization keys. GET /api/v1/organizations/{id}/settings— Read-only organization settings, grouped like the Settings page: profile, branding, plan, referrers, referrals, bonus payments, public requests, BD portal and integrations.{id}is the organization's id, Clerk organization id or slug. Requiresorganizations:read; with a personal key, admins only. Bonus payment settings need bonus access (organization keys:bonus-payments:read).
Changed
- Organization keys can create and edit invitation codes, organization links and associations; they're recorded as the actor.
v1.9.0 — 2026-10-13
Added
- Referral stats and reports, read from the same totals as the app's dashboard and reports:
GET /api/v1/stats/referrals,GET /api/v1/reports/referrals(per month or week, optionally grouped by referrer or company),GET /api/v1/reports/top-referrers,GET /api/v1/reports/top-companiesandGET /api/v1/reports/bd-standings. Date ranges cover whole months or weeks and are capped at 24 months. Rates are fractions from 0 to 1. - New
reports:readscope for organization API keys. Payout figures also needbonus-payments:read. POST /api/v1/bonus-payments— Creates a bonus payment draft. It never sends money: a person reviews it in the app and chooses Approve and send or Discard. Personal API keys only, for super admins and people with Can send bonuses (organization keys get 403). Send anidempotency_keyto make retries safe. The201response (and a200replay) includesid,status,awaiting_approvaland anapproval_urlwhere a person approves or discards the draft.- Items from
GET /api/v1/bonus-paymentscarryawaitingApproval: truewhile a payment is a draft. The field is absent otherwise. Drafts are listed only for organization keys and for people who can send bonuses.
Changed
POST /api/v1/bonus-paymentsreturns 409 when anidempotency_keywas already used with a different request, and 429 when the caller drafts too fast. A discarded draft frees itsidempotency_key.
v1.8.0 — 2026-10-12
Added
- Conversations and messages:
GET /api/v1/conversations,GETandPOST /api/v1/conversations/{id}/messages,POST /api/v1/conversations/{id}/read, andPOST /api/v1/referrals/{id}/conversation(gets or starts the referral's conversation). A person sees the conversations they're in, as in the app. Sending, starting a conversation and marking read need a personal API key. A sent message notifies everyone in the conversation exactly as one sent in the app. Images are read-only links. - Organization key scope
conversations:read(not granted by default) lets an organization key read every conversation and message.
v1.7.0 — 2026-10-12
Added
- BD portal endpoints for business developers, with personal API keys:
GET /api/v1/bd/overview(rank, figures, open task counts),GETandPOST /api/v1/bd/prospects,GETandPATCH /api/v1/bd/prospects/{id},GETandPOST /api/v1/bd/activities,GETandPOST /api/v1/bd/tasks,PATCHandDELETE /api/v1/bd/tasks/{id}, andGET /api/v1/bd/goals(read-only). - Reads take
bd_user_idto read another business developer's portal when the app allows it; any denial is a 404. Writes act on your own portal only. PATCH /api/v1/bd/tasks/{id}takes exactly one ofstatus(doneoropen),snooze: true, or task fields to edit.GET /api/v1/bd/activitiespages can hold fewer thanlimititems whilepagination.has_moreis true. Keep followingnext_cursor.- New tasks default to due tomorrow at 09:00 with a
pushreminder1h_before; activities default to today. "Today" usestime_zone, then your saved time zone, then UTC.
Changed
- The BD portal needs a personal API key and the Unlimited plan. Organization keys get 403. Without
bd_user_id, so does anyone who is not a business developer (a marketer, or an admin marked as a BDR); with it, anyone the app lets read that portal gets the data and everyone else a 404. Writes always need a business developer.
v1.6.0 — 2026-10-12
Added
GET /api/v1/referrals/{id}/timeline— The referral's history, newest first, with each event's type, actor, time, a short summary and a few safe details. Edited values, payout details and message text are never included.- Admin notes on users and referrals:
GETandPOST /api/v1/users/{id}/admin-notes,PATCHandDELETE /api/v1/users/{id}/admin-notes/{noteId}, and the same four under/api/v1/referrals/{id}/admin-notes. Admins only. Writes need a personal API key, and only a note's author can edit or delete it.
v1.5.0 — 2026-10-09
Added
GET /api/v1/referrals/{id}is documented, andPATCH /api/v1/referrals/{id}edits a referral's details, address, notes, custom fields, status and referrer in one call. Custom fields are merged (sendnullto clear one) and keys may be field names or IDs. A combined edit is all-or-nothing. ChangingreferrerIdis admin only.DELETE /api/v1/referrals/{id}— Deletes a referral (super admin only). Returns{ id, deleted: true }.POST /api/v1/referrals/{id}/restamp-company— Sets the referral's company to its referrer's current company.- Photos:
POST /api/v1/referrals/{id}/photos/upload-url,POST /api/v1/referrals/{id}/photosandDELETE /api/v1/referrals/{id}/photos/{storageId}. Upload flow: get an upload URL and token, upload the bytes (JPEG, PNG or WebP, up to 10 MB), then attach with bothuploadTokenandstorageId. A token covers one photo and expires after 24 hours. - New filters on
GET /api/v1/referrals:status(repeatable),search,label(repeatable),company,associated_user,created_from,created_to,updated_since,bonusandsort(created_desc,created_asc,updated_desc,updated_asc). For incremental sync, useupdated_since=<last sync>&sort=updated_asc. - Referral responses list
labelsas{ _id, text, color }.
Changed
- Referral edits, deletes, re-stamps and photo changes need a personal API key. Organization keys get 403.
- [Breaking] Cursors issued before this release may return 400
INVALID_CURSOR; restart from the first page. Restart from the first page whenever you changesortor any filter, too: a cursor reused with a different sort or filter may be refused withINVALID_CURSOR. - A page from
GET /api/v1/referralscan hold fewer thanlimititems whilemeta.hasNextis true. Keep followingmeta.nextCursor. - Bad
created_from,created_to,updated_since,sort,bonusorstatusvalues return 400 naming the parameter.bonusis refused for callers who can't see bonus totals (organization keys, plain admins, business developers, referrers). Before this release it was silently ignored, so an integration that sends it with an organization key now gets a 400. - The older names
statuses,searchQuery,labelIds,minDate,maxDate,bonusPaymentFilterandsortOrder(newest|oldest) still work. - A
labelorassociated_userthat isn't an ID in your organization returns 400. A malformed referral ID in the path returns 404. PATCH:lossReasonIdandlossReasonNoteonly apply to a referral that is cancelled or being cancelled; otherwise 400. Malformedaddress,customFieldValuesorreferrerIdvalues return 400 naming the field.PATCHcustom fields: only the fields you change are checked, so a value stored before the organization changed its fields (for example a removed dropdown option, or a required field added later) no longer blocks an unrelated edit.- When an edit changes both the referrer and the status, the status notification goes to the new referrer.
- Attaching a photo when the referral is at its plan's photo limit returns 403.
- The
Referralschema'sstatusvalues arenew,acknowledged,in_progress,completedandcancelled, and the list response envelope is documented as{ data: { data, meta }, requestId, timestamp }.
v1.4.0 — 2026-10-09
Added
GET /api/v1/companiesandGET /api/v1/companies/{id}— Companies with referrer and referral figures (credited by the company each referral was submitted under) and assigned BDRs. Requirescompanies:read. In the list,referral_countstops at 1,000 per company and a page reads at most 4,000 referrals in total; whenreferral_count_cappedistruethe count is a lower bound. The detail endpoint counts everything.PATCH /api/v1/companies/{id}— Rename a company or assign its BDR. Admins, personal API keys only.GET /api/v1/customersandGET /api/v1/customers/{id}— CRM customer records. Requirescustomers:readand the CRM turned on for the organization.- New API key scopes:
companies:read,customers:read.
v1.3.0 — 2025-06-01
Added
GET /api/v1/organizations/{id}/stats— Returns aggregate referral and payment statistics for an organization (requiresorganizations:readscope).- Webhook endpoint management via API:
POST /api/v1/webhooks,GET /api/v1/webhooks,GET /api/v1/webhooks/{id},PATCH /api/v1/webhooks/{id},DELETE /api/v1/webhooks/{id}. X-ReferralReactor-Request-Idresponse header on all endpoints — matches therequestIdfield in error bodies for easier log correlation.
Changed
- Rate limit window increased from 15 minutes to 60 minutes. The
X-RateLimit-Resetheader now reflects the longer window. Existing integrations are unaffected unless they relied on the 15-minute reset cadence.
v1.2.0 — 2025-04-14
Added
GET /api/v1/files/{storageId}— Retrieves a signed download URL for a file stored in Referral Reactor (e.g. referral photos). Requiresreferrals:readscope. Signed URLs expire after 1 hour.
v1.1.0 — 2025-03-03
Added
searchquery parameter onGET /api/v1/referrals— Full-text search across referral names and notes. Minimum 2 characters required.GET /api/v1/users/{id}— Retrieve a single user by their ID. Requiresusers:readscope.- Pagination support (
pageandlimitquery parameters) onGET /api/v1/usersandGET /api/v1/referrals. Default page size is 50; maximum is 200.
Changed
- [Breaking]
GET /api/v1/referralsresponse shape changed: the top-level array is now wrapped in a{ data: [...], pagination: { ... } }envelope to support pagination. Update any code that reads the response directly as an array.
v1.0.0 — 2025-01-20
Initial public release of the Referral Reactor REST API.
Added
- Authentication — Clerk-issued Bearer token authentication with five scopes:
referrals:read,referrals:write,users:read,users:write,organizations:read. - Rate limiting — Sliding-window rate limiting per API key with
X-RateLimit-Limit,X-RateLimit-Remaining, andX-RateLimit-Resetresponse headers. GET /api/v1/health— Unauthenticated health check endpoint.GET /api/v1— Returns API version and available endpoints.GET /api/v1/referrals— List referrals for the authenticated organization (requiresreferrals:read).POST /api/v1/referrals— Submit a new referral (requiresreferrals:write).GET /api/v1/users— List users in the organization (requiresusers:read).POST /api/v1/users— Create a new user (requiresusers:write).GET /api/v1/organizations— Retrieve organization details (requiresorganizations:read).- Webhook system — 15 event types across referrals, bonus payments, and users. HMAC-SHA256 signature verification, 5-attempt exponential backoff retry policy, and auto-disable on repeated failures.
- Consistent error shapes — All error responses include
code,message, andrequestIdfields.
Next Steps
- Getting Started — Make your first API call
- Authentication — API key scopes and rate limiting
- API Reference — Interactive reference for all endpoints
- Webhooks — Event types and signature verification