DevRoam API

Connect Roa to your CRM, website or automations: check free times, create and change appointments, and get a webhook every time Roa books, answers a call or takes a message.

The API and webhooks are included in the Professional and Advanced plans. No code? See the Zapier and Make guide.

Quickstart

  1. In the app go to Settings → API and tap Create key. Copy it: it starts with dr_live_ and won’t be shown again.
  2. Store it as the environment variable DEVROAM_API_KEY (never in browser code).
  3. Ask for the free times on a day:
curl "https://app.devroam.com/api/v1/availability?date=2026-11-03" \
  -H "Authorization: Bearer $DEVROAM_API_KEY"

Response: that day’s free times in the business’s local time, ready to show or to book with POST /api/v1/appointments.

Authentication

Send the key on every request in the Authorization: Bearer dr_live_… header. Each key belongs to one business; create several (one per integration) and revoke them any time in Settings. A revoked key stops working immediately (401).

Dates and times

All times are the business’s local time in YYYY-MM-DD HH:MM format (for example 2026-11-03 17:30). Don’t send a time zone or convert to UTC: DevRoam applies the business time zone and daylight-saving changes.

Endpoints

Base URL: https://app.devroam.com

MethodPathDescription
GET/api/v1/businessBusiness details (name, sector, time zone…).
GET/api/v1/servicesServices with name, price, duration and buffer.
GET/api/v1/staffTeam members (id and name). Use the id as staff_id.
GET/api/v1/availabilityFree times for one day. Same engine as Roa and the booking page: opening hours and split shifts, public holidays, blocks, notice, capacity and existing appointments.
date (YYYY-MM-DD, required) · staff_id · service · party_size · area
GET/api/v1/appointmentsList appointments or reservations.
from · to · status · limit
POST/api/v1/appointmentsCreate an appointment. Returns 201, or 409 if the time is no longer free.
Body: customer_name*, start_local*, customer_phone, service, staff_id, notes, party_size, area, notify_customer (default true)
GET/api/v1/appointments/{id}One appointment.
PATCH/api/v1/appointments/{id}Change the time, details or notes. Same fields as create.
DELETE/api/v1/appointments/{id}Cancel the appointment.
GET/api/v1/callsLatest calls answered by Roa.
limit
GET/api/v1/calls/{id}One call with its transcript.
GET/api/v1/customersKnown customers (callers).
q · limit
GET/api/v1/messagesMessages taken by Roa.
limit

Example: list services

curl "https://app.devroam.com/api/v1/services" \
  -H "Authorization: Bearer $DEVROAM_API_KEY"

Create an appointment

Check availability first or handle the 409: if the time was taken in the meantime, DevRoam does not create the appointment. With notify_customer (default true) the customer gets the same confirmation as when booking with Roa.

curl -X POST https://app.devroam.com/api/v1/appointments \
  -H "Authorization: Bearer $DEVROAM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customer_name":"Ana López","customer_phone":"612345678","service":"Haircut","start_local":"2026-11-03 17:30"}' 

Webhooks

In Settings → Webhooks add an HTTPS URL and choose the events. DevRoam sends a JSON POST with id, type, created, business_id and data.

booking.createdAppointment created (by Roa, the booking page, the dashboard or the API)
booking.changedAppointment changed
booking.cancelledAppointment cancelled
call.completedCall finished
message.receivedNew message
test.ping"Send test" button

Verify the signature

Every delivery carries DevRoam-Signature: t=<unix>,v1=<hex>, where v1 is HMAC-SHA256 with your webhook secret over t + "." + body. Verify it against the raw body:

# Header received:
# DevRoam-Signature: t=1761231000,v1=5f2c…
# v1 = hex HMAC-SHA256(secret, "<t>.<raw body>")

Retries

Reply with a 2xx within 8 seconds. Otherwise DevRoam retries after 1 min, 5 min, 30 min, 2 h and 6 h. Use the event id to ignore duplicates.

Errors and limits

400Invalid request (missing field or wrong date format)
401Missing, invalid or revoked key
403Your plan does not include the API, or the subscription is not active
404Not found (or not in your business)
409The time is not available
429More than 120 requests per minute with the same key. Wait the seconds in the Retry-After header

Errors return JSON: {{"error":{{"status":401,"code":"invalid_api_key","message":"…","docs":"…"}}}}. Branch on code; message is human-readable and in English when you send Accept-Language: en.

OpenAPI specification

Download the OpenAPI 3.1 spec to generate a client or import it into Postman or Insomnia: openapi.json.

Start free trial Talk to us