en

Error codes

All error codes currently returned by the public API, generated from the OpenAPI spec. A failed response carries the code in the envelope’s error_code field.

Error codeHTTP statusReturned by
BUSINESS_LOCATION_MISSING400create-technician, update-technician
EMERGENCY_RESCHEDULE_INVALID_INPUT400commit-emergency-reschedule, list-emergency-candidates, preview-emergency-reschedule
INVALID_REQUEST_BODY400commit-emergency-reschedule, commit-job-request-move, confirm-job-request, create-customer, create-job-request, create-technician, get-job-request, get-job-request-timeline, get-technician-schedule, list-emergency-candidates, list-job-request-booking-windows, list-job-request-changes, list-job-requests, list-job-types, list-service-areas, list-skills-by-category, list-technician-skills, list-technicians, list-vehicles, preview-emergency-reschedule, preview-job-request-move, quote-job-request, replace-technician-buddies, replace-technician-leads, replace-technician-service-areas, replace-technician-skills, replace-technician-vehicles, update-customer, update-job-priority, update-technician
INVALID_TIMEZONE400create-job-request, list-job-request-booking-windows
JOB_REQUEST_ADDRESS_REQUIRED400create-job-request
JOB_REQUEST_INVALID_INPUT400confirm-job-request, create-job-request, get-technician-schedule, list-crew-candidates, list-matching-slots, list-nearby-technicians, quote-job-request, update-job-priority
PHONE_INVALID400create-customer, create-technician, update-customer, update-technician
PHONE_OR_EMAIL_REQUIRED400create-customer
SCHEDULE_MOVE_INVALID_INPUT400commit-job-request-move, preview-job-request-move
TECHNICIAN_CONTACT_REQUIRED400create-technician, update-technician
TECHNICIAN_INVALID_BUDDY400replace-technician-buddies, replace-technician-leads
TECHNICIAN_INVALID_TIER400create-technician, update-technician
WRONG_QUERY400list-customers, list-skill-categories, list-skills-by-category, list-technician-skills
API_KEY_INVALID401commit-emergency-reschedule, commit-job-request-move, confirm-job-request, create-job-request, get-job-request, get-technician-schedule, list-crew-candidates, list-emergency-candidates, list-job-request-booking-windows, list-job-request-changes, list-job-requests, list-matching-slots, list-nearby-technicians, preview-emergency-reschedule, preview-job-request-move, quote-job-request, update-job-priority
UNAUTHORIZED401commit-emergency-reschedule, commit-job-request-move, confirm-job-request, create-customer, create-job-request, create-technician, delete-customer, delete-technician, get-customer, get-job-request, get-job-request-timeline, get-job-type, get-service-area, get-technician, get-technician-schedule, get-vehicle, list-crew-candidates, list-customers, list-emergency-candidates, list-job-request-booking-windows, list-job-request-changes, list-job-requests, list-job-types, list-matching-slots, list-nearby-technicians, list-service-areas, list-skill-categories, list-skills, list-skills-by-category, list-technician-skills, list-technicians, list-vehicles, preview-emergency-reschedule, preview-job-request-move, quote-job-request, replace-technician-buddies, replace-technician-leads, replace-technician-service-areas, replace-technician-skills, replace-technician-vehicles, update-customer, update-job-priority, update-technician
FORBIDDEN403update-job-priority
SANDBOX_MANAGEMENT_ROLE_FORBIDDEN403create-technician, update-technician
TECHNICIAN_GROUP_NOT_ASSIGNABLE403create-technician, update-technician
TECHNICIAN_ROLE_API_KEY_FORBIDDEN403create-technician, update-technician
TECHNICIAN_TARGET_NOT_MANAGEABLE403create-technician, update-technician
BUSINESS_GROUP_NOT_FOUND404create-technician, update-technician
BUSINESS_NOT_FOUND404create-customer
CUSTOMER_NOT_FOUND404create-job-request, delete-customer, get-customer, update-customer
JOB_REQUEST_NOT_FOUND404commit-emergency-reschedule, commit-job-request-move, confirm-job-request, get-job-request, get-job-request-timeline, list-crew-candidates, list-emergency-candidates, list-matching-slots, preview-emergency-reschedule, preview-job-request-move, quote-job-request, update-job-priority
JOB_TYPE_NOT_FOUND404create-job-request, get-job-type
SERVICE_AREA_NOT_FOUND404create-technician, get-service-area
SKILL_CATEGORY_NOT_FOUND404list-skills-by-category
SKILL_NOT_FOUND404create-job-request, replace-technician-skills
TECHNICIAN_NOT_FOUND404create-technician, delete-technician, get-technician, get-technician-schedule, list-technician-skills, replace-technician-buddies, replace-technician-service-areas, replace-technician-skills, replace-technician-vehicles, update-technician
VEHICLE_NOT_FOUND404get-vehicle, replace-technician-vehicles
CUSTOMER_DUPLICATE_EMAIL409create-customer, update-customer
CUSTOMER_DUPLICATE_PHONE409create-customer, update-customer
CUSTOMER_DUPLICATE_UID409create-customer
EMERGENCY_RESCHEDULE_CREW_UNSUPPORTED409commit-emergency-reschedule, preview-emergency-reschedule
EMERGENCY_RESCHEDULE_IN_PAST409commit-emergency-reschedule, preview-emergency-reschedule
EMERGENCY_RESCHEDULE_MULTIDAY_UNSUPPORTED409commit-emergency-reschedule, preview-emergency-reschedule
EMERGENCY_RESCHEDULE_NO_WORKING_DAY409commit-emergency-reschedule, preview-emergency-reschedule
EMERGENCY_RESCHEDULE_NOT_ELIGIBLE409commit-emergency-reschedule, preview-emergency-reschedule
IDEMPOTENCY_IN_PROGRESS409create-job-request
JOB_REQUEST_NO_TECHNICIAN_AVAILABLE409list-crew-candidates
SCHEDULE_MOVE_CREW_UNSTAFFABLE409commit-job-request-move, preview-job-request-move
SCHEDULE_MOVE_IN_PAST409commit-job-request-move, preview-job-request-move
SCHEDULE_MOVE_IN_PROGRESS409commit-job-request-move, preview-job-request-move
SCHEDULE_MOVE_MULTIDAY_UNSUPPORTED409commit-job-request-move, preview-job-request-move
SCHEDULE_MOVE_NO_WORKING_DAY409commit-job-request-move, preview-job-request-move
SCHEDULE_MOVE_NOT_ELIGIBLE409commit-job-request-move, preview-job-request-move
SCHEDULE_MOVE_PLAN_DRIFTED409commit-job-request-move
SCHEDULE_MOVE_REQUIRES_FREE_SLOT409commit-job-request-move, preview-job-request-move
SCHEDULE_MOVE_SLOT_OCCUPIED409commit-job-request-move, preview-job-request-move
SCHEDULE_MOVE_TECH_INFEASIBLE409commit-job-request-move, preview-job-request-move
SKILL_INACTIVE409create-job-request, replace-technician-skills
TECHNICIAN_ALREADY_MEMBER409create-technician
TECHNICIAN_DUPLICATE_EMAIL409create-technician, update-technician
TECHNICIAN_DUPLICATE_PHONE409create-technician, update-technician
TECHNICIAN_IDENTITY_CONFLICT409create-technician
TECHNICIAN_LAST_OWNER409delete-technician

Credential expiry

Credentials have finite lifetimes; these codes tell an expiry apart from a revocation or a bad value:

Error codeHTTP statusMeaning
API_KEY_EXPIRED401The API key aged past its lifetime — create a replacement key. Deliberately distinct from API_KEY_INVALID (revoked, deleted, or wrong).
OAUTH_GRANT_EXPIRED401The OAuth connection lapsed (30-day idle window or the absolute cap) — the owner must approve the app again from the consent screen.
API_KEY_SCOPE_NOT_GRANTED403The new key requested scopes beyond what its creator holds — see Authentication.
WEBHOOK_SECRET_EXPIRED409Verify was called on an endpoint whose signing secret has lapsed — rotate the secret first, then verify.
API_KEY_EXPIRY_INVALID400The requested key lifetime is outside 1–365 days.
WEBHOOK_SECRET_EXPIRY_INVALID400The requested webhook signing-secret lifetime is outside 1–365 days.
OAUTH_GRANT_LIFETIME_INVALID400The requested MCP connection lifetime cap is outside 1–365 days.

Emergency dispatch (private preview)

The emergency dispatch preview surface adds its own codes while in private preview:

Error codeHTTP statusMeaning
EMERGENCY_RESCHEDULE_INVALID_INPUT400The emergency preview request body failed validation.