Skip to main content

Today

The day at a glance, exactly as the Today screen in EquipDash shows it: what needs attention next, the gear to get out, each session, and the hires to pick up, out now and due back.

Required scope: bookings:read

GET /api/v1/today​

Query parameters​

ParameterTypeDescription
datestring YYYY-MM-DDOptional. Defaults to today in your shop's timezone.
location_idintegerOptional. Only this location. A location from another account returns 422.

Response​

Times are ISO 8601 in your shop's timezone. time fields are the same moment as a short clock label.

{
"data": {
"date": "2026-10-03",
"is_today": true,
"now": "2026-10-03T10:40:00-04:00",
"sells_hires": true,
"sells_sessions": true,
"needs": [
{ "type": "late_back", "booking_id": 1920, "title": "Jane Doe", "late_label": "1 hr", "more": 2, "items": [], "action": "open" },
{ "type": "next_session", "schedule_id": 1234, "title": "Coastal Bike Tour", "time": "11:00", "minutes": 20, "to_arrive": 5, "booked": 8, "action": "check_in" }
],
"gear": [
{ "product_id": 13, "name": "Mountain Bike", "image": null, "needed": 6, "out": 2, "by": "2026-10-03T11:00:00-04:00", "peak": 4, "peak_time": "11:30 AM", "stock": 3 }
],
"sessions": [
{
"schedule_id": 1234,
"experience_id": 3,
"name": "Coastal Bike Tour",
"start": "2026-10-03T11:00:00-04:00",
"time": "11:00",
"end_time": "1:00",
"status": "next",
"minutes_to_start": 20,
"capacity": 12,
"booked": 8,
"checked_in": 3,
"signed": 7,
"to_sign": 8,
"unpaid": [{ "booking_id": 1927, "name": "Jane Doe" }],
"guides": [{ "id": 5, "name": "Sam Reed" }],
"guides_missing_cert": [],
"to_ask": 1,
"gear": [{ "product_id": 13, "name": "Mountain Bike", "quantity": 6, "sizes": "M ×3, L ×2, 1 to ask", "size_short": "L: 1 short" }]
}
],
"hires": {
"pickups": [
{
"booking_id": 1917,
"name": "Jane Doe",
"phone": "5550100",
"at": "2026-10-03T10:15:00-04:00",
"time": "10:15",
"back_at": "2026-10-03T14:15:00-04:00",
"back_time": "2:15",
"kind": "pickup",
"address": null,
"items": [{ "product_id": 24, "name": "Paddleboard", "image": null, "quantity": 1, "sizes": "" }],
"late_minutes": 25,
"paid": false,
"signed": 0,
"to_sign": 1,
"deposit_held": null,
"location_id": null,
"location_name": null
}
],
"out": [],
"out_later_count": 1,
"returns": [],
"returns_late": 0,
"returns_not_out": 0,
"repairs": { "dropoffs": [], "ready": [] },
"counts": { "hires_today": 2, "to_pick_up": 1, "due_back": 0, "out_until_a_later_day": 1 }
},
"gear_day": {
"from": "2026-10-03T10:00:00-04:00",
"to": "2026-10-03T18:00:00-04:00",
"items": [
{
"product_id": 13, "name": "Mountain Bike", "image": null, "stock": 10, "to_get_out": 2, "at_once": 2, "at_once_label": "11:00 AM", "out_now": 4,
"short": [{ "from": "2026-10-03T13:30:00-04:00", "until": "2026-10-03T15:00:00-04:00", "short": 2, "from_label": "1:30 PM" }],
"lines": [
{ "who": "Jane Doe", "booking_id": 1917, "schedule_id": null, "state": "to_go", "quantity": 2, "from": "2026-10-03T11:00:00-04:00", "until": "2026-10-03T16:00:00-04:00", "from_label": "11:00 AM", "until_label": "4:00 PM", "continues": false }
]
}
]
},
"gear_list": [
{
"hour": "11 AM",
"rows": [
{ "at": "2026-10-03T11:00:00-04:00", "time": "11:00 AM", "item": { "product_id": 13, "name": "Mountain Bike", "quantity": 2 }, "for": "Jane Doe #1917", "where": null, "done": false, "key": "b1917-p13", "ready": true }
]
}
]
},
"meta": { "request_id": "...", "timestamp": "..." }
}

Fields worth knowing​

FieldMeaning
needsUp to four things to act on next, one per kind, most urgent first. type is one of late_back, not_picked_up, next_session, waivers_missing, to_pay, no_guide, guide_cert, next_pickup; action names the button the screen shows. Empty on any day but today.
problemsWhat needs someone right now, as the chips at the top of the screen show it, one per kind with its count. type is one of late_back, not_picked_up, gear_short (with name, time and product_id, one per item), waivers (to sign in the next two hours, with the booking_ids behind the count), sizes (people on a session starting in the next two hours who still have a size or a checked answer to give, with the first such schedule_id), no_guide, guide_cert. Empty on any day but today.
hires.*[].items[].unitsThe tags of the units the booking holds for that item, such as KY-03, for items tracked unit by unit.
hires.*[].spanWhen the hire runs, as the screen reads it: times on one day, or dates and times when it runs over several.
sessions[].bookingsEach booking on the session: people on this session, checked_in, paid, signed and to_sign.
sessions[].peopleEach participant on the session by name, with in true once checked in.
hires.pickups[].kindpickup, or delivery when you take the items to the customer.
hires.returns[].kindreturn, or collection when you fetch the items back.
hires.out_later_countHires out now that come back on a later day.
hires.returns_not_outHires due back by the end of the day that have not been picked up yet. They are listed under pickups, not returns.
hires.countsHow many hires the day has, each counted once. A hire out now and due back today is in both out and returns, so read these instead of adding the lists up. due_back includes hires late from an earlier day.
sessions[].statusrunning, next, later or finished.
sessions[].guides_missing_certNames of assigned guides missing a certificate the experience requires, or holding one that has lapsed by the session's day. When a booking locks a guide on automatically, a free guide who holds every required certificate is picked first.
sessions[].gear[].sizesFor an item the experience asks each person their size of: how many of each size the session needs, and how many people are still to ask, such as M ×3, L ×2, 1 to ask. Empty otherwise. The same count as the session's manifest.
sessions[].gear[].size_shortEach size you own fewer of than the session needs, such as L: 1 short. Empty when you have enough.
sessions[].to_askPeople on the session still to give a size or an answer checked at check-in, counting seats nobody is named on yet.
hires.repairsWorkshop drop-offs expected today and repairs ready to hand back (Services module only).
gear[].peakThe most of that item out at the same moment today, and peak_time when that first happens.
gear[].stockUnits of that item you own and can hire out, for items whose stock you track; null otherwise. peak above stock means you are short.
out_nowToday only (null on another date): what is out of the shop this minute. total units, and items, one per item with out, on_hires (hires picked up and not back) and on_sessions (gear on sessions running now). A hire still to be picked up is not out.
gear_latertrue when nothing goes out in the next two hours but gear does later today.
sessions[].needs_guideWhether the session is expected to have a guide: the activity needs one, the session sets how many, or another session of it today has one.
gear_dayEvery item that goes out on this day, for the Gear timeline: from and to are the stretch it covers (the current hour to the last return, at least eight hours). Each item has stock, to_get_out (hires not picked up yet and sessions not started, added up), at_once (the most needed at the same time, from now on today or over the whole day on another date: bookings back to back share the same gear) with at_once_label (when that first happens), out_now, short (each stretch where more are needed than owned, with how many short) and lines, one per booking or session using it from from to until. state is to_go, out, session or late; continues is true when it comes back after to. null when nothing goes out.
gear_listThe whole day's gear list by hour. done is true once the booking has gone out; ready is true when staff ticked the line as got ready.

POST /api/v1/today/gear-ready​

Tick a gear list line as got ready, or untick it. It is the same tick staff make on the Today screen.

Required scope: bookings:write

FieldTypeDescription
keystringThe line's key from gear_list.
readybooleantrue to tick, false to untick.
{ "data": { "key": "b1917-p13", "ready": true }, "meta": { "request_id": "...", "timestamp": "..." } }

A key for another account's booking, session or item returns 422.

What counts as late​

Every place EquipDash counts late hires uses the same test: this endpoint, the dashboards, the late_pickups and late_returns filters on List bookings, and the MCP tools.

  • Late to pick up: confirmed, not picked up or delivered, more than the shop's late grace (Settings > Customer messages, 15 minutes unless changed) past its start, and its hire has not ended before today. A hire whose whole hire ended on an earlier day without being collected is not counted.
  • Late back: picked up, or dropped off by delivery, not collected, and more than the grace past its end.

On the phone app: GET /api/v1/mobile/today​

The phone app's Today tab reads the same data with its phone sign-in token instead of an API key. It needs the View bookings permission, and a person kept to some locations sees only those locations' bookings and sessions.

The query parameters and response are the ones above, plus:

FieldDescription
locationsThe locations this person may open, { "id", "name" }, for the location picker.
location_idThe location the board was read for, or null for every location.
problems[].labelThe chip's words as the Today screen prints them, for example 3 late back.

A location_id this person is kept out of returns 403; one from another account returns 422.

The same data is available to AI assistants as the get_today MCP tool.