Meta Graph API · Server Security

appsecret_proof: The Server-Side Requirement That Silently Blocks Your Meta API Calls

Your integration works perfectly in testing. Then you move it to a production server, flip on a security setting, and every Graph API call starts failing with the same cryptic message — even though your access token is valid.

This is one of the most confusing errors in the Meta ecosystem, because nothing is actually wrong with your token, your permissions, or your app review. The call is being rejected for a completely separate reason: a missing security signature called appsecret_proof. Here is what it is, why Meta requires it, and why it trips up so many otherwise-correct integrations.

The Error You Are Actually Seeing

It shows up in one of two forms, depending on your setup:

(#100) API calls from the server require an appsecret_proof argument.
Invalid appsecret_proof provided in the API argument.

The first means you sent no proof at all. The second means you sent one, but it did not match what Meta expected. Both stop the request cold — and both are easy to misdiagnose as a token or permission problem, sending developers down the wrong rabbit hole for hours.

What appsecret_proof Actually Is

According to Meta’s official Secure Requests documentation, appsecret_proof is a SHA256 hash of your access token, using your app secret as the key — an HMAC signature. You attach it as an extra parameter on every server-side call so Meta can confirm the request genuinely came from a system that holds your app secret, not just from someone who copied your access token.

Why this matters: access tokens are portable. A token generated in a browser can be stolen through malware or a man-in-the-middle attack and replayed from an entirely different machine. The app secret never leaves your server, so a valid appsecret_proof proves the caller is really you.

Why Meta Enforces It — and Why It Suddenly Turns On

It is a toggle you can enable

In the App Dashboard under App Settings → Advanced → Security, the Require App Secret switch forces every call to carry a valid proof. Many teams flip this on for security hardening — then watch their live app break.

It can be required implicitly

Certain flows and products expect the proof even when you did not consciously enable it, which is why the error appears “out of nowhere” after a platform or SDK change.

Client tokens sent to a server

If a token is minted on the client and then used from your backend, Meta treats it as a server call — and server calls are exactly what the proof is designed to protect.

It is per-app, not per-token

The proof is keyed to one specific app secret. Mix tokens and secrets from two different apps and the hash will never validate.

Where It Bites Hardest

Some integrations hit this far more often than others, because they are inherently server-to-server:

  • The Conversions API — server-side event tracking is one of the most common places this error surfaces, especially through tag managers and third-party connectors that do not add the proof automatically.
  • System User access tokens — the long-lived tokens SaaS platforms rely on run entirely server-side, so every one of those calls needs a matching proof once the setting is on.
  • Backend proxies for client apps — the moment you route a client’s call through your own server to keep the app secret safe, you inherit the responsibility of signing it.

How It Gets Fixed — at a High Level

The concept is simple; getting every moving part aligned in a live system is where it goes wrong. The broad shape looks like this:

1

Locate the correct app secret

It lives in the App Dashboard under Settings → Basic, and it must belong to the same app that issued the access token you are using.

2

Generate the HMAC on the server

Every request needs a fresh SHA256 HMAC of the exact token being sent, computed only where the secret can stay private — never in client-side code.

3

Attach it to each call

The proof rides along as its own parameter on every single Graph API request, not just the first one.

4

Keep token and secret in sync

Rotate a secret, swap an app, or refresh a token, and the proof has to be regenerated to match — otherwise you are back to Invalid appsecret_proof.

The catch: this deliberately withholds the exact implementation because the details differ by language, SDK, token type, and whether your call is batched or proxied — and a single wrong byte in the hash input produces the same generic error with no clue as to which of a dozen things is off.

Common Reasons the Proof Keeps Getting Rejected

  • Hashing the wrong token — signing a user token when the call uses a page or system-user token, or vice versa.
  • Using the wrong app’s secret — extremely common when one team manages several Meta apps.
  • A rotated or reset app secret — every previously generated proof instantly becomes invalid.
  • Encoding mistakes — hashing a URL-encoded or trimmed token instead of the raw value.
  • Third-party tools that never added the proof — the integration looks configured, but the connector silently omits the parameter.

Where This Fits in the Bigger Picture

On its own, appsecret_proof is a security detail. But it rarely arrives alone — it shows up right when you are moving an app to production, adding server-side tracking, onboarding client accounts, or preparing for App Review. Each of those is a place where one small misconfiguration quietly stalls a launch. If you want to see the full range of things that can hold up a Meta submission, our guide to Meta App Review rejection reasons maps them out.

Getting a server-side Meta integration to run cleanly — correct token types, a valid appsecret_proof on every call, the right app configuration, and a submission that actually passes review — is fiddly, and the error messages rarely point at the real cause. If you would rather have it set up and approved correctly the first time instead of debugging generic errors for days, that is exactly the kind of hands-on, policy-aligned implementation support we provide. Full details are on our Facebook & Meta App Review service page.

Source: Meta for Developers — Secure Graph API Requests (developers.facebook.com/docs/graph-api/guides/secure-requests). Verified July 2026. This article is educational and is not affiliated with or endorsed by Meta, and no specific outcome can be guaranteed.