Skip to main content
Alchemy provides two things:
  1. RPC access — reading chain state, fetching transaction receipts, submitting sweep transactions.
  2. Address Activity webhooks — real-time notification when a payment arrives at a session’s deposit address.
With webhooks enabled, payments are detected in under a second. Without them, the app falls back to polling.

Credentials

You need two separate credentials from Alchemy: Direct link to the webhooks page: dashboard.alchemy.com/apps/latest/webhooks
The #1 setup mistake is using the API key as the auth token. They are different values. The API Key is per-app; the Notify Auth Token is account-wide.
Can’t find the AUTH TOKEN button? It only appears once the webhooks page has at least one webhook — with zero webhooks Alchemy shows an empty “Create a webhook” prompt and hides the token. Click Create Webhook, pick Address Activity, choose any network and address, and save. The page then switches to the populated list and the AUTH TOKEN button appears in the top-right. You can delete that webhook afterward — the app creates and manages its own webhooks automatically. Note: Security → Access Keys is a different credential (JSON-RPC / NFT / Gas Manager) and does not work as the Notify Auth Token.

Dashboard setup

  1. Sign in to your My Crypto Server dashboard.
  2. Go to Integrations → Alchemy.
  3. Enter your API Key, Notify Auth Token, and Webhook Public URL (your app’s public HTTPS URL).
  4. Toggle Enabled on and click Save.
That’s all — there is no provisioning step. Webhooks are created and deleted on demand as sessions come and go (see How it works).
Webhooks are created lazily, one per chain, only while a payment is in flight. You hold at most one webhook per chain with an active session — never all supported chains at once — so this stays comfortably under Alchemy’s free-tier webhook limit and never leaves an empty webhook listening to chain-wide activity.

Inspecting webhooks

Webhooks come and go automatically. To see what currently exists:
An empty result simply means no onchain session is active right now.

How it works

  • When a checkout session is created, its deposit address is added to that chain’s Alchemy webhook — creating the webhook (with the address already attached) if it doesn’t exist yet.
  • When the customer sends funds, Alchemy POSTs to /api/webhooks/alchemy (EVM), /api/webhooks/alchemy/solana, or /api/webhooks/alchemy/btc.
  • Each request is HMAC-SHA256 verified against the signing key stored in the alchemy_webhooks table.
  • On session completion (paid, expired, or failed), the address is removed — and if it was the webhook’s last address, the webhook is deleted.
  • An hourly reconcile job re-asserts this from the database: it (re)creates any webhook a failed add missed and removes ones with no active sessions. The poller is the safety net throughout.

Supported chains

Troubleshooting

Disabling webhooks

Toggle the Alchemy integration off, or leave the auth token / public URL blank. The app will fall back to polling on all chains — slower but fully functional.