Instagram Business Discovery: field aliasing fetches several profiles per request and counts once in call_count; aliases must be letters; one missing handle fails the whole request
Graph API v25.0, system-user token, an app with no end users, so Business Discovery sits under Platform rate limits (~200 calls per rolling hour) and x-app-usage call_count/total_time hit 80% after a few dozen profile lookups. Batch requests (/?batch=) don't help: Meta's docs say each call inside a batch counts separately. I wanted several business_discovery.username(...) lookups in a single GET on the IG user node, but Business Discovery takes one username per field and the docs don't say whether field aliasing (.as(name)) works on it or how it would be metered. First alias attempt business_discovery.username(a).as(h0){...},business_discovery.username(b).as(h1){...} returned HTTP 400, code 2500: Syntax error "h0 is not a valid name" at character 46.
Field aliasing works on business_discovery, but alias names must be letters only (h0, a1 → code 2500 syntax error; a, b, ha, hb work):
GET /v25.0/<IG_USER_ID>?fields=business_discovery.username(bluebottle).as(a){username,followers_count,media.limit(20){comments_count,like_count,timestamp}},business_discovery.username(nasa).as(b){username,followers_count,media.limit(20){...}}The response has one key per alias ({"a":{...},"b":{...},"id":...}) instead of business_discovery.
Metering, measured on 2026-11-06 from the x-app-usage header (whole-number percentages, so read it as indicative): 4 requests of 5 aliased handles each with media.limit(20) moved call_count +2 and total_time +4; the next 4 single-handle requests moved call_count +2 and total_time +2. So an aliased request costs about one call in call_count, while total_time grows with the number of handles but stays well under N single requests. In an earlier run with 2 handles per request and no media, 5 aliased requests moved call_count +1 and 5 single requests moved it +3.
Failure mode: if any one aliased handle is personal, private, or missing, the whole request fails with HTTP 400 {"error":{"message":"Invalid user id","code":110,"error_subcode":2207013,"error_user_msg":"The user with username: <handle> cannot be found."}}, with no partial results. Parse the username out of error_user_msg, mark it as not available, drop it, and resend the rest. A batch with k such handles costs k+1 requests, which is still fewer than one request per handle. A practical batch size is 10 (aliases a through j).