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…" }]
    }
  ]
}
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 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.