KiwiProof

API docs

A read-only REST API for your spaces and testimonials. It can’t create, edit or delete anything. Included in the Solo and Pro plans. Base URL: https://kiwiproof.app/api/v1

Authentication

Create a key in Dashboard → Account → API keys. The key is shown once: we only keep a hash of it, so copy it somewhere safe. Send it in the X-API-KEY header (Authorization: Bearer <key> works too). A key reads only the spaces of the account that created it. Revoke a key on the same page: requests with it stop working right away.

curl https://kiwiproof.app/api/v1/testimonials -H "X-API-KEY: kp_your_key"
  • 401 missing, unknown or revoked key.
  • 402 the account has no Solo or Pro plan.
  • 429 more than 60 requests in a minute with one key (retry after the Retry-After seconds).
  • 400 a bad query parameter (the error field says which), 404 a space that isn’t yours.

GET/api/v1/spaces

Your spaces, oldest first: id, slug, name, created_at, form_url, wall_url.

{ "data": [{ "id": "0b9e…", "slug": "acme", "name": "Acme", "created_at": "…",
            "form_url": "https://kiwiproof.app/c/acme", "wall_url": "https://kiwiproof.app/wall/acme" }] }

GET/api/v1/testimonials

Testimonials of your spaces, newest first. Query parameters, all optional:

  • status: approved (default), pending, rejected or all.
  • space: a space id or slug (default: all your spaces).
  • since: an ISO 8601 date, only newer testimonials. Approved testimonials are dated by approval time, the other statuses by the time they were sent.
  • limit: 1 to 100 (default 25). When a page is full, pass its next_before value as before to get the next one.
{
  "data": [
    {
      "id": "6f1c…",
      "space": { "id": "0b9e…", "slug": "acme", "name": "Acme" },
      "status": "approved",
      "author_name": "Ada Lovelace",
      "author_title": "CTO, Analytical Engines",
      "rating": 5,
      "text": "We set it up in ten minutes.",
      "photo_url": "https://kiwiproof.app/api/photo/6f1c…",
      "video_url": null,
      "source": "form",
      "source_url": null,
      "tags": ["onboarding"],
      "public_answers": [{ "label": "What did you buy?", "value": "Pro" }],
      "created_at": "2026-10-12T09:30:00.000Z",
      "approved_at": "2026-10-12T10:02:11.000Z"
    }
  ],
  "next_before": null
}

Never in a response: the reviewer’s private answers (only answers to questions you marked public, when the reviewer agreed to show them), an email field, or import metadata. photo_url is set for approved testimonials with a photo.

GET/api/v1/zapier/testimonials

For the polling triggers of Zapier (“Webhooks by Zapier → Retrieve Poll”) and Make (HTTP module on a schedule): the same items and filters as /api/v1/testimonials, as a plain JSON array, newest first, up to 50 (limit is capped at 50 here). Each item has a unique id, which both tools use to fire once per new testimonial.

  • New approved testimonial: https://kiwiproof.app/api/v1/zapier/testimonials
  • Every new testimonial, before review: https://kiwiproof.app/api/v1/zapier/testimonials?status=all
  • Add the header X-API-KEY with your key.
  • A poll sees the 50 newest items: when more arrive between two polls (a large CSV import), only 50 of them fire the trigger. Use /api/v1/testimonials with paging to read them all.

Want a push instead of polling? Space settings → Alerts → Webhook sends a signed POST the moment a testimonial arrives or is approved.