{"id":164,"date":"2026-09-12T19:22:45","date_gmt":"2026-09-12T22:22:45","guid":{"rendered":"https:\/\/postping.com.br\/blog\/erro-publicacao-instagram-subcodigo\/"},"modified":"2026-09-12T19:22:45","modified_gmt":"2026-09-12T22:22:45","slug":"erro-publicacao-instagram-subcodigo","status":"publish","type":"post","link":"https:\/\/postping.com.br\/blog\/erro-publicacao-instagram-subcodigo\/","title":{"rendered":"Erro de publica\u00e7\u00e3o no Instagram, leia o subc\u00f3digo primeiro"},"content":{"rendered":"<p>Por que o Instagram recusou o post, se o artigo entrou no ar no WordPress sem erro nenhum? Porque a falha n\u00e3o est\u00e1 no WordPress: est\u00e1 na resposta da Graph API, que devolve dois n\u00fameros e s\u00f3 o segundo explica alguma coisa. O <code>code<\/code> agrupa fam\u00edlias inteiras de falha; o <code>error_subcode<\/code> aponta o caso. Quem l\u00ea s\u00f3 o primeiro republica o artigo, v\u00ea falhar de novo e conclui que a API caiu.<\/p>\n<h2>9004 vem com uma mensagem que n\u00e3o descreve o problema<\/h2>\n<p>A resposta chega assim, e o campo que interessa n\u00e3o \u00e9 o primeiro:<\/p>\n<p><code>{\"error\":{\"message\":\"Only photo or video can be accepted as media type.\",\"type\":\"OAuthException\",\"code\":9004,\"error_subcode\":2207052,\"is_transient\":false,\"error_user_title\":\"Media download has failed. The URI doesn't meet requirements.\",\"error_user_msg\":\"The media could not be fetched from this URI: https:\/\/seusite.com.br\/wp-content\/uploads\/...\"}}<\/code><\/p>\n<p>A frase que est\u00e1 em <code>message<\/code> fala de tipo de m\u00eddia aceito e manda todo mundo conferir se o arquivo \u00e9 JPEG. O campo que descreve o que aconteceu \u00e9 o <code>error_user_msg<\/code>: a Meta tentou baixar a imagem do endere\u00e7o que voc\u00ea mandou e n\u00e3o conseguiu. O tipo de m\u00eddia n\u00e3o entrou na conta em momento nenhum.<\/p>\n<p>Da\u00ed em diante existem dois casos bem diferentes, e eles se separam por um detalhe de pontua\u00e7\u00e3o. Num relato aberto em 13 de mar\u00e7o de 2026 no reposit\u00f3rio do Mixpost, o campo terminava em <code>from this URI: .<\/code> N\u00e3o havia endere\u00e7o nenhum depois dos dois-pontos. O autor chegou \u00e0 conclus\u00e3o certa: o aplicativo enviava o par\u00e2metro <code>image_url<\/code> vazio, e a Meta respondeu com um erro sobre m\u00eddia porque foi o que recebeu. Endere\u00e7o ausente na mensagem \u00e9 problema do seu lado da linha.<\/p>\n<p>O segundo caso \u00e9 o inverso. Em 27 de abril de 2026, um relato no reposit\u00f3rio do Postiz trazia o mesmo par 9004 e 2207052, com o endere\u00e7o completo presente na mensagem. O autor tinha verificado o que dava: <code>curl -sI<\/code> devolvia <code>HTTP 200<\/code> e <code>Content-Type: image\/jpeg<\/code>, e a mesma requisi\u00e7\u00e3o com o agente <code>facebookexternalhit\/1.1<\/code> respondia 200 limpo. O arquivo, submetido com os mesmos par\u00e2metros, foi aceito pelo X, pelo Facebook e pelo LinkedIn. S\u00f3 o Instagram recusou.<\/p>\n<p>Separar os dois leva trinta segundos: leia o texto depois de <code>URI:<\/code> e veja se existe um endere\u00e7o ali. Existindo, abra esse endere\u00e7o com <code>curl -sI<\/code> e repita a chamada passando o agente <code>facebookexternalhit\/1.1<\/code>, que \u00e9 com ele que a Meta busca a imagem. Duas respostas 200 com tipo de imagem aceito tiram seu site da lista de suspeitos e jogam o caso para a \u00faltima se\u00e7\u00e3o.<\/p>\n<h2>190 e 102 s\u00e3o o mesmo assunto em graus diferentes<\/h2>\n<p>Um token do Instagram de curta dura\u00e7\u00e3o vale 1 hora; o de longa dura\u00e7\u00e3o, 60 dias. Como 60 dias n\u00e3o coincidem com nada no calend\u00e1rio de ningu\u00e9m, o vencimento pega a equipe de surpresa, quase sempre num fim de semana, e a esteira fica parada at\u00e9 segunda.<\/p>\n<p>O c\u00f3digo 190 diz literalmente que o token expirou. O 102 \u00e9 mais largo: a documenta\u00e7\u00e3o da Meta registra que, n\u00e3o vindo subc\u00f3digo, o estado de login ou o token expirou, foi revogado ou \u00e9 inv\u00e1lido de alguma outra forma. A diferen\u00e7a importa porque os dois pedem a\u00e7\u00f5es diferentes, e \u00e9 o subc\u00f3digo que decide qual.<\/p>\n<p>Tr\u00eas subc\u00f3digos se resolvem refazendo a autoriza\u00e7\u00e3o, porque s\u00e3o credencial vencida ou aplicativo removido: 463, 467 e 458. Os outros tr\u00eas n\u00e3o se resolvem assim, e \u00e9 a\u00ed que as tardes s\u00e3o perdidas. O 460 significa que a pessoa trocou a senha da conta do Facebook. O 459 e o 464 dizem que a conta dela tem pend\u00eancia a resolver dentro do pr\u00f3prio Facebook. O 492 \u00e9 o mais trai\u00e7oeiro: ela n\u00e3o tem o papel adequado na P\u00e1gina, o que aparece quando algu\u00e9m mexeu nas permiss\u00f5es e n\u00e3o avisou quem cuida do site.<\/p>\n<p>Leia o <code>error_subcode<\/code> antes de tentar qualquer reconex\u00e3o. Com 460 ou 492, refazer o login com a mesma conta devolve exatamente o mesmo erro, porque o que mudou foi a senha ou o papel na P\u00e1gina. Sem subc\u00f3digo nenhum junto do 102, trate como token vencido e refa\u00e7a a autoriza\u00e7\u00e3o.<\/p>\n<h2>10 e a faixa de 200 a 299 s\u00e3o mudan\u00e7a de regra, n\u00e3o erro de c\u00f3digo<\/h2>\n<p>A Meta descreve o c\u00f3digo 10 e toda a faixa de 200 a 299 com a mesma frase: a permiss\u00e3o n\u00e3o foi concedida ou foi removida. Ler isso como bug do seu lado \u00e9 o caminho mais r\u00e1pido para perder o dia. Quase sempre o que mudou foi a lista de permiss\u00f5es exigida pela plataforma, e ela mudou duas vezes em menos de um ano.<\/p>\n<p>Em 3 de dezembro de 2025 a Meta liberou a exclus\u00e3o de m\u00eddia do Instagram pela API e criou a permiss\u00e3o <code>instagram_manage_contents<\/code> para isso. Em 22 de abril de 2026 chegou a API de curtidas e coment\u00e1rios, com a permiss\u00e3o <code>instagram_manage_engagement<\/code>. Nenhuma das duas tem rela\u00e7\u00e3o com publicar artigo, e \u00e9 por isso que aparecem no diagn\u00f3stico: quem autorizou o aplicativo antes dessas datas n\u00e3o concedeu nada disso, e qualquer recurso que encoste nelas falha com 10 sem que uma linha do seu c\u00f3digo tenha mudado.<\/p>\n<p>Compare duas listas: as permiss\u00f5es que a autoriza\u00e7\u00e3o atual concedeu e as que o endere\u00e7o chamado exige hoje na documenta\u00e7\u00e3o. Havendo uma permiss\u00e3o nova no meio, a data em que ela apareceu no changelog costuma bater com a semana em que o erro come\u00e7ou. Olhe tamb\u00e9m qual vers\u00e3o a integra\u00e7\u00e3o fixou: a v25.0 responde at\u00e9 29 de julho de 2028, prazo longo o bastante para voc\u00ea esquecer que ela existe enquanto a documenta\u00e7\u00e3o segue em frente.<\/p>\n<h2>O 200 que n\u00e3o \u00e9 sucesso e o cont\u00eainer que falha depois<\/h2>\n<p>Publicar uma foto no Instagram pela API s\u00e3o duas chamadas: voc\u00ea cria um cont\u00eainer de m\u00eddia, depois manda publicar esse cont\u00eainer. A primeira devolve um identificador e um 200, e \u00e9 a\u00ed que muita gente marca a tarefa como conclu\u00edda no log. Baixar e processar a imagem acontece depois, fora da sua requisi\u00e7\u00e3o.<\/p>\n<p>O cont\u00eainer tem um campo de estado com cinco valores documentados. Tr\u00eas s\u00e3o rotina: <code>IN_PROGRESS<\/code> ainda processando, <code>FINISHED<\/code> pronto para publicar, <code>PUBLISHED<\/code> j\u00e1 publicado. Os outros dois s\u00e3o a falha que voc\u00ea procura. <code>ERROR<\/code> significa que o cont\u00eainer n\u00e3o completou o processo de publica\u00e7\u00e3o. <code>EXPIRED<\/code> significa que ele n\u00e3o foi publicado em 24 horas e expirou.<\/p>\n<p>Os dois \u00faltimos produzem a queixa mais comum: o artigo saiu no blog, o post nunca apareceu e n\u00e3o h\u00e1 erro em lugar nenhum. N\u00e3o h\u00e1 porque ningu\u00e9m foi ler o estado. O <code>EXPIRED<\/code> tem causa banal: a segunda chamada n\u00e3o aconteceu, porque a fila de tarefas agendadas do WordPress n\u00e3o rodou ou porque o processo morreu.<\/p>\n<p>Consulte o estado entre a cria\u00e7\u00e3o e a publica\u00e7\u00e3o em vez de encadear as duas chamadas \u00e0s cegas. Com <code>ERROR<\/code>, a causa raiz costuma ser a da primeira se\u00e7\u00e3o. Com <code>EXPIRED<\/code>, o problema \u00e9 do seu agendamento e n\u00e3o da Meta, e os formatos que a API aceita nessa etapa est\u00e3o em <a href=\"https:\/\/postping.com.br\/blog\/api-instagram-publicar-limites\/\">o que a API do Instagram deixa e o que n\u00e3o deixa automatizar<\/a>.<\/p>\n<h2>80002 e o teto de publica\u00e7\u00e3o s\u00e3o dois limites que n\u00e3o se misturam<\/h2>\n<p>Confundir os dois leva a esperar o tempo errado. O primeiro \u00e9 o limite de chamadas: a resposta do Instagram traz o cabe\u00e7alho <code>X-Business-Use-Case-Usage<\/code>, com quatro medidas dentro. <code>call_count<\/code> \u00e9 o percentual de chamadas permitidas j\u00e1 feitas numa janela m\u00f3vel de uma hora, <code>total_cputime<\/code> e <code>total_time<\/code> s\u00e3o percentuais de processamento, e <code>estimated_time_to_regain_access<\/code> \u00e9 o tempo em minutos at\u00e9 as chamadas deixarem de ser barradas. Quando uma dessas medidas chega a 100, as chamadas podem passar a ser barradas, e o erro que o Instagram devolve nesse caso \u00e9 o 80002.<\/p>\n<p>O segundo limite \u00e9 de outra natureza: uma conta pode publicar 100 posts pela API numa janela m\u00f3vel de 24 horas, e um carrossel inteiro conta como um post s\u00f3. Esse teto tem endere\u00e7o pr\u00f3prio de consulta, <code>GET \/&lt;IG_ID&gt;\/content_publishing_limit<\/code>, e nenhuma rela\u00e7\u00e3o com o cabe\u00e7alho de uso. Um blog di\u00e1rio nunca encosta nele. Uma ag\u00eancia que dispara a fila de vinte clientes de uma vez encosta no limite de chamadas muito antes de chegar perto do teto de publica\u00e7\u00f5es.<\/p>\n<p>Do lado do Facebook os n\u00fameros s\u00e3o outros: 4 e 17 para excesso de chamadas do aplicativo e do usu\u00e1rio, 341 para limite do aplicativo atingido, 368 para bloqueio tempor\u00e1rio por viola\u00e7\u00e3o de pol\u00edtica, que n\u00e3o \u00e9 limite de volume e n\u00e3o passa com espera.<\/p>\n<p>Leia o cabe\u00e7alho da resposta que falhou. Se <code>estimated_time_to_regain_access<\/code> vier com um n\u00famero, \u00e9 limita\u00e7\u00e3o de chamadas e esperar resolve. Se as medidas estiverem baixas e o erro persistir, o problema \u00e9 o conte\u00fado da requisi\u00e7\u00e3o, n\u00e3o o volume.<\/p>\n<h2>Quando o erro n\u00e3o \u00e9 seu<\/h2>\n<p>Existe um caso em que a checagem inteira d\u00e1 certo e o post continua sendo recusado. Uma discuss\u00e3o na comunidade de desenvolvedores da Meta, aberta em 2 de abril de 2026 e reativada entre os dias 19 e 27, reuniu relatos id\u00eanticos de 9004 com 2207052 vindos de aplicativos sem rela\u00e7\u00e3o entre si. Um participante resumiu: nenhuma mudan\u00e7a de c\u00f3digo ou de infraestrutura do lado deles. Imagens de alguns provedores grandes falhavam enquanto as de outros endere\u00e7os passavam, e o problema se desfez sozinho por volta de 3 de abril, sem explica\u00e7\u00e3o p\u00fablica.<\/p>\n<p>Repare no <code>is_transient<\/code> daquele payload: vinha como <code>false<\/code>, ou seja, a Meta afirmava que o erro n\u00e3o era passageiro, num epis\u00f3dio que passou sozinho. Bom motivo para n\u00e3o tratar esse campo como veredicto.<\/p>\n<p>Tr\u00eas sinais apontam para esse caso: o arquivo passa nas duas checagens da primeira se\u00e7\u00e3o, outra rede aceita o mesmo arquivo no mesmo minuto, e nada mudou do seu lado desde a \u00faltima publica\u00e7\u00e3o que funcionou. Confirmados os tr\u00eas, republicar na m\u00e3o \u00e9 a pior rea\u00e7\u00e3o: quando o servi\u00e7o volta, voc\u00ea descobre que criou dois posts iguais. Registre o payload inteiro, espere e tente de novo mais tarde.<\/p>\n<p>Isso pressup\u00f5e que algu\u00e9m guardou o payload, e \u00e9 aqui que o trabalho manual custa caro: a mensagem passa pela tela uma vez e some. O Post Ping guarda o erro exato devolvido pela Meta junto ao artigo que falhou, com o que foi publicado, onde e quando, o que transforma o diagn\u00f3stico deste artigo em leitura de registro. A renova\u00e7\u00e3o autom\u00e1tica do acesso tira da mesa a fam\u00edlia 190 e 102, a que mais derruba blog que publicou sem sobressalto por dois meses. Os dois est\u00e3o descritos em <a href=\"https:\/\/postping.com.br\/recursos\">recursos do plugin<\/a>, e a esteira completa do artigo at\u00e9 o post no ar est\u00e1 em <a href=\"https:\/\/postping.com.br\/blog\/wordpress-instagram-facebook-automatico\/\">publicar do WordPress no Instagram e no Facebook automaticamente<\/a>.<\/p>\n<p>Para saber que a leitura foi correta, force o erro antes que ele aconte\u00e7a sozinho. Troque o endere\u00e7o da imagem por um que n\u00e3o existe e dispare a publica\u00e7\u00e3o: o retorno tem que ser 9004 com 2207052, e o endere\u00e7o quebrado tem que aparecer depois de <code>URI:<\/code>. Volte o endere\u00e7o certo e consulte o estado do cont\u00eainer antes de publicar: tem que vir <code>FINISHED<\/code>. Quem viu esses dois retornos uma vez, com calma, reconhece o pr\u00f3ximo erro de verdade sem abrir a documenta\u00e7\u00e3o.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Erro de publica\u00e7\u00e3o no Instagram quase nunca \u00e9 o que a mensagem diz. Veja o que 9004, 190, 10 e 80002 significam e como confirmar cada causa antes de republicar.<\/p>\n","protected":false},"author":1,"featured_media":163,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-164","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-publicacao-automatica"],"_links":{"self":[{"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/posts\/164","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/comments?post=164"}],"version-history":[{"count":0,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/posts\/164\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/media\/163"}],"wp:attachment":[{"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/media?parent=164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/categories?post=164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/postping.com.br\/blog\/wp-json\/wp\/v2\/tags?post=164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}