Confirm every drop with one API call.

Send AnyoneIn the order. It emails, texts and calls the customer, understands whatever they reply, and sends your system a signed webhook with the answer.

  • REST + JSON5 endpoints
  • Signed webhooksHMAC-SHA256
  • SandboxReply as the customer
curl -X POST \
  https://api.anyonein.co.uk/v1/confirmations \
  -H "Authorization: Bearer $ANYONEIN_KEY" \
  -H "Content-Type: application/json" \
  -d @priya-sofa.json

HTTP/1.1 201 Created

{
  "confirmation": {
    "id": "cf_7d2a9c41e0b3f658",
    "status": "scheduled",
    "customer": { "first": "Priya" },
    "order": { "date": "2026-10-13",
               "window": { "from": "08:00", "to": "12:00" } },
    "steps": [
      { "channel": "email", "state": "pending" },
      { "channel": "sms",   "state": "pending" },
      { "channel": "call",  "state": "pending" }
    ]
  }
}

Sunday 11 October · 12:41

Priya replied to the text

I’m at work but my partner Jo will sign

Webhook POST /webhooks/anyonein200
X-AnyoneIn-Signature: sha256=9f2c41e8…1f20468 verified
{
  "type": "confirmation.updated",
  "data": {
    "id": "cf_7d2a9c41e0b3f658",
    "status": "confirmed",
    "outcome": {
      "intent": "alternate_signer",
      "summary": "Confirmed; partner Jo will sign.",
      "signerName": "Jo",
      "channel": "sms"
    }
  }
}
A curl request creates a confirmation for Priya’s sofa delivery on 13 October, 8am to 12pm. The API responds 201 with status scheduled and three pending steps: email, text and call. Two days later Priya replies to the text that her partner Jo will sign, and a signed confirmation.updated webhook arrives with status confirmed.

Send an order and get the outcome back by webhook.

Send the customer, the items, the date and window, and the slots you could offer instead. AnyoneIn plans the conversation and works through it on its own.

curl -X POST https://api.anyonein.co.uk/v1/confirmations \
  -H "Authorization: Bearer $ANYONEIN_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "HF-100482",
    "brand": {
      "name": "Harlow & Finch",
      "colors": { "primary": "#1F3A5F" },
      "supportEmail": "help@harlowandfinch.co.uk",
      "tone": "warm, clear and brief"
    },
    "customer": {
      "name": "Priya Shah",
      "phone": "07700 900123",
      "email": "priya@example.com"
    },
    "order": {
      "ref": "HF-100482",
      "type": "delivery",
      "date": "2026-10-13",
      "window": { "from": "08:00", "to": "12:00" },
      "items": [{ "name": "Marlow 3-seat sofa", "qty": 1, "sku": "MAR-3S-OAT" }],
      "address": { "line1": "14 Albert Road", "city": "Bristol", "postcode": "BS2 0XA" },
      "rescheduleOptions": [
        { "date": "2026-10-15", "window": { "from": "08:00", "to": "12:00" } }
      ]
    },
    "cadence": "standard",
    "webhookUrl": "https://example.com/webhooks/anyonein"
  }'

What happens next on the standard cadence

  1. Email

    Three one-tap buttons: I’ll be in, someone else will be in, I need a different day.

  2. Text

    If the email went unanswered. Plain-English replies are understood.

  3. AI phone call

    A natural voice that says it’s automated, and rebooks on the spot.

  4. Webhook

    confirmation.updated, signed, with the status and a one-line summary.

Any reply pauses the plan. A clear answer closes it. Texts and calls only go out between 9am and 8pm.

Send your first confirmation.

Most teams have their first confirmation running in the sandbox in about 30 minutes, most of it reading.

  1. 01

    Get a sandbox key

    We send it with your webhook signing secret. Keep both on your server. In the sandbox nothing reaches a real phone or inbox.

    Ask for a sandbox key
    export ANYONEIN_KEY="your-sandbox-key"
    
    curl https://api.anyonein.co.uk/v1/confirmations?limit=1 \
      -H "Authorization: Bearer $ANYONEIN_KEY"
    # {"confirmations":[]}
  2. 02

    Create a confirmation

    Customer, date, window, at least one item. Use "cadence": "demo" while testing and the steps run about 90 seconds apart.

    Every field, explained
    curl -X POST https://api.anyonein.co.uk/v1/confirmations \
      -H "Authorization: Bearer $ANYONEIN_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "customer": { "name": "Priya Shah", "phone": "07700 900123", "email": "priya@example.com" },
        "order": {
          "date": "2026-10-13",
          "window": { "from": "08:00", "to": "12:00" },
          "items": [{ "name": "Marlow 3-seat sofa" }]
        },
        "cadence": "demo",
        "webhookUrl": "https://example.com/webhooks/anyonein"
      }'
  3. 03

    Receive the webhook

    Reply as the customer in the sandbox console. When there’s an answer, a signed confirmation.updated event lands on your endpoint.

    Webhooks in depth
    POST /webhooks/anyonein HTTP/1.1
    Content-Type: application/json
    X-AnyoneIn-Signature: sha256=9f2c41e8d0b7a6f3c5e1d2b4a7968f0e3c1b5a2d4e6f8091a3b5c7d9e1f20468
    
    {"type":"confirmation.updated","data":{"id":"cf_7d2a9c41e0b3f658","status":"confirmed",…}}

Each confirmation keeps its full history.

A confirmation carries the order, the plan, every message in and out, and the answer. Four ideas cover the whole API.

confirmation

Confirmation

One delivery or collection being checked with one customer. You create it; it closes itself when there’s an answer.

"id": "cf_7d2a9c41e0b3f658",
"status": "in_progress"

steps[]

Steps

The plan: an email, then a text, then a call, each with a dueAt and a state. A reply pauses them.

{ "channel": "sms",
  "state": "delivered" }

events[]

Events

The timeline: messages out, replies in, each line of the call, and what the agent understood from them.

{ "kind": "in", "channel": "sms",
  "text": "my partner Jo will sign" }

outcome

Outcome

The answer, as an intent and a one-line summary for ops, plus the signer’s name or the new slot.

"intent": "alternate_signer",
"signerName": "Jo"

Statuses

Two open states, five ways to close.

scheduled in_progress
  • confirmed

    Someone will be in, maybe a named signer. Dispatch.

  • rescheduled

    They picked one of your other slots. Move the booking.

  • action_needed

    A different day, cancel, wrong person, opt-out or wants a person.

  • unreachable

    Everyone tried, nobody answered. Call before dispatch.

  • cancelled

    You stopped it through the API.

Cadence

standard for customers, demo for testing.

standard

Texts and calls 9am–8pm only. One retry for an unanswered call. Unreachable 6 hours after the last step.

demo

About 90 seconds apart, so you can watch the whole flow in a few minutes. Not for real customers.

The confirmation object, field by field

Signed, so you know it’s us.

Every webhook carries an HMAC-SHA256 of its exact body, keyed with your signing secret. Check it before you act on anything.

X-AnyoneIn-Signature: sha256=HMAC_SHA256(secret, rawBody)
  • Hash the raw bytes. Parsing and re-serialising the JSON changes them.
  • Compare in constant time. timingSafeEqual, compare_digest, hash_equals.
  • Answer fast. Return a 2xx within 8 seconds, then do the work.
  • Be idempotent. Key on data.id and updatedAt; the newest wins.

Roadmap Automatic retries, a signed timestamp for replay protection, and secret rotation.

import { createHmac, timingSafeEqual } from 'node:crypto';
import express from 'express';

const app = express();

// Verify against the raw bytes, before any JSON parsing.
app.post('/webhooks/anyonein', express.raw({ type: 'application/json' }), (req, res) => {
  const expected = 'sha256=' + createHmac('sha256', process.env.ANYONEIN_WEBHOOK_SECRET)
    .update(req.body)
    .digest('hex');
  const given = req.get('X-AnyoneIn-Signature') ?? '';
  const ok = given.length === expected.length &&
    timingSafeEqual(Buffer.from(given), Buffer.from(expected));
  if (!ok) return res.status(401).end();

  const { type, data } = JSON.parse(req.body);
  if (type === 'confirmation.updated') {
    // data is the full confirmation: data.status, data.outcome, data.externalId ...
  }
  res.sendStatus(204);
});

You play the customer.

In the sandbox, email, text and calls run as a simulator. Nothing reaches a real phone. You reply as the customer from the sandbox console, and the same outcomes and webhooks fire as in production. Try a reply:

Harlow & FinchText message · simulated

Harlow & Finch: Hi Priya, your Marlow 3-seat sofa is due Tue 13 Oct, 8am–12pm. It needs a signature. Will you be in? Reply YES, or tell us what suits you. api.anyonein.co.uk/c/7d2a…

status in_progress Waiting for Priya…
Webhook bodyWaiting for an answer
// Pick a reply on the left.

A simulation of the sandbox on this page, with canned answers. The real agent reads any reply in plain English.

Anyone in?
Find out before the van leaves.

Take a 60-day pilot with a hold-out group, and see the difference in your own numbers.