API changelog
Every change to the public API, newest first. Additive changes ship within v1; anything that
would break a client needs a new version path (versioning). The SDK's own changes
are in its CHANGELOG.
2026-11-07: Shopify privacy webhooks
/v1/integrations/shopify/compliance/customers-data-request,/customers-redactand/shop-redact, for Akteora's own Shopify app. Each takesshop_domain, Shopify'swebhook_idand Shopify'spayload, answers202withstatus(queued,duplicateorno_data), and does the work in the background. A repeatedwebhook_idis a no-op. Integration key only, like/install.
2026-11-06: text previews, and the Shopify integration
text_previewon every item ofGET /v1/submissions, searched or not: the start of the testimonial's own words (the text it is shown with, or the transcript of a video or audio), up to 200 characters, cut at a word boundary and ending in…when cut.nullwhen there are no words yet. Never rewritten. Additive./v1/integrations/shopify/installand/uninstall, for Akteora's own Shopify app. They take an integration key (integrationKeyin the spec), not an API key, and are not open to other integrations.- An organization billed by Shopify may set
show_attribution: falseon a widget on every plan.
2026-09-28: unlimited testimonials on paid plans
quotas.submissions_per_monthisnull(unlimited) forstarter,coreandplus. It is still counted, and still limited onfree.- The plan with id
coreis now named Agency (name). Its id is unchanged everywhere. - A plan's
featureslists only what is built today;custom_domain,white_label,sub_accountsandpriority_renderappear when they ship.
2026-09-27: importing reviews
POST /v1/imports,GET /v1/imports. Bring existing reviews into a brand as text testimonials, up to 500 rows a request, with an attestation. Scopesubmissions:write; for members, owners and admins. Importing reviews.- Testimonials have an
origin:collectedorimported, withsourceandreviewed_atfor imported ones. Neworiginfilter onGET /v1/submissionsand on exports. collect_link_idis nownullfor an imported testimonial, in the testimonial and, aslink_id, in webhook events (which also gainorigin). Collected testimonials are unchanged. A client that assumed the field was always a string should check fornull; there were no outside integrations when this shipped.- Widget and wall items gain
source,nullunless imported. - Public ratings count collected testimonials only: the wall's
rating, the widget heading's rating, andAggregateRatingmarkup. - New quota
imported_reviewsinGET /v1/billingand/v1/billing/usage, and as alimit.nameon402. - Exports: CSV gains
origin,source,source_urlandreviewed_atas the last four columns; JSON gainsorigin,sourceandreviewed_at.
2026-09-20: social sign-in for the dashboard
Operators can sign in with Google or GitHub as well as with an email and a password, which is
unchanged. Five session-only routes, listed in the reference for completeness:
GET/POST /v1/auth/social, GET /v1/auth/callback/{provider}, and
GET/POST/DELETE /v1/me/auth-methods….
Nothing here changes how an integration authenticates. API keys are the only way in for software, and these routes refuse keys as every session-only route does. They are documented because the dashboard has no private endpoints (ADR 0003), not because there is anything to call: a browser and a person are needed for all of them.
2026-09-15: the public API
- API keys.
Authorization: Bearer rk_live_…, with eleven scopes, made and revoked in the dashboard (GET,POST /v1/api-keys,DELETE /v1/api-keys/{id}, for signed-in owners and admins, never for keys). Authentication. - Test mode.
rk_test_…keys work on a separate sandbox with small allowances of its own. - Webhooks.
submission.created,submission.ready,submission.approved,submission.rejected,reel.ready,reel.failed,export.ready; signed with HMAC-SHA256; retried for 21 hours; a delivery log with every attempt, and replay./v1/webhooks…. Webhooks. - Per-key and per-organisation rate limits, with
RateLimit-*headers on every response. - Errors: new
insufficient_scope(403, withrequired_scope). - The OpenAPI document describes every event in its
webhookssection, and every request, response and path parameter has a real example. @akteora/sdk1.0.0 on npm.
2026-09-14: plans and billing
GET /v1/billing, GET /v1/billing/usage, POST /v1/billing/checkout, /portal,
/change-plan; limit.upgrade_url on every 402; closed-link reason paused.
Plans and billing.
2026-09-14: reels
/v1/reels and its clips, render and share routes; GET /v1/reels/music; the limit
render_seconds_per_month. Reels.
2026-09-13: public walls
public_wall_url on brands; GET /public/walls, /public/walls/{slug},
/public/walls/{slug}/testimonials/{id}; POST /public/removals and /public/removals/lookup.
Public walls.
2026-09-13: the widget
/v1/widgets and POST /v1/widgets/preview; the public widget document format.
Widget.
2026-09-13: moderation, tags and exports
POST /v1/exports/preview; /v1/tags; tagging a testimonial; tag_id and is_public filters;
rejected_at and rejection_reason; public_media and GET /v1/submissions/{id}/media/{variant};
the plan_limit_exceeded error. Exports, media.
2026-09-12: transcripts, search, written testimonials
Transcripts with word timings (GET, PATCH /v1/submissions/{id}/transcript); sentiment;
search with q; written and spoken-then-written testimonials (text_input, text_source,
original_text).
2026-09-10: the first routes
Brands, collect links, the capture routes, and submissions with direct-to-storage uploads.