Developer documentation

Plausa API

A REST API to pipe your testimonials into your website, CRM or internal dashboards. JSON responses, key-based auth, data scoped strictly to your account. The API ships with the Business plan.

Authentication

Generate a key in Billing → API keys, then send it in the x-api-key header (Authorization: Bearer also works). A key only unlocks its own account's data, and stops working the moment it is revoked or the account leaves the Business plan.

curl https://plausa.lovable.app/api/public/v1/stats \
  -H "x-api-key: plausa_sk_xxxxxxxxxxxx"

Limits and security

  • 120 requests per minute per key; beyond that you get a 429 with a Retry-After header.
  • Every response is filtered on the key owner: no cross-account access, ever.
  • Up to 5 active keys per account, with instant rotation and revocation from the dashboard.
  • The full secret is shown once; only its hash is stored.

Endpoints

GET/api/public/v1/testimonials

Lists the account's testimonials, filterable by sentiment and detected theme.

Parameters

  • limit Result count, 1 to 100 (default 50).
  • offset Pagination offset (default 0).
  • status new | approved | hidden
  • sentiment very_positive | positive | neutral | mixed
  • theme Stable theme key, e.g. customer-support
  • medium text | video

Example request

curl "https://plausa.lovable.app/api/public/v1/testimonials?status=approved&sentiment=very_positive&limit=20" \
  -H "x-api-key: plausa_sk_xxxxxxxxxxxx"

Example response

{
  "data": [
    {
      "id": "6f1c…",
      "author_name": "Claire Meunier",
      "author_role": "Head of Sales, Kairo",
      "rating": 5,
      "medium": "text",
      "source": "link",
      "body_original": "…",
      "body_polished": "…",
      "published_version": "polished",
      "source_locale": "fr",
      "translations": { "en": "…", "es": "…" },
      "sentiment": "very_positive",
      "sentiment_summary": "…",
      "themes": [{ "key": "customer-support", "labels": { "fr": "Support client", "en": "Customer support", "es": "Soporte" } }],
      "status": "approved",
      "created_at": "2026-08-14T09:12:00.000Z"
    }
  ],
  "count": 1,
  "total": 37,
  "limit": 50,
  "offset": 0
}
GET/api/public/v1/forms

Lists collection forms, or a single one by slug.

Parameters

  • slug Form or wall slug.

Example request

curl https://plausa.lovable.app/api/public/v1/forms \
  -H "x-api-key: plausa_sk_xxxxxxxxxxxx"

Example response

{
  "data": [
    {
      "id": "b21e…",
      "slug": "kairo-2026",
      "name": "Clients Kairo",
      "title": "Racontez-nous votre expérience",
      "questions": ["…", "…"],
      "locale": "fr",
      "is_active": true,
      "testimonial_count": 12,
      "public_url": "https://plausa.lovable.app/t/kairo-2026",
      "created_at": "2026-07-02T10:00:00.000Z"
    }
  ],
  "count": 1
}
POST/api/public/v1/forms

Creates a collection form and returns its public link.

Parameters

  • body JSON body: name, title, intro, accentColor, questions (1-5), locale, isActive.

Example request

curl -X POST https://plausa.lovable.app/api/public/v1/forms \
  -H "x-api-key: plausa_sk_xxxxxxxxxxxx" \
  -H "content-type: application/json" \
  -d '{
    "name": "Clients Kairo",
    "title": "Racontez-nous votre expérience",
    "intro": "2 minutes, pas plus.",
    "accentColor": "#1F4B43",
    "questions": ["Quel problème cherchiez-vous à résoudre ?"],
    "locale": "fr"
  }'

Example response

{
  "data": {
    "id": "d4a9…",
    "slug": "k3f9a2",
    "public_url": "https://plausa.lovable.app/t/k3f9a2"
  }
}
GET/api/public/v1/walls

Fetches a wall's metadata and, with a slug, its approved testimonials.

Parameters

  • slug Form or wall slug.
  • locale fr | en | es — language of the returned testimonials.

Example request

curl "https://plausa.lovable.app/api/public/v1/walls?slug=kairo&locale=en" \
  -H "x-api-key: plausa_sk_xxxxxxxxxxxx"

Example response

{
  "data": {
    "id": "9ac1…",
    "slug": "kairo",
    "title": "Ils parlent de nous",
    "brand_name": "Kairo",
    "layout": "masonry",
    "locale": "en",
    "public_url": "https://plausa.lovable.app/wall/kairo",
    "embed_url": "https://plausa.lovable.app/embed/kairo",
    "items": [{ "id": "6f1c…", "authorName": "Claire Meunier", "body": "…", "rating": 5 }],
    "item_count": 24
  }
}
GET/api/public/v1/stats

Baseline account stats: volumes, sentiment split, ratings, themes.

Parameters

No parameters.

Example request

curl https://plausa.lovable.app/api/public/v1/stats \
  -H "x-api-key: plausa_sk_xxxxxxxxxxxx"

Example response

{
  "data": {
    "testimonials": {
      "total": 37,
      "last_30_days": 9,
      "by_status": { "approved": 30, "new": 7 },
      "by_sentiment": { "very_positive": 21, "positive": 14, "neutral": 2 },
      "by_medium": { "text": 28, "video": 9 },
      "average_rating": 4.78
    },
    "top_themes": [{ "key": "customer-support", "count": 11 }],
    "forms": 3,
    "walls": 2
  }
}

Interactive explorer (OpenAPI)

Try every endpoint straight from this page: hit “Authorize”, paste your Business key, then “Try it out” on any operation. Request and response schemas come from the OpenAPI 3.1 contract.

Download the openapi.json contract

Error codes

401
Missing, unknown or revoked key.
403
Account is not (or no longer) on the Business plan.
400 / 422
Invalid filter value or rejected JSON body.
402
Plan quota reached while creating a resource.
429
Rate limit exceeded.

Ready to wire it up?

The API is part of the Business plan, alongside white label and team seats.

See pricing