Developer

API

List abandoned sessions

Booking sessions customers started in the widget, including ones later completed; filter on request_id to find abandoned bookings.

Updated Sep 30, 2026

Returns booking sessions: the drafts the widget saves while a customer works through a form. The widget starts saving once the customer finishes the contact step, so an abandoned session usually carries the customer's contact details. A completed booking with no saved draft gets a placeholder session with step confirm, empty data, and its request_id set. Use it for retargeting and re-engagement.

GET/api/v1/abandoned-sessions
Booking sessions across every form in the workspace, most recently active first.

Query parameters

page
integer (default 1)
1-indexed page number.
per_page
integer (default 25)
Items per page. Maximum 100.
form_id
uuid
Only sessions on this booking form.

Example request

curl https://api.servicereserve.com/api/v1/abandoned-sessions \
-H "Authorization: Bearer $SERVICERESERVE_API_KEY"

Example response

{
"items": [
  {
    "id": "b3a9f1e0-72a1-4b1d-93a4-1f9d12d3e4b2",
    "form_id": "bd28906b-7f9a-4aaf-ab86-85c1a1ccd4f2",
    "step": "address",
    "data": {
      "zip": "78701",
      "serviceIds": ["6d1f0c2a-3b4e-4f5a-9c8d-7e6f5a4b3c2d"],
      "contact": { "firstname": "Jane", "lastname": "Doe", "email": "[email protected]" }
    },
    "attribution": { "utm_source": "google" },
    "source": null,
    "request_id": null,
    "created_at": "2026-09-29T18:31:08.000Z",
    "updated_at": "2026-09-29T18:32:40.000Z"
  }
],
"pagination": { "page": 1, "per_page": 25, "total": 482 }
}

Building queries

Supported parameters are page, per_page, and form_id. Combine them with &. business_profile_id is not supported here.

# Page 2, 50 per page, scoped to one form:
curl "https://api.servicereserve.com/api/v1/abandoned-sessions?page=2&per_page=50&form_id=bd28906b-7f9a-4aaf-ab86-85c1a1ccd4f2" \
  -H "Authorization: Bearer $SERVICERESERVE_API_KEY"

per_page is clamped to a maximum of 100. form_id must be a valid UUID. Sessions are sorted by updated_at, newest first, so a customer who is still filling in the form moves to the top as they go. Expect items to shift between pages while customers are active.

Linking sessions to requests

When a customer submits, ServiceReserve sets request_id on their session. Pass that id to Get request to follow the funnel end to end.

Field reference

id
uuid
Session id.
form_id
uuid
Booking form the session belongs to.
step
string
Widget step the customer had reached at the last save, for example address, schedule, or confirm.
data
object
The draft the widget saved, for example zip, serviceIds, contact (firstname, lastname, email, phone), address, and scheduledDate. The shape follows the widget and may change.
attribution
object | null
UTM tags, referrer, page URL, and click ids captured when the session started.
source
string | null
Channel tag from the booking page URL or embed.
request_id
uuid | null
Id of the request the session turned into. null means the session is still abandoned.
created_at, updated_at
ISO 8601 string | null
When the session started and when it last changed.

The response also carries a pagination object with page, per_page, and total.

Rate limit

Each API key can make 1 request per second. Excess calls return 429 Too Many Requests with a Retry-After header. For polling syncs, sleep one second between requests.

Related