{"openapi":"3.0.3","info":{"title":"Postmatic API","version":"1","description":"Publicação e agendamento no Instagram por uma API só. Autentique com `x-access-key` (chave de API, integrações) ou `Authorization: Bearer` + `x-project-id` (painel). Erros vêm sempre no mesmo envelope, com `code` estável."},"components":{"securitySchemes":{"accessKey":{"type":"apiKey","in":"header","name":"x-access-key","description":"Chave de API do projeto (`pm_live_…`). Só no servidor, nunca no navegador."},"bearer":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Sessão do painel. Rotas de recurso exigem também o header `x-project-id`."}},"schemas":{"ErrorEnvelope":{"type":"object","properties":{"statusCode":{"type":"integer"},"code":{"type":"string","description":"Código estável. Comerciais: UNAUTHORIZED, FORBIDDEN, NOT_FOUND, VALIDATION_ERROR, PROJECT_REQUIRED, PLATFORM_NOT_AVAILABLE, STATE_INVALID, AUTHORIZATION_DENIED, ACCOUNT_NOT_BUSINESS, TOKEN_INVALID, ACCOUNT_RESTRICTED, PERMISSION_REQUIRED, MESSAGE_WINDOW_CLOSED, RATE_LIMIT_ACCOUNT, RATE_LIMIT_APP, SPAM_SUSPECTED, MEDIA_UNREACHABLE, CONTAINER_EXPIRED, CONTAINER_STUCK, PLATFORM_CREDENTIALS_MISSING, POST_NOT_CANCELLABLE, MEDIA_INVALID, MEDIA_FETCH_FAILED, RATE_LIMIT_KEY, SIGNED_REQUEST_INVALID, CANCELLED, PUBLISH_UNCONFIRMED. Corpo malformado responde com códigos nativos FST_ERR_CTP_*."},"message":{"type":"string","description":"Texto para humanos (pt-BR); pode mudar."},"details":{"type":"object","additionalProperties":{}}},"required":["statusCode","code","message"],"additionalProperties":false,"description":"Envelope de erro: decida sempre pelo `code`."}}},"paths":{"/v1/health/auth":{"get":{"summary":"Verificar a credencial","tags":["Saúde"],"description":"Compatível com o PostPeer: valida a x-access-key (ou o Bearer + x-project-id) e devolve o projeto ao qual ela pertence.","parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"project":{"type":"object","properties":{"id":{"type":"string"},"environment":{"type":"string","enum":["live","sandbox"]}},"required":["id","environment"],"additionalProperties":false}},"required":["success","project"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/healthz":{"get":{"summary":"Liveness","tags":["Saúde"],"description":"Responde 200 enquanto o processo estiver de pé. Sem autenticação.","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"],"additionalProperties":false,"description":"OK"}}}}}}},"/v1/me":{"get":{"summary":"Usuário, organização e projetos","tags":["Conta"],"description":"Só no modo Bearer. Cria a organização e o projeto no primeiro acesso de um usuário novo.","security":[{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string","nullable":true}},"required":["id","email","name"],"additionalProperties":false},"organization":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":"string","enum":["owner"]}},"required":["id","name","role"],"additionalProperties":false},"projects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"environment":{"type":"string","enum":["live","sandbox"]}},"required":["id","name","environment"],"additionalProperties":false}}},"required":["success","user","organization","projects"],"additionalProperties":false,"description":"OK"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos. Rotas de conta só aceitam Bearer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"delete":{"summary":"Excluir a conta","tags":["Conta"],"description":"Apaga organização, projetos, chaves, contas conectadas, posts e mídia, e remove o usuário do login. Irreversível.","security":[{"bearer":[]}],"responses":{"204":{"description":"Sem conteúdo"},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos. Rotas de conta só aceitam Bearer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/organizations/{id}":{"patch":{"summary":"Renomear a organização","tags":["Conta"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80}},"required":["name"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true}],"security":[{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"organization":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":"string","enum":["owner"]}},"required":["id","name","role"],"additionalProperties":false}},"required":["success","organization"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: nome vazio ou acima de 80 caracteres.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos. Rotas de conta só aceitam Bearer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: a organização não é do usuário.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/projects/{id}/api-keys":{"get":{"summary":"Listar chaves de API","tags":["Chaves de API"],"description":"Nunca devolve o segredo: só prefixo, nome, datas de uso e revogação.","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true}],"security":[{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"apiKeys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"prefix":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time","nullable":true},"revokedAt":{"type":"string","format":"date-time","nullable":true}},"required":["id","name","prefix","createdAt","lastUsedAt","revokedAt"],"additionalProperties":false}}},"required":["success","apiKeys"],"additionalProperties":false,"description":"OK"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos. Rotas de conta só aceitam Bearer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"summary":"Criar chave de API","tags":["Chaves de API"],"description":"O campo `key` (`pm_live_…`) aparece **somente nesta resposta**. Guarde-o em um cofre de segredos; a API armazena só o hash. Limite de 10 criações por minuto.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60}},"additionalProperties":false,"default":{}}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true}],"security":[{"bearer":[]}],"responses":{"201":{"description":"Criado","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"apiKey":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"prefix":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time","nullable":true},"revokedAt":{"type":"string","format":"date-time","nullable":true},"key":{"type":"string"}},"required":["id","name","prefix","createdAt","lastUsedAt","revokedAt","key"],"additionalProperties":false}},"required":["success","apiKey"],"additionalProperties":false,"description":"Criado"}}}},"400":{"description":"VALIDATION_ERROR: nome acima de 60 caracteres.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos. Rotas de conta só aceitam Bearer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/projects/{id}/api-keys/{keyId}":{"delete":{"summary":"Revogar chave de API","tags":["Chaves de API"],"description":"Idempotente: revogar de novo devolve a mesma chave com o `revokedAt` original.","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string","minLength":1},"in":"path","name":"keyId","required":true}],"security":[{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"apiKey":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"prefix":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time","nullable":true},"revokedAt":{"type":"string","format":"date-time","nullable":true}},"required":["id","name","prefix","createdAt","lastUsedAt","revokedAt"],"additionalProperties":false}},"required":["success","apiKey"],"additionalProperties":false,"description":"OK"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos. Rotas de conta só aceitam Bearer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: chave não pertence ao projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/profiles":{"post":{"summary":"Criar profile","tags":["Profiles"],"description":"Um profile agrupa contas conectadas (um cliente seu, uma marca). Passe o `id` em `profileId` ao iniciar uma conexão.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":500}},"required":["name"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"201":{"description":"Criado","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"profile":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","name","description","createdAt"],"additionalProperties":false}},"required":["success","profile"],"additionalProperties":false,"description":"Criado"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"get":{"summary":"Listar profiles","tags":["Profiles"],"description":"Do mais novo para o mais antigo. Profiles removidos não aparecem.","parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"total":{"type":"integer"},"profiles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","name","description","createdAt"],"additionalProperties":false}}},"required":["success","total","profiles"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/profiles/{id}":{"delete":{"summary":"Remover profile","tags":["Profiles"],"description":"Remoção lógica. As contas conectadas ao profile continuam existindo e mantêm o `profileId`.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"message":{"type":"string"}},"required":["success","message"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: profile não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/connect/integrations":{"get":{"summary":"Listar contas conectadas","tags":["Contas conectadas"],"description":"Contrato do PostPeer, com campos de saúde aditivos. `profileId=\"null\"` (string literal) filtra as contas sem profile. `sort` ordena por `createdAt`; `createdAt`/`-createdAt` são aliases de `asc`/`desc`.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"platform","required":false},{"schema":{"type":"string","minLength":1},"in":"query","name":"profileId","required":false},{"schema":{"type":"string","minLength":1,"maxLength":100},"in":"query","name":"q","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["asc","desc","createdAt","-createdAt"],"default":"desc"},"in":"query","name":"sort","required":false},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"total":{"type":"integer"},"integrations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Use como `accountId` em POST /v1/posts."},"platform":{"type":"string","enum":["instagram"]},"platformUserId":{"type":"string","description":"ID da conta na plataforma (Instagram user id)."},"displayName":{"type":"string","nullable":true,"description":"Username no Instagram."},"imageUrl":{"type":"string","nullable":true},"profileId":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"authStatus":{"type":"string","enum":["active","reconnect_required"],"description":"`reconnect_required` quando o token venceu ou a conta foi revogada: peça ao usuário para reconectar."},"status":{"type":"string","enum":["connected","degraded","revoked"],"description":"Resultado da última verificação de saúde."},"tokenExpiresAt":{"type":"string","format":"date-time","nullable":true},"lastHealthCheckAt":{"type":"string","format":"date-time","nullable":true},"healthError":{"type":"string","nullable":true,"description":"`CODIGO: mensagem` da última falha de saúde, ou null."},"scopes":{"type":"array","items":{"type":"string"},"description":"Permissões concedidas na Meta. Sem `instagram_business_manage_insights` ou `_manage_comments`, as rotas de analytics e comentários respondem PERMISSION_REQUIRED: reconecte."}},"required":["id","platform","platformUserId","displayName","imageUrl","profileId","createdAt","authStatus","status","tokenExpiresAt","lastHealthCheckAt","healthError","scopes"],"additionalProperties":false}}},"required":["success","total","integrations"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/connect/integrations/{id}":{"delete":{"summary":"Desconectar conta","tags":["Contas conectadas"],"description":"Apaga o token cifrado e marca a conta como `revoked`. Posts já publicados não são afetados; agendamentos para ela vão falhar.","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"message":{"type":"string"}},"required":["success","message"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: conta não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/integrations/{id}/health":{"get":{"summary":"Saúde da conexão","tags":["Contas conectadas"],"description":"Exclusivo do Postmatic. Consulta a Meta no máximo a cada 10 minutos por conta; `force=true` fura o intervalo. Use `authStatus` para decidir se o usuário precisa reconectar e `daysUntilExpiry` para avisar antes.","parameters":[{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"force","required":false},{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"health":{"type":"object","properties":{"integrationId":{"type":"string"},"status":{"type":"string","enum":["connected","degraded","revoked"]},"authStatus":{"type":"string","enum":["active","reconnect_required"]},"healthy":{"type":"boolean"},"tokenExpiresAt":{"type":"string","format":"date-time","nullable":true},"tokenRefreshedAt":{"type":"string","format":"date-time","nullable":true},"daysUntilExpiry":{"type":"integer","nullable":true},"lastHealthCheckAt":{"type":"string","format":"date-time","nullable":true},"healthError":{"type":"string","nullable":true},"scopes":{"type":"array","items":{"type":"string"}},"checkedLive":{"type":"boolean","description":"true quando a Meta foi consultada nesta chamada; false quando a resposta veio da última verificação (até 10 min)."}},"required":["integrationId","status","authStatus","healthy","tokenExpiresAt","tokenRefreshedAt","daysUntilExpiry","lastHealthCheckAt","healthError","scopes","checkedLive"],"additionalProperties":false}},"required":["success","health"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: conta não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/posts":{"post":{"summary":"Criar publicação (agora ou agendada)","tags":["Publicações"],"description":"`publishNow: true` enfileira a publicação na hora; `scheduledFor` (ISO 8601 com offset, entre 1 minuto e 75 dias à frente) agenda. Responde **202** com `status` `pending` ou `scheduled`: a publicação acontece em segundo plano, acompanhe por GET /v1/posts/{id}. Com `idempotencyKey` repetido, devolve **200** com o post original sem criar outro. Cada item de `mediaItems` leva `url` (https) ou `mediaId` (de POST /v1/media), nunca os dois. `mediaItems[].type` aceita `image` ou `video`: um vídeo sozinho publica como Reel; dois ou mais itens (imagens e vídeos misturados) viram carrossel, todos com a mesma proporção. `platformSpecificData`, dentro de cada `platforms[]`, aceita `contentType: \"story\"` (um item, sem legenda, só conta Business), as opções do Reel (`shareToFeed`, `coverUrl`, `thumbOffset`, `audioName`) e `collaborators`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","maxLength":2200,"default":""},"idempotencyKey":{"type":"string","minLength":1,"maxLength":128},"profileId":{"type":"string","minLength":1},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string","minLength":1},"content":{"type":"string","maxLength":2200},"platformSpecificData":{"type":"object","properties":{"contentType":{"type":"string","enum":["story"]},"shareToFeed":{"type":"boolean"},"coverUrl":{"type":"string","format":"uri"},"thumbOffset":{"type":"integer","minimum":0},"audioName":{"type":"string","minLength":1,"maxLength":100},"collaborators":{"type":"array","items":{"type":"string","minLength":1,"maxLength":30},"minItems":1,"maxItems":3}},"additionalProperties":false}},"required":["platform","accountId"],"additionalProperties":false},"minItems":1,"maxItems":5},"mediaItems":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["image","video"]},"url":{"type":"string","format":"uri"},"mediaId":{"type":"string","minLength":1}},"required":["type"],"additionalProperties":false},"minItems":1,"maxItems":10},"publishNow":{"type":"boolean"},"scheduledFor":{"type":"string","format":"date-time"},"timezone":{"type":"string"}},"required":["platforms","mediaItems"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"Replay idempotente: o post já existia com este `idempotencyKey`.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"postId":{"type":"string"},"status":{"type":"string","enum":["draft","pending","scheduled","publishing","published","failed","partial"]},"idempotencyKey":{"type":"string"},"content":{"type":"string"},"scheduledFor":{"type":"string","format":"date-time","nullable":true},"timezone":{"type":"string","nullable":true},"profileId":{"type":"string","nullable":true},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string"},"targetId":{"type":"string"},"status":{"type":"string","enum":["pending","queued","creating_container","awaiting_container","publishing","published","failed","missed","cancelled"]},"platformPostId":{"type":"string","nullable":true},"platformPostUrl":{"type":"string","nullable":true,"description":"Link do post publicado; só quando `status` é `published`."},"errorCode":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"attemptCount":{"type":"integer"}},"required":["platform","accountId","targetId","status","platformPostId","platformPostUrl","errorCode","errorMessage","attemptCount"],"additionalProperties":false}},"mediaUrls":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["success","postId","status","idempotencyKey","content","scheduledFor","timezone","profileId","platforms","mediaUrls","createdAt","updatedAt"],"additionalProperties":false,"description":"Replay idempotente: o post já existia com este `idempotencyKey`."}}}},"202":{"description":"Aceito para processamento","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"postId":{"type":"string"},"status":{"type":"string","enum":["draft","pending","scheduled","publishing","published","failed","partial"]},"idempotencyKey":{"type":"string"},"content":{"type":"string"},"scheduledFor":{"type":"string","format":"date-time","nullable":true},"timezone":{"type":"string","nullable":true},"profileId":{"type":"string","nullable":true},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string"},"targetId":{"type":"string"},"status":{"type":"string","enum":["pending","queued","creating_container","awaiting_container","publishing","published","failed","missed","cancelled"]},"platformPostId":{"type":"string","nullable":true},"platformPostUrl":{"type":"string","nullable":true,"description":"Link do post publicado; só quando `status` é `published`."},"errorCode":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"attemptCount":{"type":"integer"}},"required":["platform","accountId","targetId","status","platformPostId","platformPostUrl","errorCode","errorMessage","attemptCount"],"additionalProperties":false}},"mediaUrls":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["success","postId","status","idempotencyKey","content","scheduledFor","timezone","profileId","platforms","mediaUrls","createdAt","updatedAt"],"additionalProperties":false,"description":"Aceito para processamento"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id. MEDIA_INVALID / MEDIA_FETCH_FAILED / MEDIA_UNREACHABLE: a mídia não pôde ser lida ou não atende aos limites do destino (`details.reason`, `details.position`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PLATFORM_NOT_AVAILABLE: Story numa conta que não é Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: `accountId` ou `profileId` não existem neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"TOKEN_INVALID: a conta precisa ser reconectada. RATE_LIMIT_ACCOUNT: a conta esgotou a cota de publicação da Meta (100 por 24 h).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"get":{"summary":"Listar publicações","tags":["Publicações"],"description":"Filtra por `status` e `profileId` (`\"null\"` = sem profile). Paginação por `limit` (1 a 100) e `offset`; `sort` ordena por data de criação.","parameters":[{"schema":{"type":"string","enum":["draft","pending","scheduled","publishing","published","failed","partial"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","minLength":1},"in":"query","name":"profileId","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["asc","desc"],"default":"desc"},"in":"query","name":"sort","required":false},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"total":{"type":"integer"},"posts":{"type":"array","items":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"postId":{"type":"string"},"status":{"type":"string","enum":["draft","pending","scheduled","publishing","published","failed","partial"]},"idempotencyKey":{"type":"string"},"content":{"type":"string"},"scheduledFor":{"type":"string","format":"date-time","nullable":true},"timezone":{"type":"string","nullable":true},"profileId":{"type":"string","nullable":true},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string"},"targetId":{"type":"string"},"status":{"type":"string","enum":["pending","queued","creating_container","awaiting_container","publishing","published","failed","missed","cancelled"]},"platformPostId":{"type":"string","nullable":true},"platformPostUrl":{"type":"string","nullable":true,"description":"Link do post publicado; só quando `status` é `published`."},"errorCode":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"attemptCount":{"type":"integer"}},"required":["platform","accountId","targetId","status","platformPostId","platformPostUrl","errorCode","errorMessage","attemptCount"],"additionalProperties":false}},"mediaUrls":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["success","postId","status","idempotencyKey","content","scheduledFor","timezone","profileId","platforms","mediaUrls","createdAt","updatedAt"],"additionalProperties":false}}},"required":["success","total","posts"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/posts/{id}":{"get":{"summary":"Consultar publicação","tags":["Publicações"],"description":"Estado atual do post e de cada destino em `platforms`. Ao chegar a `published`, `platformPostUrl` traz o link; em `failed`, leia `errorCode` e `errorMessage` de cada destino.","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"postId":{"type":"string"},"status":{"type":"string","enum":["draft","pending","scheduled","publishing","published","failed","partial"]},"idempotencyKey":{"type":"string"},"content":{"type":"string"},"scheduledFor":{"type":"string","format":"date-time","nullable":true},"timezone":{"type":"string","nullable":true},"profileId":{"type":"string","nullable":true},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string"},"targetId":{"type":"string"},"status":{"type":"string","enum":["pending","queued","creating_container","awaiting_container","publishing","published","failed","missed","cancelled"]},"platformPostId":{"type":"string","nullable":true},"platformPostUrl":{"type":"string","nullable":true,"description":"Link do post publicado; só quando `status` é `published`."},"errorCode":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"attemptCount":{"type":"integer"}},"required":["platform","accountId","targetId","status","platformPostId","platformPostUrl","errorCode","errorMessage","attemptCount"],"additionalProperties":false}},"mediaUrls":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["success","postId","status","idempotencyKey","content","scheduledFor","timezone","profileId","platforms","mediaUrls","createdAt","updatedAt"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: post não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"delete":{"summary":"Cancelar publicação agendada","tags":["Publicações"],"description":"Cancela os destinos ainda pendentes (`errorCode: CANCELLED`). O post não é apagado: fica no histórico como `failed`. Não remove nada do Instagram.","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"message":{"type":"string"}},"required":["success","message"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: post não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"POST_NOT_CANCELLABLE: o post já entrou em publicação ou terminou.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"patch":{"summary":"Reagendar publicação","tags":["Publicações"],"description":"Só para posts ainda `scheduled`. Mesmas regras de `scheduledFor` e `timezone` da criação.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scheduledFor":{"type":"string","format":"date-time"},"timezone":{"type":"string"}},"required":["scheduledFor"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"postId":{"type":"string"},"status":{"type":"string","enum":["draft","pending","scheduled","publishing","published","failed","partial"]},"idempotencyKey":{"type":"string"},"content":{"type":"string"},"scheduledFor":{"type":"string","format":"date-time","nullable":true},"timezone":{"type":"string","nullable":true},"profileId":{"type":"string","nullable":true},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string"},"targetId":{"type":"string"},"status":{"type":"string","enum":["pending","queued","creating_container","awaiting_container","publishing","published","failed","missed","cancelled"]},"platformPostId":{"type":"string","nullable":true},"platformPostUrl":{"type":"string","nullable":true,"description":"Link do post publicado; só quando `status` é `published`."},"errorCode":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"attemptCount":{"type":"integer"}},"required":["platform","accountId","targetId","status","platformPostId","platformPostUrl","errorCode","errorMessage","attemptCount"],"additionalProperties":false}},"mediaUrls":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["success","postId","status","idempotencyKey","content","scheduledFor","timezone","profileId","platforms","mediaUrls","createdAt","updatedAt"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: post não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"POST_NOT_CANCELLABLE: o post já entrou em publicação ou terminou.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/posts/{id}/retry":{"post":{"summary":"Repetir destinos que falharam","tags":["Publicações"],"description":"Reabre os destinos em `failed`, `missed` ou `cancelled` com a legenda e a mídia originais; destinos `published` não são tocados. Sem corpo, publica agora; com `scheduledFor` (e `timezone`), agenda de novo e emite `post.scheduled`. Responde **202** com o post. Um novo evento final será emitido quando terminar.","requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"not":{}},{"type":"object","properties":{"scheduledFor":{"type":"string","format":"date-time"},"timezone":{"type":"string"}},"additionalProperties":false,"nullable":true}]}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"202":{"description":"Aceito para processamento","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"postId":{"type":"string"},"status":{"type":"string","enum":["draft","pending","scheduled","publishing","published","failed","partial"]},"idempotencyKey":{"type":"string"},"content":{"type":"string"},"scheduledFor":{"type":"string","format":"date-time","nullable":true},"timezone":{"type":"string","nullable":true},"profileId":{"type":"string","nullable":true},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string"},"targetId":{"type":"string"},"status":{"type":"string","enum":["pending","queued","creating_container","awaiting_container","publishing","published","failed","missed","cancelled"]},"platformPostId":{"type":"string","nullable":true},"platformPostUrl":{"type":"string","nullable":true,"description":"Link do post publicado; só quando `status` é `published`."},"errorCode":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"attemptCount":{"type":"integer"}},"required":["platform","accountId","targetId","status","platformPostId","platformPostUrl","errorCode","errorMessage","attemptCount"],"additionalProperties":false}},"mediaUrls":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["success","postId","status","idempotencyKey","content","scheduledFor","timezone","profileId","platforms","mediaUrls","createdAt","updatedAt"],"additionalProperties":false,"description":"Aceito para processamento"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id. VALIDATION_ERROR: nenhum destino com falha para repetir.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: post não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"POST_NOT_CANCELLABLE: algum destino ainda está em publicação. TOKEN_INVALID: a conta do destino precisa ser reconectada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/posts/{id}/comments":{"get":{"summary":"Listar comentários de um post","tags":["Comentários"],"description":"Comentários (e respostas de primeiro nível) do post no Instagram, com quem comentou. Paginação por `limit` (até 100) e `cursor` (o `nextCursor` da resposta anterior). Post com mais de um destino publicado exige `accountId`. Exige `instagram_business_manage_comments` na conta; curtidas não têm lista de autores na Meta, só `likeCount`.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"in":"query","name":"limit","required":false},{"schema":{"type":"string","minLength":1},"in":"query","name":"cursor","required":false},{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"accountId":{"type":"string"},"platformPostId":{"type":"string"},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"username":{"type":"string","nullable":true,"description":"Quem comentou."},"timestamp":{"type":"string"},"likeCount":{"type":"integer"},"hidden":{"type":"boolean"},"replies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"username":{"type":"string","nullable":true},"timestamp":{"type":"string"},"likeCount":{"type":"integer"}},"required":["id","text","username","timestamp","likeCount"],"additionalProperties":false}}},"required":["id","text","username","timestamp","likeCount","hidden","replies"],"additionalProperties":false}},"nextCursor":{"type":"string","nullable":true}},"required":["success","accountId","platformPostId","comments","nextCursor"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id. Mais de um destino publicado sem `accountId`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: post ou conta não existem neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"POST_NOT_CANCELLABLE: o post ainda não foi publicado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"summary":"Comentar ou responder","tags":["Comentários"],"description":"`text` cria um comentário no post; com `replyToCommentId`, responde a um comentário de primeiro nível (a Meta não aninha mais fundo).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":2200},"replyToCommentId":{"type":"string","minLength":1}},"required":["text"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":false},{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"201":{"description":"Criado","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"commentId":{"type":"string"}},"required":["success","commentId"],"additionalProperties":false,"description":"Criado"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: post ou conta não existem neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"POST_NOT_CANCELLABLE: o post ainda não foi publicado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/posts/{id}/comments/{commentId}":{"delete":{"summary":"Apagar comentário","tags":["Comentários"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":false},{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string","minLength":1},"in":"path","name":"commentId","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id. Mais de um destino publicado sem `accountId`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: post, conta ou comentário não existem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"POST_NOT_CANCELLABLE: o post ainda não foi publicado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"patch":{"summary":"Ocultar ou reexibir comentário","tags":["Comentários"],"description":"`{ \"hidden\": true }` oculta; `false` reexibe.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hidden":{"type":"boolean"}},"required":["hidden"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":false},{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string","minLength":1},"in":"path","name":"commentId","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"commentId":{"type":"string"},"hidden":{"type":"boolean"}},"required":["success","commentId","hidden"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id. Mais de um destino publicado sem `accountId`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: post, conta ou comentário não existem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"POST_NOT_CANCELLABLE: o post ainda não foi publicado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/messages":{"get":{"summary":"Listar conversas","tags":["Mensagens"],"description":"Conversas da conta (`accountId`), mais recentes primeiro, com participantes e a última mensagem. O `recipientId` para responder é o participante cujo `id` é diferente de `selfId`. Paginação por `limit` (até 100) e `cursor`. Exige `instagram_business_manage_messages`.","parameters":[{"schema":{"type":"string","enum":["instagram"]},"in":"query","name":"platform","required":false},{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":true},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"string","minLength":1,"pattern":"^[A-Za-z0-9_=-]+$"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"accountId":{"type":"string"},"selfId":{"type":"string"},"selfUsername":{"type":"string","nullable":true},"conversations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"participants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"profilePictureUrl":{"type":"string","nullable":true}},"required":["id","username","name","profilePictureUrl"],"additionalProperties":false}},"lastMessage":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string","nullable":true},"from":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string","nullable":true}},"required":["id","username"],"additionalProperties":false},"timestamp":{"type":"string"}},"required":["id","text","from","timestamp"],"additionalProperties":false,"nullable":true},"updatedTime":{"type":"string"}},"required":["id","participants","lastMessage","updatedTime"],"additionalProperties":false}},"nextCursor":{"type":"string","nullable":true}},"required":["success","accountId","selfId","selfUsername","conversations","nextCursor"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: conta não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"summary":"Responder uma mensagem","tags":["Mensagens"],"description":"Envia `text` (1 a 1000 caracteres) para `recipientId`. A Meta só permite responder até **24 horas** depois da última mensagem do destinatário; fora da janela (ou sem conversa anterior) a API responde `409 MESSAGE_WINDOW_CLOSED` com `details.recipientId` e `details.lastInboundAt`, sem tentar enviar.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string","minLength":1},"recipientId":{"type":"string","minLength":1},"text":{"type":"string","minLength":1,"maxLength":1000}},"required":["accountId","recipientId","text"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"201":{"description":"Criado","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"messageId":{"type":"string"}},"required":["success","messageId"],"additionalProperties":false,"description":"Criado"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: conta não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"MESSAGE_WINDOW_CLOSED: fora da janela de 24 h.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/messages/{conversationId}":{"get":{"summary":"Ler uma conversa","tags":["Mensagens"],"description":"Mensagens da conversa, mais recentes primeiro; `limit` (até 100) e `cursor`.","parameters":[{"schema":{"type":"string","enum":["instagram"]},"in":"query","name":"platform","required":false},{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":true},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"in":"query","name":"limit","required":false},{"schema":{"type":"string","minLength":1,"pattern":"^[A-Za-z0-9_=-]+$"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string","minLength":1,"pattern":"^[A-Za-z0-9_=-]+$"},"in":"path","name":"conversationId","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"accountId":{"type":"string"},"conversationId":{"type":"string"},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string","nullable":true},"from":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string","nullable":true}},"required":["id","username"],"additionalProperties":false},"timestamp":{"type":"string"}},"required":["id","text","from","timestamp"],"additionalProperties":false}},"nextCursor":{"type":"string","nullable":true}},"required":["success","accountId","conversationId","messages","nextCursor"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: conta não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/media":{"post":{"summary":"Enviar imagem","tags":["Mídia"],"description":"Um arquivo por requisição no campo `file` (multipart/form-data). JPEG, PNG ou WebP, até 8 MB, largura entre 320 e 1920 px, proporção entre 0.1:1 e 10:1. A imagem é convertida para JPEG e deduplicada por conteúdo; use o `id` como `mediaId` em POST /v1/posts. Os limites do destino (feed: 320–1440 px e 4:5–1.91:1; Story: até 1920 px, 9:16 recomendado) são aplicados na criação do post. Limite de 60 uploads por minuto.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"A imagem (JPEG, PNG ou WebP)."}}}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"201":{"description":"Criado","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"media":{"type":"object","properties":{"id":{"type":"string","description":"Use como `mediaId` em `mediaItems` de POST /v1/posts."},"url":{"type":"string"},"kind":{"type":"string","enum":["image","video"],"description":"`image` ou `video`."},"width":{"type":"integer"},"height":{"type":"integer"},"bytes":{"type":"integer"},"mime":{"type":"string"},"durationMs":{"type":"integer","nullable":true,"description":"Duração em milissegundos; nulo para imagem."}},"required":["id","url","kind","width","height","bytes","mime","durationMs"],"additionalProperties":false}},"required":["success","media"],"additionalProperties":false,"description":"Criado"}}}},"400":{"description":"MEDIA_INVALID com `details.reason`: `missing`, `too_many`, `too_large`, `mime`, `width` ou `aspect`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/media/upload-url":{"post":{"summary":"Pedir URL para enviar um vídeo","tags":["Mídia"],"description":"Devolve uma URL assinada para o cliente enviar o arquivo direto ao storage, sem passar pela API. Aceita `video/mp4` e `video/quicktime`, até 300 MB. Depois do envio, chame POST /v1/media/confirm com o `mediaId`. A URL vale 2 horas.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":255},"mimeType":{"type":"string","minLength":1},"bytes":{"type":"integer","exclusiveMinimum":true,"minimum":0}},"required":["filename","mimeType","bytes"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"201":{"description":"Criado","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"upload":{"type":"object","properties":{"mediaId":{"type":"string","description":"Use como `mediaId` em `mediaItems` depois de confirmar."},"path":{"type":"string"},"uploadUrl":{"type":"string","description":"Envie o arquivo com PUT nesta URL, com o header content-type do vídeo."},"token":{"type":"string"},"expiresIn":{"type":"integer","description":"Segundos de validade da URL."}},"required":["mediaId","path","uploadUrl","token","expiresIn"],"additionalProperties":false}},"required":["success","upload"],"additionalProperties":false,"description":"Criado"}}}},"400":{"description":"MEDIA_INVALID: tipo não aceito (`reason: mime`) ou acima de 300 MB (`reason: too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/media/confirm":{"post":{"summary":"Confirmar o envio de um vídeo","tags":["Mídia"],"description":"Valida o arquivo que foi enviado para a URL assinada e cria o registro de mídia. Um arquivo que não atende aos limites do Reel é removido do storage e não vira registro.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mediaId":{"type":"string","pattern":"^med_[0-9a-f]{16}$"}},"required":["mediaId"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"201":{"description":"Criado","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"media":{"type":"object","properties":{"id":{"type":"string","description":"Use como `mediaId` em `mediaItems` de POST /v1/posts."},"url":{"type":"string"},"kind":{"type":"string","enum":["image","video"],"description":"`image` ou `video`."},"width":{"type":"integer"},"height":{"type":"integer"},"bytes":{"type":"integer"},"mime":{"type":"string"},"durationMs":{"type":"integer","nullable":true,"description":"Duração em milissegundos; nulo para imagem."}},"required":["id","url","kind","width","height","bytes","mime","durationMs"],"additionalProperties":false}},"required":["success","media"],"additionalProperties":false,"description":"Criado"}}}},"400":{"description":"MEDIA_INVALID com `details.reason`: `missing`, `mime`, `codec`, `duration`, `fps`, `width`, `aspect`, `bitrate`, `audio`, `moov` ou `too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/analytics":{"get":{"summary":"Métricas de publicações","tags":["Analytics"],"description":"Proxy ao vivo sobre a Meta, com cache de 5 minutos por post (`force=true` fura). Com `postId`, devolve `post`; sem ele, `posts` paginado (`limit` até 20) com os posts publicados do projeto; `source=platform&accountId=` lista as mídias recentes da conta, inclusive as publicadas fora do Postmatic. `impressions`, `clicks` e `engagementRate` são sempre nulos no Instagram. Exige `instagram_business_manage_insights` na conta.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"postId","required":false},{"schema":{"type":"string","enum":["instagram"]},"in":"query","name":"platform","required":false},{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":false},{"schema":{"type":"string","enum":["postmatic","platform"],"default":"postmatic"},"in":"query","name":"source","required":false},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":10},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"force","required":false},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"post":{"type":"object","properties":{"source":{"type":"string","enum":["postmatic","platform"]},"postId":{"type":"string","nullable":true,"description":"Nulo quando a mídia não passou pelo Postmatic (`source=platform`)."},"content":{"type":"string"},"publishedAt":{"type":"string","format":"date-time","nullable":true},"aggregated":{"type":"object","properties":{"impressions":{"enum":["null"],"nullable":true},"reach":{"type":"integer","nullable":true},"likes":{"type":"integer","nullable":true},"comments":{"type":"integer","nullable":true},"shares":{"type":"integer","nullable":true},"saves":{"type":"integer","nullable":true},"clicks":{"enum":["null"],"nullable":true},"views":{"type":"integer","nullable":true},"engagementRate":{"enum":["null"],"nullable":true}},"required":["impressions","reach","likes","comments","shares","saves","clicks","views","engagementRate"],"additionalProperties":false},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string"},"platformPostId":{"type":"string"},"platformPostUrl":{"type":"string","nullable":true},"productType":{"type":"string","enum":["FEED","REELS","STORY"]},"metrics":{"type":"object","properties":{"likes":{"type":"integer","nullable":true},"comments":{"type":"integer","nullable":true},"shares":{"type":"integer","nullable":true},"saves":{"type":"integer","nullable":true},"reach":{"type":"integer","nullable":true},"views":{"type":"integer","nullable":true},"totalInteractions":{"type":"integer","nullable":true},"avgWatchTimeMs":{"type":"integer","nullable":true,"description":"Só Reels."},"totalWatchTimeMs":{"type":"integer","nullable":true,"description":"Só Reels."}},"required":["likes","comments","shares","saves","reach","views","totalInteractions","avgWatchTimeMs","totalWatchTimeMs"],"additionalProperties":false},"fetchedAt":{"type":"string","format":"date-time"}},"required":["platform","accountId","platformPostId","platformPostUrl","productType","metrics","fetchedAt"],"additionalProperties":false}}},"required":["source","postId","content","publishedAt","aggregated","platforms"],"additionalProperties":false},"total":{"type":"integer"},"posts":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["postmatic","platform"]},"postId":{"type":"string","nullable":true,"description":"Nulo quando a mídia não passou pelo Postmatic (`source=platform`)."},"content":{"type":"string"},"publishedAt":{"type":"string","format":"date-time","nullable":true},"aggregated":{"type":"object","properties":{"impressions":{"enum":["null"],"nullable":true},"reach":{"type":"integer","nullable":true},"likes":{"type":"integer","nullable":true},"comments":{"type":"integer","nullable":true},"shares":{"type":"integer","nullable":true},"saves":{"type":"integer","nullable":true},"clicks":{"enum":["null"],"nullable":true},"views":{"type":"integer","nullable":true},"engagementRate":{"enum":["null"],"nullable":true}},"required":["impressions","reach","likes","comments","shares","saves","clicks","views","engagementRate"],"additionalProperties":false},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram"]},"accountId":{"type":"string"},"platformPostId":{"type":"string"},"platformPostUrl":{"type":"string","nullable":true},"productType":{"type":"string","enum":["FEED","REELS","STORY"]},"metrics":{"type":"object","properties":{"likes":{"type":"integer","nullable":true},"comments":{"type":"integer","nullable":true},"shares":{"type":"integer","nullable":true},"saves":{"type":"integer","nullable":true},"reach":{"type":"integer","nullable":true},"views":{"type":"integer","nullable":true},"totalInteractions":{"type":"integer","nullable":true},"avgWatchTimeMs":{"type":"integer","nullable":true,"description":"Só Reels."},"totalWatchTimeMs":{"type":"integer","nullable":true,"description":"Só Reels."}},"required":["likes","comments","shares","saves","reach","views","totalInteractions","avgWatchTimeMs","totalWatchTimeMs"],"additionalProperties":false},"fetchedAt":{"type":"string","format":"date-time"}},"required":["platform","accountId","platformPostId","platformPostUrl","productType","metrics","fetchedAt"],"additionalProperties":false}}},"required":["source","postId","content","publishedAt","aggregated","platforms"],"additionalProperties":false}}},"required":["success"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta para conceder o escopo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: post ou conta não existem neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/analytics/instagram/follower-stats":{"get":{"summary":"Seguidores da conta","tags":["Analytics"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":true},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"force","required":false},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"accountId":{"type":"string"},"platform":{"type":"string","enum":["instagram"]},"currentFollowers":{"type":"integer","nullable":true},"mediaCount":{"type":"integer","nullable":true},"fetchedAt":{"type":"string","format":"date-time"}},"required":["success","accountId","platform","currentFollowers","mediaCount","fetchedAt"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: conta não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/analytics/instagram/account-insights":{"get":{"summary":"Insights da conta","tags":["Analytics"],"description":"`metrics` (padrão `reach,views,accounts_engaged,total_interactions`), `since`/`until` (AAAA-MM-DD, até 90 dias, padrão 30), `metricType` `total_value` ou `time_series` (só `reach`).","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":true},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"force","required":false},{"schema":{"type":"string","default":"reach,views,accounts_engaged,total_interactions"},"in":"query","name":"metrics","required":false},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"since","required":false},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"until","required":false},{"schema":{"type":"string","enum":["total_value","time_series"],"default":"total_value"},"in":"query","name":"metricType","required":false},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"accountId":{"type":"string"},"platform":{"type":"string","enum":["instagram"]},"dateRange":{"type":"object","properties":{"since":{"type":"string"},"until":{"type":"string"}},"required":["since","until"],"additionalProperties":false},"metricType":{"type":"string","enum":["total_value","time_series"]},"metrics":{"type":"object","additionalProperties":{"type":"object","properties":{"total":{"type":"integer","nullable":true},"values":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"number"}},"required":["date","value"],"additionalProperties":false}}},"required":["total"],"additionalProperties":false}},"dataDelay":{"type":"string"}},"required":["success","accountId","platform","dateRange","metricType","metrics","dataDelay"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id. Intervalo acima de 90 dias ou métrica desconhecida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: conta não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/analytics/instagram/demographics":{"get":{"summary":"Demografia da audiência","tags":["Analytics"],"description":"`metric` (`follower_demographics` padrão, `engaged_audience_demographics`, `reached_audience_demographics`), `breakdown` (padrão `age,city,country,gender`), `timeframe` (`this_month` padrão, `this_week`). Uma chamada à Meta por dimensão.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"accountId","required":true},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"force","required":false},{"schema":{"type":"string","enum":["follower_demographics","engaged_audience_demographics","reached_audience_demographics"],"default":"follower_demographics"},"in":"query","name":"metric","required":false},{"schema":{"type":"string","default":"age,city,country,gender"},"in":"query","name":"breakdown","required":false},{"schema":{"type":"string","enum":["this_month","this_week"],"default":"this_month"},"in":"query","name":"timeframe","required":false},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"accountId":{"type":"string"},"platform":{"type":"string","enum":["instagram"]},"metric":{"type":"string"},"timeframe":{"type":"string"},"demographics":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","properties":{"dimension":{"type":"string"},"value":{"type":"number"}},"required":["dimension","value"],"additionalProperties":false}}},"note":{"type":"string"}},"required":["success","accountId","platform","metric","timeframe","demographics","note"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token. PERMISSION_REQUIRED: reconecte a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: conta não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/notifications":{"post":{"summary":"Criar assinatura de webhook","tags":["Webhooks"],"description":"Recebe `post.scheduled`, `post.published`, `post.partial` e `post.failed` por POST na `webhook.url` (https, host público). O `secret` aparece **somente nesta resposta**: guarde-o para verificar a assinatura `X-Postmatic-Signature` (`sha256=` + HMAC-SHA256 hex de `<X-Postmatic-Timestamp>.<corpo cru>`). Até 3 tentativas com 10 s de timeout; deduplique pelo `id` do evento.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"channel":{"type":"string","enum":["webhook"],"default":"webhook"},"profileId":{"type":"string","minLength":1},"eventTypes":{"type":"array","items":{"type":"string","enum":["post.scheduled","post.published","post.partial","post.failed"]},"minItems":1},"onlyScheduledPosts":{"type":"boolean","default":false},"enabled":{"type":"boolean","default":true},"webhook":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"],"additionalProperties":false}},"required":["eventTypes","webhook"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"201":{"description":"Criado","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"notification":{"type":"object","properties":{"id":{"type":"string"},"channel":{"type":"string","enum":["webhook"]},"profileId":{"type":"string","nullable":true,"description":"Com profile, só recebe eventos de posts desse profile."},"eventTypes":{"type":"array","items":{"type":"string","enum":["post.scheduled","post.published","post.partial","post.failed"]}},"onlyScheduledPosts":{"type":"boolean","description":"true: eventos finais só de posts que foram agendados."},"enabled":{"type":"boolean"},"webhook":{"type":"object","properties":{"url":{"type":"string"},"secret":{"type":"string","description":"Inteiro só na resposta da criação; mascarado (`whsec_…xxxx`) nas demais."}},"required":["url","secret"],"additionalProperties":false},"lastTestAt":{"type":"string","format":"date-time","nullable":true},"lastTestStatus":{"type":"string","enum":["delivered","failed"],"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","channel","profileId","eventTypes","onlyScheduledPosts","enabled","webhook","lastTestAt","lastTestStatus","createdAt","updatedAt"],"additionalProperties":false}},"required":["success","notification"],"additionalProperties":false,"description":"Criado"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id. VALIDATION_ERROR com `reason: blocked`: a URL aponta para um endereço interno.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: `profileId` não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"get":{"summary":"Listar assinaturas","tags":["Webhooks"],"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"total":{"type":"integer"},"notifications":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"channel":{"type":"string","enum":["webhook"]},"profileId":{"type":"string","nullable":true,"description":"Com profile, só recebe eventos de posts desse profile."},"eventTypes":{"type":"array","items":{"type":"string","enum":["post.scheduled","post.published","post.partial","post.failed"]}},"onlyScheduledPosts":{"type":"boolean","description":"true: eventos finais só de posts que foram agendados."},"enabled":{"type":"boolean"},"webhook":{"type":"object","properties":{"url":{"type":"string"},"secret":{"type":"string","description":"Inteiro só na resposta da criação; mascarado (`whsec_…xxxx`) nas demais."}},"required":["url","secret"],"additionalProperties":false},"lastTestAt":{"type":"string","format":"date-time","nullable":true},"lastTestStatus":{"type":"string","enum":["delivered","failed"],"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","channel","profileId","eventTypes","onlyScheduledPosts","enabled","webhook","lastTestAt","lastTestStatus","createdAt","updatedAt"],"additionalProperties":false}}},"required":["success","total","notifications"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/notifications/test":{"post":{"summary":"Testar um destino","tags":["Webhooks"],"description":"Envia um evento de exemplo (`type: post.published`, id `evt_test_…`) e devolve o resultado da entrega. Com `notificationId`, usa a assinatura salva e registra `lastTestAt`/`lastTestStatus`; com `webhook.url`, assina com um segredo de uso único devolvido em `result.secret`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"notificationId":{"type":"string","minLength":1},"webhook":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"],"additionalProperties":false}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"result":{"type":"object","properties":{"delivered":{"type":"boolean"},"statusCode":{"type":"integer","nullable":true},"error":{"type":"string","nullable":true},"latencyMs":{"type":"integer"},"secret":{"type":"string","description":"Só quando testado por `webhook.url` sem assinatura salva: segredo de uso único que assinou este evento."}},"required":["delivered","statusCode","error","latencyMs"],"additionalProperties":false}},"required":["success","result"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: `notificationId` não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/notifications/{id}":{"get":{"summary":"Consultar assinatura","tags":["Webhooks"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"notification":{"type":"object","properties":{"id":{"type":"string"},"channel":{"type":"string","enum":["webhook"]},"profileId":{"type":"string","nullable":true,"description":"Com profile, só recebe eventos de posts desse profile."},"eventTypes":{"type":"array","items":{"type":"string","enum":["post.scheduled","post.published","post.partial","post.failed"]}},"onlyScheduledPosts":{"type":"boolean","description":"true: eventos finais só de posts que foram agendados."},"enabled":{"type":"boolean"},"webhook":{"type":"object","properties":{"url":{"type":"string"},"secret":{"type":"string","description":"Inteiro só na resposta da criação; mascarado (`whsec_…xxxx`) nas demais."}},"required":["url","secret"],"additionalProperties":false},"lastTestAt":{"type":"string","format":"date-time","nullable":true},"lastTestStatus":{"type":"string","enum":["delivered","failed"],"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","channel","profileId","eventTypes","onlyScheduledPosts","enabled","webhook","lastTestAt","lastTestStatus","createdAt","updatedAt"],"additionalProperties":false}},"required":["success","notification"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: assinatura não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"patch":{"summary":"Editar assinatura","tags":["Webhooks"],"description":"Todos os campos opcionais. Trocar a URL não troca o segredo.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"profileId":{"type":"string","minLength":1,"nullable":true},"eventTypes":{"type":"array","items":{"type":"string","enum":["post.scheduled","post.published","post.partial","post.failed"]},"minItems":1},"onlyScheduledPosts":{"type":"boolean"},"enabled":{"type":"boolean"},"webhook":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"],"additionalProperties":false}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"notification":{"type":"object","properties":{"id":{"type":"string"},"channel":{"type":"string","enum":["webhook"]},"profileId":{"type":"string","nullable":true,"description":"Com profile, só recebe eventos de posts desse profile."},"eventTypes":{"type":"array","items":{"type":"string","enum":["post.scheduled","post.published","post.partial","post.failed"]}},"onlyScheduledPosts":{"type":"boolean","description":"true: eventos finais só de posts que foram agendados."},"enabled":{"type":"boolean"},"webhook":{"type":"object","properties":{"url":{"type":"string"},"secret":{"type":"string","description":"Inteiro só na resposta da criação; mascarado (`whsec_…xxxx`) nas demais."}},"required":["url","secret"],"additionalProperties":false},"lastTestAt":{"type":"string","format":"date-time","nullable":true},"lastTestStatus":{"type":"string","enum":["delivered","failed"],"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","channel","profileId","eventTypes","onlyScheduledPosts","enabled","webhook","lastTestAt","lastTestStatus","createdAt","updatedAt"],"additionalProperties":false}},"required":["success","notification"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: assinatura ou `profileId` não existem neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"delete":{"summary":"Remover assinatura","tags":["Webhooks"],"description":"Remoção lógica: o histórico de entregas continua consultável pelo id.","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"message":{"type":"string"}},"required":["success","message"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: assinatura não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/notifications/{id}/deliveries":{"get":{"summary":"Histórico de entregas","tags":["Webhooks"],"description":"Mais recentes primeiro; `limit` (1 a 100) e `offset`. Cada entrega é uma tentativa acumulada do mesmo evento para esta assinatura.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"total":{"type":"integer"},"deliveries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"eventId":{"type":"string","description":"Igual ao `id` do payload entregue; use como chave de deduplicação."},"eventType":{"type":"string","enum":["post.scheduled","post.published","post.partial","post.failed"]},"postId":{"type":"string"},"status":{"type":"string","enum":["pending","delivered","failed"]},"attempt":{"type":"integer","description":"Tentativas já feitas (até 3)."},"responseStatus":{"type":"integer","nullable":true},"error":{"type":"string","nullable":true},"nextAttemptAt":{"type":"string","format":"date-time","nullable":true},"deliveredAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","eventId","eventType","postId","status","attempt","responseStatus","error","nextAttemptAt","deliveredAt","createdAt"],"additionalProperties":false}}},"required":["success","total","deliveries"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: assinatura não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/connect/instagram/callback":{"get":{"summary":"Retorno do OAuth (uso da Meta)","tags":["Contas conectadas"],"description":"Destino do redirecionamento da Meta depois da autorização. Não chame diretamente. Com `redirectUri` na conexão, responde 302 para lá; sem ele, devolve a conta conectada em JSON.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"state","required":true},{"schema":{"type":"string","minLength":1},"in":"query","name":"code","required":false},{"schema":{"type":"string"},"in":"query","name":"error","required":false},{"schema":{"type":"string"},"in":"query","name":"error_reason","required":false},{"schema":{"type":"string"},"in":"query","name":"error_description","required":false}],"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"integration":{"type":"object","properties":{"id":{"type":"string","description":"Use como `accountId` em POST /v1/posts."},"platform":{"type":"string","enum":["instagram"]},"platformUserId":{"type":"string","description":"ID da conta na plataforma (Instagram user id)."},"displayName":{"type":"string","nullable":true,"description":"Username no Instagram."},"imageUrl":{"type":"string","nullable":true},"profileId":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"authStatus":{"type":"string","enum":["active","reconnect_required"],"description":"`reconnect_required` quando o token venceu ou a conta foi revogada: peça ao usuário para reconectar."},"status":{"type":"string","enum":["connected","degraded","revoked"],"description":"Resultado da última verificação de saúde."},"tokenExpiresAt":{"type":"string","format":"date-time","nullable":true},"lastHealthCheckAt":{"type":"string","format":"date-time","nullable":true},"healthError":{"type":"string","nullable":true,"description":"`CODIGO: mensagem` da última falha de saúde, ou null."},"scopes":{"type":"array","items":{"type":"string"},"description":"Permissões concedidas na Meta. Sem `instagram_business_manage_insights` ou `_manage_comments`, as rotas de analytics e comentários respondem PERMISSION_REQUIRED: reconecte."}},"required":["id","platform","platformUserId","displayName","imageUrl","profileId","createdAt","authStatus","status","tokenExpiresAt","lastHealthCheckAt","healthError","scopes"],"additionalProperties":false}},"required":["success","integration"],"additionalProperties":false,"description":"OK"}}}},"302":{"description":"Redirecionamento para o redirectUri"},"400":{"description":"STATE_INVALID: state ausente, adulterado ou expirado. AUTHORIZATION_DENIED: o usuário negou. ACCOUNT_NOT_BUSINESS: conta pessoal.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"TOKEN_INVALID ou ACCOUNT_RESTRICTED: a Meta recusou a conta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: 60 por minuto por IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/connect/{platform}":{"get":{"summary":"Iniciar conexão de uma conta","tags":["Contas conectadas"],"description":"Devolve a URL de autorização para redirecionar o usuário. Só `instagram` está disponível; a conta precisa ser profissional (Business ou Creator). Ao terminar, o usuário volta para `redirectUri` com `?status=connected&integrationId=…` ou `?status=error&code=…`. `appId` (BYOK do PostPeer) é aceito e ignorado.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"profileId","required":false},{"schema":{"type":"string","format":"uri"},"in":"query","name":"redirectUri","required":false},{"schema":{"type":"string"},"in":"query","name":"appId","required":false},{"schema":{"type":"string"},"in":"path","name":"platform","required":true},{"schema":{"type":"string"},"in":"header","name":"x-project-id","required":false,"description":"Obrigatório no modo Bearer; ignorado com x-access-key."}],"security":[{"accessKey":[]},{"bearer":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"URL de autorização na Meta, válida por 10 minutos."}},"required":["url"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"VALIDATION_ERROR: campo rejeitado. PROJECT_REQUIRED: modo Bearer sem x-project-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"UNAUTHORIZED: chave ausente, inválida, revogada ou expirada; ou Bearer e x-access-key enviados juntos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"PLATFORM_NOT_AVAILABLE: plataforma não suportada. FORBIDDEN: o projeto não pertence ao usuário do token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"NOT_FOUND: `profileId` não existe neste projeto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: limite de requisições da credencial excedido (ver headers x-ratelimit-*).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/meta/deauthorize":{"post":{"summary":"Callback de desautorização (uso da Meta)","tags":["Callbacks da Meta"],"description":"Chamado pela Meta quando o usuário remove o app no Instagram. Verifica o `signed_request` e revoga as contas daquele usuário.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"signed_request":{"type":"string","minLength":1}},"required":["signed_request"],"additionalProperties":false}}}},"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"SIGNED_REQUEST_INVALID: assinatura não confere.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: 60 por minuto por IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/meta/data-deletion":{"post":{"summary":"Callback de exclusão de dados (uso da Meta)","tags":["Callbacks da Meta"],"description":"Chamado pela Meta quando o usuário pede a exclusão dos dados. Devolve a URL de acompanhamento e o código de confirmação, no formato exigido pela Meta.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"signed_request":{"type":"string","minLength":1}},"required":["signed_request"],"additionalProperties":false}}}},"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"confirmation_code":{"type":"string"}},"required":["url","confirmation_code"],"additionalProperties":false,"description":"OK"}}}},"400":{"description":"SIGNED_REQUEST_INVALID: assinatura não confere.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: 60 por minuto por IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/meta/data-deletion/{code}":{"get":{"summary":"Status de um pedido de exclusão","tags":["Callbacks da Meta"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"code","required":true}],"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"confirmation_code":{"type":"string"},"status":{"type":"string","enum":["pending","done"]}},"required":["confirmation_code","status"],"additionalProperties":false,"description":"OK"}}}},"404":{"description":"NOT_FOUND: código desconhecido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_KEY: 60 por minuto por IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}}},"servers":[{"url":"https://api.uat.postmatic.dev"}],"tags":[{"name":"Saúde","description":"Liveness e verificação de credencial."},{"name":"Contas conectadas","description":"Conexão OAuth, listagem, saúde e desconexão de contas do Instagram."},{"name":"Profiles","description":"Agrupamento de contas conectadas por cliente ou marca."},{"name":"Publicações","description":"Criar, acompanhar, reagendar e cancelar posts."},{"name":"Mídia","description":"Upload direto de imagens."},{"name":"Analytics","description":"Métricas de publicação e de conta, ao vivo da Meta, com cache curto."},{"name":"Comentários","description":"Comentários dos posts publicados: listar, responder, apagar e ocultar."},{"name":"Mensagens","description":"Mensagens diretas do Instagram: conversas, leitura e resposta dentro da janela de 24 h."},{"name":"Webhooks","description":"Assinaturas de eventos de saída, teste de destino e histórico de entregas."},{"name":"Chaves de API","description":"Só no modo Bearer (painel)."},{"name":"Conta","description":"Só no modo Bearer (painel)."},{"name":"Callbacks da Meta","description":"Endpoints chamados pela Meta, exigidos pelo App Review."}]}