en
Bookings›Fire quote (FIXED action — business)

Fire quote (FIXED action — business)

Sends the quote: sets quoted_at + duration cols, advances pending_action to confirm_booking. Status stays `booking`. job_duration_minutes may be omitted when the job's job type has a default_duration_minutes: the type's default duration and buffers are used (a buffer you send still wins). This is how an automation or voice agent schedules work it cannot size. Before writing, checks that the customer will see at least one slot: the same engine as the customer slot picker runs over the windows the customer asked for with THIS quote's duration (working hours, service areas, time-off, existing bookings, crew coverage). If no slot exists the quote is refused with 409 JOB_REQUEST_QUOTE_NOT_SCHEDULABLE; data.reason says why (outside_working_hours, requested_windows_passed, outside_service_area, off_shift, on_time_off, missing_required_skills, no_technician_available, ...) and data.blocked_by counts the roster per blocker. Send force=true to schedule it anyway after agreeing a time with the customer.

Arguments

idstringpathrequired
Job request ID
▾crewarray<object>bodyoptional
Crew — multi-person plan (tech lead + buddies). Omit / empty = single person (lead 100%). When present must have exactly one is_lead and wrench_percent summing to 100. See MULTIPERSON_CREW_DESIGN.md.
is_leadbooleanbodyoptional
Whether this slot is the crew lead. Exactly one slot must set it.
skill_idsarray<string>bodyoptional
UUIDs of the skills this slot requires (hard filter for the matching engine). Optional; up to 20.
wrench_percentintegerbodyoptional
This slot's share of the job's man-hours, in percent (1–100). Shares across all slots must sum to 100.
demobilization_minutesintegerbodyoptional
Demobilization (teardown) minutes added after the work. Optional, min 0.
forcebooleanbodyoptional
Schedule the job even when no technician can take it in ANY window the customer asked for (outside working hours, outside every service area, nobody free). Without it that case answers 409 JOB_REQUEST_QUOTE_NOT_SCHEDULABLE with the reason, so the coordinator can agree a different time with the customer first. Send true only after that conversation; the override is recorded in the activity feed.
job_duration_minutesintegerbodyoptional
Hands-on work duration in minutes (man-minutes for a crew job), min 1. On POST /quote it may be OMITTED when the job's job type carries a default_duration_minutes: the quote then uses the type's default duration and its default buffers (a buffer you send still wins). No duration and no default answers 400 JOB_REQUEST_QUOTE_INVALID. PATCH /quote always requires it.
mobilization_minutesintegerbodyoptional
Mobilization (setup/travel-prep) minutes added before the work. Optional, min 0.
status_versionintegerbodyoptional
Optimistic-lock fence: the status_version from your last read. Omitted/0 = fence on the row's current version (no race protection).
POST/v1/job-requests/{id}/quote
curl -X POST "https://api.crisphive.com/v1/job-requests/9b2f6c3e-1a4d-4f0a-8f2e-7c5d1b3a9e01/quote" \
  -H "Authorization: Bearer chsk_test_4eC8xQ9mZ2pL7Ka0rT" \
  -H "Content-Type: application/json" \
  -d '{
  "crew": [
    {
      "is_lead": true,
      "skill_ids": [
        "9b2f6c3e-1a4d-4f0a-8f2e-7c5d1b3a9e01"
      ],
      "wrench_percent": 50
    }
  ],
  "demobilization_minutes": 15,
  "force": false,
  "job_duration_minutes": 120,
  "mobilization_minutes": 15,
  "status_version": 1
}'
Request body
{
"crew": [
{
"is_lead": ,
"skill_ids": [
],
"wrench_percent":
}
],
"demobilization_minutes": ,
"force": ,
"job_duration_minutes": ,
"mobilization_minutes": ,
"status_version":
}

Responses