P
ProFormsDocs

Manage Webhooks

Create, list, update, archive, restore, and permanently delete inbound webhooks for a site.

â„šī¸
For details on how inbound webhooks receive and process submissions, see Inbound Webhooks.
💡
Captcha protection for inbound webhook submissions is configured at the site level, not per webhook. Set the provider in Site Settings, then all inbound webhooks for that site follow the same rule.

List Webhooks

Retrieve all inbound webhooks for a site.

sites.view
GET/v1/sites/:id/webhooks

Query Parameters

archivedstring

Show archived webhooks: true or false (default: false)

Example Request

curl
curl "https://proforms.io/api/v1/sites/s_xyz789/webhooks" \
  -H "Authorization: Bearer pf_your_api_key"

Response

200 OK
{
  "success": true,
  "data": {
    "webhooks": [
      {
        "id": "wh_abc123",
        "name": "Contact Form Webhook",
        "source": "generic",
        "isEnabled": true,
        "submissionCount": 142,
        "lastReceivedAt": "2026-02-17T09:15:00.000Z",
        "archivedAt": null,
        "webhookUrl": "https://proforms.io/api/v1/incoming/wh_abc123",
        "createdAt": "2026-01-10T10:00:00.000Z",
        "updatedAt": "2026-02-15T14:00:00.000Z"
      }
    ],
    "archivedCount": 2
  }
}

Create Webhook

Create a new inbound webhook for a site. The secret key is only returned once on creation — save it.

sites.edit
POST/v1/sites/:id/webhooks

Request Body

name*string

Webhook name (e.g. "Contact Form")

sourcestring

Source type: generic, google_ads, zapier (default: generic)

Example Request

curl
curl -X POST "https://proforms.io/api/v1/sites/s_xyz789/webhooks" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Google Ads Leads",
    "source": "google_ads"
  }'

Response

201 Created
{
  "success": true,
  "data": {
    "id": "wh_def456",
    "name": "Google Ads Leads",
    "source": "google_ads",
    "isEnabled": true,
    "secretKey": "a1b2c3d4e5f6...your_secret_key_here",
    "webhookUrl": "https://proforms.io/api/v1/incoming/wh_def456",
    "createdAt": "2026-02-17T10:00:00.000Z"
  }
}
âš ī¸
The secretKey is only returned on creation. Store it securely — it cannot be retrieved later. The GET endpoint returns a masked placeholder.

Get Webhook

Retrieve details of a single webhook.

sites.view
GET/v1/sites/:id/webhooks/:webhookId

Example Request

curl
curl "https://proforms.io/api/v1/sites/s_xyz789/webhooks/wh_abc123" \
  -H "Authorization: Bearer pf_your_api_key"

Response

200 OK
{
  "success": true,
  "data": {
    "id": "wh_abc123",
    "name": "Contact Form Webhook",
    "source": "generic",
    "isEnabled": true,
    "secretKey": "â€ĸâ€ĸâ€ĸâ€ĸâ€ĸâ€ĸâ€ĸâ€ĸ",
    "submissionCount": 142,
    "lastReceivedAt": "2026-02-17T09:15:00.000Z",
    "archivedAt": null,
    "webhookUrl": "https://proforms.io/api/v1/incoming/wh_abc123",
    "createdAt": "2026-01-10T10:00:00.000Z",
    "updatedAt": "2026-02-15T14:00:00.000Z"
  }
}

Update Webhook

Update a webhook's name, source, enabled state, or restore it from archive.

sites.edit
PUT/v1/sites/:id/webhooks/:webhookId

Request Body

namestring

Webhook name

sourcestring

Source type: generic, google_ads, zapier

isEnabledboolean

Enable or disable the webhook

restoreboolean

Set to true to restore an archived webhook

Example Request

curl
curl -X PUT "https://proforms.io/api/v1/sites/s_xyz789/webhooks/wh_abc123" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Updated Webhook Name",
    "isEnabled": false
  }'

Response

200 OK
{
  "success": true,
  "data": {
    "id": "wh_abc123",
    "name": "Updated Webhook Name",
    "source": "generic",
    "isEnabled": false,
    "submissionCount": 142,
    "lastReceivedAt": "2026-02-17T09:15:00.000Z",
    "webhookUrl": "https://proforms.io/api/v1/incoming/wh_abc123",
    "updatedAt": "2026-02-17T14:30:00.000Z"
  }
}

Archive Webhook

Soft-delete a webhook. The webhook is disabled and moved to the archive. Archived webhooks return 410 Gone when they receive submissions.

sites.delete
DELETE/v1/sites/:id/webhooks/:webhookId

Example Request

curl
curl -X DELETE "https://proforms.io/api/v1/sites/s_xyz789/webhooks/wh_abc123" \
  -H "Authorization: Bearer pf_your_api_key"

Response

200 OK
{
  "success": true,
  "data": {
    "message": "Webhook archived successfully"
  }
}
💡
To restore an archived webhook, use the Update endpoint with {"restore": true}.

Permanent Delete

Permanently delete a webhook and its auto-created form (if any). Builder-created forms are unlinked but preserved.

sites.delete
DELETE/v1/sites/:id/webhooks/:webhookId?permanent=true

Example Request

curl
curl -X DELETE "https://proforms.io/api/v1/sites/s_xyz789/webhooks/wh_abc123?permanent=true" \
  -H "Authorization: Bearer pf_your_api_key"

Response

200 OK
{
  "success": true,
  "data": {
    "message": "Webhook permanently deleted"
  }
}
âš ī¸
Permanent deletion removes the webhook and any auto-created webhook-source form (including its submissions). This action cannot be undone.