{"openapi":"3.1.0","info":{"title":"SimpleDock API","version":"1.0.0","summary":"Dock appointment scheduling for warehouses, distribution centers, and 3PLs.","description":"Read availability and create or manage dock appointments programmatically.\n\nAuthenticate with a Pro API key as a Bearer token (`Authorization: Bearer sd_live_…`), created in Settings → API. Endpoints under `/public` need no key.\n\nEvery non-2xx response is `{ \"error\": { \"code\", \"message\", \"details\"? } }`. Codes are stable — branch on `error.code`, never on the message text.\n\nTypical flow: `listLocations` → `listAppointmentTypes` → `listAvailability` → `createAppointment`. The same operations are exposed as MCP tools at `/api/v1/mcp`.\n\n**Pacing.** Every response carries `RateLimit-Policy` and `RateLimit` (draft-ietf-httpapi-ratelimit-headers structured fields); a 429 adds `Retry-After`. Authenticated: 120 requests per 60s per key. Unauthenticated: 60 per 60s per IP.\n\n**Stability.** The version is in the URL path. 180 days' notice before a version is retired, signalled by `Deprecation` (RFC 9745) and `Sunset` (RFC 8594) response headers and `deprecated: true` on affected operations. Policy: https://simpledock.ai/developers/versioning","termsOfService":"https://simpledock.ai/terms-of-service","contact":{"name":"SimpleDock support","email":"support@simpledock.ai","url":"https://simpledock.ai/contact"},"license":{"name":"Proprietary","url":"https://simpledock.ai/terms-of-service"}},"externalDocs":{"description":"SimpleDock developer documentation","url":"https://simpledock.ai/developers"},"x-api-lifecycle":{"currentVersion":"v1","versioningScheme":"url-path","minimumDeprecationNoticeDays":180,"deprecationSignals":["Deprecation","Sunset","Link; rel=\"successor-version\""],"policyUrl":"https://simpledock.ai/developers/versioning","additiveChanges":["New endpoints and new optional request parameters","New fields on an existing response object","New enum values on a field already documented as extensible","New optional headers"],"breakingChanges":["Removing or renaming an endpoint, field, or enum value","Making an optional request parameter required","Changing a field's type or the meaning of an existing value","Tightening validation so a previously accepted request is rejected"]},"x-rate-limits":{"headers":["RateLimit","RateLimit-Policy","Retry-After"],"specification":"draft-ietf-httpapi-ratelimit-headers","policies":[{"name":"api-key","quota":120,"windowSeconds":60,"keyedOn":"api-key"},{"name":"public","quota":60,"windowSeconds":60,"keyedOn":"client-ip"}]},"servers":[{"url":"https://simpledock.ai/api/v1","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Locations","description":"Locations, doors, types, and hours"},{"name":"Availability","description":"Bookable time slots"},{"name":"Appointments","description":"Create and manage appointments"},{"name":"Analytics","description":"Per-location summaries"},{"name":"Public","description":"Unauthenticated endpoints. Safe for agents with no API key: service status, a facility's public booking details, and its open slots by date. Rate limited to 60 requests per minute per IP (best-effort, per instance)."}],"paths":{"/locations":{"get":{"tags":["Locations"],"summary":"List locations","operationId":"listLocations","description":"List every location (facility) the API key's organization can see. Start here: the returned `id` is the `locationId` every other endpoint takes.","responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Location"}}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/locations/{id}":{"get":{"tags":["Locations"],"summary":"Get a location","operationId":"getLocation","description":"Fetch one location by ID, including its timezone, street address, and whether bookings need approval.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Location ID"}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Location"}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/locations/{id}/appointment-types":{"get":{"tags":["Locations"],"summary":"List appointment types","operationId":"listAppointmentTypes","description":"List the bookable appointment types at a location — each carries the load type (FTL/LTL), direction (inbound/outbound), duration, minimum notice, and buffers that govern which slots are offered.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Location ID"}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AppointmentType"}}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/locations/{id}/doors":{"get":{"tags":["Locations"],"summary":"List doors","operationId":"listDoors","description":"List the dock doors at a location, in board order. Only active doors accept appointments.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Location ID"}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Door"}}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/locations/{id}/operating-windows":{"get":{"tags":["Locations"],"summary":"List operating windows","description":"List a location's weekly operating hours and any one-off blocked windows (holidays, maintenance). Slots are only ever offered inside an operating window and outside every blocked window.","operationId":"listOperatingWindows","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Location ID"}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/OperatingWindows"}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/availability":{"get":{"tags":["Availability"],"summary":"List bookable slots","operationId":"listAvailability","description":"List the bookable start times at a location on one calendar date for one appointment type. Applies operating hours, minimum notice, buffers, slots-per-hour, and per-door capacity. Call this before createAppointment.","parameters":[{"name":"locationId","in":"query","required":true,"schema":{"type":"string"},"description":"Location ID from listLocations."},{"name":"appointmentTypeId","in":"query","required":true,"schema":{"type":"string"},"description":"Appointment type ID from listAppointmentTypes; sets duration and rules."},{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"YYYY-MM-DD"}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Slot"}}},"required":["data"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/appointments":{"get":{"tags":["Appointments"],"summary":"List appointments","operationId":"listAppointments","description":"List appointments, newest first, filtered by location, status, and time range. Paginate with `cursor` from `nextCursor`.","parameters":[{"name":"locationId","in":"query","schema":{"type":"string"},"description":"Only appointments at this location. Omit for every location the key can see."},{"name":"status","in":"query","schema":{"type":"string","enum":["PENDING","CONFIRMED","CANCELLED","COMPLETED","NO_SHOW"]},"description":"Only appointments in this status."},{"name":"from","in":"query","schema":{"type":"string","format":"date-time"},"description":"Only appointments starting at or after this instant (ISO 8601)."},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"},"description":"Only appointments starting before this instant (ISO 8601)."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Page size, 1–100."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's nextCursor."}],"responses":{"200":{"description":"Paginated appointments","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Appointment"}},"nextCursor":{"type":["string","null"]}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}},"post":{"tags":["Appointments"],"summary":"Create an appointment","operationId":"createAppointment","description":"Book a dock appointment. `startTime` must be a slot returned by listAvailability. If the location requires approval the appointment is created PENDING; otherwise CONFIRMED. Returns 409 when the slot is no longer bookable.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAppointment"}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Location or type not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"No availability / conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/appointments/{id}":{"get":{"tags":["Appointments"],"summary":"Get an appointment","operationId":"getAppointment","description":"Fetch one appointment by ID, including its door, appointment type, contact details, and custom fields.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Appointment ID"}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}},"patch":{"tags":["Appointments"],"summary":"Reschedule and/or edit details","operationId":"updateAppointment","description":"Reschedule an appointment (send `startTime`, and optionally `doorId`) and/or edit its details. Rescheduling revalidates availability and returns 409 if the new slot is not bookable.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Appointment ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchAppointment"}}}},"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/appointments/{id}/approve":{"post":{"tags":["Appointments"],"summary":"Approve a pending appointment","operationId":"approveAppointment","description":"Approve a PENDING appointment, optionally moving it to a different `startTime` in the same call. Returns 409 if the appointment is not pending.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Appointment ID"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"}}}}}},"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Not pending","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/appointments/{id}/reject":{"post":{"tags":["Appointments"],"summary":"Reject a pending appointment","operationId":"rejectAppointment","description":"Reject a PENDING appointment with an optional reason, which is included in the notification sent to the carrier. Returns 409 if the appointment is not pending.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Appointment ID"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Not pending","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/appointments/{id}/check-in":{"post":{"tags":["Appointments"],"summary":"Record driver check-in / arrival","operationId":"checkInAppointment","description":"Record a driver's check-in: ON_TRACK, RUNNING_LATE (send `estimatedDelay` in minutes), or CANCELLING. Starts the dwell-time clock when dwell tracking is on.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Appointment ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["ON_TRACK","RUNNING_LATE","CANCELLING"]},"estimatedDelay":{"type":"integer","minimum":0,"description":"Minutes late"}}}}}},"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Not active","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/appointments/{id}/cancel":{"post":{"tags":["Appointments"],"summary":"Cancel an appointment","operationId":"cancelAppointment","description":"Cancel an appointment and free its slot. Notifies the carrier and the location's staff.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Appointment ID"}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/appointments/{id}/status":{"post":{"tags":["Appointments"],"summary":"Transition status (CONFIRMED / COMPLETED / NO_SHOW)","operationId":"setAppointmentStatus","description":"Move an appointment to CONFIRMED, COMPLETED, or NO_SHOW. Use cancelAppointment to cancel and approveAppointment/rejectAppointment for pending decisions.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Appointment ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["CONFIRMED","COMPLETED","NO_SHOW"]}}}}}},"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/public/status":{"get":{"tags":["Public"],"operationId":"getPublicStatus","summary":"Service status and machine-readable surface directory","description":"Unauthenticated. Returns service status plus absolute URLs for the OpenAPI spec, the MCP endpoint and manifest, llms.txt, and the sitemap. Callable with nothing in hand, so an agent can start here and discover everything else.","security":[],"responses":{"200":{"description":"Service is up","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PublicStatus"}},"required":["data"]}}}},"429":{"description":"Rate limited — 60 requests per minute per IP; retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/public/locations/{slug}":{"get":{"tags":["Public"],"operationId":"getPublicLocation","summary":"Public booking details for a facility","description":"Unauthenticated. Returns what a facility's booking page already publishes: name, timezone, address, bookable appointment types, weekly operating hours, and upcoming blocked windows. Never returns appointments or carrier details.","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"The facility's public booking slug — the last path segment of its booking link (/book/{slug})."}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PublicLocation"}},"required":["data"]}}}},"404":{"description":"No facility is published at that slug","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — 60 requests per minute per IP; retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/public/locations/{slug}/availability":{"get":{"tags":["Public"],"operationId":"getPublicAvailability","summary":"Open slots at a facility on one date","description":"Unauthenticated. Returns the bookable start times at a facility on one calendar date for one appointment type, applying the same operating hours, minimum notice, buffers, slots-per-hour, and door capacity the booking page applies. Read-only: booking requires the booking link or an API key.","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"The facility's public booking slug — the last path segment of its booking link (/book/{slug})."},{"name":"appointmentTypeId","in":"query","required":true,"schema":{"type":"string"},"description":"An appointment type ID from getPublicLocation."},{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"Calendar date in the facility's timezone, formatted YYYY-MM-DD."}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PublicAvailability"}},"required":["data"]}}}},"400":{"description":"Missing or malformed appointmentTypeId or date","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown facility or appointment type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — 60 requests per minute per IP; retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"description":"Availability could not be computed — retry shortly","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/analytics":{"get":{"tags":["Analytics"],"summary":"Per-location appointment summary","operationId":"getAnalytics","description":"Summarize appointments at one location over a date range: totals, counts by status, and counts by appointment type. The range may not exceed 366 days.","parameters":[{"name":"locationId","in":"query","required":true,"schema":{"type":"string"},"description":"Location to summarize."},{"name":"from","in":"query","schema":{"type":"string","format":"date-time"},"description":"Start of the window (ISO 8601). Defaults to 30 days ago."},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"},"description":"End of the window (ISO 8601). Defaults to now. Max 366 days from `from`."}],"responses":{"200":{"description":"Success","headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AnalyticsSummary"}},"required":["data"]}}}},"401":{"description":"Unauthorized — missing, invalid, or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required — organization is not on Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden — key is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited — slow down and retry after Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"Standing quota, e.g. `\"api-key\";q=120;w=60`.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining quota and reset, e.g. `\"api-key\";r=118;t=57`.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Your Pro API key (sd_live_…). Create one in Settings → API."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}}},"PublicStatus":{"type":"object","description":"Service status and a directory of every machine-readable surface.","required":["service","status","apiVersion"],"properties":{"service":{"type":"string","const":"simpledock"},"status":{"type":"string","enum":["ok"]},"apiVersion":{"type":"string"},"time":{"type":"string","format":"date-time"},"documentation":{"type":"string","format":"uri"},"openapi":{"type":"object","properties":{"json":{"type":"string","format":"uri"},"yaml":{"type":"string","format":"uri"}}},"mcp":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"transport":{"type":"string","const":"streamable-http"},"protocolVersion":{"type":"string"},"manifest":{"type":"string","format":"uri"}}},"agentIndex":{"type":"object","properties":{"llmsTxt":{"type":"string","format":"uri"},"llmsFullTxt":{"type":"string","format":"uri"},"sitemap":{"type":"string","format":"uri"}}},"publicEndpoints":{"type":"array","items":{"type":"object","properties":{"operationId":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"description":{"type":"string"}}}},"authenticatedApi":{"type":"object","properties":{"base":{"type":"string","format":"uri"},"scheme":{"type":"string"},"keys":{"type":"string","format":"uri"}}}}},"PublicLocation":{"type":"object","description":"A facility as its public booking page presents it.","required":["slug","name","timezone","appointmentTypes"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"organizationName":{"type":"string"},"timezone":{"type":"string","description":"IANA timezone, e.g. America/Chicago."},"address":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"zip":{"type":["string","null"]},"appointmentApprovalRequired":{"type":"boolean"},"bookingUrl":{"type":"string","format":"uri"},"availabilityUrl":{"type":"string","format":"uri"},"appointmentTypes":{"type":"array","items":{"$ref":"#/components/schemas/AppointmentType"}},"operatingWindows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"dayOfWeek":{"type":"integer","minimum":0,"maximum":6},"openTime":{"type":"string"},"closeTime":{"type":"string"}}}},"blockedWindows":{"type":"array","items":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"reason":{"type":["string","null"]}}}}}},"PublicAvailability":{"type":"object","description":"Open slots at a facility on one calendar date.","required":["slug","date","slots"],"properties":{"slug":{"type":"string"},"date":{"type":"string","format":"date"},"timezone":{"type":"string"},"appointmentType":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"durationMinutes":{"type":"integer"}}},"slots":{"type":"array","items":{"$ref":"#/components/schemas/Slot"}},"bookingUrl":{"type":"string","format":"uri"}}},"Location":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"timezone":{"type":"string"},"address":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"zip":{"type":["string","null"]},"appointmentApprovalRequired":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"Door":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"sortOrder":{"type":"integer"},"isActive":{"type":"boolean"}}},"AppointmentType":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"loadType":{"type":"string","enum":["FTL","LTL"]},"direction":{"type":"string","enum":["INBOUND","OUTBOUND"]},"durationMinutes":{"type":"integer"},"minimumNoticeMinutes":{"type":"integer"},"bufferBeforeMinutes":{"type":"integer"},"bufferAfterMinutes":{"type":"integer"}}},"OperatingWindows":{"type":"object","properties":{"operatingWindows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"dayOfWeek":{"type":"integer","minimum":0,"maximum":6},"openTime":{"type":"string"},"closeTime":{"type":"string"}}}},"blockedWindows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"reason":{"type":["string","null"]}}}}}},"Slot":{"type":"object","properties":{"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"displayTime":{"type":"string"}}},"Appointment":{"type":"object","required":["id","status","locationId","startTime","endTime","companyName","contactEmail","customFields","createdAt","updatedAt","door","appointmentType"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","CONFIRMED","CANCELLED","COMPLETED","NO_SHOW"]},"locationId":{"type":"string"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"companyName":{"type":"string"},"contactEmail":{"type":"string"},"contactPhone":{"type":["string","null"]},"driverName":{"type":["string","null"]},"driverPhone":{"type":["string","null"]},"trailerNumber":{"type":["string","null"]},"poReference":{"type":["string","null"]},"notes":{"type":["string","null"]},"driverNotes":{"type":["string","null"]},"customFields":{"type":["object","null"],"additionalProperties":true},"arrivalStatus":{"type":["string","null"]},"estimatedDelay":{"type":["integer","null"]},"approvedAt":{"type":["string","null"],"format":"date-time"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"cancelledAt":{"type":["string","null"],"format":"date-time"},"rejectionReason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"door":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"appointmentType":{"$ref":"#/components/schemas/AppointmentTypeSummary"}}},"AppointmentTypeSummary":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"loadType":{"type":"string"},"direction":{"type":"string"},"durationMinutes":{"type":"integer"}}},"CreateAppointment":{"type":"object","required":["locationId","appointmentTypeId","startTime","companyName","contactEmail"],"properties":{"locationId":{"type":"string"},"appointmentTypeId":{"type":"string"},"startTime":{"type":"string","format":"date-time"},"companyName":{"type":"string"},"contactEmail":{"type":"string","format":"email"},"contactPhone":{"type":"string"},"driverName":{"type":"string"},"driverPhone":{"type":"string"},"trailerNumber":{"type":"string"},"poReference":{"type":"string"},"notes":{"type":"string"},"driverNotes":{"type":"string"},"doorId":{"type":"string","description":"Optional explicit door"},"customFields":{"type":"object","additionalProperties":true}}},"PatchAppointment":{"type":"object","description":"Provide startTime/doorId to reschedule, and/or any detail fields to edit.","properties":{"startTime":{"type":"string","format":"date-time"},"doorId":{"type":"string"},"companyName":{"type":"string"},"contactEmail":{"type":"string","format":"email"},"contactPhone":{"type":["string","null"]},"driverName":{"type":["string","null"]},"driverPhone":{"type":["string","null"]},"trailerNumber":{"type":["string","null"]},"poReference":{"type":["string","null"]},"notes":{"type":["string","null"]},"driverNotes":{"type":["string","null"]}}},"AnalyticsSummary":{"type":"object","properties":{"locationId":{"type":"string"},"timezone":{"type":"string"},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"total":{"type":"integer"},"byStatus":{"type":"object","additionalProperties":{"type":"integer"}},"byType":{"type":"array","items":{"type":"object","properties":{"appointmentTypeId":{"type":"string"},"name":{"type":["string","null"]},"count":{"type":"integer"}}}}}}}}}