{"rid":"storage/wechat-official-account-uploadimg","card":{"rid":"storage/wechat-official-account-uploadimg","eid":"qq","topic":"storage","slug":"wechat-official-account-uploadimg","provider":"WeChat Official Account — uploadimg (图文消息图片, the uncapped endpoint)","url":"https://developers.weixin.qq.com/doc/service/api/material/permanent/api_uploadimage","domain":"qq.com","category":"messaging","tier":null,"verdict":"fails-egress","vorder":5,"grp":"rejected","confidence":"reported","binding":"per-object-cap","identity_kind":"anonymous","identity_basis":"stated","needs_card":0,"needs_phone":0,"needs_id":0,"needs_institution":0,"country":null,"crypto":null,"interfaces":"rest","egress_metered":0,"per_object_bytes":1000000,"retention_days":null,"verified_at":"2026-10-21T00:00:00.000Z","verified_basis":"inherited","checked_on":"2026-10-21","stale_on":"2026-11-04","n_evidence":2,"usd_month":null,"usd_per_tb_month":null,"summary":"NO documented count cap. The docs state explicitly: \"该接口所上传的图片，不占用公众号的素材库中图片数量的100000个的限制\" — images uploaded via this endpoint do NOT count against the 100,0...","duplicate_of":null,"n_unknown":4},"record":{"topic":"storage","slug":"wechat-official-account-uploadimg","provider":"WeChat Official Account — uploadimg (图文消息图片, the uncapped endpoint)","url":"https://developers.weixin.qq.com/doc/service/api/material/permanent/api_uploadimage","category":"messaging","free_tier":{"stated":"NO documented count cap. The docs state explicitly: \"该接口所上传的图片，不占用公众号的素材库中图片数量的100000个的限制\" — images uploaded via this endpoint do NOT count against the 100,000-image library limit. Per-file cap 1 MB, JPG/PNG only.","unit":"MB","metered_on":"unstated","source_url":"https://developers.weixin.qq.com/doc/service/api/material/permanent/api_uploadimage","read_on":"2026-10-21","notes":null},"per_object_cap":{"stated":"Per-file cap 1 MB","bytes":1000000,"source_url":"https://developers.weixin.qq.com/doc/service/api/material/permanent/api_uploadimage","notes":"not stated"},"retention":{"stated":"| Images are permanent in practice (they must survive in published articles forever), but the service is tuned for article inline images, so bulk non-image binary upload is impossible and a hotlink-blocked 403 can appear without warning.","source_url":"https://developers.weixin.qq.com/doc/service/api/material/permanent/api_uploadimage","notes":"not stated"},"egress":{"terms":"Free and unmetered — the response hands back a public CDN URL on mmbiz.qpic.cn (\"url\": \"http://mmbiz.qpic.cn/XXXXX\"), which is served by Tencent's CDN with no access_token and no auth header. This is the only genuinely anonymous read path found in this entire slot.","metered":false,"source_url":"http://mmbiz.qpic.cn/XXXXX"},"interface":["rest"],"interface_detail":"rest","tooling":"Trivial — one multipart POST: curl -F media=@test.jpg \"https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN\". No wrapper needed; any HTTP client plus a token-refresh loop (access_token lives 7200s) is the whole client.","chaining":"The absence of a count cap means one account is already unbounded in object count; the binding limit becomes 1 MB/file. 1 account = effectively millions of 1MB objects. Multiple Official Accounts (1 per entity) multiply further, but count is not the constraint — file size is.","limits":[{"kind":"per-object-cap","value":"Per-file cap 1 MB","source":"https://developers.weixin.qq.com/doc/service/api/material/permanent/api_uploadimage"}],"limits_note":"1 MB per image, jpg/png only. access_token required to UPLOAD (2h expiry, refresh loop needed). Download is anonymous. mmbiz.qpic.cn applies a Referer/hotlink check — direct GETs without a WeChat/weixin Referer can be refused, which breaks plain curl fetch fan-out and CDN-fronting.","identity_cost":{"kind":"anonymous","detail":"derived from the record's prose, not from an identity field, and no signup was executed: red to UPLOAD (2h expiry, refresh loop needed). Download is anonymous. mmbiz.qpic.cn applies a Referer/hotlink check — direct GETs without a WeChat/weixin Referer can be refused, which brea","country":null},"reliability_note":"Images are permanent in practice (they must survive in published articles forever), but the service is tuned for article inline images, so bulk non-image binary upload is impossible and a hotlink-blocked 403 can appear without warning.","confidence":"reported","confidence_note":"One page read moves it to documented.","evidence":[{"url":"https://developers.weixin.qq.com/doc/service/api/material/permanent/api_uploadimage","date":"2026-10-21","proved":"read live: '该接口所上传的图片，不占用公众号的素材库中图片数量的100000个的限制，图片仅支持jpg/png格式，大小必须在1MB以下' plus response field url = 'http://mmbiz.qpic.cn/XXXXX'"},{"url":"https://mmbiz.qpic.cn/mmbiz_jpg/<synthetic-id>","date":"2026-10-21","proved":"probe: GET -> 400 text/plain (endpoint live and reachable anonymously; the 400 is a fabricated media id, not an auth wall)"}],"verdict":"fails-egress","verified_at":"2026-10-21T00:00:00.000Z","notes":"NO documented count cap. The docs state explicitly: \"该接口所上传的图片，不占用公众号的素材库中图片数量的100000个的限制\" — images uploaded via this endpoint do NOT count against the 100,000-image library limit. Per-file cap 1 MB, JPG/PNG only.","extras":{"dead_end":{"failure_class":"quota","why":"NO documented count cap. The docs state explicitly: \"该接口所上传的图片，不占用公众号的素材库中图片数量的100000个的限制\" — images uploaded via this endpoint do NOT count against the 100,000-image library limit. Per-file cap 1 MB, JPG/PNG only.","retry_when":null,"first_recorded":"2026-10-21"}},"binding":"per-object-cap","binding_note":"the per-object cap sets the shard size and therefore the object count; it bounds the total more tightly than any headline quota"},"claims":[{"path":"$.free_tier.stated","kind":"free-quota","num":1,"unit":"MB","per":null,"currency":null,"usd":null,"fx_date":null,"parse":"ok"},{"path":"$.limits[0].value","kind":"limit:per-object-cap","num":1,"unit":"MB","per":null,"currency":null,"usd":null,"fx_date":null,"parse":"ok"}],"unknown":[["$.extras.dead_end.retry_when","process"],["$.free_tier.notes","process"],["$.per_object_cap.notes","not-extracted"],["$.retention.notes","not-extracted"]],"history":[],"drift":[]}