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
| Parameter | Type | Description |
|---|---|---|
date | string YYYY-MM-DD | Optional. Defaults to today in your shop's timezone. |
location_id | integer | Optional. 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
| Field | Meaning |
|---|---|
needs | Up 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. |
problems | What 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[].units | The tags of the units the booking holds for that item, such as KY-03, for items tracked unit by unit. |
hires.*[].span | When the hire runs, as the screen reads it: times on one day, or dates and times when it runs over several. |
sessions[].bookings | Each booking on the session: people on this session, checked_in, paid, signed and to_sign. |
sessions[].people | Each participant on the session by name, with in true once checked in. |
hires.pickups[].kind | pickup, or delivery when you take the items to the customer. |
hires.returns[].kind | return, or collection when you fetch the items back. |
hires.out_later_count | Hires out now that come back on a later day. |
hires.returns_not_out | Hires due back by the end of the day that have not been picked up yet. They are listed under pickups, not returns. |
hires.counts | How 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[].status | running, next, later or finished. |
sessions[].guides_missing_cert | Names 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[].sizes | For 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_short | Each size you own fewer of than the session needs, such as L: 1 short. Empty when you have enough. |
sessions[].to_ask | People on the session still to give a size or an answer checked at check-in, counting seats nobody is named on yet. |
hires.repairs | Workshop drop-offs expected today and repairs ready to hand back (Services module only). |
gear[].peak | The most of that item out at the same moment today, and peak_time when that first happens. |
gear[].stock | Units 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_now | Today 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_later | true when nothing goes out in the next two hours but gear does later today. |
sessions[].needs_guide | Whether 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_day | Every 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_list | The 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
| Field | Type | Description |
|---|---|---|
key | string | The line's key from gear_list. |
ready | boolean | true 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:
| Field | Description |
|---|---|
locations | The locations this person may open, { "id", "name" }, for the location picker. |
location_id | The location the board was read for, or null for every location. |
problems[].label | The 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.