# Zapier and Make
---

**Last updated:** October 1, 2026

---

Use a Zap or a Make scenario to start a FakeParrot workflow, call FakeParrot's
tools, and read back what a run produced. A FakeParrot workflow is a saved,
automated job that works from your company's knowledge, such as a weekly report.

| You want to | Use | Sign-in |
|---|---|---|
| Start a workflow | The workflow's webhook link | None. The link is the credential. |
| Call FakeParrot's tools | The platform's MCP Client app | OAuth or an API key |
| Read a run's result | `get_workflow_run` or `GET /api/reports` | An API key or OAuth with `workflows:read` |
| Receive a run's report when it finishes | `POST /api/reports/{run_id}/callbacks` or `POST /api/report-hooks` | An API key or OAuth with `workflows:read` |

## Start a workflow from a Zap or a Make scenario

### Turn on the webhook link

1. Open the workflow and choose **Edit**.
2. Under **Webhook trigger**, choose **Create link** and copy it. FakeParrot
   shows the link once.

The link is a `POST` address on `https://fakeparrot.com`:

```text
POST /api/workflows/hooks/{public_id}/{token}
```

- Anyone with the link can start the workflow, so treat it like a password.
  FakeParrot keeps only a hash of the token. **Rotate link** replaces it, and
  **Remove link** turns it off.
- Only the workflow's owner or a company admin can create the link. The
  workflow must be active.

### What to send

Send a JSON object. Its fields become the run's inputs, so they must match the
inputs the workflow declares: the same names, and only text, numbers or true and
false. Text can run to 20,000 characters per field. An unknown field or a
missing required one is refused. A workflow that declares no inputs takes an
empty body. The whole body can be up to 256 KB.

### What comes back

A started run answers `201` with `success`, `run_id` and `status`. The reply
does not wait for the run to finish. Other answers:

- `400`: the body is not a JSON object, or its fields do not match the inputs.
- `404`: the link is wrong or was removed.
- `413`: the body is over 256 KB.
- `409`: the workflow is not active, billing is blocked, or it has run more than
  60 times in the past hour (the default limit).

### Set up the step

| | Zapier | Make |
|---|---|---|
| App | Webhooks by Zapier | HTTP |
| Step | **POST** | **Make a request** |
| URL | The link | The link |
| Method | POST | POST |
| Body | Send as JSON, one field per input | Body content type `application/JSON`, then the JSON object in **Body content** |

## Call FakeParrot's MCP server from Zapier or Make

Both platforms have an **MCP Client** app. Point it at
`https://fakeparrot.com/mcp`, which uses Streamable HTTP, and sign in with OAuth
or with an API key (`fkp_...`). In Zapier, the step is **Run Tool**, and the key
goes in the **Bearer Token** field. In Make, the module is **Call a tool**, and
the key goes in **API Key / Access token**.

Both MCP Client apps are beta, so their screens and limits can change. Make's
OAuth address, `https://www.make.com/oauth/cb/mcp`, is one FakeParrot accepts
when an app registers. If OAuth sign-in does not finish in either app, use an
API key.

The [MCP server guide](/developers/mcp) explains how to create a key and what
each permission allows.

## Get the result back

The webhook returns a `run_id`. FakeParrot can send the run's report to an
address when the run finishes, or you can check the run until it finishes.

### Have FakeParrot send the report

| Call | Body | What it does |
|---|---|---|
| `POST /api/reports/{run_id}/callbacks` | `url` | Sends this run's report once, when the run finishes. If it has already finished, sends it at once. |
| `POST /api/report-hooks` | `target_url`, and optionally `workflow_public_id` and `statuses` | Sends each report in your company that you can read, when its run finishes. `workflow_public_id` limits it to one workflow. `statuses` limits it to some of `completed`, `failed`, `budget_exceeded`, `cancelled` and `stale`. |
| `GET /api/report-hooks` | None | Lists your active hooks. Each address shows only its host and last few characters. |
| `DELETE /api/report-hooks/{id}` | None | Stops one hook. |

Both `POST` calls answer `201` with the hook's `id`.

- **Sign-in.** Send `Authorization: Bearer fkp_...`, or an OAuth access token,
  with `workflows:read`. The hook belongs to that key or OAuth connection, and
  revoking it stops the hook. A browser sign-in can list and stop hooks but
  cannot create one.
- **Address.** It must be a public `https` URL. An address that resolves to a
  private, loopback or link-local IP is refused with `422`. FakeParrot checks
  the address again before every send and does not follow redirects.
- **What arrives.** A `POST` whose JSON body has the same shape as
  `GET /api/reports/{run_id}`, as you can read it at the time it is sent. The
  `X-FakeParrot-Delivery` header names the delivery and `X-FakeParrot-Hook`
  names the hook. FakeParrot does not sign the request, so keep the address
  secret.
- **Duplicates.** Delivery is at least once, so the same report can arrive more
  than once. A repeat carries the same `X-FakeParrot-Delivery` value, so
  de-duplicate on that header.
- **Your answer.** Answer with any `2xx` within 10 seconds. FakeParrot retries
  a timeout, a failed connection, `408`, `425`, `429` and any `5xx`, up to 8
  attempts. The first retry waits 30 seconds and each later one waits twice as
  long, up to an hour. A `410` stops the hook. Any other answer ends that
  delivery without a retry.
- **Delegated work.** A run that is `awaiting_work_packet` has not finished, so its
  report is not sent until it does.

In Zapier, the address can be a Webhooks by Zapier **Catch Hook** URL. In Make,
it can be a **Custom webhook** URL.

### Check the run yourself

Check the `run_id` again after a delay, until the status is `completed`,
`failed`, `cancelled`, `stale` or `budget_exceeded`. A run waiting on delegated
work remains `awaiting_work_packet` until the work packet returns.

| Call | What it returns |
|---|---|
| MCP tool `get_workflow_run` with `run_id` | `status`, `progress`, `current_step`, `summary`, `errors`, each step's status, `report_url`, and `outcome` when there is one |
| `GET /api/reports/{run_id}` | The run's report as JSON, with `presentation.execution_status`, `created_at` and `completed_at` |
| `GET /api/reports` | `reports` (each with `id`, `status`, `workflow_name`, `created_at`, `completed_at`), `total`, `offset`, `limit` and `has_more` |

For the REST calls, send `Authorization: Bearer fkp_...`. `GET /api/reports`
takes `limit` (1 to 200), `offset`, `status` and `workflow_public_id`. Each call
returns only reports that the sign-in is allowed to read.

## Support

Email [support@fakeparrot.com](mailto:support@fakeparrot.com).
