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/enquiriesSend one enquiry

Call it right after the sale, visit or appointment. Loops emails the enquiry, classifies the answer and handles the review ask automatically.

FieldTypeDescription
email*stringThe customer's email address.
namestringUsed to personalize the email ("Hi Maria,").
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": "Maria Silva", "email": "maria@example.com", "send_after_days": 1}'
Response · 202
{ "status": "queued", "id": "jh7…" }
POST/api/v1/enquiriesSend 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": "Maria Silva", "email": "maria@example.com"},
      {"name": "João Pereira", "email": "joao@example.com"}
    ]
  }'
Response · 202
{
  "status": "accepted",
  "summary": { "queued": 2, "already_invited": 1 },
  "results": [
    { "email": "maria@example.com", "status": "queued", "id": "jh7…" },
    { "email": "joao@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, plus a private feedback box for anyone who wasn't happy.

  4. 4Reminder

    One reminder to people who didn't answer, after the number of days you set. 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