[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-meta-debug-access-token":3,"mdc-6fjmv6-key":36,"related-repo-meta-debug-access-token":1685,"related-org-meta-debug-access-token":1776},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":26,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"debug-access-token","diagnose Meta access token issues","Diagnose a Meta access token problem (expired, wrong scopes, wrong app, invalid) WITHOUT the token ever entering the agent or AI provider context. Guides the developer to inspect the token themselves via the Access Token Debugger web tool or the public debug_token Graph API, then interprets the returned metadata. Use when an API call fails with an auth\u002FOAuthException error (e.g. code 190) or a token isn't behaving as expected.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"meta","Meta Open Source","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmeta.png","facebook",[13,17,20,23],{"name":14,"slug":15,"type":16},"Security","security","tag",{"name":18,"slug":19,"type":16},"Auth","auth",{"name":21,"slug":22,"type":16},"API Development","api-development",{"name":24,"slug":25,"type":16},"Debugging","debugging",0,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fagentic-tools","2026-08-09T04:33:25.439404","MIT",[],{"repoUrl":27,"stars":26,"forks":26,"topics":32,"description":33},[],"Agentic tools plugin and skills","https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fagentic-tools\u002Ftree\u002FHEAD\u002Fplugins\u002Fdevtools\u002Fskills\u002Fdebug-access-token","---\nname: debug-access-token\ndescription: \"Diagnose a Meta access token problem (expired, wrong scopes, wrong app, invalid) WITHOUT the token ever entering the agent or AI provider context. Guides the developer to inspect the token themselves via the Access Token Debugger web tool or the public debug_token Graph API, then interprets the returned metadata. Use when an API call fails with an auth\u002FOAuthException error (e.g. code 190) or a token isn't behaving as expected.\"\nallowed-tools: mcp__devtools__devtools_discovery\nlicense: MIT\n---\n\n# Debug Access Token\n\nHelp a developer figure out why a Meta access token is failing — without ever handling the raw token yourself.\n\n## Security first — never handle a live token\n\nAn access token is a bearer credential: whoever holds it can act as its owner. Anything pasted into this chat enters the agent's context and is transmitted to the AI provider (logs, history, retention). Treat a token like a password.\n\n1. **Do NOT ask the developer to paste an access token (or an app secret) into this chat.** Inspect tokens using the developer-run options below, and ask only for the resulting metadata.\n2. **If a token was already pasted**, tell the developer to **revoke\u002Frotate it** (Graph API Explorer, or the app dashboard → regenerate), then continue with the metadata flow below using a fresh token.\n\n## Workflow\n\n1. **Confirm the symptom.** Ask what failed:\n   - The error `code` and `subcode` (e.g. `190` \u002F `463`)\n   - Which endpoint\u002Frequest failed\n   - Which app the call was made with, and what the token is expected to do (which permissions\u002Fscopes)\n\n2. **Have the developer inspect the token themselves.** Offer either option — both run in the developer's own environment and return only metadata, never routing the token through this agent:\n\n   - **A. Access Token Debugger (web):** open [https:\u002F\u002Fdevelopers.facebook.com\u002Ftools\u002Fdebug\u002Faccesstoken\u002F](https:\u002F\u002Fdevelopers.facebook.com\u002Ftools\u002Fdebug\u002Faccesstoken\u002F), paste the token there (a Meta first-party surface, not this agent), and read the results panel.\n   - **B. `debug_token` Graph API via the bundled script:** this skill ships a ready-to-run script, `scripts\u002Fdebug_token_probe.py`, that reads the token and app secret from **environment variables** (by name — never their values) and prints only redacted metadata; the developer sets the env vars and runs it in their own shell, then brings back only the printed JSON. See the **Using the `debug_token` script** section below for how to run it and the expected output. Reference: [debug_token docs](https:\u002F\u002Fdevelopers.facebook.com\u002Fdocs\u002Fgraph-api\u002Freference\u002Fdebug_token\u002F). Never ask the developer to send you the token or the app secret.\n\n   If the developer needs exact, current steps, use `devtools_discovery` (action `search_docs`) to fetch the latest Access Token Debugger \u002F `debug_token` documentation.\n\n3. **Ask only for the redacted metadata.** Request they copy back the debug output with PII removed. Keep: `is_valid`, `type`, `app_id`, `application`, `issued_at`, `expires_at`, `data_access_expires_at`, `scopes` \u002F `granular_scopes`, and any `error.code` \u002F `error.subcode` \u002F `error.message`. **Tell them to redact `user_id` and any profile IDs** — you do not need them to diagnose the failure. (The bundled script already emits only this allow-listed, redacted subset.) See **Using the `debug_token` script** below for an example of the token-free output to expect.\n\n4. **Interpret the metadata and report** (format below).\n\n## Using the `debug_token` script (Option B)\n\nWhen the developer prefers the API over the web debugger, point them at the script\nbundled with this skill, `scripts\u002Fdebug_token_probe.py`. It reads the credentials\nfrom **environment variables in the developer's own shell** — **by name**, never\ntheir values — so no token or secret ever appears in the chat, in a script you\nauthor, or on a command line. The shell provides the values at run time, and the\nscript prints only redacted metadata. Do not re-derive or paste the script into the\nchat; it is already checked in and vetted — just tell the developer how to run it.\n\n**Give the developer the absolute path.** The script lives inside the installed\nplugin, not in the developer's working directory, so a relative path will not\nresolve for them. Substitute the absolute path of this skill's directory — you know\nit, having just read `SKILL.md` from there — wherever `\u003Cskill-dir>` appears below.\n\nHave them run this in a **throwaway shell, not the shell they start their agent\nfrom**: an exported variable is inherited by every process that shell launches, so a\ntoken left exported can reach an agent started later from the same terminal.\n\nPrompt for the two secrets. `-s` hides the input, so neither value is echoed to\nthe screen or typed on a command line. **The prompt syntax differs by shell** —\nin zsh, `read -p` means \"read from a coprocess\", not \"print this prompt\", so the\nbash form fails there:\n\n```bash\n# bash\nread -rsp 'Access token: ' FB_INPUT_TOKEN; echo\nread -rsp 'App secret:   ' FB_APP_SECRET; echo\n```\n\n```zsh\n# zsh (the macOS default)\nread -rs 'FB_INPUT_TOKEN?Access token: '; echo\nread -rs 'FB_APP_SECRET?App secret:   '; echo\n```\n\nThen, in either shell:\n\n```bash\nexport FB_APP_ID='\u003Cyour app id>'\nexport FB_INPUT_TOKEN FB_APP_SECRET\n\npython3 \u003Cskill-dir>\u002Fscripts\u002Fdebug_token_probe.py\n\nunset FB_INPUT_TOKEN FB_APP_SECRET FB_APP_ID\n```\n\nThe script needs only the Python 3 standard library — no packages to install. The\ndeveloper pastes back only the printed JSON. Example of the token-free output to\nexpect — note there is **no token, no app secret, and no `user_id`**; that is the\nwhole point:\n\n```json\n{\n  \"is_valid\": true,\n  \"type\": \"USER\",\n  \"app_id\": \"1234567890123456\",\n  \"application\": \"Example App\",\n  \"issued_at\": 1785000000,\n  \"expires_at\": 1792800000,\n  \"data_access_expires_at\": 1800000000,\n  \"scopes\": [\"public_profile\", \"email\", \"pages_show_list\", \"pages_read_engagement\"]\n}\n```\n\n## Interpretation & Report Format\n\n**Token summary**\n- Valid? Token `type` (User \u002F Page \u002F App \u002F System User)?\n- Owning app: does `app_id` match the app the call was made with?\n- Expiry: `expires_at` in the past → expired; `0` → never expires; `data_access_expires_at` in the past → data-access window lapsed (re-auth needed).\n- Scopes present vs. the scopes the failing call requires.\n\n**Diagnosis (common cases)**\n\n| Signal | Meaning | Fix |\n|--------|---------|-----|\n| `is_valid=false`, error 190 subcode 463 | Session expired | Re-authenticate the user |\n| `is_valid=false`, error 190 (no subcode) | Invalid or revoked token | Re-issue the token |\n| `expires_at` in the past | Expired short-lived token | Exchange for a long-lived token, or re-login |\n| Required scope missing from `scopes` | Permission not granted\u002Fapproved | Request the scope; run App Review (`\u002Fapp-review-prep`) |\n| `app_id` ≠ the calling app | Token minted for a different app | Use a token issued by the correct app |\n| `type` not what the endpoint expects (User vs Page vs App) | Wrong token type | Mint the correct token type for that endpoint |\n\n**Next steps**\n- Concrete remediation for the diagnosed cause, then cross-links (below).\n\n## Acceptable vs unacceptable usage\n\n- ✅ Interpreting **redacted** `debug_token` metadata the developer brings back\n- ✅ Linking the developer to the web Access Token Debugger\n- ✅ Pointing the developer to the bundled `scripts\u002Fdebug_token_probe.py` (reads the token\u002Fapp secret from **environment variables** by name) for them to run themselves\n- ✅ Emitting a command that references the credentials **by environment-variable\n  name only** (`\"$FB_INPUT_TOKEN\"`), for the developer to run in their own shell\n- ❌ Accepting a raw or live access token as chat input\n- ❌ Asking for an app secret\n- ❌ Echoing a token back, or storing a token anywhere\n- ❌ Emitting a command containing a literal token or app secret — including a\n  placeholder the developer substitutes. The value would land in their shell\n  history and, for the life of the process, in `ps` output\n- ❌ Running the `read` \u002F `export` commands or the script **yourself**. The\n  developer runs them in their own shell; you never hold the credential\n\n## Tips\n\n- Error code `190` is the catch-all `OAuthException`; the **subcode** disambiguates it (463 = expired, 467 = invalid, etc.). Always ask for the subcode.\n- If the developer can't run `debug_token`, the web Access Token Debugger needs no setup — start there.\n- Related: `\u002Fapi-integration` (token types & auth setup) and `\u002Fapi-health` (rate limits\u002Fquota, once the token works).\n",{"data":37,"body":39},{"name":4,"description":6,"allowed-tools":38,"license":29},"mcp__devtools__devtools_discovery",{"type":40,"children":41},"root",[42,50,56,63,68,101,107,423,435,461,487,499,527,635,717,722,849,866,1211,1217,1225,1284,1292,1471,1479,1487,1493,1611,1617,1679],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","Debug Access Token",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54],{"type":48,"value":55},"Help a developer figure out why a Meta access token is failing — without ever handling the raw token yourself.",{"type":43,"tag":57,"props":58,"children":60},"h2",{"id":59},"security-first-never-handle-a-live-token",[61],{"type":48,"value":62},"Security first — never handle a live token",{"type":43,"tag":51,"props":64,"children":65},{},[66],{"type":48,"value":67},"An access token is a bearer credential: whoever holds it can act as its owner. Anything pasted into this chat enters the agent's context and is transmitted to the AI provider (logs, history, retention). Treat a token like a password.",{"type":43,"tag":69,"props":70,"children":71},"ol",{},[72,84],{"type":43,"tag":73,"props":74,"children":75},"li",{},[76,82],{"type":43,"tag":77,"props":78,"children":79},"strong",{},[80],{"type":48,"value":81},"Do NOT ask the developer to paste an access token (or an app secret) into this chat.",{"type":48,"value":83}," Inspect tokens using the developer-run options below, and ask only for the resulting metadata.",{"type":43,"tag":73,"props":85,"children":86},{},[87,92,94,99],{"type":43,"tag":77,"props":88,"children":89},{},[90],{"type":48,"value":91},"If a token was already pasted",{"type":48,"value":93},", tell the developer to ",{"type":43,"tag":77,"props":95,"children":96},{},[97],{"type":48,"value":98},"revoke\u002Frotate it",{"type":48,"value":100}," (Graph API Explorer, or the app dashboard → regenerate), then continue with the metadata flow below using a fresh token.",{"type":43,"tag":57,"props":102,"children":104},{"id":103},"workflow",[105],{"type":48,"value":106},"Workflow",{"type":43,"tag":69,"props":108,"children":109},{},[110,171,289,413],{"type":43,"tag":73,"props":111,"children":112},{},[113,118,120],{"type":43,"tag":77,"props":114,"children":115},{},[116],{"type":48,"value":117},"Confirm the symptom.",{"type":48,"value":119}," Ask what failed:",{"type":43,"tag":121,"props":122,"children":123},"ul",{},[124,161,166],{"type":43,"tag":73,"props":125,"children":126},{},[127,129,135,137,143,145,151,153,159],{"type":48,"value":128},"The error ",{"type":43,"tag":130,"props":131,"children":133},"code",{"className":132},[],[134],{"type":48,"value":130},{"type":48,"value":136}," and ",{"type":43,"tag":130,"props":138,"children":140},{"className":139},[],[141],{"type":48,"value":142},"subcode",{"type":48,"value":144}," (e.g. ",{"type":43,"tag":130,"props":146,"children":148},{"className":147},[],[149],{"type":48,"value":150},"190",{"type":48,"value":152}," \u002F ",{"type":43,"tag":130,"props":154,"children":156},{"className":155},[],[157],{"type":48,"value":158},"463",{"type":48,"value":160},")",{"type":43,"tag":73,"props":162,"children":163},{},[164],{"type":48,"value":165},"Which endpoint\u002Frequest failed",{"type":43,"tag":73,"props":167,"children":168},{},[169],{"type":48,"value":170},"Which app the call was made with, and what the token is expected to do (which permissions\u002Fscopes)",{"type":43,"tag":73,"props":172,"children":173},{},[174,179,181,260,264,266,272,274,280,282,287],{"type":43,"tag":77,"props":175,"children":176},{},[177],{"type":48,"value":178},"Have the developer inspect the token themselves.",{"type":48,"value":180}," Offer either option — both run in the developer's own environment and return only metadata, never routing the token through this agent:",{"type":43,"tag":121,"props":182,"children":183},{},[184,204],{"type":43,"tag":73,"props":185,"children":186},{},[187,192,194,202],{"type":43,"tag":77,"props":188,"children":189},{},[190],{"type":48,"value":191},"A. Access Token Debugger (web):",{"type":48,"value":193}," open ",{"type":43,"tag":195,"props":196,"children":200},"a",{"href":197,"rel":198},"https:\u002F\u002Fdevelopers.facebook.com\u002Ftools\u002Fdebug\u002Faccesstoken\u002F",[199],"nofollow",[201],{"type":48,"value":197},{"type":48,"value":203},", paste the token there (a Meta first-party surface, not this agent), and read the results panel.",{"type":43,"tag":73,"props":205,"children":206},{},[207,220,222,228,230,235,237,249,251,258],{"type":43,"tag":77,"props":208,"children":209},{},[210,212,218],{"type":48,"value":211},"B. ",{"type":43,"tag":130,"props":213,"children":215},{"className":214},[],[216],{"type":48,"value":217},"debug_token",{"type":48,"value":219}," Graph API via the bundled script:",{"type":48,"value":221}," this skill ships a ready-to-run script, ",{"type":43,"tag":130,"props":223,"children":225},{"className":224},[],[226],{"type":48,"value":227},"scripts\u002Fdebug_token_probe.py",{"type":48,"value":229},", that reads the token and app secret from ",{"type":43,"tag":77,"props":231,"children":232},{},[233],{"type":48,"value":234},"environment variables",{"type":48,"value":236}," (by name — never their values) and prints only redacted metadata; the developer sets the env vars and runs it in their own shell, then brings back only the printed JSON. See the ",{"type":43,"tag":77,"props":238,"children":239},{},[240,242,247],{"type":48,"value":241},"Using the ",{"type":43,"tag":130,"props":243,"children":245},{"className":244},[],[246],{"type":48,"value":217},{"type":48,"value":248}," script",{"type":48,"value":250}," section below for how to run it and the expected output. Reference: ",{"type":43,"tag":195,"props":252,"children":255},{"href":253,"rel":254},"https:\u002F\u002Fdevelopers.facebook.com\u002Fdocs\u002Fgraph-api\u002Freference\u002Fdebug_token\u002F",[199],[256],{"type":48,"value":257},"debug_token docs",{"type":48,"value":259},". Never ask the developer to send you the token or the app secret.",{"type":43,"tag":261,"props":262,"children":263},"br",{},[],{"type":48,"value":265},"If the developer needs exact, current steps, use ",{"type":43,"tag":130,"props":267,"children":269},{"className":268},[],[270],{"type":48,"value":271},"devtools_discovery",{"type":48,"value":273}," (action ",{"type":43,"tag":130,"props":275,"children":277},{"className":276},[],[278],{"type":48,"value":279},"search_docs",{"type":48,"value":281},") to fetch the latest Access Token Debugger \u002F ",{"type":43,"tag":130,"props":283,"children":285},{"className":284},[],[286],{"type":48,"value":217},{"type":48,"value":288}," documentation.",{"type":43,"tag":73,"props":290,"children":291},{},[292,297,299,305,307,313,314,320,321,327,328,334,335,341,342,348,349,355,356,362,364,370,371,377,378,384,386,399,401,411],{"type":43,"tag":77,"props":293,"children":294},{},[295],{"type":48,"value":296},"Ask only for the redacted metadata.",{"type":48,"value":298}," Request they copy back the debug output with PII removed. Keep: ",{"type":43,"tag":130,"props":300,"children":302},{"className":301},[],[303],{"type":48,"value":304},"is_valid",{"type":48,"value":306},", ",{"type":43,"tag":130,"props":308,"children":310},{"className":309},[],[311],{"type":48,"value":312},"type",{"type":48,"value":306},{"type":43,"tag":130,"props":315,"children":317},{"className":316},[],[318],{"type":48,"value":319},"app_id",{"type":48,"value":306},{"type":43,"tag":130,"props":322,"children":324},{"className":323},[],[325],{"type":48,"value":326},"application",{"type":48,"value":306},{"type":43,"tag":130,"props":329,"children":331},{"className":330},[],[332],{"type":48,"value":333},"issued_at",{"type":48,"value":306},{"type":43,"tag":130,"props":336,"children":338},{"className":337},[],[339],{"type":48,"value":340},"expires_at",{"type":48,"value":306},{"type":43,"tag":130,"props":343,"children":345},{"className":344},[],[346],{"type":48,"value":347},"data_access_expires_at",{"type":48,"value":306},{"type":43,"tag":130,"props":350,"children":352},{"className":351},[],[353],{"type":48,"value":354},"scopes",{"type":48,"value":152},{"type":43,"tag":130,"props":357,"children":359},{"className":358},[],[360],{"type":48,"value":361},"granular_scopes",{"type":48,"value":363},", and any ",{"type":43,"tag":130,"props":365,"children":367},{"className":366},[],[368],{"type":48,"value":369},"error.code",{"type":48,"value":152},{"type":43,"tag":130,"props":372,"children":374},{"className":373},[],[375],{"type":48,"value":376},"error.subcode",{"type":48,"value":152},{"type":43,"tag":130,"props":379,"children":381},{"className":380},[],[382],{"type":48,"value":383},"error.message",{"type":48,"value":385},". ",{"type":43,"tag":77,"props":387,"children":388},{},[389,391,397],{"type":48,"value":390},"Tell them to redact ",{"type":43,"tag":130,"props":392,"children":394},{"className":393},[],[395],{"type":48,"value":396},"user_id",{"type":48,"value":398}," and any profile IDs",{"type":48,"value":400}," — you do not need them to diagnose the failure. (The bundled script already emits only this allow-listed, redacted subset.) See ",{"type":43,"tag":77,"props":402,"children":403},{},[404,405,410],{"type":48,"value":241},{"type":43,"tag":130,"props":406,"children":408},{"className":407},[],[409],{"type":48,"value":217},{"type":48,"value":248},{"type":48,"value":412}," below for an example of the token-free output to expect.",{"type":43,"tag":73,"props":414,"children":415},{},[416,421],{"type":43,"tag":77,"props":417,"children":418},{},[419],{"type":48,"value":420},"Interpret the metadata and report",{"type":48,"value":422}," (format below).",{"type":43,"tag":57,"props":424,"children":426},{"id":425},"using-the-debug_token-script-option-b",[427,428,433],{"type":48,"value":241},{"type":43,"tag":130,"props":429,"children":431},{"className":430},[],[432],{"type":48,"value":217},{"type":48,"value":434}," script (Option B)",{"type":43,"tag":51,"props":436,"children":437},{},[438,440,445,447,452,454,459],{"type":48,"value":439},"When the developer prefers the API over the web debugger, point them at the script\nbundled with this skill, ",{"type":43,"tag":130,"props":441,"children":443},{"className":442},[],[444],{"type":48,"value":227},{"type":48,"value":446},". It reads the credentials\nfrom ",{"type":43,"tag":77,"props":448,"children":449},{},[450],{"type":48,"value":451},"environment variables in the developer's own shell",{"type":48,"value":453}," — ",{"type":43,"tag":77,"props":455,"children":456},{},[457],{"type":48,"value":458},"by name",{"type":48,"value":460},", never\ntheir values — so no token or secret ever appears in the chat, in a script you\nauthor, or on a command line. The shell provides the values at run time, and the\nscript prints only redacted metadata. Do not re-derive or paste the script into the\nchat; it is already checked in and vetted — just tell the developer how to run it.",{"type":43,"tag":51,"props":462,"children":463},{},[464,469,471,477,479,485],{"type":43,"tag":77,"props":465,"children":466},{},[467],{"type":48,"value":468},"Give the developer the absolute path.",{"type":48,"value":470}," The script lives inside the installed\nplugin, not in the developer's working directory, so a relative path will not\nresolve for them. Substitute the absolute path of this skill's directory — you know\nit, having just read ",{"type":43,"tag":130,"props":472,"children":474},{"className":473},[],[475],{"type":48,"value":476},"SKILL.md",{"type":48,"value":478}," from there — wherever ",{"type":43,"tag":130,"props":480,"children":482},{"className":481},[],[483],{"type":48,"value":484},"\u003Cskill-dir>",{"type":48,"value":486}," appears below.",{"type":43,"tag":51,"props":488,"children":489},{},[490,492,497],{"type":48,"value":491},"Have them run this in a ",{"type":43,"tag":77,"props":493,"children":494},{},[495],{"type":48,"value":496},"throwaway shell, not the shell they start their agent\nfrom",{"type":48,"value":498},": an exported variable is inherited by every process that shell launches, so a\ntoken left exported can reach an agent started later from the same terminal.",{"type":43,"tag":51,"props":500,"children":501},{},[502,504,510,512,517,519,525],{"type":48,"value":503},"Prompt for the two secrets. ",{"type":43,"tag":130,"props":505,"children":507},{"className":506},[],[508],{"type":48,"value":509},"-s",{"type":48,"value":511}," hides the input, so neither value is echoed to\nthe screen or typed on a command line. ",{"type":43,"tag":77,"props":513,"children":514},{},[515],{"type":48,"value":516},"The prompt syntax differs by shell",{"type":48,"value":518}," —\nin zsh, ",{"type":43,"tag":130,"props":520,"children":522},{"className":521},[],[523],{"type":48,"value":524},"read -p",{"type":48,"value":526}," means \"read from a coprocess\", not \"print this prompt\", so the\nbash form fails there:",{"type":43,"tag":528,"props":529,"children":534},"pre",{"className":530,"code":531,"language":532,"meta":533,"style":533},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# bash\nread -rsp 'Access token: ' FB_INPUT_TOKEN; echo\nread -rsp 'App secret:   ' FB_APP_SECRET; echo\n","bash","",[535],{"type":43,"tag":130,"props":536,"children":537},{"__ignoreMap":533},[538,550,597],{"type":43,"tag":539,"props":540,"children":543},"span",{"class":541,"line":542},"line",1,[544],{"type":43,"tag":539,"props":545,"children":547},{"style":546},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[548],{"type":48,"value":549},"# bash\n",{"type":43,"tag":539,"props":551,"children":553},{"class":541,"line":552},2,[554,560,566,572,577,582,587,592],{"type":43,"tag":539,"props":555,"children":557},{"style":556},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[558],{"type":48,"value":559},"read",{"type":43,"tag":539,"props":561,"children":563},{"style":562},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[564],{"type":48,"value":565}," -rsp",{"type":43,"tag":539,"props":567,"children":569},{"style":568},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[570],{"type":48,"value":571}," '",{"type":43,"tag":539,"props":573,"children":574},{"style":562},[575],{"type":48,"value":576},"Access token: ",{"type":43,"tag":539,"props":578,"children":579},{"style":568},[580],{"type":48,"value":581},"'",{"type":43,"tag":539,"props":583,"children":584},{"style":562},[585],{"type":48,"value":586}," FB_INPUT_TOKEN",{"type":43,"tag":539,"props":588,"children":589},{"style":568},[590],{"type":48,"value":591},";",{"type":43,"tag":539,"props":593,"children":594},{"style":556},[595],{"type":48,"value":596}," echo\n",{"type":43,"tag":539,"props":598,"children":600},{"class":541,"line":599},3,[601,605,609,613,618,622,627,631],{"type":43,"tag":539,"props":602,"children":603},{"style":556},[604],{"type":48,"value":559},{"type":43,"tag":539,"props":606,"children":607},{"style":562},[608],{"type":48,"value":565},{"type":43,"tag":539,"props":610,"children":611},{"style":568},[612],{"type":48,"value":571},{"type":43,"tag":539,"props":614,"children":615},{"style":562},[616],{"type":48,"value":617},"App secret:   ",{"type":43,"tag":539,"props":619,"children":620},{"style":568},[621],{"type":48,"value":581},{"type":43,"tag":539,"props":623,"children":624},{"style":562},[625],{"type":48,"value":626}," FB_APP_SECRET",{"type":43,"tag":539,"props":628,"children":629},{"style":568},[630],{"type":48,"value":591},{"type":43,"tag":539,"props":632,"children":633},{"style":556},[634],{"type":48,"value":596},{"type":43,"tag":528,"props":636,"children":640},{"className":637,"code":638,"language":639,"meta":533,"style":533},"language-zsh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# zsh (the macOS default)\nread -rs 'FB_INPUT_TOKEN?Access token: '; echo\nread -rs 'FB_APP_SECRET?App secret:   '; echo\n","zsh",[641],{"type":43,"tag":130,"props":642,"children":643},{"__ignoreMap":533},[644,652,685],{"type":43,"tag":539,"props":645,"children":646},{"class":541,"line":542},[647],{"type":43,"tag":539,"props":648,"children":649},{"style":546},[650],{"type":48,"value":651},"# zsh (the macOS default)\n",{"type":43,"tag":539,"props":653,"children":654},{"class":541,"line":552},[655,659,664,668,673,677,681],{"type":43,"tag":539,"props":656,"children":657},{"style":556},[658],{"type":48,"value":559},{"type":43,"tag":539,"props":660,"children":661},{"style":562},[662],{"type":48,"value":663}," -rs",{"type":43,"tag":539,"props":665,"children":666},{"style":568},[667],{"type":48,"value":571},{"type":43,"tag":539,"props":669,"children":670},{"style":562},[671],{"type":48,"value":672},"FB_INPUT_TOKEN?Access token: ",{"type":43,"tag":539,"props":674,"children":675},{"style":568},[676],{"type":48,"value":581},{"type":43,"tag":539,"props":678,"children":679},{"style":568},[680],{"type":48,"value":591},{"type":43,"tag":539,"props":682,"children":683},{"style":556},[684],{"type":48,"value":596},{"type":43,"tag":539,"props":686,"children":687},{"class":541,"line":599},[688,692,696,700,705,709,713],{"type":43,"tag":539,"props":689,"children":690},{"style":556},[691],{"type":48,"value":559},{"type":43,"tag":539,"props":693,"children":694},{"style":562},[695],{"type":48,"value":663},{"type":43,"tag":539,"props":697,"children":698},{"style":568},[699],{"type":48,"value":571},{"type":43,"tag":539,"props":701,"children":702},{"style":562},[703],{"type":48,"value":704},"FB_APP_SECRET?App secret:   ",{"type":43,"tag":539,"props":706,"children":707},{"style":568},[708],{"type":48,"value":581},{"type":43,"tag":539,"props":710,"children":711},{"style":568},[712],{"type":48,"value":591},{"type":43,"tag":539,"props":714,"children":715},{"style":556},[716],{"type":48,"value":596},{"type":43,"tag":51,"props":718,"children":719},{},[720],{"type":48,"value":721},"Then, in either shell:",{"type":43,"tag":528,"props":723,"children":725},{"className":530,"code":724,"language":532,"meta":533,"style":533},"export FB_APP_ID='\u003Cyour app id>'\nexport FB_INPUT_TOKEN FB_APP_SECRET\n\npython3 \u003Cskill-dir>\u002Fscripts\u002Fdebug_token_probe.py\n\nunset FB_INPUT_TOKEN FB_APP_SECRET FB_APP_ID\n",[726],{"type":43,"tag":130,"props":727,"children":728},{"__ignoreMap":533},[729,763,775,784,819,827],{"type":43,"tag":539,"props":730,"children":731},{"class":541,"line":542},[732,738,744,749,753,758],{"type":43,"tag":539,"props":733,"children":735},{"style":734},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[736],{"type":48,"value":737},"export",{"type":43,"tag":539,"props":739,"children":741},{"style":740},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[742],{"type":48,"value":743}," FB_APP_ID",{"type":43,"tag":539,"props":745,"children":746},{"style":568},[747],{"type":48,"value":748},"=",{"type":43,"tag":539,"props":750,"children":751},{"style":568},[752],{"type":48,"value":581},{"type":43,"tag":539,"props":754,"children":755},{"style":562},[756],{"type":48,"value":757},"\u003Cyour app id>",{"type":43,"tag":539,"props":759,"children":760},{"style":568},[761],{"type":48,"value":762},"'\n",{"type":43,"tag":539,"props":764,"children":765},{"class":541,"line":552},[766,770],{"type":43,"tag":539,"props":767,"children":768},{"style":734},[769],{"type":48,"value":737},{"type":43,"tag":539,"props":771,"children":772},{"style":740},[773],{"type":48,"value":774}," FB_INPUT_TOKEN FB_APP_SECRET\n",{"type":43,"tag":539,"props":776,"children":777},{"class":541,"line":599},[778],{"type":43,"tag":539,"props":779,"children":781},{"emptyLinePlaceholder":780},true,[782],{"type":48,"value":783},"\n",{"type":43,"tag":539,"props":785,"children":787},{"class":541,"line":786},4,[788,794,799,804,809,814],{"type":43,"tag":539,"props":789,"children":791},{"style":790},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[792],{"type":48,"value":793},"python3",{"type":43,"tag":539,"props":795,"children":796},{"style":568},[797],{"type":48,"value":798}," \u003C",{"type":43,"tag":539,"props":800,"children":801},{"style":562},[802],{"type":48,"value":803},"skill-di",{"type":43,"tag":539,"props":805,"children":806},{"style":740},[807],{"type":48,"value":808},"r",{"type":43,"tag":539,"props":810,"children":811},{"style":568},[812],{"type":48,"value":813},">",{"type":43,"tag":539,"props":815,"children":816},{"style":562},[817],{"type":48,"value":818},"\u002Fscripts\u002Fdebug_token_probe.py\n",{"type":43,"tag":539,"props":820,"children":822},{"class":541,"line":821},5,[823],{"type":43,"tag":539,"props":824,"children":825},{"emptyLinePlaceholder":780},[826],{"type":48,"value":783},{"type":43,"tag":539,"props":828,"children":830},{"class":541,"line":829},6,[831,836,840,844],{"type":43,"tag":539,"props":832,"children":833},{"style":556},[834],{"type":48,"value":835},"unset",{"type":43,"tag":539,"props":837,"children":838},{"style":562},[839],{"type":48,"value":586},{"type":43,"tag":539,"props":841,"children":842},{"style":562},[843],{"type":48,"value":626},{"type":43,"tag":539,"props":845,"children":846},{"style":562},[847],{"type":48,"value":848}," FB_APP_ID\n",{"type":43,"tag":51,"props":850,"children":851},{},[852,854,864],{"type":48,"value":853},"The script needs only the Python 3 standard library — no packages to install. The\ndeveloper pastes back only the printed JSON. Example of the token-free output to\nexpect — note there is ",{"type":43,"tag":77,"props":855,"children":856},{},[857,859],{"type":48,"value":858},"no token, no app secret, and no ",{"type":43,"tag":130,"props":860,"children":862},{"className":861},[],[863],{"type":48,"value":396},{"type":48,"value":865},"; that is the\nwhole point:",{"type":43,"tag":528,"props":867,"children":871},{"className":868,"code":869,"language":870,"meta":533,"style":533},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"is_valid\": true,\n  \"type\": \"USER\",\n  \"app_id\": \"1234567890123456\",\n  \"application\": \"Example App\",\n  \"issued_at\": 1785000000,\n  \"expires_at\": 1792800000,\n  \"data_access_expires_at\": 1800000000,\n  \"scopes\": [\"public_profile\", \"email\", \"pages_show_list\", \"pages_read_engagement\"]\n}\n","json",[872],{"type":43,"tag":130,"props":873,"children":874},{"__ignoreMap":533},[875,883,910,948,984,1020,1049,1078,1107,1202],{"type":43,"tag":539,"props":876,"children":877},{"class":541,"line":542},[878],{"type":43,"tag":539,"props":879,"children":880},{"style":568},[881],{"type":48,"value":882},"{\n",{"type":43,"tag":539,"props":884,"children":885},{"class":541,"line":552},[886,891,895,900,905],{"type":43,"tag":539,"props":887,"children":888},{"style":568},[889],{"type":48,"value":890},"  \"",{"type":43,"tag":539,"props":892,"children":893},{"style":734},[894],{"type":48,"value":304},{"type":43,"tag":539,"props":896,"children":897},{"style":568},[898],{"type":48,"value":899},"\"",{"type":43,"tag":539,"props":901,"children":902},{"style":568},[903],{"type":48,"value":904},":",{"type":43,"tag":539,"props":906,"children":907},{"style":568},[908],{"type":48,"value":909}," true,\n",{"type":43,"tag":539,"props":911,"children":912},{"class":541,"line":599},[913,917,921,925,929,934,939,943],{"type":43,"tag":539,"props":914,"children":915},{"style":568},[916],{"type":48,"value":890},{"type":43,"tag":539,"props":918,"children":919},{"style":734},[920],{"type":48,"value":312},{"type":43,"tag":539,"props":922,"children":923},{"style":568},[924],{"type":48,"value":899},{"type":43,"tag":539,"props":926,"children":927},{"style":568},[928],{"type":48,"value":904},{"type":43,"tag":539,"props":930,"children":931},{"style":568},[932],{"type":48,"value":933}," \"",{"type":43,"tag":539,"props":935,"children":936},{"style":562},[937],{"type":48,"value":938},"USER",{"type":43,"tag":539,"props":940,"children":941},{"style":568},[942],{"type":48,"value":899},{"type":43,"tag":539,"props":944,"children":945},{"style":568},[946],{"type":48,"value":947},",\n",{"type":43,"tag":539,"props":949,"children":950},{"class":541,"line":786},[951,955,959,963,967,971,976,980],{"type":43,"tag":539,"props":952,"children":953},{"style":568},[954],{"type":48,"value":890},{"type":43,"tag":539,"props":956,"children":957},{"style":734},[958],{"type":48,"value":319},{"type":43,"tag":539,"props":960,"children":961},{"style":568},[962],{"type":48,"value":899},{"type":43,"tag":539,"props":964,"children":965},{"style":568},[966],{"type":48,"value":904},{"type":43,"tag":539,"props":968,"children":969},{"style":568},[970],{"type":48,"value":933},{"type":43,"tag":539,"props":972,"children":973},{"style":562},[974],{"type":48,"value":975},"1234567890123456",{"type":43,"tag":539,"props":977,"children":978},{"style":568},[979],{"type":48,"value":899},{"type":43,"tag":539,"props":981,"children":982},{"style":568},[983],{"type":48,"value":947},{"type":43,"tag":539,"props":985,"children":986},{"class":541,"line":821},[987,991,995,999,1003,1007,1012,1016],{"type":43,"tag":539,"props":988,"children":989},{"style":568},[990],{"type":48,"value":890},{"type":43,"tag":539,"props":992,"children":993},{"style":734},[994],{"type":48,"value":326},{"type":43,"tag":539,"props":996,"children":997},{"style":568},[998],{"type":48,"value":899},{"type":43,"tag":539,"props":1000,"children":1001},{"style":568},[1002],{"type":48,"value":904},{"type":43,"tag":539,"props":1004,"children":1005},{"style":568},[1006],{"type":48,"value":933},{"type":43,"tag":539,"props":1008,"children":1009},{"style":562},[1010],{"type":48,"value":1011},"Example App",{"type":43,"tag":539,"props":1013,"children":1014},{"style":568},[1015],{"type":48,"value":899},{"type":43,"tag":539,"props":1017,"children":1018},{"style":568},[1019],{"type":48,"value":947},{"type":43,"tag":539,"props":1021,"children":1022},{"class":541,"line":829},[1023,1027,1031,1035,1039,1045],{"type":43,"tag":539,"props":1024,"children":1025},{"style":568},[1026],{"type":48,"value":890},{"type":43,"tag":539,"props":1028,"children":1029},{"style":734},[1030],{"type":48,"value":333},{"type":43,"tag":539,"props":1032,"children":1033},{"style":568},[1034],{"type":48,"value":899},{"type":43,"tag":539,"props":1036,"children":1037},{"style":568},[1038],{"type":48,"value":904},{"type":43,"tag":539,"props":1040,"children":1042},{"style":1041},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1043],{"type":48,"value":1044}," 1785000000",{"type":43,"tag":539,"props":1046,"children":1047},{"style":568},[1048],{"type":48,"value":947},{"type":43,"tag":539,"props":1050,"children":1052},{"class":541,"line":1051},7,[1053,1057,1061,1065,1069,1074],{"type":43,"tag":539,"props":1054,"children":1055},{"style":568},[1056],{"type":48,"value":890},{"type":43,"tag":539,"props":1058,"children":1059},{"style":734},[1060],{"type":48,"value":340},{"type":43,"tag":539,"props":1062,"children":1063},{"style":568},[1064],{"type":48,"value":899},{"type":43,"tag":539,"props":1066,"children":1067},{"style":568},[1068],{"type":48,"value":904},{"type":43,"tag":539,"props":1070,"children":1071},{"style":1041},[1072],{"type":48,"value":1073}," 1792800000",{"type":43,"tag":539,"props":1075,"children":1076},{"style":568},[1077],{"type":48,"value":947},{"type":43,"tag":539,"props":1079,"children":1081},{"class":541,"line":1080},8,[1082,1086,1090,1094,1098,1103],{"type":43,"tag":539,"props":1083,"children":1084},{"style":568},[1085],{"type":48,"value":890},{"type":43,"tag":539,"props":1087,"children":1088},{"style":734},[1089],{"type":48,"value":347},{"type":43,"tag":539,"props":1091,"children":1092},{"style":568},[1093],{"type":48,"value":899},{"type":43,"tag":539,"props":1095,"children":1096},{"style":568},[1097],{"type":48,"value":904},{"type":43,"tag":539,"props":1099,"children":1100},{"style":1041},[1101],{"type":48,"value":1102}," 1800000000",{"type":43,"tag":539,"props":1104,"children":1105},{"style":568},[1106],{"type":48,"value":947},{"type":43,"tag":539,"props":1108,"children":1110},{"class":541,"line":1109},9,[1111,1115,1119,1123,1127,1132,1136,1141,1145,1150,1154,1159,1163,1167,1171,1176,1180,1184,1188,1193,1197],{"type":43,"tag":539,"props":1112,"children":1113},{"style":568},[1114],{"type":48,"value":890},{"type":43,"tag":539,"props":1116,"children":1117},{"style":734},[1118],{"type":48,"value":354},{"type":43,"tag":539,"props":1120,"children":1121},{"style":568},[1122],{"type":48,"value":899},{"type":43,"tag":539,"props":1124,"children":1125},{"style":568},[1126],{"type":48,"value":904},{"type":43,"tag":539,"props":1128,"children":1129},{"style":568},[1130],{"type":48,"value":1131}," [",{"type":43,"tag":539,"props":1133,"children":1134},{"style":568},[1135],{"type":48,"value":899},{"type":43,"tag":539,"props":1137,"children":1138},{"style":562},[1139],{"type":48,"value":1140},"public_profile",{"type":43,"tag":539,"props":1142,"children":1143},{"style":568},[1144],{"type":48,"value":899},{"type":43,"tag":539,"props":1146,"children":1147},{"style":568},[1148],{"type":48,"value":1149},",",{"type":43,"tag":539,"props":1151,"children":1152},{"style":568},[1153],{"type":48,"value":933},{"type":43,"tag":539,"props":1155,"children":1156},{"style":562},[1157],{"type":48,"value":1158},"email",{"type":43,"tag":539,"props":1160,"children":1161},{"style":568},[1162],{"type":48,"value":899},{"type":43,"tag":539,"props":1164,"children":1165},{"style":568},[1166],{"type":48,"value":1149},{"type":43,"tag":539,"props":1168,"children":1169},{"style":568},[1170],{"type":48,"value":933},{"type":43,"tag":539,"props":1172,"children":1173},{"style":562},[1174],{"type":48,"value":1175},"pages_show_list",{"type":43,"tag":539,"props":1177,"children":1178},{"style":568},[1179],{"type":48,"value":899},{"type":43,"tag":539,"props":1181,"children":1182},{"style":568},[1183],{"type":48,"value":1149},{"type":43,"tag":539,"props":1185,"children":1186},{"style":568},[1187],{"type":48,"value":933},{"type":43,"tag":539,"props":1189,"children":1190},{"style":562},[1191],{"type":48,"value":1192},"pages_read_engagement",{"type":43,"tag":539,"props":1194,"children":1195},{"style":568},[1196],{"type":48,"value":899},{"type":43,"tag":539,"props":1198,"children":1199},{"style":568},[1200],{"type":48,"value":1201},"]\n",{"type":43,"tag":539,"props":1203,"children":1205},{"class":541,"line":1204},10,[1206],{"type":43,"tag":539,"props":1207,"children":1208},{"style":568},[1209],{"type":48,"value":1210},"}\n",{"type":43,"tag":57,"props":1212,"children":1214},{"id":1213},"interpretation-report-format",[1215],{"type":48,"value":1216},"Interpretation & Report Format",{"type":43,"tag":51,"props":1218,"children":1219},{},[1220],{"type":43,"tag":77,"props":1221,"children":1222},{},[1223],{"type":48,"value":1224},"Token summary",{"type":43,"tag":121,"props":1226,"children":1227},{},[1228,1240,1252,1279],{"type":43,"tag":73,"props":1229,"children":1230},{},[1231,1233,1238],{"type":48,"value":1232},"Valid? Token ",{"type":43,"tag":130,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":48,"value":312},{"type":48,"value":1239}," (User \u002F Page \u002F App \u002F System User)?",{"type":43,"tag":73,"props":1241,"children":1242},{},[1243,1245,1250],{"type":48,"value":1244},"Owning app: does ",{"type":43,"tag":130,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":48,"value":319},{"type":48,"value":1251}," match the app the call was made with?",{"type":43,"tag":73,"props":1253,"children":1254},{},[1255,1257,1262,1264,1270,1272,1277],{"type":48,"value":1256},"Expiry: ",{"type":43,"tag":130,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":48,"value":340},{"type":48,"value":1263}," in the past → expired; ",{"type":43,"tag":130,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":48,"value":1269},"0",{"type":48,"value":1271}," → never expires; ",{"type":43,"tag":130,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":48,"value":347},{"type":48,"value":1278}," in the past → data-access window lapsed (re-auth needed).",{"type":43,"tag":73,"props":1280,"children":1281},{},[1282],{"type":48,"value":1283},"Scopes present vs. the scopes the failing call requires.",{"type":43,"tag":51,"props":1285,"children":1286},{},[1287],{"type":43,"tag":77,"props":1288,"children":1289},{},[1290],{"type":48,"value":1291},"Diagnosis (common cases)",{"type":43,"tag":1293,"props":1294,"children":1295},"table",{},[1296,1320],{"type":43,"tag":1297,"props":1298,"children":1299},"thead",{},[1300],{"type":43,"tag":1301,"props":1302,"children":1303},"tr",{},[1304,1310,1315],{"type":43,"tag":1305,"props":1306,"children":1307},"th",{},[1308],{"type":48,"value":1309},"Signal",{"type":43,"tag":1305,"props":1311,"children":1312},{},[1313],{"type":48,"value":1314},"Meaning",{"type":43,"tag":1305,"props":1316,"children":1317},{},[1318],{"type":48,"value":1319},"Fix",{"type":43,"tag":1321,"props":1322,"children":1323},"tbody",{},[1324,1349,1372,1395,1425,1448],{"type":43,"tag":1301,"props":1325,"children":1326},{},[1327,1339,1344],{"type":43,"tag":1328,"props":1329,"children":1330},"td",{},[1331,1337],{"type":43,"tag":130,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":48,"value":1336},"is_valid=false",{"type":48,"value":1338},", error 190 subcode 463",{"type":43,"tag":1328,"props":1340,"children":1341},{},[1342],{"type":48,"value":1343},"Session expired",{"type":43,"tag":1328,"props":1345,"children":1346},{},[1347],{"type":48,"value":1348},"Re-authenticate the user",{"type":43,"tag":1301,"props":1350,"children":1351},{},[1352,1362,1367],{"type":43,"tag":1328,"props":1353,"children":1354},{},[1355,1360],{"type":43,"tag":130,"props":1356,"children":1358},{"className":1357},[],[1359],{"type":48,"value":1336},{"type":48,"value":1361},", error 190 (no subcode)",{"type":43,"tag":1328,"props":1363,"children":1364},{},[1365],{"type":48,"value":1366},"Invalid or revoked token",{"type":43,"tag":1328,"props":1368,"children":1369},{},[1370],{"type":48,"value":1371},"Re-issue the token",{"type":43,"tag":1301,"props":1373,"children":1374},{},[1375,1385,1390],{"type":43,"tag":1328,"props":1376,"children":1377},{},[1378,1383],{"type":43,"tag":130,"props":1379,"children":1381},{"className":1380},[],[1382],{"type":48,"value":340},{"type":48,"value":1384}," in the past",{"type":43,"tag":1328,"props":1386,"children":1387},{},[1388],{"type":48,"value":1389},"Expired short-lived token",{"type":43,"tag":1328,"props":1391,"children":1392},{},[1393],{"type":48,"value":1394},"Exchange for a long-lived token, or re-login",{"type":43,"tag":1301,"props":1396,"children":1397},{},[1398,1408,1413],{"type":43,"tag":1328,"props":1399,"children":1400},{},[1401,1403],{"type":48,"value":1402},"Required scope missing from ",{"type":43,"tag":130,"props":1404,"children":1406},{"className":1405},[],[1407],{"type":48,"value":354},{"type":43,"tag":1328,"props":1409,"children":1410},{},[1411],{"type":48,"value":1412},"Permission not granted\u002Fapproved",{"type":43,"tag":1328,"props":1414,"children":1415},{},[1416,1418,1424],{"type":48,"value":1417},"Request the scope; run App Review (",{"type":43,"tag":130,"props":1419,"children":1421},{"className":1420},[],[1422],{"type":48,"value":1423},"\u002Fapp-review-prep",{"type":48,"value":160},{"type":43,"tag":1301,"props":1426,"children":1427},{},[1428,1438,1443],{"type":43,"tag":1328,"props":1429,"children":1430},{},[1431,1436],{"type":43,"tag":130,"props":1432,"children":1434},{"className":1433},[],[1435],{"type":48,"value":319},{"type":48,"value":1437}," ≠ the calling app",{"type":43,"tag":1328,"props":1439,"children":1440},{},[1441],{"type":48,"value":1442},"Token minted for a different app",{"type":43,"tag":1328,"props":1444,"children":1445},{},[1446],{"type":48,"value":1447},"Use a token issued by the correct app",{"type":43,"tag":1301,"props":1449,"children":1450},{},[1451,1461,1466],{"type":43,"tag":1328,"props":1452,"children":1453},{},[1454,1459],{"type":43,"tag":130,"props":1455,"children":1457},{"className":1456},[],[1458],{"type":48,"value":312},{"type":48,"value":1460}," not what the endpoint expects (User vs Page vs App)",{"type":43,"tag":1328,"props":1462,"children":1463},{},[1464],{"type":48,"value":1465},"Wrong token type",{"type":43,"tag":1328,"props":1467,"children":1468},{},[1469],{"type":48,"value":1470},"Mint the correct token type for that endpoint",{"type":43,"tag":51,"props":1472,"children":1473},{},[1474],{"type":43,"tag":77,"props":1475,"children":1476},{},[1477],{"type":48,"value":1478},"Next steps",{"type":43,"tag":121,"props":1480,"children":1481},{},[1482],{"type":43,"tag":73,"props":1483,"children":1484},{},[1485],{"type":48,"value":1486},"Concrete remediation for the diagnosed cause, then cross-links (below).",{"type":43,"tag":57,"props":1488,"children":1490},{"id":1489},"acceptable-vs-unacceptable-usage",[1491],{"type":48,"value":1492},"Acceptable vs unacceptable usage",{"type":43,"tag":121,"props":1494,"children":1495},{},[1496,1515,1520,1538,1558,1563,1568,1573,1586],{"type":43,"tag":73,"props":1497,"children":1498},{},[1499,1501,1506,1508,1513],{"type":48,"value":1500},"✅ Interpreting ",{"type":43,"tag":77,"props":1502,"children":1503},{},[1504],{"type":48,"value":1505},"redacted",{"type":48,"value":1507}," ",{"type":43,"tag":130,"props":1509,"children":1511},{"className":1510},[],[1512],{"type":48,"value":217},{"type":48,"value":1514}," metadata the developer brings back",{"type":43,"tag":73,"props":1516,"children":1517},{},[1518],{"type":48,"value":1519},"✅ Linking the developer to the web Access Token Debugger",{"type":43,"tag":73,"props":1521,"children":1522},{},[1523,1525,1530,1532,1536],{"type":48,"value":1524},"✅ Pointing the developer to the bundled ",{"type":43,"tag":130,"props":1526,"children":1528},{"className":1527},[],[1529],{"type":48,"value":227},{"type":48,"value":1531}," (reads the token\u002Fapp secret from ",{"type":43,"tag":77,"props":1533,"children":1534},{},[1535],{"type":48,"value":234},{"type":48,"value":1537}," by name) for them to run themselves",{"type":43,"tag":73,"props":1539,"children":1540},{},[1541,1543,1548,1550,1556],{"type":48,"value":1542},"✅ Emitting a command that references the credentials ",{"type":43,"tag":77,"props":1544,"children":1545},{},[1546],{"type":48,"value":1547},"by environment-variable\nname only",{"type":48,"value":1549}," (",{"type":43,"tag":130,"props":1551,"children":1553},{"className":1552},[],[1554],{"type":48,"value":1555},"\"$FB_INPUT_TOKEN\"",{"type":48,"value":1557},"), for the developer to run in their own shell",{"type":43,"tag":73,"props":1559,"children":1560},{},[1561],{"type":48,"value":1562},"❌ Accepting a raw or live access token as chat input",{"type":43,"tag":73,"props":1564,"children":1565},{},[1566],{"type":48,"value":1567},"❌ Asking for an app secret",{"type":43,"tag":73,"props":1569,"children":1570},{},[1571],{"type":48,"value":1572},"❌ Echoing a token back, or storing a token anywhere",{"type":43,"tag":73,"props":1574,"children":1575},{},[1576,1578,1584],{"type":48,"value":1577},"❌ Emitting a command containing a literal token or app secret — including a\nplaceholder the developer substitutes. The value would land in their shell\nhistory and, for the life of the process, in ",{"type":43,"tag":130,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":48,"value":1583},"ps",{"type":48,"value":1585}," output",{"type":43,"tag":73,"props":1587,"children":1588},{},[1589,1591,1596,1597,1602,1604,1609],{"type":48,"value":1590},"❌ Running the ",{"type":43,"tag":130,"props":1592,"children":1594},{"className":1593},[],[1595],{"type":48,"value":559},{"type":48,"value":152},{"type":43,"tag":130,"props":1598,"children":1600},{"className":1599},[],[1601],{"type":48,"value":737},{"type":48,"value":1603}," commands or the script ",{"type":43,"tag":77,"props":1605,"children":1606},{},[1607],{"type":48,"value":1608},"yourself",{"type":48,"value":1610},". The\ndeveloper runs them in their own shell; you never hold the credential",{"type":43,"tag":57,"props":1612,"children":1614},{"id":1613},"tips",[1615],{"type":48,"value":1616},"Tips",{"type":43,"tag":121,"props":1618,"children":1619},{},[1620,1646,1658],{"type":43,"tag":73,"props":1621,"children":1622},{},[1623,1625,1630,1632,1638,1640,1644],{"type":48,"value":1624},"Error code ",{"type":43,"tag":130,"props":1626,"children":1628},{"className":1627},[],[1629],{"type":48,"value":150},{"type":48,"value":1631}," is the catch-all ",{"type":43,"tag":130,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":48,"value":1637},"OAuthException",{"type":48,"value":1639},"; the ",{"type":43,"tag":77,"props":1641,"children":1642},{},[1643],{"type":48,"value":142},{"type":48,"value":1645}," disambiguates it (463 = expired, 467 = invalid, etc.). Always ask for the subcode.",{"type":43,"tag":73,"props":1647,"children":1648},{},[1649,1651,1656],{"type":48,"value":1650},"If the developer can't run ",{"type":43,"tag":130,"props":1652,"children":1654},{"className":1653},[],[1655],{"type":48,"value":217},{"type":48,"value":1657},", the web Access Token Debugger needs no setup — start there.",{"type":43,"tag":73,"props":1659,"children":1660},{},[1661,1663,1669,1671,1677],{"type":48,"value":1662},"Related: ",{"type":43,"tag":130,"props":1664,"children":1666},{"className":1665},[],[1667],{"type":48,"value":1668},"\u002Fapi-integration",{"type":48,"value":1670}," (token types & auth setup) and ",{"type":43,"tag":130,"props":1672,"children":1674},{"className":1673},[],[1675],{"type":48,"value":1676},"\u002Fapi-health",{"type":48,"value":1678}," (rate limits\u002Fquota, once the token works).",{"type":43,"tag":1680,"props":1681,"children":1682},"style",{},[1683],{"type":48,"value":1684},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1686,"total":1109},[1687,1701,1715,1730,1744,1757,1764],{"slug":1688,"name":1688,"fn":1689,"description":1690,"org":1691,"tags":1692,"stars":26,"repoUrl":27,"updatedAt":1700},"api-health","monitor API health for Meta apps","Monitor API health for a Meta app — check rate limits, call volume, and API deprecations. Use whenever a user asks whether their app is being throttled, is near its rate limits, how much of its call volume or quota is being used, or about deprecated Graph API versions. Prefer this skill over calling devtools_api_usage directly — it resolves the app, pulls rate limits, call volume, and deprecations together, and applies the warning\u002Fthrottle thresholds and standard report format that ad-hoc tool calls miss.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1693,1694,1697],{"name":21,"slug":22,"type":16},{"name":1695,"slug":1696,"type":16},"Monitoring","monitoring",{"name":1698,"slug":1699,"type":16},"Observability","observability","2026-08-09T04:07:33.554887",{"slug":1702,"name":1702,"fn":1703,"description":1704,"org":1705,"tags":1706,"stars":26,"repoUrl":27,"updatedAt":1714},"api-integration","set up Meta API integrations","Guide a developer through setting up a Meta API integration from scratch — discovers the right APIs, fetches setup guides, authentication requirements, permissions, and code examples. Use when the user wants to build with a specific Meta product (WhatsApp, Instagram, Messenger, Pages, Ads, etc.).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1707,1708,1711],{"name":21,"slug":22,"type":16},{"name":1709,"slug":1710,"type":16},"Documentation","documentation",{"name":1712,"slug":1713,"type":16},"Integrations","integrations","2026-08-09T04:07:34.582065",{"slug":1716,"name":1716,"fn":1717,"description":1718,"org":1719,"tags":1720,"stars":26,"repoUrl":27,"updatedAt":1729},"app-health-check","audit Meta app health and compliance","Run a comprehensive health check on a Meta app — audits settings, security, compliance, app review status, rate limits, and API deprecations in one pass. Use when you want a full picture of an app's current state.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1721,1724,1727,1728],{"name":1722,"slug":1723,"type":16},"Audit","audit",{"name":1725,"slug":1726,"type":16},"Compliance","compliance",{"name":1698,"slug":1699,"type":16},{"name":14,"slug":15,"type":16},"2026-08-09T04:07:29.56623",{"slug":1731,"name":1731,"fn":1732,"description":1733,"org":1734,"tags":1735,"stars":26,"repoUrl":27,"updatedAt":1743},"app-review-prep","prepare Meta apps for App Review","Prepare a Meta app for App Review — checks current status, outstanding requirements, granted privileges, and submission history. Use before submitting an app for review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1736,1737,1740],{"name":1725,"slug":1726,"type":16},{"name":1738,"slug":1739,"type":16},"Deployment","deployment",{"name":1741,"slug":1742,"type":16},"Operations","operations","2026-08-09T04:07:30.574837",{"slug":1745,"name":1745,"fn":1746,"description":1747,"org":1748,"tags":1749,"stars":26,"repoUrl":27,"updatedAt":1756},"compliance-check","check compliance status for Meta apps","Check compliance status for a Meta app — surfaces open required actions, active violations, and recommendations with remediation guidance. Use to audit compliance posture or resolve compliance blockers.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1750,1751,1752,1755],{"name":1722,"slug":1723,"type":16},{"name":1725,"slug":1726,"type":16},{"name":1753,"slug":1754,"type":16},"Regulatory Compliance","regulatory-compliance",{"name":14,"slug":15,"type":16},"2026-08-09T04:07:28.551778",{"slug":4,"name":4,"fn":5,"description":6,"org":1758,"tags":1759,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1760,1761,1762,1763],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"slug":1765,"name":1765,"fn":1766,"description":1767,"org":1768,"tags":1769,"stars":26,"repoUrl":27,"updatedAt":1775},"debug-webhooks","troubleshoot Meta app webhooks","Troubleshoot webhook issues for a Meta app — inspect active subscriptions, identify misconfiguration, and send test payloads to verify delivery. Use when webhooks aren't working as expected.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1770,1771,1772],{"name":21,"slug":22,"type":16},{"name":24,"slug":25,"type":16},{"name":1773,"slug":1774,"type":16},"Webhooks","webhooks","2026-08-09T04:07:31.582579",{"items":1777,"total":1967},[1778,1802,1816,1837,1858,1875,1884,1904,1917,1930,1945,1957],{"slug":1779,"name":1779,"fn":1780,"description":1781,"org":1782,"tags":1783,"stars":1799,"repoUrl":1800,"updatedAt":1801},"relay-best-practices","write idiomatic Relay code","Best practices for writing idiomatic Relay code. ALWAYS use this skill when writing or modifying React components that use Relay for data fetching. Covers fragments, queries, mutations, pagination, and common anti-patterns. Use when you see `useFragment`, `useLazyLoadQuery`, `usePreloadedQuery`, `useMutation`, `usePaginationFragment`, `graphql` template literals, `react-relay` imports, or `__generated__\u002F*.graphql` files. Also use when asked to explain Relay concepts, debug Relay issues, or review Relay code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1784,1787,1790,1793,1796],{"name":1785,"slug":1786,"type":16},"Engineering","engineering",{"name":1788,"slug":1789,"type":16},"Frontend","frontend",{"name":1791,"slug":1792,"type":16},"GraphQL","graphql",{"name":1794,"slug":1795,"type":16},"React","react",{"name":1797,"slug":1798,"type":16},"Relay","relay",18950,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Frelay","2026-04-22T04:58:15.370563",{"slug":1803,"name":1803,"fn":1804,"description":1805,"org":1806,"tags":1807,"stars":1799,"repoUrl":1800,"updatedAt":1815},"relay-performance","optimize Relay application performance","Performance best practices for Relay applications. Use when optimizing data fetching, reducing re-renders, configuring caching, or improving time to first meaningful paint. Covers query placement, @defer, pagination, fetch policies, garbage collection, fragment granularity, and server-side filtering. Companion to the relay-best-practices skill which covers correctness and architecture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1808,1809,1810,1813,1814],{"name":1788,"slug":1789,"type":16},{"name":1791,"slug":1792,"type":16},{"name":1811,"slug":1812,"type":16},"Performance","performance",{"name":1794,"slug":1795,"type":16},{"name":1797,"slug":1798,"type":16},"2026-06-10T07:30:28.726513",{"slug":1817,"name":1817,"fn":1818,"description":1819,"org":1820,"tags":1821,"stars":1834,"repoUrl":1835,"updatedAt":1836},"add-shape-types-to-torch-model","annotate PyTorch models with tensor shapes","Port a PyTorch model to use pyrefly's tensor shape type system (Tensor[[B, C, H, W]], Int[T]). Use this skill whenever the user wants to add shape annotations to a PyTorch model, type a model with tensor dimensions, port a model to use shape tracking, or annotate model forward methods with tensor shapes. Also use when the user mentions tensor shape ports, Int types for PyTorch, or pyrefly shape checking on a model file. Invoke BEFORE starting any model port — the skill's gated workflow prevents common failure modes.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1822,1825,1828,1831],{"name":1823,"slug":1824,"type":16},"Data Modeling","data-modeling",{"name":1826,"slug":1827,"type":16},"Deep Learning","deep-learning",{"name":1829,"slug":1830,"type":16},"Python","python",{"name":1832,"slug":1833,"type":16},"PyTorch","pytorch",6833,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fpyrefly","2026-07-18T05:12:08.515952",{"slug":1838,"name":1838,"fn":1839,"description":1840,"org":1841,"tags":1842,"stars":1855,"repoUrl":1856,"updatedAt":1857},"camera-streaming","configure camera streaming and photo capture","Stream, video frames, photo capture, resolution\u002Fframe rate configuration",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1843,1846,1849,1852],{"name":1844,"slug":1845,"type":16},"Camera","camera",{"name":1847,"slug":1848,"type":16},"Hardware","hardware",{"name":1850,"slug":1851,"type":16},"iOS","ios",{"name":1853,"slug":1854,"type":16},"Video","video",488,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios","2026-08-06T05:38:47.523424",{"slug":1859,"name":1859,"fn":1860,"description":1861,"org":1862,"tags":1863,"stars":1855,"repoUrl":1856,"updatedAt":1874},"dat-conventions","develop iOS applications with DAT SDK","Swift patterns, async\u002Fawait, naming conventions, key types for DAT SDK iOS development",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1864,1865,1868,1871],{"name":1850,"slug":1851,"type":16},{"name":1866,"slug":1867,"type":16},"Mobile","mobile",{"name":1869,"slug":1870,"type":16},"SDK","sdk",{"name":1872,"slug":1873,"type":16},"Swift","swift","2026-08-06T05:38:49.536777",{"slug":25,"name":25,"fn":1876,"description":1877,"org":1878,"tags":1879,"stars":1855,"repoUrl":1856,"updatedAt":1883},"debug wearable device software","Common issues, Developer Mode, version compatibility, state machine diagnosis",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1880,1881,1882],{"name":24,"slug":25,"type":16},{"name":1785,"slug":1786,"type":16},{"name":1850,"slug":1851,"type":16},"2026-08-06T05:38:50.51086",{"slug":1885,"name":1885,"fn":1886,"description":1887,"org":1888,"tags":1889,"stars":1855,"repoUrl":1856,"updatedAt":1903},"display-access","manage display capabilities on wearable devices","Display capability setup, display-capable device selection, UI DSL, icons, buttons, images, and video playback",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1890,1893,1896,1899,1902],{"name":1891,"slug":1892,"type":16},"Design","design",{"name":1894,"slug":1895,"type":16},"Images","images",{"name":1897,"slug":1898,"type":16},"Interaction","interaction",{"name":1900,"slug":1901,"type":16},"UI Components","ui-components",{"name":1853,"slug":1854,"type":16},"2026-08-06T05:38:53.520488",{"slug":1905,"name":1905,"fn":1906,"description":1907,"org":1908,"tags":1909,"stars":1855,"repoUrl":1856,"updatedAt":1916},"getting-started","set up Meta wearable SDK integration","SDK setup, Swift Package Manager integration, Info.plist configuration, and first connection to Meta glasses",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1910,1913,1914,1915],{"name":1911,"slug":1912,"type":16},"Configuration","configuration",{"name":1850,"slug":1851,"type":16},{"name":1869,"slug":1870,"type":16},{"name":1872,"slug":1873,"type":16},"2026-08-06T05:38:48.514522",{"slug":1918,"name":1918,"fn":1919,"description":1920,"org":1921,"tags":1922,"stars":1855,"repoUrl":1856,"updatedAt":1929},"live-debugging-mcp","debug iOS wearable applications","Use this whenever debugging an iOS DAT app with local DAT Inspector MCP tools, live device events, Meta AI app\u002Fdevice boundary issues, permissions, registration, sessions, streaming, callbacks, or user reports that the app cannot communicate with glasses.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1923,1924,1925,1928],{"name":24,"slug":25,"type":16},{"name":1850,"slug":1851,"type":16},{"name":1926,"slug":1927,"type":16},"MCP","mcp",{"name":1866,"slug":1867,"type":16},"2026-08-06T06:09:15.013902",{"slug":1931,"name":1931,"fn":1932,"description":1933,"org":1934,"tags":1935,"stars":1855,"repoUrl":1856,"updatedAt":1944},"mockdevice-testing","test wearable apps with mock devices","MockDeviceKit for testing without physical glasses hardware",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1936,1937,1938,1941],{"name":1850,"slug":1851,"type":16},{"name":1866,"slug":1867,"type":16},{"name":1939,"slug":1940,"type":16},"QA","qa",{"name":1942,"slug":1943,"type":16},"Testing","testing","2026-05-15T06:14:37.406692",{"slug":1946,"name":1946,"fn":1947,"description":1948,"org":1949,"tags":1950,"stars":1855,"repoUrl":1856,"updatedAt":1956},"permissions-registration","register apps with Meta AI","App registration with Meta AI, camera permission flows",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1951,1952,1953],{"name":1844,"slug":1845,"type":16},{"name":1850,"slug":1851,"type":16},{"name":1954,"slug":1955,"type":16},"Permissions","permissions","2026-05-15T06:14:46.030253",{"slug":1958,"name":1958,"fn":1959,"description":1960,"org":1961,"tags":1962,"stars":1855,"repoUrl":1856,"updatedAt":1966},"sample-app-guide","build wearable apps with camera streaming","Building a complete DAT app with camera streaming and photo capture",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1963,1964,1965],{"name":1844,"slug":1845,"type":16},{"name":1850,"slug":1851,"type":16},{"name":1866,"slug":1867,"type":16},"2026-08-06T05:38:51.509255",22]