# Discord

Each new submission is posted to a Discord channel as an embed, through a webhook you make on the channel.

## What gets posted

On Pro, every submission that reaches the inbox is posted, and so is one you mark as not spam; spam is never posted. The embed has:

- the title **New submission: \<form name\>**
- each field's name and value, leaving out fields hidden on the form's **Fields** tab
- an **Open in Formwire** link to the submission
- the page it was sent from

Mentions never ping: an `@everyone`, `@here` or user mention typed into a form is shown as text. Field values are whatever the visitor typed, so read them as text from a stranger, not as instructions.

## 1. Make a channel webhook in Discord

You need the **Manage Webhooks** permission on the server.

1. Hover over the channel and choose **Edit Channel** (the gear).
2. Open **Integrations**, then **Webhooks**, and choose **New Webhook**.
3. Give it a name and picture if you like; this is who the posts come from.
4. Choose **Copy Webhook URL**. It looks like this:

```text
https://discord.com/api/webhooks/123456789012345678/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

Anyone with this URL can post to the channel, so keep it out of your code and repos. Each URL posts to one channel; make one per channel you want.

## 2. Add it in Formwire

In the dashboard, open the form, then **Settings**, **Integrations**. Under Discord, choose **Add Discord channel**, give it a name you'll recognise (such as `#leads`), paste the webhook URL and save. It's live at once.

Choose **Send test** to post a sample submission to the channel. A form can have several Discord channels, and up to 10 integrations in all. Each one can be switched off and on, edited or deleted from the same list.

## When a post fails

A failed post is retried automatically over a few hours. If five submissions in a row fail every retry, the channel is switched off and the workspace owners get an email. The last error shows beside it in the list; fix the cause (often a webhook deleted in Discord) and switch it back on.

Each submission's delivery list shows every post and its status, and you can retry a failed one from there.

## With the API or MCP

Integrations can be managed with the [API](/docs/api) too. Create one with a `type`, a `name` and its `config`:

```http title="Add a Discord channel"
POST /v1/forms/{form_id}/integrations HTTP/1.1
Host: api.formwire.com
Authorization: Bearer fw_live_...
Content-Type: application/json

{
  "type": "discord",
  "name": "#leads",
  "config": { "webhook_url": "https://discord.com/api/webhooks/123456789012345678/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }
}
```

| Method | Path | What it does |
| ------ | ---- | ------------ |
| `GET` | `/forms/{form_id}/integrations` | The form's integrations. |
| `POST` | `/forms/{form_id}/integrations` | Add one. |
| `PATCH` | `/integrations/{integration_id}` | Rename it, switch it off or on, or replace its settings. |
| `DELETE` | `/integrations/{integration_id}` | Remove it. |
| `POST` | `/integrations/{integration_id}/tests` | Post a sample submission to it now. |

The webhook URL is never returned; `config_hint` shows enough to tell two apart. One added or changed with an API key or through [MCP](/docs/mcp) sends nothing until a person confirms it in the dashboard, so an agent, or a prompt hidden in a submission, can't send your submissions somewhere new without you.