{"openapi":"3.0.0","paths":{"/api/v1/queues":{"get":{"description":"Lista las filas de la cuenta, paginadas por cursor. Filtra por `entityId` si se indica.","operationId":"PublicQueuesController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Listar filas","tags":["Filas"]},"post":{"description":"Crea una Fila Express con su instancia abierta, igual que desde el panel.","operationId":"PublicQueuesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"entityId":{"type":"string","minLength":1,"maxLength":128},"name":{"type":"string","minLength":2,"maxLength":120},"subtitle":{"type":"string","maxLength":160},"processName":{"type":"string","maxLength":120},"type":{"type":"string","enum":["TURN","APPOINTMENT","HYBRID"]},"locationId":{"$ref":"#/properties/entityId"},"location":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"accuracyMeters":{"type":"number","minimum":0},"name":{"type":"string","maxLength":120},"shortAddress":{"type":"string","minLength":3,"maxLength":160},"fullAddress":{"type":"string","maxLength":300},"timezone":{"type":"string","maxLength":60}},"required":["lat","lng","shortAddress"],"additionalProperties":false},"schedule":{"type":"object","properties":{"mode":{"type":"string","enum":["always","weekly"]},"weekly":{"type":"array","items":{"type":"object","properties":{"day":{"type":"integer","minimum":0,"maximum":6},"open":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"close":{"$ref":"#/properties/schedule/properties/weekly/items/properties/open"}},"required":["day","open","close"],"additionalProperties":false},"maxItems":14},"opensBeforeMinutes":{"type":"integer","minimum":0,"maximum":1440},"closesBeforeMinutes":{"type":"integer","minimum":0,"maximum":1440},"allowOutsideHours":{"type":"boolean"},"resetNumberingDaily":{"type":"boolean"}},"required":["mode"],"additionalProperties":false},"capacity":{"type":"object","properties":{"maxTurns":{"type":"integer","exclusiveMinimum":true,"minimum":0},"waitlistEnabled":{"type":"boolean","default":false},"autoPromote":{"type":"boolean","default":true}},"additionalProperties":false,"default":{"waitlistEnabled":false}},"geofence":{"type":"object","properties":{"radiusMeters":{"type":"integer","exclusiveMinimum":true,"minimum":0,"maximum":50000},"requireToTake":{"type":"boolean","default":false}},"required":["radiusMeters"],"additionalProperties":false},"tolerance":{"type":"object","properties":{"graceMinutes":{"type":"integer","minimum":0,"maximum":120},"allowReentry":{"type":"boolean","default":true},"maxReentries":{"type":"integer","minimum":0,"maximum":10,"default":1}},"required":["graceMinutes"],"additionalProperties":false},"dispatchFlow":{"type":"object","properties":{"callOnNext":{"type":"boolean","default":true},"trackService":{"type":"boolean","default":true},"onToleranceExpired":{"type":"string","enum":["no_show","cancel","hold","none"],"default":"no_show"},"allowReopen":{"type":"boolean","default":false}},"additionalProperties":false},"preAttention":{"type":"object","properties":{"instructions":{"type":"string","maxLength":500},"questions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40},"label":{"type":"string","minLength":1,"maxLength":160},"type":{"type":"string","enum":["text","choice"],"default":"text"},"options":{"type":"array","items":{"anyOf":[{"type":"string","minLength":1,"maxLength":80},{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":80},"prefix":{"type":"string","maxLength":4},"priority":{"type":"string","enum":["VERY_HIGH","HIGH","NORMAL","LOW"]}},"required":["label"],"additionalProperties":false}]},"maxItems":12},"required":{"type":"boolean","default":false}},"required":["id","label"],"additionalProperties":false},"maxItems":10,"default":[]}},"additionalProperties":false},"stations":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":40},"description":{"type":"string","maxLength":160}},"required":["label"],"additionalProperties":false},"maxItems":30},"help":{"type":"object","properties":{"enabled":{"type":"boolean","default":false},"quickReplies":{"type":"array","items":{"type":"string","minLength":1,"maxLength":120},"maxItems":12}},"additionalProperties":false},"transferEnabled":{"type":"boolean","default":false},"whatsappCapture":{"type":"boolean","default":true},"accessCodeRequired":{"type":"boolean","default":false},"cancellation":{"type":"object","properties":{"minNoticeMinutes":{"type":"integer","minimum":0,"maximum":100000}},"required":["minNoticeMinutes"],"additionalProperties":false},"carpool":{"type":"object","properties":{"enabled":{"type":"boolean","default":false},"intakeWindowMinutes":{"type":"integer","minimum":0,"maximum":1440},"oneActiveTurnPerCode":{"type":"boolean"},"autoArriveOnGeofence":{"type":"boolean"}},"additionalProperties":false},"arrivalBoard":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","minLength":1,"maxLength":40},"label":{"type":"string","minLength":1,"maxLength":40}},"required":["key","label"],"additionalProperties":false},"maxItems":12},"showSecurity":{"type":"boolean"}},"required":["columns"],"additionalProperties":false},"offers":{"type":"object","properties":{"enabled":{"type":"boolean","default":false},"maxPoints":{"type":"integer","exclusiveMinimum":true,"minimum":0,"maximum":100000,"default":100}},"additionalProperties":false},"dispatchers":{"type":"integer","minimum":0,"maximum":100,"default":1},"turnPrefix":{"type":"string","maxLength":4},"turnPadding":{"type":"integer","minimum":0,"maximum":8}},"required":["entityId","name","type"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Crear fila","tags":["Filas"]}},"/api/v1/queues/{queueId}":{"get":{"description":"Detalle de una fila con sus instancias recientes.","operationId":"PublicQueuesController_get","parameters":[{"name":"queueId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Obtener fila","tags":["Filas"]}},"/api/v1/queues/{queueId}/sla":{"put":{"description":"Objetivos de espera y atención de la fila.","operationId":"PublicQueuesController_setSla","parameters":[{"name":"queueId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"maxWaitMinutes":{"type":"integer","minimum":0,"maximum":100000,"nullable":true},"maxServiceMinutes":{"type":"integer","minimum":0,"maximum":100000,"nullable":true}},"additionalProperties":false}}}},"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Configurar SLA","tags":["Filas"]}},"/api/v1/queues/{queueId}/dispatch-flow":{"put":{"description":"Llamado directo, medición de atención, tolerancia y reapertura de turnos.","operationId":"PublicQueuesController_setDispatchFlow","parameters":[{"name":"queueId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"callOnNext":{"type":"boolean","default":true},"trackService":{"type":"boolean","default":true},"onToleranceExpired":{"type":"string","enum":["no_show","cancel","hold","none"],"default":"no_show"},"allowReopen":{"type":"boolean","default":false}},"additionalProperties":false}}}},"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Configurar flujo de despacho","tags":["Filas"]}},"/api/v1/queues/{queueId}/whatsapp-capture":{"put":{"operationId":"PublicQueuesController_setWhatsappCapture","parameters":[{"name":"queueId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"whatsappCapture":{"type":"boolean"}},"required":["whatsappCapture"],"additionalProperties":false}}}},"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Configurar captura de WhatsApp","tags":["Filas"]}},"/api/v1/queues/{queueId}/numbering-reset":{"put":{"operationId":"PublicQueuesController_setNumberingReset","parameters":[{"name":"queueId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"resetNumberingDaily":{"type":"boolean"}},"required":["resetNumberingDaily"],"additionalProperties":false}}}},"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Configurar reinicio diario de numeración","tags":["Filas"]}},"/api/v1/queues/{queueId}/cancellation-policy":{"put":{"operationId":"PublicQueuesController_setCancellationPolicy","parameters":[{"name":"queueId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"minNoticeMinutes":{"type":"integer","minimum":0,"maximum":100000,"nullable":true}},"additionalProperties":false}}}},"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Configurar política de cancelación de citas","tags":["Filas"]}},"/api/v1/queues/{queueId}/stations":{"get":{"operationId":"PublicQueuesController_listStations","parameters":[{"name":"queueId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Listar estaciones","tags":["Filas"]},"post":{"operationId":"PublicQueuesController_createStation","parameters":[{"name":"queueId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":40},"description":{"type":"string","maxLength":160}},"required":["label"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Crear estación","tags":["Filas"]}},"/api/v1/stations/{stationId}":{"delete":{"operationId":"PublicQueuesController_removeStation","parameters":[{"name":"stationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Eliminar estación","tags":["Filas"]}},"/api/v1/queue-runs/{runId}/open":{"post":{"operationId":"PublicQueuesController_open","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Abrir fila","tags":["Filas"]}},"/api/v1/queue-runs/{runId}/close":{"post":{"operationId":"PublicQueuesController_close","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Cerrar fila","tags":["Filas"]}},"/api/v1/queue-runs/{runId}/close-intake":{"post":{"description":"La fila sigue atendiendo pendientes.","operationId":"PublicQueuesController_closeIntake","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Cerrar toma de turnos","tags":["Filas"]}},"/api/v1/queue-runs/{runId}/open-intake":{"post":{"operationId":"PublicQueuesController_openIntake","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Reabrir toma de turnos","tags":["Filas"]}},"/api/v1/queue-runs/{runId}/turns":{"post":{"description":"Crea un turno en la instancia de fila. Usa `idempotencyKey` para reintentos seguros: la misma clave devuelve el mismo turno.","operationId":"PublicTurnsController_create","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"peopleCount":{"type":"integer","minimum":1,"maximum":20,"default":1},"idempotencyKey":{"type":"string","minLength":8,"maxLength":120},"phone":{"type":"string","minLength":8,"maxLength":20},"notifyWhatsapp":{"type":"boolean"},"formResponse":{"type":"object","additionalProperties":{"type":"string"}}},"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Crear turno","tags":["Turnos"]},"get":{"description":"Paginado por cursor; filtra por `status` (WAITING, CALLED, COMPLETED, …).","operationId":"PublicTurnsController_list","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Listar turnos de una instancia","tags":["Turnos"]}},"/api/v1/turns/{turnId}":{"get":{"description":"Vista completa del turno: estado, posición, estimación de espera y datos de la fila.","operationId":"PublicTurnsController_get","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Obtener turno","tags":["Turnos"]}},"/api/v1/turns/{turnId}/cancel":{"post":{"description":"Cancela el turno como administrador.","operationId":"PublicTurnsController_cancel","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Cancelar turno","tags":["Turnos"]}},"/api/v1/queue-runs/{runId}/arrivals":{"get":{"description":"Turnos con presencia/llegada de la instancia (modo carpool o presencial).","operationId":"PublicTurnsController_arrivals","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Tablero de llegadas","tags":["Turnos"]}},"/api/v1/queue-runs/{runId}/dispatch/next":{"post":{"description":"Toma el siguiente turno en espera; opcionalmente lo asigna a una estación.","operationId":"PublicDispatchController_next","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Despachar el siguiente turno","tags":["Despacho"]}},"/api/v1/turns/{turnId}/call":{"post":{"description":"Opcionalmente a una estación específica.","operationId":"PublicDispatchController_call","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Llamar turno","tags":["Despacho"]}},"/api/v1/turns/{turnId}/assign-station":{"post":{"operationId":"PublicDispatchController_assignStation","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"stationId":{"type":"string","minLength":1,"maxLength":128,"nullable":true}},"required":["stationId"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Asignar estación al turno","tags":["Despacho"]}},"/api/v1/turns/{turnId}/arrive":{"post":{"operationId":"PublicDispatchController_arrive","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Confirmar llegada del turno","tags":["Despacho"]}},"/api/v1/turns/{turnId}/start":{"post":{"operationId":"PublicDispatchController_start","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Iniciar atención","tags":["Despacho"]}},"/api/v1/turns/{turnId}/complete":{"post":{"operationId":"PublicDispatchController_complete","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Finalizar turno","tags":["Despacho"]}},"/api/v1/turns/{turnId}/no-show":{"post":{"operationId":"PublicDispatchController_noShow","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Marcar turno como no presentado","tags":["Despacho"]}},"/api/v1/turns/{turnId}/hold":{"post":{"operationId":"PublicDispatchController_hold","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Retener turno","tags":["Despacho"]}},"/api/v1/turns/{turnId}/release":{"post":{"description":"Regresa el turno a la espera.","operationId":"PublicDispatchController_release","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Liberar turno retenido","tags":["Despacho"]}},"/api/v1/turns/{turnId}/reopen":{"post":{"description":"Requiere `dispatchFlow.allowReopen` en la fila y estar dentro de la ventana de 5 minutos.","operationId":"PublicDispatchController_reopen","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Reabrir turno finalizado","tags":["Despacho"]}},"/api/v1/turns/{turnId}/forward":{"post":{"description":"Usa un enlace de filas conectadas (`linkId`).","operationId":"PublicDispatchController_forward","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"linkId":{"type":"string","minLength":1,"maxLength":128}},"required":["linkId"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Enviar turno a la siguiente fila","tags":["Despacho"]}},"/api/v1/turns/{turnId}/priority":{"post":{"operationId":"PublicDispatchController_setPriority","parameters":[{"name":"turnId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"priority":{"type":"string","enum":["VERY_HIGH","HIGH","NORMAL","LOW"]}},"required":["priority"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Cambiar prioridad del turno","tags":["Despacho"]}},"/api/v1/queue-runs/{runId}/slots":{"post":{"description":"Genera los horarios de un día.","operationId":"PublicAppointmentsController_generateSlots","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"startTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"endTime":{"$ref":"#/properties/startTime"},"slotMinutes":{"type":"integer","minimum":1,"maximum":480},"capacity":{"type":"integer","minimum":1,"maximum":1000}},"required":["date","startTime","endTime","slotMinutes","capacity"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Generar slots de cita","tags":["Citas"]},"get":{"description":"`?available=true` filtra los que tienen cupo.","operationId":"PublicAppointmentsController_listSlots","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}},{"name":"available","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Listar slots","tags":["Citas"]}},"/api/v1/queue-runs/{runId}/appointments":{"post":{"description":"Agenda en un `slotId` específico o en el siguiente disponible. Acepta `idempotencyKey` para reintentos seguros.","operationId":"PublicAppointmentsController_schedule","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Agendar cita","tags":["Citas"]},"get":{"operationId":"PublicAppointmentsController_listAppointments","parameters":[{"name":"runId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Listar citas de una instancia","tags":["Citas"]}},"/api/v1/appointments/{id}":{"get":{"operationId":"PublicAppointmentsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Obtener cita","tags":["Citas"]}},"/api/v1/appointments/{id}/cancel":{"post":{"operationId":"PublicAppointmentsController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Cancelar cita","tags":["Citas"]}},"/api/v1/appointments/{id}/check-in":{"post":{"operationId":"PublicAppointmentsController_checkIn","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Registrar llegada (check-in)","tags":["Citas"]}},"/api/v1/appointments/{id}/start":{"post":{"operationId":"PublicAppointmentsController_start","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Iniciar atención de la cita","tags":["Citas"]}},"/api/v1/appointments/{id}/complete":{"post":{"operationId":"PublicAppointmentsController_complete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Finalizar cita","tags":["Citas"]}},"/api/v1/appointments/{id}/no-show":{"post":{"operationId":"PublicAppointmentsController_noShow","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Marcar cita como no presentada","tags":["Citas"]}},"/api/v1/access-codes":{"get":{"operationId":"PublicAccessCodesController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Listar códigos de acceso de la cuenta","tags":["Códigos de acceso"]},"post":{"operationId":"PublicAccessCodesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":32},"scopeType":{"type":"string","enum":["account","entity","queue"],"default":"account"},"scopeId":{"type":"string","minLength":1,"maxLength":128},"maxUses":{"type":"integer","exclusiveMinimum":true,"minimum":0,"maximum":1000000},"expiresAt":{"type":"string","format":"date-time"},"prefix":{"type":"string","maxLength":4},"classification":{"type":"string","maxLength":60},"priority":{"type":"string","enum":["VERY_HIGH","HIGH","NORMAL","LOW"]},"properties":{"type":"object","additionalProperties":{}}},"required":["code"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Crear código de acceso","tags":["Códigos de acceso"]}},"/api/v1/access-codes/bulk":{"post":{"operationId":"PublicAccessCodesController_bulk","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":32},"scopeType":{"type":"string","enum":["account","entity","queue"],"default":"account"},"scopeId":{"type":"string","minLength":1,"maxLength":128},"maxUses":{"type":"integer","exclusiveMinimum":true,"minimum":0,"maximum":1000000},"expiresAt":{"type":"string","format":"date-time"},"prefix":{"type":"string","maxLength":4},"classification":{"type":"string","maxLength":60},"priority":{"type":"string","enum":["VERY_HIGH","HIGH","NORMAL","LOW"]},"properties":{"type":"object","additionalProperties":{}}},"required":["code"],"additionalProperties":false},"minItems":1,"maxItems":1000}},"required":["codes"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Crear códigos en lote","tags":["Códigos de acceso"]}},"/api/v1/access-codes/{id}/disable":{"post":{"operationId":"PublicAccessCodesController_disable","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Desactivar código de acceso","tags":["Códigos de acceso"]}},"/api/v1/entities":{"get":{"operationId":"PublicEntitiesController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Listar sucursales","tags":["Sucursales"]},"post":{"operationId":"PublicEntitiesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":120},"description":{"type":"string","maxLength":500},"websiteUrl":{"type":"string","format":"uri","maxLength":300},"supportEmail":{"type":"string","format":"email","maxLength":254},"supportPhone":{"type":"string","pattern":"^\\+?[0-9][0-9\\s-]{6,19}$"},"location":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"accuracyMeters":{"type":"number","minimum":0},"name":{"type":"string","maxLength":120},"shortAddress":{"type":"string","minLength":3,"maxLength":160},"fullAddress":{"type":"string","maxLength":300},"timezone":{"type":"string","maxLength":60}},"required":["lat","lng","shortAddress"],"additionalProperties":false}},"required":["name"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Crear sucursal","tags":["Sucursales"]}},"/api/v1/entities/{entityId}":{"patch":{"operationId":"PublicEntitiesController_update","parameters":[{"name":"entityId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":120},"description":{"type":"string","maxLength":500,"nullable":true},"websiteUrl":{"type":"string","format":"uri","maxLength":300,"nullable":true},"supportEmail":{"type":"string","format":"email","maxLength":254,"nullable":true},"supportPhone":{"type":"string","pattern":"^\\+?[0-9][0-9\\s-]{6,19}$","nullable":true},"location":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"accuracyMeters":{"type":"number","minimum":0},"name":{"type":"string","maxLength":120},"shortAddress":{"type":"string","minLength":3,"maxLength":160},"fullAddress":{"type":"string","maxLength":300},"timezone":{"type":"string","maxLength":60}},"required":["lat","lng","shortAddress"],"additionalProperties":false}},"additionalProperties":false}}}},"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Editar sucursal","tags":["Sucursales"]},"delete":{"description":"Elimina la sucursal y sus filas en cascada. Acción irreversible.","operationId":"PublicEntitiesController_remove","parameters":[{"name":"entityId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Eliminar sucursal","tags":["Sucursales"]}},"/api/v1/queue-links":{"get":{"operationId":"PublicWorkflowController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Listar enlaces entre filas","tags":["Filas conectadas"]},"post":{"description":"Al finalizar un turno en la fila origen se crea el siguiente en la fila destino.","operationId":"PublicWorkflowController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fromQueueDefinitionId":{"type":"string","minLength":1,"maxLength":128},"toQueueDefinitionId":{"$ref":"#/properties/fromQueueDefinitionId"},"trigger":{"type":"string","enum":["complete","manual"],"default":"complete"},"keepNumber":{"type":"boolean","default":false},"keepFormResponse":{"type":"boolean","default":false},"conditions":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["answer","priority"]},"key":{"type":"string","maxLength":60},"operator":{"type":"string","enum":["eq","neq","contains"]},"value":{"type":"string","minLength":1,"maxLength":120}},"required":["source","operator","value"],"additionalProperties":false},"maxItems":10}},"required":["fromQueueDefinitionId","toQueueDefinitionId"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Crear enlace entre filas","tags":["Filas conectadas"]}},"/api/v1/queue-links/{linkId}":{"patch":{"description":"Cambia condiciones o el modo del enlace.","operationId":"PublicWorkflowController_update","parameters":[{"name":"linkId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"trigger":{"type":"string","enum":["complete","manual"]},"keepNumber":{"type":"boolean"},"keepFormResponse":{"type":"boolean"},"conditions":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["answer","priority"]},"key":{"type":"string","maxLength":60},"operator":{"type":"string","enum":["eq","neq","contains"]},"value":{"type":"string","minLength":1,"maxLength":120}},"required":["source","operator","value"],"additionalProperties":false},"maxItems":10}},"additionalProperties":false}}}},"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Editar enlace","tags":["Filas conectadas"]},"delete":{"operationId":"PublicWorkflowController_remove","parameters":[{"name":"linkId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Eliminar enlace","tags":["Filas conectadas"]}},"/api/v1/analytics/dashboard":{"get":{"description":"Resumen en vivo por fila: turnos activos, atendidos y tiempos.","operationId":"PublicAnalyticsController_getDashboard","parameters":[],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Panel operativo del día","tags":["Analítica"]}},"/api/v1/analytics/summary":{"get":{"description":"Métricas agregadas del periodo `from`–`to` (YYYY-MM-DD).","operationId":"PublicAnalyticsController_getSummary","parameters":[{"name":"from","required":false,"in":"query","schema":{"type":"string","format":"date"}},{"name":"to","required":false,"in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Analítica histórica","tags":["Analítica"]}},"/api/v1/webhook-endpoints":{"get":{"description":"El secreto de firma nunca se vuelve a mostrar.","operationId":"PublicWebhooksController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Listar webhooks","tags":["Webhooks"]},"post":{"description":"Devuelve el secreto de firma (`whsec_…`) UNA sola vez. Guárdalo de inmediato.","operationId":"PublicWebhooksController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":500},"events":{"type":"array","items":{"type":"string","enum":["turn.created","turn.called","turn.completed","turn.cancelled","turn.reopened","queue.opened","queue.closed","appointment.scheduled","appointment.completed"]},"minItems":1}},"required":["url","events"],"additionalProperties":false}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Crear webhook","tags":["Webhooks"]}},"/api/v1/webhook-endpoints/{id}":{"delete":{"operationId":"PublicWebhooksController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Eliminar webhook","tags":["Webhooks"]}},"/api/v1/webhook-deliveries":{"get":{"description":"Últimas 30 entregas con su estado.","operationId":"PublicWebhooksController_deliveries","parameters":[],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Entregas recientes","tags":["Webhooks"]}}},"info":{"title":"Turno0 API","description":"API REST de Turno0 para integraciones de terceros: filas, turnos, despacho, citas, catálogos y webhooks. Autenticación con el header `X-API-Key` (las keys se crean en el panel, sección Integraciones). Guía completa en https://developers.turno0.com.","version":"1.0.0","contact":{}},"tags":[],"servers":[{"url":"https://api.turno0.com"}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key"}},"schemas":{}}}