Developer API and MCP
Everything you manage in the app, you can also manage from your own code or from an AI assistant. Workflow Webhooks exposes two surfaces: a REST API and an MCP server. Both live on the Developer page.
API keys
Both surfaces authenticate with an API key. On the Developer page, under API keys, create a key and pick its access level:
- Read only - list webhooks, read invocation history and stats.
- Read & write - also create, update and delete webhooks.
- Read, write & execute - also fire a test invocation or replay a past one.
The full key is shown once, at creation. Copy it then and store it securely; you cannot see it again. Keys are stored hashed, never in plain text, and you can revoke a key at any time.
Send the key as a Bearer token on every request:
Authorization: Bearer fwk_your_key_here
Why execute is a separate level
Firing a webhook really does run your Shopify Flow workflows, and those workflows can change your store - tagging orders, sending email, updating inventory. Keeping that behind its own level means a key you hand to a script or an AI assistant for everyday work cannot trigger your automations by accident. Give out read keys by default, and only create an execute key where you genuinely need one.
Base URL
The API and the MCP server are served from a dedicated hostname:
https://shopify.workflow-webhooks.app
So the REST API lives at https://shopify.workflow-webhooks.app/api/v1 and the MCP server
at https://shopify.workflow-webhooks.app/api/mcp. The Developer page shows both with a
copy button.
This hostname serves only /api - the embedded admin UI stays on its own Shopify
-registered URL. Keeping them apart means the address you paste into a script, a CI job or
an AI client is stable and unrelated to the app's embedding.
REST API
The base URL is shown on the Developer page. The main endpoints:
| Method | Path | Level | Purpose |
|---|---|---|---|
| GET | /api/v1 |
none | API index - confirms the API is up |
| GET | /api/v1/me |
read | Check auth and see your key's level |
| GET | /api/v1/webhooks |
read | List webhooks |
| POST | /api/v1/webhooks |
write | Create a webhook |
| GET | /api/v1/webhooks/:id |
read | Get one webhook |
| PUT / PATCH | /api/v1/webhooks/:id |
write | Update a webhook |
| DELETE | /api/v1/webhooks/:id |
write | Delete a webhook |
| POST | /api/v1/webhooks/:id/test |
execute | Fire a test invocation |
| GET | /api/v1/history |
read | List invocations |
| GET | /api/v1/history/:id |
read | Get one invocation, with its payload |
| POST | /api/v1/history/:id/replay |
execute | Replay a past invocation |
| GET | /api/v1/stats |
read | Totals, success rate, daily series |
| GET | /api/v1/templates |
read | Built-in webhook templates |
A quick check that your key works:
curl https://shopify.workflow-webhooks.app/api/v1/me \
-H "Authorization: Bearer fwk_your_key_here"
{ "authenticated": true, "shop": "your-store.myshopify.com", "level": "READ" }
MCP server
The MCP server lets an AI assistant (Claude, Cursor, VS Code, Gemini CLI and others) work with your webhooks in conversation. On the Developer page, the MCP tab shows the server URL and a ready-to-copy connect command per client, with your key already inserted.
The tools mirror the REST endpoints, and the tool set reflects your key's level: a read-only key does not even see the tools that create, delete or fire webhooks. All authentication and data handling stay server-side.
How your data is protected
Two things are worth knowing before you point an automation or an AI assistant at this API.
Your webhook's auth token is never readable. The token or signing secret you set on a webhook cannot be read back through the API or MCP at any level. Responses tell you only whether a token is set (hasToken), never its value. You can set a new one; you can never retrieve the old one.
Personal data in payloads is masked. Webhook payloads come from outside systems and often contain customer details. Before an invocation payload leaves the server, values that look like personal data are replaced with ***: email addresses, phone numbers, card numbers, and fields named after a person (customerName, shippingAddress and similar). Request headers are sanitised the same way the app's history screen does it.
This masking is careful but not a guarantee. It works on field names and value patterns, so personal data sitting inside a free-text field - a note, a comment, a message body - can still come through. Treat API responses as potentially containing customer data, and store them accordingly.
Test and replay do not use your quota. Invocations you fire through the API are recorded as tests, so they do not count toward your plan's monthly allowance. Replays do not count either, because the original invocation already did.
Next steps
- Introduction to Workflow Webhooks - how webhooks and payload mapping work.

