{"openapi":"3.1.0","info":{"title":"Patrocinio Tech API pública","description":"Envio de mensagens de WhatsApp e consulta da fila de entregas do 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":{}}}},"400":{"description":"Pedido incompleto ou destinatário inválido · códigos possíveis: invalid_recipient, empty_message, 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."}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: 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."}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"A Meta recusou o envio · códigos possíveis: outside_24h_window, recipient_unreachable, template_params_mismatch, template_not_found, template_paused, invalid_template, marketing_experiment, 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."}},"required":["code","message"]}},"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":{"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."}},"required":["code","message"]}},"required":["success","error"]}}}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/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":{}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: 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."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"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."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}}}}}},"/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":{}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: 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."}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/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"}}}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: 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."}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/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.","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","default":50,"title":"Limit"}},{"name":"before_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Before Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: 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."}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/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":{}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: 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."}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/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":{}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: 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."}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"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."}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/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":{}}}},"401":{"description":"Chave de API ausente, inválida ou revogada · códigos possíveis: 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."}},"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."}},"type":"object","required":["code","message"]}},"type":"object","required":["success","error"]}}}}}}}},"components":{"schemas":{"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"}},"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","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"}},"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","minimum":0},{"type":"null"}],"title":"Total Amount"},"tax":{"type":"integer","minimum":0,"title":"Tax","default":0},"goods_type":{"type":"string","enum":["digital-goods","physical-goods"],"title":"Goods Type","default":"digital-goods"}},"type":"object","required":["reference_id","pix_code","merchant_name","key","items"],"title":"PixOrderIn","description":"Cobrança PIX de um template de Detalhes do Pedido."},"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"}},"type":"object","required":["to"],"title":"PublicSendIn"},"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"}},"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":[]}]}