Skip to content
RingUp
Start free trial

Tap Ready from your till.

A small REST API over HTTPS with JSON, idempotency keys and signed webhooks. Everything the staff page does, your system can do.

The API is included in the Counter and Group plans. See pricing

Authenticate

Send your key as a bearer token. Live keys start with rk_live_ and test keys with rk_test_.

Create a ticket when the order is placed

Send your order number and get back the ticket number and the link to print as a QR on the receipt.

curl https://api.useringup.com/v1/tickets \
  -H "Authorization: Bearer $RINGUP_KEY" \
  -H "Idempotency-Key: order-4182" \
  -H "Content-Type: application/json" \
  -d '{ "queue": "B", "external_ref": "4182" }'

201 Created
{ "id": "tk_8f2a…", "display_number": "B-27",
  "url": "https://r.useringup.com/t/Zp3…", "status": "created" }

Mark it ready when it is plated

Retrying with the same Idempotency-Key is safe: the customer is rung once.

curl -X POST https://api.useringup.com/v1/tickets/tk_8f2a…/ready \
  -H "Authorization: Bearer $RINGUP_KEY" \
  -H "Idempotency-Key: order-4182-ready"

200 OK
{ "rang": true, "channel_used": "push", "call_out_loud": false }

Listen for what customers do

We sign each delivery with HMAC-SHA256. Verify it with the SDK or ten lines of your own code.

import { verifyWebhookSignature } from '@ringup/sdk'

const result = await verifyWebhookSignature(
  process.env.RINGUP_WEBHOOK_SECRET,
  rawBody,
  request.headers.get('RingUp-Signature'),
)
if (!result.ok) return new Response('bad signature', { status: 400 })

Limits

120 writes per key per branch in a burst, refilled at one per second; reads are more generous. Every response carries RateLimit headers, and errors follow RFC 9457 problem documents.