jackwener/OpenCLI · error · CommandExecutionError
Instagram private route could not derive X-IG-App-ID from in
Error message
Instagram private route could not derive X-IG-App-ID from instagram runtime
What it means
The private API route must send the X-IG-App-ID header. It is taken from the instagram runtime appId or the captured browser context; when neither provides it the request would be rejected by Instagram, so this error is thrown up front.
Source
Thrown at clis/instagram/_shared/private-publish.js:113
await page.wait({ time: 2 });
const [cookies, runtime, entries] = await Promise.all([
page.getCookies({ domain: 'instagram.com' }),
page.evaluate(buildReadInstagramRuntimeInfoJs()),
typeof page.readNetworkCapture === 'function'
? page.readNetworkCapture()
: Promise.resolve([]),
]);
const captureEntries = (Array.isArray(entries) ? entries : []);
const capturedContext = derivePrivateApiContextFromCapture(captureEntries)
?? derivePartialPrivateApiContextFromCapture(captureEntries);
const csrfToken = runtime?.csrfToken || getCookieValue(cookies, 'csrftoken') || capturedContext.csrfToken || '';
const igAppId = runtime?.appId || capturedContext.igAppId || '';
const instagramAjax = runtime?.instagramAjax || capturedContext.instagramAjax || '';
if (!csrfToken) {
throw new CommandExecutionError('Instagram private route could not derive CSRF token from browser session');
}
if (!igAppId) {
throw new CommandExecutionError('Instagram private route could not derive X-IG-App-ID from instagram runtime');
}
if (!instagramAjax) {
throw new CommandExecutionError('Instagram private route could not derive X-Instagram-AJAX from instagram runtime');
}
const asbdId = capturedContext.asbdId || '';
const igWwwClaim = capturedContext.igWwwClaim || '';
const webSessionId = capturedContext.webSessionId || '';
return {
apiContext: {
asbdId,
csrfToken,
igAppId,
igWwwClaim,
instagramAjax,
webSessionId,
},
jazoest: deriveInstagramJazoest(csrfToken),
};View on GitHub (pinned to 49907e53dc)
Solutions
- Set appId in the instagram runtime config (the standard web app id: 936619743392459)
- Ensure a page load happens before the private call so headers are captured
- Re-login / reload instagram.com to refresh captured context
- Upgrade the CLI if Instagram rotated app ids and captures no longer include it
Example fix
// before
runtime = { csrfToken };
// after
runtime = { csrfToken, appId: '936619743392459', instagramAjax: ajaxValue }; Defensive patterns
Strategy: validation
Validate before calling
if (!runtime.appId && !captured.igAppId) {
runtime.appId = '936619743392459'; // standard Instagram web app id
} Type guard
function hasIgAppId(rt) {
return typeof rt?.appId === 'string' && /^\d{10,}$/.test(rt.appId);
} Try / catch
try {
await publishPrivate(cfg);
} catch (e) {
if (/could not derive X-IG-App-ID/.test(e.message)) {
cfg.runtime.appId = '936619743392459'; // retry with known app id
} else throw e;
} Prevention
- Set appId explicitly in the instagram runtime config
- Load an instagram.com page first so request headers are captured
- Keep the CLI updated if Instagram rotates its web app id
When it happens
Trigger: resolveInstagramPrivatePublishConfig runs with runtime.appId unset and no captured context containing igAppId.
Common situations: Minimal runtime config without appId, private route invoked before any page load captured headers, Instagram changed the app id and captures are stale/absent.
Related errors
- Instagram private route could not derive X-Instagram-AJAX fr
- Instagram private publish configure_sidecar returned invalid
- Instagram private publish configure_sidecar failed: ${respon
- Missing ${label}
- Invalid ${label}: ${raw}
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/b138db9d2337722e.
Report an issue: GitHub.