{"openapi":"3.1.0","info":{"title":"Agendria API pública","version":"1.0.0","description":"API pública da Agendria (agendria.com.br), plataforma brasileira de agendamento online. Permite buscar negócios, ver serviços, preços e horários livres e agendar como convidado, sem conta. Endpoints do painel do dono exigem login e não fazem parte deste documento. Valores monetários em centavos (`amount` inteiro, `currency` BRL). Datas em ISO 8601.","contact":{"name":"Agendria","email":"contato@agendria.com.br","url":"https://agendria.com.br/desenvolvedores"},"termsOfService":"https://agendria.com.br/termos"},"servers":[{"url":"https://agendria.com.br/api/v1","description":"Produção"}],"tags":[{"name":"Descoberta","description":"Encontrar negócios."},{"name":"Negócio","description":"Perfil, serviços e profissionais de um negócio."},{"name":"Agendamento","description":"Horários livres e criação de agendamento."},{"name":"Gestão da reserva","description":"Ações do cliente com o token de gestão (`X-Booking-Token`)."}],"externalDocs":{"description":"Guia para desenvolvedores e servidor MCP","url":"https://agendria.com.br/desenvolvedores"},"components":{"securitySchemes":{"BookingToken":{"type":"apiKey","in":"header","name":"X-Booking-Token","description":"Segredo de gestão de UM agendamento, devolvido em `manage_token` na criação. Não dá acesso a nenhum outro dado."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"issue":{"type":"string"}},"required":["field","issue"]}}},"required":["code","message"]}},"required":["error"]},"DiscoveryPage":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"vertical":{"type":["string","null"]},"cover_url":{"type":["string","null"]},"logo_url":{"type":["string","null"]},"city":{"type":["string","null"]},"district":{"type":["string","null"]},"distance_m":{"type":["number","null"]},"rating_avg":{"type":["number","null"]},"rating_count":{"type":"integer"},"featured":{"type":"boolean"},"top_services":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"price_from":{"type":"object","properties":{"amount":{"type":"integer"},"currency":{"type":"string"}},"required":["amount","currency"]},"duration_minutes":{"type":"integer"}},"required":["name","price_from","duration_minutes"]}}},"required":["id","slug","name","description","cover_url","logo_url","city","district","distance_m","rating_avg","rating_count","featured","top_services"]}},"page":{"type":"object","properties":{"next_cursor":{"type":"string"},"has_more":{"type":"boolean"},"total":{"type":"integer"}},"required":["next_cursor","has_more"]}},"required":["data","page"]},"ShopProfile":{"type":"object","properties":{"tenant_id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"timezone":{"type":"string"},"about":{"type":["string","null"]},"contact_phone":{"type":["string","null"]},"whatsapp":{"type":["string","null"]},"instagram":{"type":["string","null"]},"logo_url":{"type":["string","null"]},"cover_photo_url":{"type":["string","null"]},"address":{"type":["string","null"]},"neighborhood":{"type":["string","null"]},"city":{"type":["string","null"]},"state_uf":{"type":["string","null"]},"maps_url":{"type":["string","null"]},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"opening_hours":{"type":["array","null"],"items":{"type":"object","properties":{"weekday":{"type":"integer","minimum":0,"maximum":6},"open":{"type":"string"},"close":{"type":"string"}},"required":["weekday","open","close"]}},"amenities":{"type":["array","null"],"items":{"type":"string"}},"price_band":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"average_rating":{"type":["number","null"]},"review_count":{"type":"integer"},"payments_enabled":{"type":"boolean"},"require_payment_to_book":{"type":"boolean"},"cancel_min_antecedence_min":{"type":"integer"},"pending_payment_ttl_min":{"type":"integer"},"min_antecedence_min":{"type":"integer"},"slot_granularity_min":{"type":"integer"},"no_show_policy":{"type":"string","enum":["none","deposit","card_on_file"]},"deposit_bps":{"type":"integer"},"deposit_min_minor":{"type":"integer"},"deposit_required":{"type":"boolean"},"online_payment_required":{"type":"boolean"},"vertical":{"type":"string"},"specialty":{"type":"string"},"booking_model":{"type":"string"}},"required":["tenant_id","name","slug","timezone","average_rating","review_count","payments_enabled","require_payment_to_book","cancel_min_antecedence_min","pending_payment_ttl_min","no_show_policy","deposit_bps","deposit_min_minor","vertical","specialty","booking_model"]},"ServiceList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"category":{"type":["string","null"]},"duration_minutes":{"type":"integer"},"base_price":{"type":"object","properties":{"amount":{"type":"integer"},"currency":{"type":"string"}},"required":["amount","currency"]},"staff_ids":{"type":"array","items":{"type":"string"}},"deposit_minor":{"type":"integer"},"staff_requirement":{"type":"string"},"scheduling":{"type":"string"},"max_seats_per_booking":{"type":"integer"},"subject_kind":{"type":["string","null"]}},"required":["id","name","duration_minutes","base_price","staff_ids","deposit_minor","staff_requirement","scheduling"]}}},"required":["data"]},"StaffList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"avatar_url":{"type":["string","null"]},"bio":{"type":["string","null"]},"specialties":{"type":["array","null"],"items":{"type":"string"}},"rating":{"type":["number","null"]},"review_count":{"type":"integer"},"portfolio":{"type":"array","items":{"type":"string"}}},"required":["id","name","rating","review_count"]}}},"required":["data"]},"Availability":{"type":"object","properties":{"service_id":{"type":"string"},"duration_minutes":{"type":"integer"},"services":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"duration_minutes":{"type":"integer"},"price":{"type":"object","properties":{"amount":{"type":"integer"},"currency":{"type":"string"}},"required":["amount","currency"]}},"required":["id","name","duration_minutes","price"]}},"price_total":{"type":"object","properties":{"amount":{"type":"integer"},"currency":{"type":"string"}},"required":["amount","currency"]},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"slots":{"type":"array","items":{"type":"object","properties":{"start_at":{"type":"string"},"staff_ids":{"type":"array","items":{"type":"string"}},"price":{"type":"object","properties":{"amount":{"type":"integer"},"currency":{"type":"string"}},"required":["amount","currency"]},"remaining":{"type":"integer","minimum":0},"capacity":{"type":"integer","minimum":1},"host_staff_id":{"type":["string","null"]},"host_name":{"type":["string","null"]}},"required":["start_at","staff_ids","price"]}},"split_suggestions":{"type":"array","items":{"type":"object","properties":{"start_at":{"type":"string"},"legs":{"type":"array","items":{"type":"object","properties":{"service_id":{"type":"string"},"service_name":{"type":"string"},"staff_id":{"type":"string"},"staff_name":{"type":"string"},"start_at":{"type":"string"},"end_at":{"type":"string"}},"required":["service_id","staff_id","start_at","end_at"]}}},"required":["start_at","legs"]}}},"required":["date","slots"]}}},"required":["service_id","duration_minutes","days"]},"CreateBookingRequest":{"type":"object","properties":{"service_id":{"type":"string"},"service_ids":{"type":"array","items":{"type":"string"}},"legs":{"type":"array","items":{"type":"object","properties":{"service_id":{"type":"string"},"staff_id":{"type":"string"},"start_at":{"type":"string"}},"required":["service_id"]}},"staff_id":{"type":"string"},"start_at":{"type":"string"},"guest_name":{"type":"string"},"guest_phone":{"type":"string"},"guest_email":{"type":"string","maxLength":200,"format":"email"},"identify_token":{"type":"string","maxLength":2048},"analytics_session_id":{"type":"string","format":"uuid"},"notes":{"type":"string"},"seats":{"type":"integer","minimum":1,"maximum":50},"subject_id":{"type":"string"},"subject":{"type":"object","properties":{"kind":{"type":"string","enum":["pet","vehicle"]},"name":{"type":"string","minLength":1,"maxLength":60},"size_class":{"type":"string","enum":["xs","s","m","l","xl"]},"identifier":{"type":"string","maxLength":20},"species":{"type":"string","enum":["dog","cat","other"]},"breed":{"type":"string","maxLength":60},"model":{"type":"string","maxLength":60}},"required":["kind","name"]},"intake":{"type":"object","properties":{"form_id":{"type":"string","format":"uuid"},"form_version":{"type":"integer","minimum":1},"answers":{"type":"object","additionalProperties":{"anyOf":[{"type":"string","maxLength":4000},{"type":"boolean"},{"type":"array","items":{"type":"string","maxLength":80},"maxItems":30},{"type":"object","properties":{"yes":{"type":"boolean"},"details":{"type":"string","maxLength":1000}},"required":["yes"]},{"type":"null"},{"type":"null"}]}},"signer_name":{"type":"string","minLength":1,"maxLength":120},"signed":{"type":"boolean"}},"required":["form_id","form_version","answers"]},"addon_ids":{"type":"array","items":{"type":"string"},"maxItems":3}},"required":["start_at"]},"RescheduleBookingRequest":{"type":"object","properties":{"start_at":{"type":"string","minLength":10},"staff_id":{"type":["string","null"],"format":"uuid"}},"required":["start_at"]},"CancelBookingRequest":{"type":"object","properties":{"apply_to_group":{"type":"boolean"},"reason":{"type":"string","maxLength":200}}},"Booking":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"service_id":{"type":"string"},"service_name":{"type":"string"},"staff_id":{"type":["string","null"]},"staff_name":{"type":["string","null"]},"start_at":{"type":"string"},"end_at":{"type":"string"},"price":{"type":"object","properties":{"amount":{"type":"integer"},"currency":{"type":"string"}},"required":["amount","currency"]},"cancellation_deadline_at":{"type":"string"},"manage_token":{"type":"string"},"payment":{"type":"object","properties":{"payment_id":{"type":"string"},"method":{"type":"string"},"status":{"type":"string"},"pix_qr_code":{"type":"string"},"pix_copy_paste":{"type":"string"},"expires_at":{"type":"string"},"amount_minor":{"type":"integer"},"confirmation":{"type":"string","enum":["auto","manual"]}},"required":["payment_id","method","status","pix_qr_code","pix_copy_paste","expires_at"]},"deposit_minor":{"type":"integer"},"booking_group_id":{"type":["string","null"]},"group":{"type":"object","properties":{"id":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"appointment_id":{"type":"string"},"service_id":{"type":"string"},"service_name":{"type":"string"},"staff_id":{"type":["string","null"]},"staff_name":{"type":["string","null"]},"start_at":{"type":"string"},"end_at":{"type":"string"},"status":{"type":"string"},"price":{"type":"object","properties":{"amount":{"type":"integer"},"currency":{"type":"string"}},"required":["amount","currency"]}},"required":["appointment_id","service_id","service_name","staff_id","staff_name","start_at","end_at","price"]}},"total_price":{"type":"object","properties":{"amount":{"type":"integer"},"currency":{"type":"string"}},"required":["amount","currency"]},"total_duration_minutes":{"type":"integer"}},"required":["id","items","total_price","total_duration_minutes"]},"review":{"type":["object","null"],"properties":{"id":{"type":"string"},"rating":{"type":"integer","minimum":1,"maximum":5},"comment":{"type":["string","null"]},"status":{"type":"string","enum":["pending","approved","rejected"]},"submitted_at":{"type":"string"},"owner_reply":{"type":["string","null"]},"owner_replied_at":{"type":["string","null"]}},"required":["id","rating","comment","status","submitted_at"]},"can_review":{"type":"boolean"},"public_id":{"type":"string"},"seats":{"type":"integer","minimum":1},"subject":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["pet","vehicle"]},"name":{"type":"string"},"size_class":{"type":["string","null"],"enum":["xs","s","m","l","xl"]}},"required":["id","kind","name","size_class"]},"resource_name":{"type":["string","null"]},"addons":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"addon_id":{"type":["string","null"],"default":null},"kind":{"type":"string","enum":["service","product"]},"name":{"type":"string"},"price_minor":{"type":"integer"},"duration_minutes":{"type":"integer"},"currency":{"type":"string"},"product_id":{"type":["string","null"]},"service_id":{"type":["string","null"]}},"required":["id","kind","name","price_minor","duration_minutes","currency","product_id","service_id"]}},"products_minor":{"type":"integer"}},"required":["id","status","service_id","service_name","staff_id","staff_name","start_at","end_at","price","cancellation_deadline_at"]}},"parameters":{}},"paths":{"/public/discovery/search":{"get":{"operationId":"searchBusinesses","tags":["Descoberta"],"summary":"Buscar negócios","description":"Negócios listados e ativos, filtráveis por texto, cidade, segmento e coordenadas. Paginação por cursor (`page.next_cursor`).","parameters":[{"schema":{"type":"string","maxLength":120},"required":false,"name":"q","in":"query"},{"schema":{"type":"string","maxLength":80},"required":false,"name":"city","in":"query"},{"schema":{"type":"string","enum":["barbershop","beauty","aesthetics","automotive","pet","tattoo","health","fitness","general"]},"required":false,"name":"vertical","in":"query"},{"schema":{"type":["number","null"],"minimum":-90,"maximum":90},"required":false,"name":"lat","in":"query"},{"schema":{"type":["number","null"],"minimum":-180,"maximum":180},"required":false,"name":"lng","in":"query"},{"schema":{"type":"number","exclusiveMinimum":0,"maximum":200},"required":false,"name":"radius_km","in":"query"},{"schema":{"type":"string","enum":["distance","rating","featured"]},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","maxLength":200},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","maxLength":3},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Página de negócios.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryPage"}}}},"400":{"description":"INVALID_ARGUMENT: parâmetros inválidos (`details` aponta os campos).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED: limite por IP e negócio excedido; tente de novo em instantes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/discovery/nearby":{"get":{"operationId":"listNearbyBusinesses","tags":["Descoberta"],"summary":"Negócios perto de um ponto","description":"Mesmo contrato da busca; com `lat`/`lng` ordena por distância (`distance_m`).","parameters":[{"schema":{"type":"string","maxLength":120},"required":false,"name":"q","in":"query"},{"schema":{"type":"string","maxLength":80},"required":false,"name":"city","in":"query"},{"schema":{"type":"string","enum":["barbershop","beauty","aesthetics","automotive","pet","tattoo","health","fitness","general"]},"required":false,"name":"vertical","in":"query"},{"schema":{"type":["number","null"],"minimum":-90,"maximum":90},"required":false,"name":"lat","in":"query"},{"schema":{"type":["number","null"],"minimum":-180,"maximum":180},"required":false,"name":"lng","in":"query"},{"schema":{"type":"number","exclusiveMinimum":0,"maximum":200},"required":false,"name":"radius_km","in":"query"},{"schema":{"type":"string","enum":["distance","rating","featured"]},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","maxLength":200},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","maxLength":3},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Página de negócios.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryPage"}}}},"400":{"description":"INVALID_ARGUMENT: parâmetros inválidos (`details` aponta os campos).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED: limite por IP e negócio excedido; tente de novo em instantes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/shops/{slug}":{"get":{"operationId":"getBusiness","tags":["Negócio"],"summary":"Perfil público do negócio","description":"Endereço, horário de funcionamento, contato, nota média e política de agendamento (sinal Pix, prazo de cancelamento).","parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9-]+$","description":"Identificador público do negócio (ex.: `barbearia-do-ze`).","example":"barbearia-do-ze"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"Perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopProfile"}}}},"404":{"description":"NOT_FOUND: negócio inexistente, não listado ou agendamento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/shops/{slug}/services":{"get":{"operationId":"listServices","tags":["Negócio"],"summary":"Serviços e preços","description":"Serviços ativos com duração, preço efetivo de hoje (centavos), profissionais habilitados e o sinal que seria cobrado.","parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9-]+$","description":"Identificador público do negócio (ex.: `barbearia-do-ze`).","example":"barbearia-do-ze"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"Serviços.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceList"}}}},"404":{"description":"NOT_FOUND: negócio inexistente, não listado ou agendamento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/shops/{slug}/staff":{"get":{"operationId":"listStaff","tags":["Negócio"],"summary":"Profissionais","description":"Profissionais ativos com nota média e portfólio.","parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9-]+$","description":"Identificador público do negócio (ex.: `barbearia-do-ze`).","example":"barbearia-do-ze"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"Profissionais.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffList"}}}},"404":{"description":"NOT_FOUND: negócio inexistente, não listado ou agendamento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/shops/{slug}/availability":{"get":{"operationId":"getAvailability","tags":["Agendamento"],"summary":"Horários livres","description":"Horários livres por dia (fuso do negócio) para um ou mais serviços. `date_from` é `YYYY-MM-DD`, `days` vai de 1 a 31. Cada slot traz `start_at` (ISO 8601 com offset) e os `staff_ids` livres.","parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9-]+$","description":"Identificador público do negócio (ex.: `barbearia-do-ze`).","example":"barbearia-do-ze"},"required":true,"name":"slug","in":"path"},{"schema":{"type":"string"},"required":false,"name":"service_id","in":"query"},{"schema":{"type":"string"},"required":false,"name":"service_ids","in":"query"},{"schema":{"type":"string"},"required":false,"name":"staff_id","in":"query"},{"schema":{"type":"string"},"required":false,"name":"date_from","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":31},"required":false,"name":"days","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50},"required":false,"name":"seats","in":"query"},{"schema":{"type":"string","enum":["xs","s","m","l","xl"]},"required":false,"name":"size_class","in":"query"},{"schema":{"type":"string"},"required":false,"name":"subject_id","in":"query"},{"schema":{"type":"string"},"required":false,"name":"addon_ids","in":"query"},{"schema":{"type":"string"},"required":false,"name":"booking_id","in":"query"}],"responses":{"200":{"description":"Disponibilidade.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Availability"}}}},"400":{"description":"INVALID_ARGUMENT: parâmetros inválidos (`details` aponta os campos).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_FOUND: negócio inexistente, não listado ou agendamento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/shops/{slug}/bookings":{"post":{"operationId":"createBooking","tags":["Agendamento"],"summary":"Criar agendamento","description":"Cria o agendamento como convidado (nome + telefone). Sem pagamento online o status já é `confirmed`; com sinal ou pagamento obrigatório fica `pending` até o Pix (`payment`) ser pago dentro de `pending_payment_ttl_min`. A resposta traz `manage_token` UMA vez: guarde-o para consultar, cancelar ou remarcar. Limite: 20 por minuto por IP e negócio.","parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9-]+$","description":"Identificador público do negócio (ex.: `barbearia-do-ze`).","example":"barbearia-do-ze"},"required":true,"name":"slug","in":"path"},{"schema":{"type":"string","maxLength":200,"description":"Chave única por tentativa (UUID). Repetir a mesma chave com o mesmo corpo devolve a resposta original."},"required":false,"name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBookingRequest"}}}},"responses":{"201":{"description":"Agendamento criado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"400":{"description":"INVALID_ARGUMENT: parâmetros inválidos (`details` aponta os campos).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_FOUND: negócio inexistente, não listado ou agendamento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"CONFLICT / INVALID_STATE_TRANSITION / IDEMPOTENCY_CONFLICT: horário ocupado, estado não permite a ação ou chave reutilizada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"INVARIANT_VIOLATION: regra do negócio (ex.: prazo de cancelamento encerrado).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED: limite por IP e negócio excedido; tente de novo em instantes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/shops/{slug}/bookings/{id}":{"get":{"operationId":"getBooking","tags":["Gestão da reserva"],"summary":"Consultar agendamento e status do Pix","description":"Status do agendamento e, quando houver cobrança, o status do Pix (`payment.status`: pending, paid, expired) e o copia-e-cola.","security":[{"BookingToken":[]}],"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9-]+$","description":"Identificador público do negócio (ex.: `barbearia-do-ze`).","example":"barbearia-do-ze"},"required":true,"name":"slug","in":"path"},{"schema":{"type":"string","description":"Id público do agendamento (`apt_…`) devolvido na criação.","example":"apt_01k9z3x5m2q7c8v4n6b0t1r2s3"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Token de gestão devolvido em `manage_token` na criação (também presente no link `?t=`)."},"required":true,"name":"x-booking-token","in":"header"}],"responses":{"200":{"description":"Agendamento.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"401":{"description":"UNAUTHORIZED: token de gestão ausente ou inválido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_FOUND: negócio inexistente, não listado ou agendamento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/shops/{slug}/bookings/{id}:cancel":{"post":{"operationId":"cancelBooking","tags":["Gestão da reserva"],"summary":"Cancelar agendamento","description":"Cancela até `cancel_min_antecedence_min` minutos antes do horário. Idempotente: cancelar de novo devolve o mesmo estado.","security":[{"BookingToken":[]}],"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9-]+$","description":"Identificador público do negócio (ex.: `barbearia-do-ze`).","example":"barbearia-do-ze"},"required":true,"name":"slug","in":"path"},{"schema":{"type":"string","description":"Id público do agendamento (`apt_…`) devolvido na criação.","example":"apt_01k9z3x5m2q7c8v4n6b0t1r2s3"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Token de gestão devolvido em `manage_token` na criação (também presente no link `?t=`)."},"required":true,"name":"x-booking-token","in":"header"},{"schema":{"type":"string","maxLength":200,"description":"Chave única por tentativa (UUID). Repetir a mesma chave com o mesmo corpo devolve a resposta original."},"required":false,"name":"idempotency-key","in":"header"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelBookingRequest"}}}},"responses":{"200":{"description":"Agendamento cancelado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"401":{"description":"UNAUTHORIZED: token de gestão ausente ou inválido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_FOUND: negócio inexistente, não listado ou agendamento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"CONFLICT / INVALID_STATE_TRANSITION / IDEMPOTENCY_CONFLICT: horário ocupado, estado não permite a ação ou chave reutilizada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"INVARIANT_VIOLATION: regra do negócio (ex.: prazo de cancelamento encerrado).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED: limite por IP e negócio excedido; tente de novo em instantes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/shops/{slug}/bookings/{id}:reschedule":{"post":{"operationId":"rescheduleBooking","tags":["Gestão da reserva"],"summary":"Remarcar agendamento","description":"Move o agendamento (e os serviços agendados junto) para um horário livre da disponibilidade. Mantém o profissional quando ele estiver livre.","security":[{"BookingToken":[]}],"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9-]+$","description":"Identificador público do negócio (ex.: `barbearia-do-ze`).","example":"barbearia-do-ze"},"required":true,"name":"slug","in":"path"},{"schema":{"type":"string","description":"Id público do agendamento (`apt_…`) devolvido na criação.","example":"apt_01k9z3x5m2q7c8v4n6b0t1r2s3"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Token de gestão devolvido em `manage_token` na criação (também presente no link `?t=`)."},"required":true,"name":"x-booking-token","in":"header"},{"schema":{"type":"string","maxLength":200,"description":"Chave única por tentativa (UUID). Repetir a mesma chave com o mesmo corpo devolve a resposta original."},"required":false,"name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RescheduleBookingRequest"}}}},"responses":{"200":{"description":"Agendamento remarcado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"400":{"description":"INVALID_ARGUMENT: parâmetros inválidos (`details` aponta os campos).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"UNAUTHORIZED: token de gestão ausente ou inválido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_FOUND: negócio inexistente, não listado ou agendamento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"CONFLICT / INVALID_STATE_TRANSITION / IDEMPOTENCY_CONFLICT: horário ocupado, estado não permite a ação ou chave reutilizada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"INVARIANT_VIOLATION: regra do negócio (ex.: prazo de cancelamento encerrado).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED: limite por IP e negócio excedido; tente de novo em instantes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/shops/{slug}/bookings/{id}:repay":{"post":{"operationId":"renewPixCharge","tags":["Gestão da reserva"],"summary":"Gerar novo Pix","description":"Quando o Pix do sinal expirou e o horário segue livre, segura o horário de novo e devolve uma nova cobrança. Com o Pix ainda válido, devolve o atual.","security":[{"BookingToken":[]}],"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9-]+$","description":"Identificador público do negócio (ex.: `barbearia-do-ze`).","example":"barbearia-do-ze"},"required":true,"name":"slug","in":"path"},{"schema":{"type":"string","description":"Id público do agendamento (`apt_…`) devolvido na criação.","example":"apt_01k9z3x5m2q7c8v4n6b0t1r2s3"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Token de gestão devolvido em `manage_token` na criação (também presente no link `?t=`)."},"required":true,"name":"x-booking-token","in":"header"},{"schema":{"type":"string","maxLength":200,"description":"Chave única por tentativa (UUID). Repetir a mesma chave com o mesmo corpo devolve a resposta original."},"required":false,"name":"idempotency-key","in":"header"}],"responses":{"200":{"description":"Agendamento com o Pix vigente.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"401":{"description":"UNAUTHORIZED: token de gestão ausente ou inválido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_FOUND: negócio inexistente, não listado ou agendamento não encontrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"CONFLICT / INVALID_STATE_TRANSITION / IDEMPOTENCY_CONFLICT: horário ocupado, estado não permite a ação ou chave reutilizada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED: limite por IP e negócio excedido; tente de novo em instantes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{}}