{"openapi":"3.1.0","info":{"title":"Instagram API — insta.onerb.rest","version":"2.0.0","description":"API pública para consulta de perfis do Instagram. Fotos servidas via R2 (URLs permanentes). JSON normalizado PT-BR."},"servers":[{"url":"https://insta.onerb.rest","description":"Produção"},{"url":"https://insta-api.onerb.workers.dev","description":"Workers Dev"},{"url":"http://localhost:8787","description":"Local"}],"components":{"schemas":{"PerfilInstagram":{"type":"object","properties":{"usuario":{"type":"string"},"nome_completo":{"type":"string"},"biografia":{"type":"string"},"bio_links":{"type":"array","items":{"type":"object","properties":{"titulo":{"type":"string"},"url":{"type":"string"}},"required":["titulo","url"]}},"foto_perfil":{"type":"string","description":"URL permanente da foto via R2"},"foto_perfil_hd":{"type":"string","description":"URL permanente da foto HD via R2"},"seguidores":{"type":"number"},"seguindo":{"type":"number"},"total_posts":{"type":"number"},"privado":{"type":"boolean"},"verificado":{"type":"boolean"},"conta_comercial":{"type":"boolean"},"conta_profissional":{"type":"boolean"},"categoria":{"type":"string","nullable":true},"link_externo":{"type":"string","nullable":true},"id":{"type":"string"},"destaques":{"type":"number"}},"required":["usuario","nome_completo","biografia","bio_links","foto_perfil","foto_perfil_hd","seguidores","seguindo","total_posts","privado","verificado","conta_comercial","conta_profissional","categoria","link_externo","id","destaques"]},"PostInstagram":{"type":"object","properties":{"id":{"type":"string"},"codigo":{"type":"string","description":"Shortcode do post (ex: DRI-4IJjeru)"},"tipo":{"type":"string","enum":["foto","video","carrossel"]},"imagem_url":{"type":"string","description":"URL permanente da imagem via R2"},"eh_video":{"type":"boolean"},"curtidas":{"type":"number"},"comentarios":{"type":"number"},"legenda":{"type":"string","description":"Texto da legenda (preserva emojis)"},"data_publicacao":{"type":"string","description":"ISO 8601"}},"required":["id","codigo","tipo","imagem_url","eh_video","curtidas","comentarios","legenda","data_publicacao"]},"MetaResposta":{"type":"object","properties":{"fonte":{"type":"string","description":"Source usado (ig-web, face-web, etc)"},"cache":{"type":"boolean"},"cache_em":{"type":"string"},"buscado_em":{"type":"string"},"request_id":{"type":"string"},"tempo_ms":{"type":"number"}},"required":["fonte","cache","buscado_em","request_id","tempo_ms"]},"RespostaSucesso":{"type":"object","properties":{"sucesso":{"type":"boolean","enum":[true]},"dados":{"type":"object","properties":{"perfil":{"$ref":"#/components/schemas/PerfilInstagram"},"posts":{"type":"array","items":{"$ref":"#/components/schemas/PostInstagram"}}},"required":["perfil","posts"]},"meta":{"$ref":"#/components/schemas/MetaResposta"}},"required":["sucesso","dados","meta"]},"RespostaErro":{"type":"object","properties":{"sucesso":{"type":"boolean","enum":[false]},"erro":{"type":"string"}},"required":["sucesso","erro"]}},"parameters":{}},"paths":{"/perfil/:username":{"get":{"tags":["Instagram"],"summary":"Buscar perfil do Instagram","description":"Retorna perfil completo + posts. Fotos servidas via R2 (URLs permanentes). Fallback automático entre sources.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":30,"pattern":"^[a-zA-Z0-9_.]+$","description":"Username do perfil (sem @)","example":"cristiano"},"required":true,"name":"username","in":"path"},{"schema":{"type":"string","enum":["ig-web","face-web","ig-mobile","threads"],"description":"Source específico (opcional — default usa fallback automático)"},"required":false,"name":"fonte","in":"query"},{"schema":{"type":"string","enum":["true","false"],"default":"true","description":"Se \"false\", ignora cache e busca dados frescos do Instagram"},"required":false,"name":"cache","in":"query"}],"responses":{"200":{"description":"Perfil encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RespostaSucesso"}}}},"404":{"description":"Usuário não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RespostaErro"}}}}}}}}}