{"openapi":"3.1.0","info":{"title":"Patrocinio Tech API pública","description":"Números conectados, templates, envio de mensagens de WhatsApp e acompanhamento por webhook. Guia com exemplos em https://patrociniotech.com/documentacao-api","version":"1.0.0"},"paths":{"/public/v1/messages":{"post":{"tags":["public-api"],"summary":"Enviar mensagem (texto ou template)","operationId":"public_send_public_v1_messages_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Um valor único por mensagem (um uuid serve). A chave é RESERVADA antes de falarmos com a Meta: repetir a chamada devolve a resposta original em vez de enviar de novo. Repita em erro de conexão e em 5xx sempre com a MESMA chave e o mesmo conteúdo. Somente uma recusa confirmada libera a chave; uma tentativa sem confirmação não é reenviada.","title":"Idempotency-Key"},"description":"Um valor único por mensagem (um uuid serve). A chave é RESERVADA antes de falarmos com a Meta: repetir a chamada devolve a resposta original em vez de enviar de novo. Repita em erro de conexão e em 5xx sempre com a MESMA chave e o mesmo conteúdo. Somente uma recusa confirmada libera a chave; uma tentativa sem confirmação não é reenviada."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSendIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"400":{"description":"Pedido incompleto ou destinatário inválido · códigos possíveis: invalid_recipient, empty_message, ambiguous_message, invalid_idempotency_key, pix_needs_template","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"409":{"description":"Outra chamada com a MESMA Idempotency-Key ainda está em andamento. Espere alguns segundos e repita COM A MESMA CHAVE · códigos possíveis: idempotency_in_flight, idempotency_conflict, idempotency_legacy_unverified","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"422":{"description":"Envio recusado pela validação ou pela Meta · códigos possíveis: invalid_request, outside_24h_window, recipient_unreachable, template_params_mismatch, template_not_found, template_paused, invalid_template, marketing_not_allowed, marketing_experiment, marketing_recipient_limited, delivery_limited, payment_issue, account_restricted, variable_too_long, variable_bad_format, invalid_pix_order, template_required_header_media, template_header_mismatch, template_format_unsupported, invalid_otp","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"503":{"description":"A consulta dos templates está indisponível. Repita com a mesma chave · códigos possíveis: templates_unavailable","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/messages/status":{"get":{"tags":["public-api"],"summary":"Recuperar um envio por referência ou chave de idempotência","description":"Sem envio nem alteração de estado. Escolha client_ref OU Idempotency-Key.\n\nA referência encontra registros já persistidos e precisa ser única por operação.\nA chave também encontra a reserva de um envio incerto. Confira resolution:\nunconfirmed não é failed, e accepted não significa delivered. Um 404 pode\nocorrer antes da reserva/persistência ou após retenção e não autoriza reenviar.\nNunca retoma uma reserva nem consulta a Meta; preserva a chave e o conteúdo\noriginal para eventual repetição do POST, conforme o contrato de idempotência.","operationId":"public_lookup_message_public_v1_messages_status_get","parameters":[{"name":"client_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}],"title":"Client Ref"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}],"title":"Idempotency-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMessageLookupOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"400":{"description":"Escolha exatamente uma forma de consulta · códigos possíveis: invalid_status_lookup","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"Tentativa não localizada; não comprova falha nem autoriza reenvio · códigos possíveis: message_not_found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"409":{"description":"A referência foi reutilizada em mais de uma tentativa · códigos possíveis: ambiguous_client_ref","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/messages/{message_id}/status":{"get":{"tags":["public-api"],"summary":"Consultar o status registrado de uma mensagem enviada","description":"Somente leitura: consulta o banco pelo message_id devolvido no envio, sem falar com a Meta.\n\nUm 404 pode ocorrer antes da persistência ou após a retenção; nunca autoriza reenviar\nautomaticamente. A consulta consome a mesma cota de requisições da chave, não um novo envio.","operationId":"public_message_status_public_v1_messages__message_id__status_get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9._~+/=-]+$","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMessageStatusOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"Mensagem enviada não encontrada nesta conta · códigos possíveis: message_not_found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/validate":{"post":{"tags":["public-api"],"summary":"Validar e normalizar o formato de um telefone","description":"Valida o formato ANTES de enviar: país, DDD e comprimento conforme o plano telefônico.\nUm telefone digitado errado pode ter formato válido. Retorna `to` normalizado, só dígitos.\n`valid=true` não confirma cadastro no WhatsApp, autorização para envio nem entrega.\nConfirme `delivered`/`read` pelo webhook `message.status`. `failed` com código Meta 131026\nindica mensagem não entregue, sem comprovar que o destinatário não tem WhatsApp.","operationId":"public_validate_public_v1_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/window/{to}":{"get":{"tags":["public-api"],"summary":"A janela de 24h está aberta?","description":"A janela de 24h deste contato está aberta para enviar texto livre?\n\nA janela define o formato permitido, não a gratuidade. A cobrança segue as regras vigentes\nda Meta, a categoria e as franquias da conta. Consulte Faturamento para os volumes cobrados.\n\n    janela aberta  -> POST /messages com `text` ou `template`\n    janela fechada -> POST /messages com `template` aprovado\n\nSem isto, a escolha vira tentativa e erro: mandar texto fora da janela devolve 422 e só então o\nsistema tenta o template, o que custa uma ida e volta a mais em cada mensagem.\n\nA janela conta a partir da última vez que o CLIENTE escreveu. Mensagem que você envia não abre\nnem estende janela nenhuma.\n\nContato que nunca escreveu devolve `open: false`, e isso não é erro: é o estado normal de quem\nvocê ainda não conversou, e a resposta certa é mandar template.","operationId":"public_window_public_v1_window__to__get","parameters":[{"name":"to","in":"path","required":true,"schema":{"type":"string","title":"To"}},{"name":"phone_number_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWindowOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"400":{"description":"Destinatário ou número de envio inválido · códigos possíveis: invalid_recipient, no_connected_number","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/templates":{"get":{"tags":["public-api"],"summary":"Catálogo e estados dos templates da conta","description":"Os templates da conta, com o formato de cada um.\n\nServe para o sistema do cliente montar o envio sem ninguém decorar nada: vem o `name`, o\n`language` e quantas VARIÁVEIS o corpo espera, que é o que o `POST /messages` pede em\n`variables` (na ordem, {{1}}, {{2}}, ...).\n\nMandar a quantidade errada de variáveis é o erro mais comum de quem integra template, e a Meta\ndevolve isso como falha genérica. Com `variables_count` na mão, dá para validar antes de gastar.\n\nPor padrão só os APROVADOS, porque são os únicos que enviam. `status=ALL` traz todos, para uma\ntela de administração mostrar o que está em análise ou reprovado.","operationId":"public_templates_public_v1_templates_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"APPROVED","title":"Status"}},{"name":"phone_number_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCatalogueOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"400":{"description":"Filtro inválido ou número indisponível nesta conta · códigos possíveis: invalid_template_status, no_connected_number","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"503":{"description":"Não foi possível obter o catálogo completo da Meta · códigos possíveis: templates_unavailable","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}},"post":{"tags":["public-api"],"summary":"Criar template e submeter à Meta","operationId":"create_public_v1_templates_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateTemplateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreatedTemplateOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"400":{"description":"Número não conectado à empresa · códigos possíveis: no_connected_number","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Modelo inválido ou recusado · códigos possíveis: invalid_request, invalid_name, invalid_category, empty_body, invalid_vars, missing_examples, adjacent_vars, only_vars, mixed_vars, header_var, footer_var, invalid_header_format, invalid_format, invalid_button, header_sample_required, auth_template_format, auth_template_ttl, order_details_button, order_details_header, name_taken, meta_error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"503":{"description":"Resultado incerto: consulte o catálogo antes de repetir · códigos possíveis: template_creation_unconfirmed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/deliveries":{"get":{"tags":["public-api"],"summary":"Fila de entregas do webhook","description":"Entregas do webhook, mais recente primeiro.\n\n`status`: pending | delivering | delivered | failed. `before_id` pagina para trás (cursor).\nA resposta traz `next_before_id` quando pode haver mais: repita a chamada com ele até vir nulo.\nCombine message_id e event para localizar a entrega de um envio. Os filtros usam\níndices próprios e sempre o tenant da chave. `retention` informa os prazos efetivos:\ndelivered: 30 dias; failed: 60 dias, por padrão, contados de created_at.\npending/delivering não são removidos por idade. Armazene seus próprios eventos.","operationId":"public_list_deliveries_public_v1_deliveries_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"before_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Before Id"}},{"name":"message_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9._~+/=-]+$"},{"type":"null"}],"title":"Message Id"}},{"name":"event","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}],"title":"Event"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDeliveriesOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"400":{"description":"Filtro de status ou evento inválido · códigos possíveis: invalid_status, invalid_event","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/deliveries/{delivery_id}":{"get":{"tags":["public-api"],"summary":"Uma entrega do webhook","description":"Uma entrega, com `last_error`: o corpo do que o SEU endpoint respondeu, mesmo num 2xx.\n\nÉ o campo que responde \"o webhook chegou mas nada aconteceu, por quê?\": um 200 pode dizer no\ncorpo que não aplicou.","operationId":"public_get_delivery_public_v1_deliveries__delivery_id__get","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDeliveryOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"Entrega não encontrada nesta conta · códigos possíveis: not_found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/deliveries/{delivery_id}/retry":{"post":{"tags":["public-api"],"summary":"Reenviar uma entrega","description":"Devolve a entrega para a fila. Vale para `failed` (dead-letter) e para `delivered` (reprocessar).\n\nO corpo é assinado DE NOVO no disparo, com timestamp do momento: uma entrega guardada e reenviada\nhoras depois não esbarra na janela de replay do seu endpoint.\n\nEntra na trilha com prefixo `api.`, igual ao envio: a mesma ação existe no painel\n(`webhook.retry`) e auditar só a versão de gente deixaria a porta da máquina sem rastro. Quem\nolha a trilha depois quer saber que houve reenvio, não por qual das duas portas.","operationId":"public_retry_delivery_public_v1_deliveries__delivery_id__retry_post","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"Entrega não encontrada nesta conta ou ainda na fila · códigos possíveis: not_retryable","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/deliveries/retry-failed":{"post":{"tags":["public-api"],"summary":"Reenviar todas as entregas que falharam","description":"Reenvia TUDO que esgotou as tentativas. O caso comum depois de consertar o endpoint.","operationId":"public_retry_failed_public_v1_deliveries_retry_failed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/numbers":{"get":{"tags":["public-api"],"summary":"Números conectados, qualidade e limite do portfólio","operationId":"public_numbers_public_v1_numbers_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Tamanho da página: de 1 a 50. Conta como uma requisição no limite compartilhado de 600/min por chave.","default":20,"title":"Limit"},"description":"Tamanho da página: de 1 a 50. Conta como uma requisição no limite compartilhado de 600/min por chave."},{"name":"after_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":64,"pattern":"^[0-9]+$"},{"type":"null"}],"description":"Cursor next_after_id recebido na página anterior. Não precisa continuar existindo no cadastro.","title":"After Id"},"description":"Cursor next_after_id recebido na página anterior. Não precisa continuar existindo no cadastro."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicNumbersOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Parâmetro de paginação inválido · códigos possíveis: invalid_request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/templates/header-sample":{"post":{"tags":["public-api"],"summary":"Enviar amostra de mídia para criar um template","operationId":"sample_public_v1_templates_header_sample_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_sample_public_v1_templates_header_sample_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTemplateSampleOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"400":{"description":"Número indisponível ou arquivo vazio · códigos possíveis: no_connected_number, empty_file","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}}},"413":{"description":"Amostra acima do tamanho permitido · códigos possíveis: file_too_large","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"415":{"description":"Tipo de arquivo não suportado · códigos possíveis: unsupported_media","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"422":{"description":"Parâmetro ou conteúdo inválido · códigos possíveis: invalid_request, invalid_sample","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"502":{"description":"Upload para a Meta falhou · códigos possíveis: upload_failed","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/contacts/consent/batch":{"post":{"tags":["public-api"],"summary":"Consultar até 500 consentimentos e bloqueios de marketing","operationId":"consent_batch_public_v1_contacts_consent_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentBatchIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentBatchOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"400":{"description":"Número de envio indisponível · códigos possíveis: no_connected_number","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}}},"422":{"description":"Corpo ou telefone inválido · códigos possíveis: invalid_request","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"properties":{"fields":{"items":{"properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"type":"object","required":["field","code","message"]},"type":"array","maxItems":20},"retry_after_seconds":{"type":"integer","minimum":1}},"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/contacts/{to}/consent":{"put":{"tags":["public-api"],"summary":"Registrar uma manifestação de consentimento com referência à prova","operationId":"consent_write_public_v1_contacts__to__consent_put","parameters":[{"name":"to","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":32,"title":"To"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentWriteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentWriteOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"400":{"description":"Telefone/número de envio inválido · códigos possíveis: invalid_recipient, no_connected_number","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"409":{"description":"Registro não aplicado · códigos possíveis: consent_blocked, stale_consent, consent_event_conflict","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"422":{"description":"Declaração inválida · códigos possíveis: invalid_request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/campaigns":{"get":{"tags":["public-api"],"summary":"Campanhas criadas no painel","operationId":"public_campaigns_public_v1_campaigns_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"before_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Before Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCampaignListOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Paginação inválida · códigos possíveis: invalid_request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}},"/public/v1/campaigns/{campaign_id}/results":{"get":{"tags":["public-api"],"summary":"Entrega por destinatário de uma campanha","operationId":"public_campaign_results_public_v1_campaigns__campaign_id__results_get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Campaign Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"enum":["all","pending","sending","sent","delivered","read","failed","skipped","uncertain","not_sent","opted_out"],"type":"string","default":"all","title":"Status"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":32,"pattern":"^[0-9]+$"},{"type":"null"}],"title":"After"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCampaignResultsOut"}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: missing_api_key, invalid_api_key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"Campanha não encontrada nesta empresa · códigos possíveis: not_found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"422":{"description":"Filtro ou paginação inválidos · códigos possíveis: invalid_request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}},"429":{"description":"Excesso de requisições. Respeite o header Retry-After · códigos possíveis: api_rate_limited, rate_limited","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Código estável. Programe contra ele, não contra a frase."},"message":{"type":"string","description":"Frase em português, pronta para mostrar a uma pessoa."},"details":{"type":"object","description":"Detalhes opcionais para corrigir campos ou respeitar uma pausa. Nunca contêm valores enviados ou credenciais.","properties":{"fields":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"field":{"type":"string","example":"body.header_media.link"},"code":{"type":"string","example":"url_parsing"},"message":{"type":"string","example":"Informe uma URL válida."}},"required":["field","code","message"]}},"retry_after_seconds":{"type":"integer","minimum":1}}}},"required":["code","message"]}},"required":["success","error"]}}},"headers":{"X-RateLimit-Limit":{"description":"Requisições por minuto por chave, compartilhadas entre leitura e escrita.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Saldo no instante da resposta; concorrência pode consumir chamadas antes da próxima requisição.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp em segundos do fim da janela do minuto.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"api_key com Redis; api_key_worker durante fallback local. Ausente sem autenticação válida.","schema":{"type":"string","enum":["api_key","api_key_worker"]}}}}}}}},"components":{"schemas":{"ApiConsentRecordOut":{"properties":{"event_id":{"type":"string","title":"Event Id"},"state":{"type":"string","enum":["accepted","declined"],"title":"State"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"recorded_at":{"type":"string","format":"date-time","title":"Recorded At"},"source":{"type":"string","title":"Source"},"evidence_ref":{"type":"string","title":"Evidence Ref"},"notice_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notice Version"}},"type":"object","required":["event_id","state","occurred_at","recorded_at","source","evidence_ref","notice_version"],"title":"ApiConsentRecordOut"},"Body_sample_public_v1_templates_header_sample_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"JPEG/PNG até 5 MB; MP4/3GPP/PDF até 16 MB. Não use dados reais de clientes como exemplo."},"phone_number_id":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[0-9]+$","title":"Phone Number Id"}},"type":"object","required":["file","phone_number_id"],"title":"Body_sample_public_v1_templates_header_sample_post"},"ConsentBatchDataOut":{"properties":{"phone_number_id":{"type":"string","title":"Phone Number Id"},"checked_at":{"type":"string","format":"date-time","title":"Checked At"},"items":{"items":{"$ref":"#/components/schemas/ConsentContactOut"},"type":"array","title":"Items"}},"type":"object","required":["phone_number_id","checked_at","items"],"title":"ConsentBatchDataOut"},"ConsentBatchIn":{"properties":{"phone_number_id":{"anyOf":[{"type":"string","maxLength":64,"minLength":1,"pattern":"^[0-9]+$"},{"type":"null"}],"title":"Phone Number Id"},"recipients":{"items":{"type":"string","maxLength":32,"minLength":1},"type":"array","maxItems":500,"minItems":1,"title":"Recipients","description":"Até 500 telefones internacionais. Uma consulta na cota por chave; duplicados são removidos preservando a ordem. Não verifica existência no WhatsApp."}},"additionalProperties":false,"type":"object","required":["recipients"],"title":"ConsentBatchIn"},"ConsentBatchOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success"},"data":{"$ref":"#/components/schemas/ConsentBatchDataOut"}},"type":"object","required":["success","data"],"title":"ConsentBatchOut"},"ConsentContactOut":{"properties":{"to":{"type":"string","title":"To"},"known":{"type":"boolean","title":"Known","description":"Existe cadastro no número de envio selecionado."},"opt_in":{"anyOf":[{"type":"string","enum":["pending","accepted","declined"]},{"type":"null"}],"title":"Opt In","description":"Estado legado do cadastro. accepted pode vir de inbound (a pessoa escreveu), sem autorização comprovada para promoções. Não conte accepted como consentimento verificado."},"opt_in_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Opt In At","description":"Data do estado local atual; registros legados podem não ter data/origem. Não inventamos prova retroativa."},"opt_in_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opt In Source","description":"Origem do estado: inbound indica conversa iniciada pelo contato; manual/import também não comprovam autorização. api identifica declaração externa; consulte a prova original e o estado atual."},"opt_in_scope":{"type":"string","const":"phone_number","title":"Opt In Scope","description":"opt_in e sua data/origem são do número selecionado. A exclusão de marketing vale para a empresa inteira."},"marketing_allowed":{"type":"boolean","title":"Marketing Allowed","description":"Ausência de bloqueio local, não comprovação de consentimento. Uma recusa em outro número da mesma empresa também impede marketing."},"marketing_block_reason":{"anyOf":[{"type":"string","enum":["opted_out","blocked"]},{"type":"null"}],"title":"Marketing Block Reason"},"latest_api_record":{"anyOf":[{"$ref":"#/components/schemas/ApiConsentRecordOut"},{"type":"null"}],"description":"Última prova declarada pela API para este número. É histórica e pode ter sido substituída por saída posterior; consulte marketing_allowed e opt_in atuais."}},"type":"object","required":["to","known","opt_in","opt_in_at","opt_in_source","opt_in_scope","marketing_allowed","marketing_block_reason","latest_api_record"],"title":"ConsentContactOut"},"ConsentWriteDataOut":{"properties":{"event_id":{"type":"string","title":"Event Id"},"recorded_at":{"type":"string","format":"date-time","title":"Recorded At"},"idempotent_replay":{"type":"boolean","title":"Idempotent Replay"},"contact":{"$ref":"#/components/schemas/ConsentContactOut"}},"type":"object","required":["event_id","recorded_at","idempotent_replay","contact"],"title":"ConsentWriteDataOut"},"ConsentWriteIn":{"properties":{"phone_number_id":{"anyOf":[{"type":"string","maxLength":64,"minLength":1,"pattern":"^[0-9]+$"},{"type":"null"}],"title":"Phone Number Id"},"event_id":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9._:-]+$","title":"Event Id","description":"Identificador único da declaração na sua empresa. Repetir com o mesmo conteúdo não reaplica o aceite. Conteúdo diferente retorna 409."},"state":{"type":"string","enum":["accepted","declined"],"title":"State"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At","description":"Data real da manifestação, com fuso explícito. Não pode estar mais de cinco minutos no futuro."},"source":{"type":"string","enum":["web","app","form","phone","in_person","other"],"title":"Source"},"evidence_ref":{"type":"string","maxLength":200,"minLength":1,"title":"Evidence Ref","description":"Referência opaca à prova guardada no seu sistema. Não envie credenciais, documentos ou o conteúdo da conversa."},"notice_version":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Notice Version","description":"Versão do texto de consentimento apresentado à pessoa, se disponível."}},"additionalProperties":false,"type":"object","required":["event_id","state","occurred_at","source","evidence_ref"],"title":"ConsentWriteIn"},"ConsentWriteOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success"},"data":{"$ref":"#/components/schemas/ConsentWriteDataOut"}},"type":"object","required":["success","data"],"title":"ConsentWriteOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeaderMediaIn":{"properties":{"type":{"type":"string","maxLength":16,"title":"Type","default":"document"},"link":{"type":"string","maxLength":2048,"minLength":8,"title":"Link"},"filename":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Filename"}},"additionalProperties":false,"type":"object","required":["link"],"title":"HeaderMediaIn","description":"Anexo do CABEÇALHO de um template.\n\nObrigatório em template cujo cabeçalho é documento, imagem ou vídeo. Sem ele a Meta rejeita com\n132012, e a mensagem simplesmente não sai. É o caso dos templates de entrega de pedido, que\nlevam o bilhete em PDF.\n\n`link` é uma URL PÚBLICA que a Meta baixa: ela precisa alcançar o arquivo sem login. Não é\nupload; o arquivo continua no seu servidor."},"PixItemIn":{"properties":{"name":{"type":"string","maxLength":60,"minLength":1,"title":"Name"},"amount":{"type":"integer","maximum":9007199254740991,"minimum":0,"title":"Amount"},"quantity":{"type":"integer","maximum":1000,"minimum":1,"title":"Quantity","default":1},"retailer_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Retailer Id"}},"additionalProperties":false,"type":"object","required":["name","amount"],"title":"PixItemIn","description":"Uma linha do pedido. `amount` é o valor UNITÁRIO em centavos."},"PixOrderIn":{"properties":{"reference_id":{"type":"string","maxLength":64,"minLength":1,"title":"Reference Id"},"pix_code":{"type":"string","maxLength":1024,"minLength":20,"title":"Pix Code"},"merchant_name":{"type":"string","maxLength":120,"minLength":1,"title":"Merchant Name"},"key":{"type":"string","maxLength":120,"minLength":1,"title":"Key"},"key_type":{"type":"string","enum":["CNPJ","CPF","EMAIL","PHONE","EVP"],"title":"Key Type","default":"CNPJ"},"items":{"items":{"$ref":"#/components/schemas/PixItemIn"},"type":"array","maxItems":30,"minItems":1,"title":"Items"},"total_amount":{"anyOf":[{"type":"integer","maximum":9007199254740991,"minimum":0},{"type":"null"}],"title":"Total Amount"},"tax":{"type":"integer","maximum":9007199254740991,"minimum":0,"title":"Tax","default":0},"goods_type":{"type":"string","enum":["digital-goods","physical-goods"],"title":"Goods Type","default":"digital-goods"}},"additionalProperties":false,"type":"object","required":["reference_id","pix_code","merchant_name","key","items"],"title":"PixOrderIn","description":"Cobrança PIX de um template de Detalhes do Pedido."},"PublicCampaignCountsOut":{"properties":{"pending":{"type":"integer","minimum":0,"title":"Pending","default":0},"sending":{"type":"integer","minimum":0,"title":"Sending","default":0},"sent":{"type":"integer","minimum":0,"title":"Sent","description":"Aceitas, ainda sem entrega/leitura ou falha posterior registrada.","default":0},"delivered":{"type":"integer","minimum":0,"title":"Delivered","description":"Entregues, excluindo as que já têm leitura registrada.","default":0},"read":{"type":"integer","minimum":0,"title":"Read","description":"Lidas/reproduzidas. Também foram entregues; não somar com delivered_including_read.","default":0},"failed":{"type":"integer","minimum":0,"title":"Failed","default":0},"skipped":{"type":"integer","minimum":0,"title":"Skipped","default":0},"uncertain":{"type":"integer","minimum":0,"title":"Uncertain","default":0},"not_sent":{"type":"integer","minimum":0,"title":"Not Sent","default":0},"opted_out":{"type":"integer","minimum":0,"title":"Opted Out","description":"Saídas de promoções atribuídas à campanha. Sobrepõe os estados anteriores; não entra na soma de destinatários.","default":0}},"type":"object","title":"PublicCampaignCountsOut"},"PublicCampaignListDataOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PublicCampaignOut"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More"},"next_before_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Before Id"},"checked_at":{"type":"string","format":"date-time","title":"Checked At"}},"type":"object","required":["items","has_more","next_before_id","checked_at"],"title":"PublicCampaignListDataOut"},"PublicCampaignListOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success"},"data":{"$ref":"#/components/schemas/PublicCampaignListDataOut"}},"type":"object","required":["success","data"],"title":"PublicCampaignListOut"},"PublicCampaignOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id"},"template":{"type":"string","title":"Template"},"language":{"type":"string","title":"Language"},"status":{"type":"string","enum":["scheduled","sending","done","failed"],"title":"Status","description":"Estado do disparo. done não significa que todas as mensagens foram entregues."},"total":{"type":"integer","minimum":0,"title":"Total","description":"Destinatários selecionados para o disparo. Não é contagem de entregas."},"accepted":{"type":"integer","minimum":0,"title":"Accepted","description":"Aceitas no envio à API da Meta. Podem falhar depois por webhook."},"dispatch_failed":{"type":"integer","minimum":0,"title":"Dispatch Failed","description":"Falhas no disparo; não inclui necessariamente falhas posteriores de entrega."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"}},"type":"object","required":["id","name","phone_number_id","template","language","status","total","accepted","dispatch_failed","created_at","scheduled_at","started_at","finished_at"],"title":"PublicCampaignOut"},"PublicCampaignRecipientOut":{"properties":{"to":{"type":"string","title":"To","description":"Telefone solicitado no disparo. contact_wa_id pode ser diferente quando a Meta normalizou o destinatário."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"contact_wa_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Wa Id"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id","description":"WAMID da Meta; null se não há aceite registrado. Use GET /messages/{message_id}/status para consultar uma mensagem."},"dispatch_status":{"type":"string","enum":["pending","sending","sent","failed","skipped","uncertain","unknown"],"title":"Dispatch Status","description":"Estado da tentativa local. unknown em históricos anteriores à trilha por destinatário."},"status":{"type":"string","enum":["pending","sending","sent","delivered","read","failed","skipped","uncertain","not_sent"],"title":"Status"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Código estável da falha conhecida; null quando não há classificação registrada. Nunca prova que o destinatário não tem WhatsApp."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"attempted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Attempted At"},"status_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Status At","description":"Última atualização de preço/status da trilha quando disponível; não é garantia de horário da entrega."},"pricing_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Category"},"billable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Billable","description":"Indicação de cobrança recebida da Meta; null significa não informado, não gratuidade."},"opted_out_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Opted Out At","description":"Saída de promoções atribuída a esta campanha. Sobrepõe o status de entrega, não o substitui."}},"type":"object","required":["to","name","contact_wa_id","message_id","dispatch_status","status","error_code","reason","attempted_at","status_at","pricing_category","billable","opted_out_at"],"title":"PublicCampaignRecipientOut"},"PublicCampaignResultsDataOut":{"properties":{"campaign":{"$ref":"#/components/schemas/PublicCampaignOut"},"counts":{"$ref":"#/components/schemas/PublicCampaignCountsOut","description":"Totais da campanha, independentes da página e do filtro. delivered exclui read; opted_out sobrepõe os demais e não deve ser somado."},"delivered_including_read":{"type":"integer","title":"Delivered Including Read"},"records":{"type":"integer","title":"Records","description":"Destinatários com evidência de envio/trilha disponível."},"untracked":{"type":"integer","title":"Untracked","description":"Diferença positiva entre total selecionado e registros disponíveis. Não classifique como falha."},"complete_tracking":{"type":"boolean","title":"Complete Tracking"},"total_filtered":{"type":"integer","title":"Total Filtered","description":"Quantidade que corresponde ao filtro em toda a campanha, antes do cursor."},"items":{"items":{"$ref":"#/components/schemas/PublicCampaignRecipientOut"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More"},"next_after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next After","description":"Cursor lexical por telefone. Passe em after com os mesmos filtros; eventos podem alterar status entre páginas."},"snapshot_at":{"type":"string","format":"date-time","title":"Snapshot At","description":"Horário da leitura no banco; não é consulta ao vivo à Meta."}},"type":"object","required":["campaign","counts","delivered_including_read","records","untracked","complete_tracking","total_filtered","items","has_more","next_after","snapshot_at"],"title":"PublicCampaignResultsDataOut"},"PublicCampaignResultsOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success"},"data":{"$ref":"#/components/schemas/PublicCampaignResultsDataOut"}},"type":"object","required":["success","data"],"title":"PublicCampaignResultsOut"},"PublicCreateTemplateIn":{"properties":{"category":{"type":"string","enum":["UTILITY","MARKETING","AUTHENTICATION"],"title":"Category"},"body":{"type":"string","maxLength":1024,"title":"Body","default":""},"code_expiration_minutes":{"type":"integer","maximum":90,"minimum":1,"title":"Code Expiration Minutes","default":10},"add_security_recommendation":{"type":"boolean","title":"Add Security Recommendation","default":true},"body_examples":{"additionalProperties":{"type":"string","maxLength":1024,"minLength":1},"propertyNames":{"maxLength":64,"minLength":1},"type":"object","maxProperties":100,"title":"Body Examples"},"header":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Header"},"header_format":{"anyOf":[{"type":"string","enum":["TEXT","IMAGE","VIDEO","DOCUMENT"]},{"type":"null"}],"title":"Header Format"},"header_handle":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Header Handle","description":"Handle obtido no upload de amostra. Não é media_id nem URL de PDF."},"footer":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Footer"},"buttons":{"items":{"$ref":"#/components/schemas/PublicTemplateButtonIn"},"type":"array","maxItems":10,"title":"Buttons"},"phone_number_id":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[0-9]+$","title":"Phone Number Id","description":"Número da própria empresa que seleciona a WABA. Obrigatório para não criar na conta errada."},"display_format":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Display Format"},"message_send_ttl_seconds":{"anyOf":[{"type":"integer","maximum":2592000,"minimum":30},{"type":"null"}],"title":"Message Send Ttl Seconds"},"name":{"type":"string","maxLength":60,"minLength":1,"pattern":"^[a-z0-9_]+$","title":"Name"},"language":{"type":"string","maxLength":12,"minLength":2,"pattern":"^[a-z]{2,3}(?:_[A-Z]{2})?$","title":"Language","default":"pt_BR"}},"additionalProperties":false,"type":"object","required":["category","phone_number_id","name"],"title":"PublicCreateTemplateIn"},"PublicCreatedTemplateData":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status","description":"Resultado informado pela Meta. PENDING não permite envio; aguarde APPROVED."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","required":["id","name","status","category"],"title":"PublicCreatedTemplateData"},"PublicCreatedTemplateOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success"},"data":{"$ref":"#/components/schemas/PublicCreatedTemplateData"}},"type":"object","required":["success","data"],"title":"PublicCreatedTemplateOut"},"PublicDeliveriesDataOut":{"properties":{"deliveries":{"items":{"$ref":"#/components/schemas/PublicDeliveryDataOut"},"type":"array","title":"Deliveries"},"next_before_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Before Id"},"retention":{"$ref":"#/components/schemas/PublicDeliveryRetentionOut"}},"type":"object","required":["deliveries","next_before_id","retention"],"title":"PublicDeliveriesDataOut"},"PublicDeliveriesOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success","default":true},"data":{"$ref":"#/components/schemas/PublicDeliveriesDataOut"}},"type":"object","required":["data"],"title":"PublicDeliveriesOut"},"PublicDeliveryDataOut":{"properties":{"id":{"type":"integer","title":"Id"},"event":{"type":"string","title":"Event"},"status":{"type":"string","enum":["pending","delivering","delivered","failed"],"title":"Status"},"attempts":{"type":"integer","title":"Attempts"},"last_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Status"},"next_attempt_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Attempt At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"message_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Status"},"recipient":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recipient"},"client_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Ref"}},"type":"object","required":["id","event","status","attempts","last_status","next_attempt_at","delivered_at","created_at","message_id","message_status","recipient","client_ref"],"title":"PublicDeliveryDataOut"},"PublicDeliveryDetailDataOut":{"properties":{"id":{"type":"integer","title":"Id"},"event":{"type":"string","title":"Event"},"status":{"type":"string","enum":["pending","delivering","delivered","failed"],"title":"Status"},"attempts":{"type":"integer","title":"Attempts"},"last_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Status"},"next_attempt_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Attempt At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"message_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Status"},"recipient":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recipient"},"client_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Ref"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error","description":"Trecho limitado da última resposta, inclusive HTTP2xx, ou diagnóstico da falha. Não é JSON garantido."}},"type":"object","required":["id","event","status","attempts","last_status","next_attempt_at","delivered_at","created_at","message_id","message_status","recipient","client_ref","last_error"],"title":"PublicDeliveryDetailDataOut"},"PublicDeliveryOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success","default":true},"data":{"$ref":"#/components/schemas/PublicDeliveryDetailDataOut"}},"type":"object","required":["data"],"title":"PublicDeliveryOut"},"PublicDeliveryRetentionOut":{"properties":{"delivered_days":{"type":"integer","title":"Delivered Days"},"failed_days":{"type":"integer","title":"Failed Days"},"pending_pruned":{"type":"boolean","const":false,"title":"Pending Pruned","default":false},"delivering_pruned":{"type":"boolean","const":false,"title":"Delivering Pruned","default":false},"measured_from":{"type":"string","const":"created_at","title":"Measured From","default":"created_at"}},"type":"object","required":["delivered_days","failed_days"],"title":"PublicDeliveryRetentionOut"},"PublicLookupMessageOut":{"properties":{"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id","description":"Pode ser null em uma recusa anterior ao aceite da Meta."},"status":{"type":"string","enum":["sent","delivered","read","played","failed","unknown"],"title":"Status"},"client_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Ref"},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id"},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Quando a mensagem foi registrada localmente, em UTC."},"message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Message At","description":"Horário registrado da mensagem ou última tentativa; não é o horário da entrega/leitura."},"checked_at":{"type":"string","format":"date-time","title":"Checked At","description":"Horário UTC desta consulta."},"error":{"anyOf":[{"$ref":"#/components/schemas/PublicMessageErrorOut"},{"type":"null"}]}},"type":"object","required":["message_id","status","client_ref","phone_number_id","to","created_at","message_at","checked_at","error"],"title":"PublicLookupMessageOut"},"PublicLookupRetentionOut":{"properties":{"idempotency_days":{"type":"integer","title":"Idempotency Days"},"messages_days":{"type":"integer","title":"Messages Days"},"measured_from":{"type":"string","const":"created_at","title":"Measured From","default":"created_at"}},"type":"object","required":["idempotency_days","messages_days"],"title":"PublicLookupRetentionOut"},"PublicMessageErrorOut":{"properties":{"code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Code","description":"Código numérico da Meta quando preservado no registro; caso contrário, null."},"reason":{"type":"string","title":"Reason","description":"Código estável de erro da integração."},"message":{"type":"string","title":"Message","description":"Orientação em português; não inclui o erro bruto da Meta."}},"type":"object","required":["code","reason","message"],"title":"PublicMessageErrorOut"},"PublicMessageLookupDataOut":{"properties":{"lookup":{"type":"string","enum":["client_ref","idempotency_key"],"title":"Lookup"},"resolution":{"type":"string","enum":["matched","accepted","unconfirmed"],"title":"Resolution","description":"matched: registro local; accepted: aceite durável da Meta sem persistência concluída; unconfirmed: tentativa reservada sem confirmação. Nenhum estado autoriza criar outro envio."},"message":{"anyOf":[{"$ref":"#/components/schemas/PublicLookupMessageOut"},{"type":"null"}]},"checked_at":{"type":"string","format":"date-time","title":"Checked At"},"retention":{"$ref":"#/components/schemas/PublicLookupRetentionOut"}},"type":"object","required":["lookup","resolution","message","checked_at","retention"],"title":"PublicMessageLookupDataOut"},"PublicMessageLookupOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success","default":true},"data":{"$ref":"#/components/schemas/PublicMessageLookupDataOut"}},"type":"object","required":["data"],"title":"PublicMessageLookupOut"},"PublicMessageStatusDataOut":{"properties":{"message_id":{"type":"string","title":"Message Id"},"status":{"type":"string","enum":["sent","delivered","read","played","failed","unknown"],"title":"Status"},"client_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Ref"},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id"},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Quando a mensagem foi registrada localmente, em UTC."},"message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Message At","description":"Horário registrado da mensagem ou última tentativa; não é o horário da entrega/leitura."},"checked_at":{"type":"string","format":"date-time","title":"Checked At","description":"Horário UTC desta consulta."},"error":{"anyOf":[{"$ref":"#/components/schemas/PublicMessageErrorOut"},{"type":"null"}]}},"type":"object","required":["message_id","status","client_ref","phone_number_id","to","created_at","message_at","checked_at","error"],"title":"PublicMessageStatusDataOut"},"PublicMessageStatusOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success","default":true},"data":{"$ref":"#/components/schemas/PublicMessageStatusDataOut"}},"type":"object","required":["data"],"title":"PublicMessageStatusOut"},"PublicNumberHealthOut":{"properties":{"state":{"type":"string","enum":["AVAILABLE","LIMITED","BLOCKED","UNKNOWN"],"title":"State","description":"Último estado persistido pelo monitoramento. UNKNOWN quando não existe leitura válida. Não garante aceite ou entrega de um novo envio."},"source":{"type":"string","const":"monitoring","title":"Source"},"checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Checked At","description":"Horário da última verificação de saúde persistida; pode ser anterior à consulta de qualidade/limite. Não é uma consulta de saúde ao vivo nesta rota."},"reasons":{"items":{"$ref":"#/components/schemas/PublicNumberHealthReasonOut"},"type":"array","maxItems":20,"title":"Reasons","description":"Restrições de mensagens informadas pela Meta. 141010 indica verificação de negócio pendente, sem implicar limite de 250. Erros de SIP são excluídos."},"stale":{"type":"boolean","title":"Stale","description":"True quando a leitura não existe ou tem mais de 30 minutos. Consulte checked_at; não trate estado antigo como capacidade atual."}},"type":"object","required":["state","source","checked_at","reasons","stale"],"title":"PublicNumberHealthOut"},"PublicNumberHealthReasonOut":{"properties":{"code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Code"},"title":{"type":"string","title":"Title"},"action":{"type":"string","title":"Action","description":"Orientação para conferir a restrição. Não é garantia de liberação ou entrega."},"entity":{"anyOf":[{"type":"string","enum":["PHONE_NUMBER","WABA","BUSINESS","APP","TEMPLATE"]},{"type":"null"}],"title":"Entity"}},"type":"object","required":["code","title","action","entity"],"title":"PublicNumberHealthReasonOut"},"PublicNumberLimitOut":{"properties":{"value":{"anyOf":[{"type":"integer","maximum":1000000000000,"minimum":1},{"type":"null"}],"title":"Value","description":"Destinatários únicos em 24 h, compartilhados pelo portfólio. Não é mensagens/minuto nem saldo restante. Null quando desconhecido ou ilimitado."},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"unlimited":{"type":"boolean","title":"Unlimited"},"known":{"type":"boolean","title":"Known"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"scope":{"type":"string","const":"business_portfolio","title":"Scope"},"window_hours":{"type":"integer","const":24,"title":"Window Hours"},"source":{"anyOf":[{"type":"string","const":"whatsapp_business_manager_messaging_limit"},{"type":"null"}],"title":"Source"},"checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Checked At"}},"type":"object","required":["value","tier","unlimited","known","label","scope","window_hours","source","checked_at"],"title":"PublicNumberLimitOut"},"PublicNumberOut":{"properties":{"phone_number_id":{"type":"string","title":"Phone Number Id","description":"ID Meta usado no envio e no catálogo de templates. Não é o telefone E.164."},"waba_id":{"type":"string","title":"Waba Id"},"business_portfolio_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Portfolio Id","description":"ID do portfólio persistido na conexão. Números do mesmo portfólio compartilham o limite; não some seus valores. Null quando não conhecido."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Apelido interno no painel."},"display_phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Phone Number"},"verified_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified Name"},"quality":{"$ref":"#/components/schemas/PublicNumberQualityOut"},"messaging_limit":{"$ref":"#/components/schemas/PublicNumberLimitOut"},"health":{"$ref":"#/components/schemas/PublicNumberHealthOut"},"meta_available":{"type":"boolean","title":"Meta Available","description":"Se a página conseguiu consultar número na Meta ou em cache recente. False não significa desconectado/bloqueado; identidade e saúde persistidas continuam disponíveis."}},"type":"object","required":["phone_number_id","waba_id","business_portfolio_id","label","display_phone_number","verified_name","quality","messaging_limit","health","meta_available"],"title":"PublicNumberOut"},"PublicNumberQualityOut":{"properties":{"rating":{"anyOf":[{"type":"string","enum":["GREEN","YELLOW","RED","UNKNOWN"]},{"type":"null"}],"title":"Rating","description":"Nota Meta. UNKNOWN indica sem nota; null indica ausente/indisponível. Nenhum dos dois significa qualidade baixa."},"label":{"type":"string","title":"Label"},"source":{"type":"string","enum":["meta","unavailable"],"title":"Source"},"checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Checked At","description":"Horário da consulta real à Meta, preservado no cache; não é o horário em que a Meta mudou a nota."}},"type":"object","required":["rating","label","source","checked_at"],"title":"PublicNumberQualityOut"},"PublicNumbersDataOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PublicNumberOut"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More"},"next_after_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next After Id","description":"Passe como after_id na próxima página. Cursor opaco, ordenação lexical por ID. Null quando não houver próxima página."},"checked_at":{"type":"string","format":"date-time","title":"Checked At","description":"Horário da resposta. As leituras Meta e de saúde têm seus próprios checked_at."}},"type":"object","required":["items","has_more","next_after_id","checked_at"],"title":"PublicNumbersDataOut"},"PublicNumbersOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success"},"data":{"$ref":"#/components/schemas/PublicNumbersDataOut"}},"type":"object","required":["success","data"],"title":"PublicNumbersOut"},"PublicSendIn":{"properties":{"to":{"type":"string","maxLength":32,"minLength":1,"title":"To"},"phone_number_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Phone Number Id"},"text":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Text"},"template":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Template"},"language":{"type":"string","maxLength":16,"title":"Language","default":"pt_BR"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Variables"},"variable_names":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Variable Names"},"header_media":{"anyOf":[{"$ref":"#/components/schemas/HeaderMediaIn"},{"type":"null"}]},"header_text":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Header Text"},"button_url_param":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Button Url Param"},"button_url_index":{"type":"integer","maximum":9,"minimum":0,"title":"Button Url Index","default":0},"coupon_code":{"anyOf":[{"type":"string","maxLength":15},{"type":"null"}],"title":"Coupon Code"},"coupon_index":{"type":"integer","maximum":9,"minimum":0,"title":"Coupon Index","default":0},"otp_code":{"anyOf":[{"type":"string","maxLength":15},{"type":"null"}],"title":"Otp Code"},"otp_index":{"type":"integer","maximum":9,"minimum":0,"title":"Otp Index","default":0},"reply_to_message_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Reply To Message Id"},"pix_order":{"anyOf":[{"$ref":"#/components/schemas/PixOrderIn"},{"type":"null"}]},"client_ref":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Client Ref"}},"additionalProperties":false,"type":"object","required":["to"],"title":"PublicSendIn"},"PublicTemplateButtonIn":{"properties":{"type":{"type":"string","title":"Type"},"text":{"type":"string","maxLength":40,"title":"Text","default":""},"url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Url"},"phone_number":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone Number"},"url_example":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Url Example"},"coupon_example":{"anyOf":[{"type":"string","maxLength":15},{"type":"null"}],"title":"Coupon Example"}},"additionalProperties":false,"type":"object","required":["type"],"title":"PublicTemplateButtonIn"},"PublicTemplateSampleData":{"properties":{"handle":{"type":"string","title":"Handle"},"format":{"type":"string","enum":["IMAGE","VIDEO","DOCUMENT"],"title":"Format"}},"type":"object","required":["handle","format"],"title":"PublicTemplateSampleData"},"PublicTemplateSampleOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success"},"data":{"$ref":"#/components/schemas/PublicTemplateSampleData"}},"type":"object","required":["success","data"],"title":"PublicTemplateSampleOut"},"PublicWindowDataOut":{"properties":{"to":{"type":"string","title":"To"},"open":{"type":"boolean","title":"Open"},"can_send_text":{"type":"boolean","title":"Can Send Text"},"seconds_left":{"type":"integer","title":"Seconds Left"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"last_inbound_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Inbound At"},"opt_in":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opt In","description":"Estado legado do cadastro. accepted com origem inbound registra contato recebido, não autorização comprovada para campanhas."},"opt_in_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Opt In At","description":"Quando o estado foi registrado; null se não há data preservada. Não comprova, sozinho, consentimento."},"opt_in_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opt In Source","description":"Origem do estado no cadastro deste remetente. Não é evidência independente."},"opt_in_scope":{"type":"string","const":"phone_number","title":"Opt In Scope","default":"phone_number"},"marketing_allowed":{"type":"boolean","title":"Marketing Allowed","description":"Sem bloqueio de marketing registrado. Não comprova consentimento ou entrega."},"marketing_block_reason":{"anyOf":[{"type":"string","const":"opted_out_or_blocked"},{"type":"null"}],"title":"Marketing Block Reason"}},"type":"object","required":["to","open","can_send_text","seconds_left","expires_at","last_inbound_at","opt_in","marketing_allowed","marketing_block_reason"],"title":"PublicWindowDataOut"},"PublicWindowOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success","default":true},"data":{"$ref":"#/components/schemas/PublicWindowDataOut"}},"type":"object","required":["data"],"title":"PublicWindowOut"},"TemplateBodyOut":{"properties":{"text":{"type":"string","title":"Text"},"variables_count":{"type":"integer","title":"Variables Count"},"variable_names":{"items":{"type":"string"},"type":"array","title":"Variable Names"}},"type":"object","required":["text","variables_count","variable_names"],"title":"TemplateBodyOut"},"TemplateButtonOut":{"properties":{"index":{"type":"integer","title":"Index"},"type":{"type":"string","title":"Type"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"needs_url_param":{"type":"boolean","title":"Needs Url Param"},"needs_coupon":{"type":"boolean","title":"Needs Coupon"},"needs_otp":{"type":"boolean","title":"Needs Otp"}},"type":"object","required":["index","type","text","url","phone_number","needs_url_param","needs_coupon","needs_otp"],"title":"TemplateButtonOut"},"TemplateCatalogueDataOut":{"properties":{"templates":{"items":{"$ref":"#/components/schemas/TemplateCatalogueItemOut"},"type":"array","title":"Templates"}},"type":"object","required":["templates"],"title":"TemplateCatalogueDataOut"},"TemplateCatalogueItemOut":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Identificador Meta desta versão/idioma. Nulo somente quando a Meta não o informar."},"name":{"type":"string","title":"Name"},"language":{"type":"string","title":"Language"},"status":{"type":"string","title":"Status","description":"Estado informado pela Meta. PENDING significa em análise, não aprovado."},"category":{"type":"string","title":"Category"},"quality_score":{"anyOf":[{"$ref":"#/components/schemas/TemplateQualityOut"},{"type":"null"}]},"rejected_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejected Reason","description":"Razão de rejeição fornecida pela Meta, quando existente. NONE é representado por nulo."},"message_send_ttl_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Message Send Ttl Seconds","description":"Prazo de tentativa de entrega na Meta, em segundos, quando informado. Não é a validade de um código de autenticação."},"sendable":{"type":"boolean","title":"Sendable","description":"Verdadeiro somente se status for APPROVED. Não garante entrega nem substitui api_supported."},"api_supported":{"type":"boolean","title":"Api Supported","description":"Se este formato pode ser preenchido pela API pública, independentemente do estado de aprovação."},"api_unsupported_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Unsupported Reason"},"header":{"anyOf":[{"$ref":"#/components/schemas/TemplateHeaderOut"},{"type":"null"}]},"parameter_format":{"type":"string","enum":["NAMED","POSITIONAL"],"title":"Parameter Format"},"body":{"$ref":"#/components/schemas/TemplateBodyOut"},"footer":{"anyOf":[{"$ref":"#/components/schemas/TemplateFooterOut"},{"type":"null"}]},"buttons":{"items":{"$ref":"#/components/schemas/TemplateButtonOut"},"type":"array","title":"Buttons"},"body_text":{"type":"string","title":"Body Text","description":"Compatibilidade: mesmo texto de body.text."},"variables_count":{"type":"integer","title":"Variables Count","description":"Compatibilidade: mesma contagem de body.variables_count."},"variable_names":{"items":{"type":"string"},"type":"array","title":"Variable Names","description":"Compatibilidade: mesmos nomes de body.variable_names."},"header_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Format","description":"Compatibilidade: mesmo formato de header.format."},"components":{"items":{"type":"object"},"type":"array","title":"Components","description":"Componentes originais da Meta, preservados para compatibilidade e formatos adicionais."}},"type":"object","required":["id","name","language","status","category","quality_score","rejected_reason","message_send_ttl_seconds","sendable","api_supported","api_unsupported_reason","header","parameter_format","body","footer","buttons","body_text","variables_count","variable_names","header_format","components"],"title":"TemplateCatalogueItemOut"},"TemplateCatalogueOut":{"properties":{"success":{"type":"boolean","const":true,"title":"Success"},"data":{"$ref":"#/components/schemas/TemplateCatalogueDataOut"}},"type":"object","required":["success","data"],"title":"TemplateCatalogueOut"},"TemplateFooterOut":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"code_expiration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Code Expiration Minutes"}},"type":"object","required":["text","code_expiration_minutes"],"title":"TemplateFooterOut"},"TemplateHeaderOut":{"properties":{"format":{"type":"string","title":"Format"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"needs_text":{"type":"boolean","title":"Needs Text"},"needs_media":{"type":"boolean","title":"Needs Media"}},"type":"object","required":["format","text","needs_text","needs_media"],"title":"TemplateHeaderOut"},"TemplateQualityOut":{"properties":{"score":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score","description":"Nota informada pela Meta, como GREEN, YELLOW, RED ou UNKNOWN. Nulo quando ausente; não é uma estimativa local."},"date":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Date","description":"Instante da nota em segundos Unix, quando informado pela Meta."},"reasons":{"items":{},"type":"array","title":"Reasons","description":"Razões fornecidas pela Meta. Lista vazia quando não informadas; sua estrutura pode variar."}},"type":"object","required":["score","date","reasons"],"title":"TemplateQualityOut"},"ValidateIn":{"properties":{"to":{"type":"string","maxLength":32,"minLength":1,"title":"To"},"country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country"}},"additionalProperties":false,"type":"object","required":["to"],"title":"ValidateIn"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"ChaveDeApi":{"type":"http","scheme":"bearer","bearerFormat":"ptk_live_..."}}},"servers":[{"url":"https://api.patrociniotech.com"}],"security":[{"ChaveDeApi":[]}]}