★loops
Developer docs

One request per customer.
Loops does the rest.

Call the API right after a sale, visit or appointment from your POS, CRM or booking tool. Loops emails the enquiry, classifies the answer, sends the follow-up and the reminder, and keeps your board up to date.

The API is optional. You can also add customers by hand, import a CSV or share a link from the dashboard.

No code: Zapier, Make, n8n

Connect the tool you already use. Five steps, no developer required.

  1. 1
    Pick the trigger in your app

    New order, appointment completed, invoice paid, booking checked out. Whatever means "the job is done".

  2. 2
    Add the action "Webhooks by Zapier"

    Choose the event "Custom Request". Set Method to POST and paste the URL.

    URL
    https://yourdomain.com/api/v1/enquiries
  3. 3
    Add two headers

    In the Headers section, one per line: key on the left, value on the right.

    Headers
    Authorization: Bearer lk_YOUR_API_KEY
    Content-Type: application/json
  4. 4
    Map the data

    Set Data Pass-Through to false and paste the JSON. Replace the values with fields from your trigger. send_after_days is optional: 0 sends now, 2 waits two days.

    Data (JSON)
    {
      "name": "{{first_name}} {{last_name}}",
      "email": "{{email}}",
      "ref": "{{order_id}}",
      "send_after_days": 1
    }
  5. 5
    Test, then publish

    Zapier shows a 202 with "status": "queued". Turn the Zap on and every new event sends an enquiry.

Every request needs an API key from the API section. Keys are per business; revoke and regenerate any time. Customers contacted in the last 30 days are skipped automatically.

Authentication

Every request carries your business's API key as a Bearer token. Replace lk_YOUR_API_KEY with a key generated above.

Authorization: Bearer lk_YOUR_API_KEY
POST/api/v1/enquiries— Send one enquiry

Call it right after the sale, visit or appointment. Loops emails the enquiry, classifies the answer and handles the follow-up email automatically.

FieldTypeDescription
email*stringThe customer's email address.
namestringUsed to personalize the email ("Hi Emma,").
refstringYour own reference (order id, visit id…). Stored on the contact.
forcebooleanSend even if this customer was contacted in the last 30 days.
send_after_daysintegerWait this many whole days before the first email (0–365, default 0). Useful right after a booking: ask once the visit is over. Shows as "sends in N days" on your board, where it can be stopped.
curl -X POST https://yourdomain.com/api/v1/enquiries \
  -H "Authorization: Bearer lk_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Emma Clarke", "email": "emma@example.com", "send_after_days": 1}'
Response · 202
{ "status": "queued", "id": "jh7…" }
POST/api/v1/enquiries— Send in bulk

Same endpoint — send an array instead of a single object. Up to 500 customers per call, each processed with the same rules (30-day dedupe included).

FieldTypeDescription
customers*arrayUp to 500 objects, each with email (required), name, ref and send_after_days — same meaning as the single call.
forcebooleanApplies to every customer in the batch.
send_after_daysintegerDefault delay for every customer in the batch; a per-customer value wins.
curl -X POST https://yourdomain.com/api/v1/enquiries \
  -H "Authorization: Bearer lk_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customers": [
      {"name": "Emma Clarke", "email": "emma@example.com"},
      {"name": "Liam Parker", "email": "liam@example.com"}
    ]
  }'
Response · 202
{
  "status": "accepted",
  "summary": { "queued": 2, "already_invited": 1 },
  "results": [
    { "email": "emma@example.com", "status": "queued", "id": "jh7…" },
    { "email": "liam@example.com",  "status": "queued", "id": "jh7…" },
    { "email": "rui@example.com",   "status": "already_invited" }
  ]
}
Status codes
202Accepted — emails go out within seconds. Bulk responses include a per-customer breakdown.
409Customer already got an enquiry in the last 30 days (single call). Pass "force": true to send anyway.
401API key missing, invalid or revoked.
402No active subscription for this business.
413Bulk batch larger than 500 customers — split it.
422Invalid email address or empty customer list.

What happens next

  1. 1Enquiry email

    Sent within seconds, under your business name, with the one-tap scale embedded.

  2. 2Classification

    The first tap is normalized to the 0–10 NPS scale and the customer lands on your board.

  3. 3Follow-up

    A warm thank-you with a direct link to your review page, for everyone who answers, whatever their score. Any comment they add lands on your board.

  4. 4Reminder

    One reminder to people who didn't answer, after the number of days you set, with the question and your review link. Then it stops.

Customers already contacted in the last 30 days are skipped unless you pass force. Unsubscribes are honoured automatically, and every email carries a one-click unsubscribe header.

Get an API key in the dashboard

Keys are per business, shown once, and revocable any time from the API tab.

Start in 5 minutes