es
ReservasConfirmar una reserva en nombre del cliente

Confirmar una reserva en nombre del cliente

Dispara la acción `confirm_booking` del actor cliente desde la superficie del NEGOCIO (auditada como business_on_behalf). Dos usos: (1) LIVE — el personal confirma una franja para un cliente que reservó por teléfono; (2) SANDBOX — la superficie de magic-token del cliente es solo live (el enlace de un trabajo de sandbox nunca puede llegar a un cliente real), así que esta es la ÚNICA forma de hacer avanzar un trabajo de prueba de sandbox más allá de la reserva (book → quote → confirm → assign → complete). El cuerpo lleva el scheduled_at elegido por el cliente (datetime naive en hora local del negocio). TABLA DE DECISIÓN — cada 409 que devuelve este endpoint y el PRÓXIMO PASO correcto (ramifique según error_code, nunca según el estado HTTP): • JOB_REQUEST_STAGE_CONFLICT — el trabajo cambió desde que lo leyó (NOTA: cada intento FALLIDO de confirmación también incrementa status_version por diseño). Siguiente: vuelva a hacer GET del trabajo, reintente con el status_version actualizado. • JOB_REQUEST_ACTION_NOT_PENDING — el trabajo ya no está en el paso de confirmación (normalmente: ya confirmado). Siguiente: vuelva a hacer GET y muestre el estado actual; no reintente. • JOB_REQUEST_NO_TECHNICIAN_AVAILABLE — la HORA es inviable para todos (fuera del horario de trabajo / de la ventana del cliente, o nadie cualifica). Siguiente: elija otra hora mediante booking-windows / time-segments. NO es un caso de emergencia — el desplazamiento no puede crear capacidad. • JOB_REQUEST_TECH_INFEASIBLE — el técnico FORZADO nunca puede asumir el trabajo entonces; `data.reason` dice por qué: cannot_arrive_in_time (desplazamiento/inicio de turno — `data.earliest_feasible_at` (RFC3339 UTC) es la primera hora del mismo día en que PUEDE estar in situ → ofrézcala) | missing_required_skills | not_available_today | not_lead_tier. Siguiente: mantenga al técnico y reprograme a earliest_feasible_at+, O mantenga la hora y quite technician_id (selección automática) / elija otro técnico desde time-segments. NO es un caso de emergencia. • JOB_REQUEST_P0_REQUIRES_DISPLACEMENT — el ÚNICO código que enruta al flujo de EMERGENCIA: el trabajo es P0, el técnico cualifica, pero el carril está genuinamente ocupado. Siguiente: POST emergency/candidates → preview → commit (el commit auto-confirma). Advertencia: si los trabajos que ocupan son a su vez P0, la vista previa rechazará con EMERGENCY_RESCHEDULE_SLOT_OCCUPIED (P0 nunca desplaza a P0) — entonces elija otro técnico/hora.

Argumentos

idstringpathobligatorio
ID de la solicitud de trabajo
Idempotency-Keystringheaderopcional
Unique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE.
arrival_window_minutesintegerbodyopcional
ArrivalWindowMinutes = ancho (minutos) de la ventana de llegada que el cliente pulsa en el selector de franjas (es el time_slot_step_minutes, por defecto 30). Se persiste para que el detalle posterior a la confirmación vuelva a renderizar la ventana correcta. Opcional; los límites ([5, 240], que coinciden con el paso del selector de franjas) se validan en el caso de uso — autoridad única, un solo código de error (JOB_REQUEST_INVALID_INPUT).
scheduled_atstringbodyopcional
Chosen start time — business-local naive datetime, no offset (the business_time.datetime value from the time-segments picker). The server converts to UTC using the job's business timezone.
status_versionintegerbodyopcional
Optimistic-lock fence: the status_version from your last read. Omitted/0 = fence on the row's current version (no race protection).
technician_idstringbodyopcional
TechnicianID (solo confirmación de NEGOCIO — ignorado en la superficie del cliente): forzar la asignación del trabajo a este técnico en lugar de la selección automática clasificada. Se omite la clasificación; la viabilidad (horas/permisos/geo/habilidades), la regla TierLead y la protección contra doble reserva siguen aplicando — un técnico forzado inviable rechaza la confirmación (P0 recibe la pista de desplazamiento).
POST/v1/job-requests/{id}/confirm
curl -X POST "https://api.crisphive.com/v1/job-requests/9b2f6c3e-1a4d-4f0a-8f2e-7c5d1b3a9e01/confirm" \
  -H "Authorization: Bearer chsk_test_4eC8xQ9mZ2pL7Ka0rT" \
  -H "Content-Type: application/json" \
  -d '{
  "arrival_window_minutes": 1,
  "scheduled_at": "2030-06-14T09:00:00",
  "status_version": 2,
  "technician_id": "9b2f6c3e-1a4d-4f0a-8f2e-7c5d1b3a9e01"
}'
Cuerpo de la solicitud
{
"arrival_window_minutes": ,
"scheduled_at": ,
"status_version": ,
"technician_id":
}

Respuestas