Akteora API docs

Public walls

Every brand can have a public page on Akteora: https://akteora.com/b/{slug}, listing its approved testimonials with their words, a permalink for each one, and structured data for search engines. This page is for developers who want the same content in their own server-rendered pages, or who need to know what a brand's public address promises.

A wall shows a testimonial only while all of these hold:

That is exactly the rule the widget uses, decided by the same function.

Make a brand public

curl -X PATCH https://api.akteora.com/v1/brands/brd_01J8… \
  -H "$AUTH" -H 'content-type: application/json' \
  -d '{ "is_public": true, "slug": "northwind" }'
{
  "id": "brd_01J8…",
  "slug": "northwind",
  "is_public": true,
  "public_wall_url": "https://akteora.com/b/northwind",
  "logo_url": "https://cdn.akteora.com/l/Zq3…w.png",
  "…": "…"
}

Read a wall

These routes need no authentication. They are what akteora.com itself renders from.

curl https://api.akteora.com/public/walls/northwind?page=1
{
  "brand": {
    "name": "Northwind",
    "slug": "northwind",
    "logo_url": "https://cdn.akteora.com/l/Zq3…w.png",
    "accent_color": "#1a73e8"
  },
  "wall_url": "https://akteora.com/b/northwind",
  "url": "https://akteora.com/b/northwind",
  "testimonial_count": 31,
  "rating": { "average": 4.8, "count": 27 },
  "indexable": true,
  "page": 1,
  "page_count": 2,
  "page_size": 24,
  "testimonials": [
    {
      "id": "sub_01J8Z3…",
      "kind": "video",
      "name": "Maria Lopez",
      "title": "Head of Operations",
      "company": "Harbour Dental",
      "rating": 5,
      "date": "2026-08-30",
      "text": "We had the whole team onboarded in an afternoon…",
      "video_url": "https://cdn.akteora.com/m/k9Xb…/video.mp4",
      "audio_url": null,
      "poster_url": "https://cdn.akteora.com/m/k9Xb…/poster.jpg",
      "duration_ms": 42000,
      "language": "en",
      "captions": [{ "start_ms": 0, "end_ms": 2400, "text": "We had the whole team…" }],
      "source": null
    }
  ]
}
Route Returns
GET /public/walls/{slug}?page={n} One page of a wall: 24 testimonials, newest approval first.
GET /public/walls/{slug}/testimonials/{id} One testimonial with its wall's summary: url is its permalink.
GET /public/walls Every public brand with the id and address of each testimonial on its wall: what a sitemap is built from.

What these promise:

On akteora.com

Structured data: each wall is a schema.org Organization with an AggregateRating, and each testimonial that has a rating and a name is a Review. A testimonial without either, and any review imported from another site, is shown but not marked up. Google may choose not to show star ratings for these pages: its guidelines exclude reviews that the reviewed business controls, and a brand chooses what it publishes.

When a customer asks to be removed

A customer who gave an email address receives a confirmation with a personal link, https://akteora.com/remove/{token}. It asks before it does anything; confirming hides the testimonial everywhere at once and erases it for good (recording, words and details) moments later. The token exists only in that email. Integrations do not need to do anything, but anything you copied out of Akteora (an exported file, a re-hosted video) is yours to remove.

POST /public/removals/lookup and POST /public/removals (both with { "token": "…" }) are the page's own calls; they are listed in the OpenAPI document for completeness.