Kenso

Inbound webhooks

Webhook URLs on a campaign that send leads into Kenso from your own tools, with field mapping and recent deliveries.

Webhooks and events10 endpointsKen-Version: 2026-11-02AuthenticationWorkspacesErrors

List a campaign's inbound webhooks in the current workspace

GET/v1/campaigns/{campaignId}/inbound-webhooksinbound-webhooks.list

Try it on developer.ken.so

Ordered by id. Read-only. Requires ReadAccess.

Parameters

Name
In
Type
Required
Description
campaignId
In: path
integer (int64)
required
limit
In: query
integer (int32)
optional
cursor
In: query
string
optional
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a list of InboundWebhookModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
id
integer (int64)
kind
string
campaign (each delivery uploads a lead to its campaign), people (each delivery creates or updates a person) or website (the site's rb2b, Vector, Snitcher or Warmly webhook: each delivery records a website visit; set up through PATCH /v1/website).
campaignId
integer (int64)
The campaign a campaign webhook feeds; omitted for the other kinds.
name
string
url
string
samplePayloadJson
string
mapping
array of WebhookAssignment
status
string
lastReceivedAt
string (date-time)
acceptedCount
integer (int64)
rejectedCount
integer (int64)
preset
string
A people webhook's form preset, when it was created from one, or a website webhook's provider.
app
string
A people webhook's sending app: zapier, make or n8n. Omitted when none.
defaultOwnerMemberId
integer (int64)
The member who owns the people a people webhook creates. Omitted: the workspace's intake settings decide.
createAccounts
boolean
A people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.
peopleCreated
integer (int64)
People a people webhook created. Omitted for a campaign webhook.
peopleUpdated
integer (int64)
People a people webhook matched and updated. Omitted for a campaign webhook.
Request
curl -X GET "https://api.ken.so/v1/campaigns/812/inbound-webhooks?limit=1" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
Response 200
{
  "success": true,
  "data": [
    {
      "id": 812,
      "kind": "string",
      "campaignId": 812,
      "name": "string",
      "url": "https://example.com",
      "samplePayloadJson": "string",
      "mapping": [
        {
          "target": "string",
          "variableName": "string",
          "useAsAiContext": true,
          "fallback": true,
          "source": {
            "kind": "string",
            "path": "string",
            "value": "string",
            "labelPath": "string",
            "valuePath": "string",
            "label": "string",
            "labelsPath": "string",
            "idPath": "string",
            "index": 1
          }
        }
      ],
      "status": "string",
      "lastReceivedAt": "2026-09-23T15:02:11Z",
      "acceptedCount": 1,
      "rejectedCount": 1,
      "preset": "string",
      "app": "string",
      "defaultOwnerMemberId": 812,
      "createAccounts": true,
      "peopleCreated": 1,
      "peopleUpdated": 1
    }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6ODE1fQ",
    "hasMore": true,
    "total": 1,
    "isTotalCapped": true
  }
}

Create an inbound webhook on a campaign in the current workspace

POST/v1/campaigns/{campaignId}/inbound-webhooksinbound-webhooks.create

Try it on developer.ken.so

Returns 201 and Location. Requires the integrations permission (admins by default).

Parameters

Name
In
Type
Required
Description
campaignId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
name
string
optional
samplePayloadJson
string
optional
mapping
array of WebhookAssignment
optional
preset
string
optional
A preset (hubspot_forms, typeform, webflow, tally, rb2b, vector, generic, zapier, make, n8n); fills Ken.Scraper.API.Dtos.CreateInboundWebhookRequest.Mapping when that is empty.
kind
string
optional
campaign or people. Optional: the route decides it (under a campaign, campaign; at the workspace level, people), and a different value is 400.
app
string
optional
A people webhook's sending app: zapier, make or n8n. The zapier, make and n8n presets set it.
defaultOwnerMemberId
integer (int64)
optional
A people webhook only: the member who owns the people it creates. Omit it to let the intake settings decide.
createAccounts
boolean
optional
A people webhook only: false never creates the person's account; true or omitted, the intake settings decide.

Response 201

data is a InboundWebhookModel.

Field
Type
Description
id
integer (int64)
kind
string
campaign (each delivery uploads a lead to its campaign), people (each delivery creates or updates a person) or website (the site's rb2b, Vector, Snitcher or Warmly webhook: each delivery records a website visit; set up through PATCH /v1/website).
campaignId
integer (int64)
The campaign a campaign webhook feeds; omitted for the other kinds.
name
string
url
string
samplePayloadJson
string
mapping
array of WebhookAssignment
status
string
lastReceivedAt
string (date-time)
acceptedCount
integer (int64)
rejectedCount
integer (int64)
preset
string
A people webhook's form preset, when it was created from one, or a website webhook's provider.
app
string
A people webhook's sending app: zapier, make or n8n. Omitted when none.
defaultOwnerMemberId
integer (int64)
The member who owns the people a people webhook creates. Omitted: the workspace's intake settings decide.
createAccounts
boolean
A people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.
peopleCreated
integer (int64)
People a people webhook created. Omitted for a campaign webhook.
peopleUpdated
integer (int64)
People a people webhook matched and updated. Omitted for a campaign webhook.
Request
curl -X POST "https://api.ken.so/v1/campaigns/812/inbound-webhooks" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "samplePayloadJson": "string",
  "mapping": [
    {
      "target": "string",
      "variableName": "string",
      "useAsAiContext": true,
      "fallback": true,
      "source": {
        "kind": "string",
        "path": "string",
        "value": "string",
        "labelPath": "string",
        "valuePath": "string",
        "label": "string",
        "labelsPath": "string",
        "idPath": "string",
        "index": 1
      }
    }
  ],
  "preset": "string",
  "kind": "string",
  "app": "string",
  "defaultOwnerMemberId": 812,
  "createAccounts": true
}'
Response 201
{
  "success": true,
  "data": {
    "id": 812,
    "kind": "string",
    "campaignId": 812,
    "name": "string",
    "url": "https://example.com",
    "samplePayloadJson": "string",
    "mapping": [
      {
        "target": "string",
        "variableName": "string",
        "useAsAiContext": true,
        "fallback": true,
        "source": {
          "kind": "string",
          "path": "string",
          "value": "string",
          "labelPath": "string",
          "valuePath": "string",
          "label": "string",
          "labelsPath": "string",
          "idPath": "string",
          "index": 1
        }
      }
    ],
    "status": "string",
    "lastReceivedAt": "2026-09-23T15:02:11Z",
    "acceptedCount": 1,
    "rejectedCount": 1,
    "preset": "string",
    "app": "string",
    "defaultOwnerMemberId": 812,
    "createAccounts": true,
    "peopleCreated": 1,
    "peopleUpdated": 1
  }
}

List the workspace's people webhooks

GET/v1/inbound-webhooksinbound-webhooks.list-people-sources

Needs the accounts feature on your workspace. Until it is on, calls answer 404. Needs the lead_intake feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

A people webhook runs lead intake on every delivery: it creates or updates a person (source form for the form presets, visitor for rb2b and vector, else webhook). Ordered by id. A campaign's webhooks are listed under the campaign. Requires the accounts and lead_intake features. Read-only. Requires ReadAccess.

Parameters

Name
In
Type
Required
Description
limit
In: query
integer (int32)
optional
cursor
In: query
string
optional
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a list of InboundWebhookModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
id
integer (int64)
kind
string
campaign (each delivery uploads a lead to its campaign), people (each delivery creates or updates a person) or website (the site's rb2b, Vector, Snitcher or Warmly webhook: each delivery records a website visit; set up through PATCH /v1/website).
campaignId
integer (int64)
The campaign a campaign webhook feeds; omitted for the other kinds.
name
string
url
string
samplePayloadJson
string
mapping
array of WebhookAssignment
status
string
lastReceivedAt
string (date-time)
acceptedCount
integer (int64)
rejectedCount
integer (int64)
preset
string
A people webhook's form preset, when it was created from one, or a website webhook's provider.
app
string
A people webhook's sending app: zapier, make or n8n. Omitted when none.
defaultOwnerMemberId
integer (int64)
The member who owns the people a people webhook creates. Omitted: the workspace's intake settings decide.
createAccounts
boolean
A people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.
peopleCreated
integer (int64)
People a people webhook created. Omitted for a campaign webhook.
peopleUpdated
integer (int64)
People a people webhook matched and updated. Omitted for a campaign webhook.
Request
curl -X GET "https://api.ken.so/v1/inbound-webhooks?limit=1" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
Response 200
{
  "success": true,
  "data": [
    {
      "id": 812,
      "kind": "string",
      "campaignId": 812,
      "name": "string",
      "url": "https://example.com",
      "samplePayloadJson": "string",
      "mapping": [
        {
          "target": "string",
          "variableName": "string",
          "useAsAiContext": true,
          "fallback": true,
          "source": {
            "kind": "string",
            "path": "string",
            "value": "string",
            "labelPath": "string",
            "valuePath": "string",
            "label": "string",
            "labelsPath": "string",
            "idPath": "string",
            "index": 1
          }
        }
      ],
      "status": "string",
      "lastReceivedAt": "2026-09-23T15:02:11Z",
      "acceptedCount": 1,
      "rejectedCount": 1,
      "preset": "string",
      "app": "string",
      "defaultOwnerMemberId": 812,
      "createAccounts": true,
      "peopleCreated": 1,
      "peopleUpdated": 1
    }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6ODE1fQ",
    "hasMore": true,
    "total": 1,
    "isTotalCapped": true
  }
}

Create a people webhook in the current workspace

POST/v1/inbound-webhooksinbound-webhooks.create-people-source

Needs the accounts feature on your workspace. Until it is on, calls answer 404. Needs the lead_intake feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

Returns 201 and Location. Each delivery to its URL creates or updates a person. name is required. Give a preset (hubspot_forms, typeform, webflow, tally, rb2b, vector, generic, zapier, make, n8n) or a mapping that maps email, profile_url, or a name with company_domain. zapier, make and n8n are the generic flat keys and set app; an app alone uses them too. defaultOwnerMemberId must be a workspace member. Requires the accounts and lead_intake features. Requires the integrations permission (admins by default).

Parameters

Name
In
Type
Required
Description
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
name
string
optional
samplePayloadJson
string
optional
mapping
array of WebhookAssignment
optional
preset
string
optional
A preset (hubspot_forms, typeform, webflow, tally, rb2b, vector, generic, zapier, make, n8n); fills Ken.Scraper.API.Dtos.CreateInboundWebhookRequest.Mapping when that is empty.
kind
string
optional
campaign or people. Optional: the route decides it (under a campaign, campaign; at the workspace level, people), and a different value is 400.
app
string
optional
A people webhook's sending app: zapier, make or n8n. The zapier, make and n8n presets set it.
defaultOwnerMemberId
integer (int64)
optional
A people webhook only: the member who owns the people it creates. Omit it to let the intake settings decide.
createAccounts
boolean
optional
A people webhook only: false never creates the person's account; true or omitted, the intake settings decide.

Response 201

data is a InboundWebhookModel.

Field
Type
Description
id
integer (int64)
kind
string
campaign (each delivery uploads a lead to its campaign), people (each delivery creates or updates a person) or website (the site's rb2b, Vector, Snitcher or Warmly webhook: each delivery records a website visit; set up through PATCH /v1/website).
campaignId
integer (int64)
The campaign a campaign webhook feeds; omitted for the other kinds.
name
string
url
string
samplePayloadJson
string
mapping
array of WebhookAssignment
status
string
lastReceivedAt
string (date-time)
acceptedCount
integer (int64)
rejectedCount
integer (int64)
preset
string
A people webhook's form preset, when it was created from one, or a website webhook's provider.
app
string
A people webhook's sending app: zapier, make or n8n. Omitted when none.
defaultOwnerMemberId
integer (int64)
The member who owns the people a people webhook creates. Omitted: the workspace's intake settings decide.
createAccounts
boolean
A people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.
peopleCreated
integer (int64)
People a people webhook created. Omitted for a campaign webhook.
peopleUpdated
integer (int64)
People a people webhook matched and updated. Omitted for a campaign webhook.
Request
curl -X POST "https://api.ken.so/v1/inbound-webhooks" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "samplePayloadJson": "string",
  "mapping": [
    {
      "target": "string",
      "variableName": "string",
      "useAsAiContext": true,
      "fallback": true,
      "source": {
        "kind": "string",
        "path": "string",
        "value": "string",
        "labelPath": "string",
        "valuePath": "string",
        "label": "string",
        "labelsPath": "string",
        "idPath": "string",
        "index": 1
      }
    }
  ],
  "preset": "string",
  "kind": "string",
  "app": "string",
  "defaultOwnerMemberId": 812,
  "createAccounts": true
}'
Response 201
{
  "success": true,
  "data": {
    "id": 812,
    "kind": "string",
    "campaignId": 812,
    "name": "string",
    "url": "https://example.com",
    "samplePayloadJson": "string",
    "mapping": [
      {
        "target": "string",
        "variableName": "string",
        "useAsAiContext": true,
        "fallback": true,
        "source": {
          "kind": "string",
          "path": "string",
          "value": "string",
          "labelPath": "string",
          "valuePath": "string",
          "label": "string",
          "labelsPath": "string",
          "idPath": "string",
          "index": 1
        }
      }
    ],
    "status": "string",
    "lastReceivedAt": "2026-09-23T15:02:11Z",
    "acceptedCount": 1,
    "rejectedCount": 1,
    "preset": "string",
    "app": "string",
    "defaultOwnerMemberId": 812,
    "createAccounts": true,
    "peopleCreated": 1,
    "peopleUpdated": 1
  }
}

Return one inbound webhook in the current workspace

GET/v1/inbound-webhooks/{inboundWebhookId}inbound-webhooks.get

Try it on developer.ken.so

A missing or cross-workspace id is not_found. Requires ReadAccess.

Parameters

Name
In
Type
Required
Description
inboundWebhookId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a InboundWebhookModel.

Field
Type
Description
id
integer (int64)
kind
string
campaign (each delivery uploads a lead to its campaign), people (each delivery creates or updates a person) or website (the site's rb2b, Vector, Snitcher or Warmly webhook: each delivery records a website visit; set up through PATCH /v1/website).
campaignId
integer (int64)
The campaign a campaign webhook feeds; omitted for the other kinds.
name
string
url
string
samplePayloadJson
string
mapping
array of WebhookAssignment
status
string
lastReceivedAt
string (date-time)
acceptedCount
integer (int64)
rejectedCount
integer (int64)
preset
string
A people webhook's form preset, when it was created from one, or a website webhook's provider.
app
string
A people webhook's sending app: zapier, make or n8n. Omitted when none.
defaultOwnerMemberId
integer (int64)
The member who owns the people a people webhook creates. Omitted: the workspace's intake settings decide.
createAccounts
boolean
A people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.
peopleCreated
integer (int64)
People a people webhook created. Omitted for a campaign webhook.
peopleUpdated
integer (int64)
People a people webhook matched and updated. Omitted for a campaign webhook.
Request
curl -X GET "https://api.ken.so/v1/inbound-webhooks/812" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
Response 200
{
  "success": true,
  "data": {
    "id": 812,
    "kind": "string",
    "campaignId": 812,
    "name": "string",
    "url": "https://example.com",
    "samplePayloadJson": "string",
    "mapping": [
      {
        "target": "string",
        "variableName": "string",
        "useAsAiContext": true,
        "fallback": true,
        "source": {
          "kind": "string",
          "path": "string",
          "value": "string",
          "labelPath": "string",
          "valuePath": "string",
          "label": "string",
          "labelsPath": "string",
          "idPath": "string",
          "index": 1
        }
      }
    ],
    "status": "string",
    "lastReceivedAt": "2026-09-23T15:02:11Z",
    "acceptedCount": 1,
    "rejectedCount": 1,
    "preset": "string",
    "app": "string",
    "defaultOwnerMemberId": 812,
    "createAccounts": true,
    "peopleCreated": 1,
    "peopleUpdated": 1
  }
}

Update an inbound webhook

PATCH/v1/inbound-webhooks/{inboundWebhookId}inbound-webhooks.update

Try it on developer.ken.so

Absent fields stay unchanged. Requires the integrations permission (admins by default). A people webhook also takes app (zapier, make or n8n, or null to clear it), defaultOwnerMemberId (a workspace member, else invalid_member; null clears it) and createAccounts (true or false), keeping its URL, preset and people counters; another kind refuses them with 400 naming the field. createPerson is a workflow webhook's, set on its webhook trigger, so here it is refused the same way. A website source (kind website) follows the site's visitor-ID provider, set in Settings > Integrations: the next PATCH /v1/website that names a provider resumes it and resets its mapping to that provider's preset. Set the site's provider to none to stop it.

Parameters

Name
In
Type
Required
Description
inboundWebhookId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
name
string
optional
samplePayloadJson
string
optional
mapping
array of WebhookAssignment
optional
status
string
optional
app
string
optional
A people webhook only: zapier, make or n8n, or null to clear it.
defaultOwnerMemberId
integer (int64)
optional
A people webhook only: a member of the workspace, or null to clear it.
createAccounts
boolean
optional
A people webhook only: true or false.
createPerson
boolean
optional
A workflow webhook only: true or false.

Response 200

data is a InboundWebhookModel.

Field
Type
Description
id
integer (int64)
kind
string
campaign (each delivery uploads a lead to its campaign), people (each delivery creates or updates a person) or website (the site's rb2b, Vector, Snitcher or Warmly webhook: each delivery records a website visit; set up through PATCH /v1/website).
campaignId
integer (int64)
The campaign a campaign webhook feeds; omitted for the other kinds.
name
string
url
string
samplePayloadJson
string
mapping
array of WebhookAssignment
status
string
lastReceivedAt
string (date-time)
acceptedCount
integer (int64)
rejectedCount
integer (int64)
preset
string
A people webhook's form preset, when it was created from one, or a website webhook's provider.
app
string
A people webhook's sending app: zapier, make or n8n. Omitted when none.
defaultOwnerMemberId
integer (int64)
The member who owns the people a people webhook creates. Omitted: the workspace's intake settings decide.
createAccounts
boolean
A people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.
peopleCreated
integer (int64)
People a people webhook created. Omitted for a campaign webhook.
peopleUpdated
integer (int64)
People a people webhook matched and updated. Omitted for a campaign webhook.
Request
curl -X PATCH "https://api.ken.so/v1/inbound-webhooks/812" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "samplePayloadJson": "string",
  "mapping": [
    {
      "target": "string",
      "variableName": "string",
      "useAsAiContext": true,
      "fallback": true,
      "source": {
        "kind": "string",
        "path": "string",
        "value": "string",
        "labelPath": "string",
        "valuePath": "string",
        "label": "string",
        "labelsPath": "string",
        "idPath": "string",
        "index": 1
      }
    }
  ],
  "status": "string",
  "app": "string",
  "defaultOwnerMemberId": 812,
  "createAccounts": true,
  "createPerson": true
}'
Response 200
{
  "success": true,
  "data": {
    "id": 812,
    "kind": "string",
    "campaignId": 812,
    "name": "string",
    "url": "https://example.com",
    "samplePayloadJson": "string",
    "mapping": [
      {
        "target": "string",
        "variableName": "string",
        "useAsAiContext": true,
        "fallback": true,
        "source": {
          "kind": "string",
          "path": "string",
          "value": "string",
          "labelPath": "string",
          "valuePath": "string",
          "label": "string",
          "labelsPath": "string",
          "idPath": "string",
          "index": 1
        }
      }
    ],
    "status": "string",
    "lastReceivedAt": "2026-09-23T15:02:11Z",
    "acceptedCount": 1,
    "rejectedCount": 1,
    "preset": "string",
    "app": "string",
    "defaultOwnerMemberId": 812,
    "createAccounts": true,
    "peopleCreated": 1,
    "peopleUpdated": 1
  }
}

Soft-delete an inbound webhook

DELETE/v1/inbound-webhooks/{inboundWebhookId}inbound-webhooks.delete

Try it on developer.ken.so

Requires the integrations permission (admins by default). Returns 204.

Parameters

Name
In
Type
Required
Description
inboundWebhookId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 204

Request
curl -X DELETE "https://api.ken.so/v1/inbound-webhooks/812" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
Response 204
HTTP/1.1 204 No Content

Rotate the ingest token

POST/v1/inbound-webhooks/{inboundWebhookId}/rotate-tokeninbound-webhooks.rotate-token

Try it on developer.ken.so

The previous URL stops working immediately.

Requires the integrations permission (admins by default).

Parameters

Name
In
Type
Required
Description
inboundWebhookId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a InboundWebhookModel.

Field
Type
Description
id
integer (int64)
kind
string
campaign (each delivery uploads a lead to its campaign), people (each delivery creates or updates a person) or website (the site's rb2b, Vector, Snitcher or Warmly webhook: each delivery records a website visit; set up through PATCH /v1/website).
campaignId
integer (int64)
The campaign a campaign webhook feeds; omitted for the other kinds.
name
string
url
string
samplePayloadJson
string
mapping
array of WebhookAssignment
status
string
lastReceivedAt
string (date-time)
acceptedCount
integer (int64)
rejectedCount
integer (int64)
preset
string
A people webhook's form preset, when it was created from one, or a website webhook's provider.
app
string
A people webhook's sending app: zapier, make or n8n. Omitted when none.
defaultOwnerMemberId
integer (int64)
The member who owns the people a people webhook creates. Omitted: the workspace's intake settings decide.
createAccounts
boolean
A people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.
peopleCreated
integer (int64)
People a people webhook created. Omitted for a campaign webhook.
peopleUpdated
integer (int64)
People a people webhook matched and updated. Omitted for a campaign webhook.
Request
curl -X POST "https://api.ken.so/v1/inbound-webhooks/812/rotate-token" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
Response 200
{
  "success": true,
  "data": {
    "id": 812,
    "kind": "string",
    "campaignId": 812,
    "name": "string",
    "url": "https://example.com",
    "samplePayloadJson": "string",
    "mapping": [
      {
        "target": "string",
        "variableName": "string",
        "useAsAiContext": true,
        "fallback": true,
        "source": {
          "kind": "string",
          "path": "string",
          "value": "string",
          "labelPath": "string",
          "valuePath": "string",
          "label": "string",
          "labelsPath": "string",
          "idPath": "string",
          "index": 1
        }
      }
    ],
    "status": "string",
    "lastReceivedAt": "2026-09-23T15:02:11Z",
    "acceptedCount": 1,
    "rejectedCount": 1,
    "preset": "string",
    "app": "string",
    "defaultOwnerMemberId": 812,
    "createAccounts": true,
    "peopleCreated": 1,
    "peopleUpdated": 1
  }
}

Dry-run a mapping against a sample payload

POST/v1/inbound-webhooks/{inboundWebhookId}/test-mappinginbound-webhooks.test-mapping

Try it on developer.ken.so

Does not create a lead. Requires the integrations permission (admins by default).

Parameters

Name
In
Type
Required
Description
inboundWebhookId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
samplePayloadJson
string
optional
mapping
array of WebhookAssignment
optional

Response 200

data is a InboundWebhookMappingTestModel.

Field
Type
Description
resolvedFields
map of string
resolvedCustomVariables
map of string
unresolvedPaths
array of string
wouldBeAccepted
boolean
rejectionReason
string
Request
curl -X POST "https://api.ken.so/v1/inbound-webhooks/812/test-mapping" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "samplePayloadJson": "string",
  "mapping": [
    {
      "target": "string",
      "variableName": "string",
      "useAsAiContext": true,
      "fallback": true,
      "source": {
        "kind": "string",
        "path": "string",
        "value": "string",
        "labelPath": "string",
        "valuePath": "string",
        "label": "string",
        "labelsPath": "string",
        "idPath": "string",
        "index": 1
      }
    }
  ]
}'
Response 200
{
  "success": true,
  "data": {
    "resolvedFields": {
      "key": "string"
    },
    "resolvedCustomVariables": {
      "key": "string"
    },
    "unresolvedPaths": [
      "string"
    ],
    "wouldBeAccepted": true,
    "rejectionReason": "string"
  }
}

List recent deliveries for an inbound webhook

GET/v1/inbound-webhooks/{inboundWebhookId}/deliveriesinbound-webhooks.deliveries

Try it on developer.ken.so

The delivery log has no numeric id, so this window uses limit (1 to 100, default 100) and omits totalCount. Requires ReadAccess.

Parameters

Name
In
Type
Required
Description
inboundWebhookId
In: path
integer (int64)
required
limit
In: query
integer (int32)
optional
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a list of InboundWebhookDeliveryModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
receivedAt
string (date-time)
outcome
string
reason
string
httpStatus
integer (int32)
body
string
Request
curl -X GET "https://api.ken.so/v1/inbound-webhooks/812/deliveries?limit=1" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
Response 200
{
  "success": true,
  "data": [
    {
      "receivedAt": "2026-09-23T15:02:11Z",
      "outcome": "string",
      "reason": "string",
      "httpStatus": 1,
      "body": "string"
    }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6ODE1fQ",
    "hasMore": true,
    "total": 1,
    "isTotalCapped": true
  }
}