{"openapi":"3.0.0","info":{"title":"360studio Public Links API","version":"1.0.0","description":"Contratos anónimos para formularios y reservas. Las operaciones aplican rate limiting e idempotencia."},"servers":[{"url":"https://api.360studio.app/public/v1","description":"Producción"},{"url":"https://sandbox.api.360studio.app/public/v1","description":"Sandbox"}],"tags":[{"name":"PublicForms","description":"Formularios publicados por un Workspace."},{"name":"PublicBookings","description":"Disponibilidad y reservas públicas."}],"components":{"schemas":{"PublicForm":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"fields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","minLength":1,"maxLength":50,"pattern":"^[a-z][a-z0-9_]*$"},"label":{"type":"string","minLength":1,"maxLength":100},"type":{"type":"string","enum":["text","email","phone"]},"required":{"type":"boolean"}},"required":["key","label","type","required"],"additionalProperties":false}}},"required":["name","fields"]}},"required":["success","data"]},"PublicFormSubmissionInput":{"type":"object","properties":{"idempotency_key":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"values":{"type":"object","additionalProperties":{"type":"string","maxLength":500}}},"required":["idempotency_key","values"],"additionalProperties":false},"PublicFormSubmission":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"submission_id":{"type":"string"},"status":{"type":"string","enum":["processing","completed","failed"]},"contact_id":{"type":"string"},"case_id":{"type":"string"}},"required":["submission_id","status"]}},"required":["success","data"]},"PublicBookingAvailability":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"timezone":{"type":"string"},"duration_minutes":{"type":"number"},"slots":{"type":"array","items":{"type":"object","properties":{"start_at":{"type":"string"},"end_at":{"type":"string"},"local_date":{"type":"string"},"local_time":{"type":"string"}},"required":["start_at","end_at","local_date","local_time"]}}},"required":["name","timezone","duration_minutes","slots"]}},"required":["success","data"]},"PublicBookingInput":{"type":"object","properties":{"idempotency_key":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"start_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"contact":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":150},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"phone":{"type":"string","pattern":"^\\+?\\d{7,15}$"},"phone_country_code":{"type":"string","minLength":2,"maxLength":2}},"required":["name"],"additionalProperties":false}},"required":["idempotency_key","start_at","contact"],"additionalProperties":false},"PublicBooking":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"booking_id":{"type":"string"},"contact_id":{"type":"string"},"case_id":{"type":"string"},"start_at":{"type":"string"},"end_at":{"type":"string"},"timezone":{"type":"string"},"replayed":{"type":"boolean"}},"required":["booking_id","contact_id","start_at","end_at","timezone","replayed"]}},"required":["success","data"]}}},"paths":{"/forms/{slug}":{"get":{"operationId":"getPublicForm","tags":["PublicForms"],"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"description":"Identificador público configurado por el Workspace."}],"responses":{"200":{"description":"Formulario publicado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicForm"}}}},"404":{"description":"Formulario inexistente o inactivo."},"429":{"description":"Límite de solicitudes excedido."}}}},"/forms/{slug}/submissions":{"post":{"operationId":"submitPublicForm","tags":["PublicForms"],"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"description":"Identificador público configurado por el Workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicFormSubmissionInput"}}}},"responses":{"201":{"description":"Envío aceptado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicFormSubmission"}}}},"400":{"description":"Payload inválido."},"404":{"description":"Formulario inexistente o inactivo."},"429":{"description":"Límite de solicitudes excedido."}}}},"/booking-links/{slug}/availability":{"get":{"operationId":"getPublicBookingAvailability","tags":["PublicBookings"],"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"description":"Identificador público configurado por el Workspace."},{"in":"query","name":"date","required":false,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Disponibilidad publicada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBookingAvailability"}}}},"404":{"description":"Link inexistente o inactivo."},"429":{"description":"Límite de solicitudes excedido."}}}},"/booking-links/{slug}/bookings":{"post":{"operationId":"createPublicBooking","tags":["PublicBookings"],"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"description":"Identificador público configurado por el Workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBookingInput"}}}},"responses":{"201":{"description":"Reserva confirmada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBooking"}}}},"400":{"description":"Payload o slot inválido."},"404":{"description":"Link inexistente o inactivo."},"409":{"description":"El slot ya no está disponible."},"429":{"description":"Límite de solicitudes excedido."}}}}}}