Inbound webhooks
Webhook URLs on a campaign that send leads into Kenso from your own tools, with field mapping and recent deliveries.
List a campaign's inbound webhooks in the current workspace
/v1/campaigns/{campaignId}/inbound-webhooksinbound-webhooks.listOrdered by id. Read-only. Requires ReadAccess.
Parameters
400 workspace_required).Response 200
data is a list of InboundWebhookModel. Each item has these fields. The response also carries pagination.
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).campaign webhook feeds; omitted for the other kinds.people webhook's form preset, when it was created from one, or a website webhook's provider.people webhook's sending app: zapier, make or n8n. Omitted when none.people webhook creates. Omitted: the workspace's intake settings decide.people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.people webhook created. Omitted for a campaign webhook.people webhook matched and updated. Omitted for a campaign webhook.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"
{
"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
/v1/campaigns/{campaignId}/inbound-webhooksinbound-webhooks.createReturns 201 and Location. Requires the integrations permission (admins by default).
Parameters
400 workspace_required).Request body
application/json, optional.
hubspot_forms, typeform, webflow, tally, rb2b, vector, generic, zapier, make, n8n); fills Ken.Scraper.API.Dtos.CreateInboundWebhookRequest.Mapping when that is empty.campaign or people. Optional: the route decides it (under a campaign, campaign; at the workspace level, people), and a different value is 400.people webhook's sending app: zapier, make or n8n. The zapier, make and n8n presets set it.people webhook only: the member who owns the people it creates. Omit it to let the intake settings decide.people webhook only: false never creates the person's account; true or omitted, the intake settings decide.Response 201
data is a InboundWebhookModel.
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).campaign webhook feeds; omitted for the other kinds.people webhook's form preset, when it was created from one, or a website webhook's provider.people webhook's sending app: zapier, make or n8n. Omitted when none.people webhook creates. Omitted: the workspace's intake settings decide.people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.people webhook created. Omitted for a campaign webhook.people webhook matched and updated. Omitted for a campaign webhook.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
}'{
"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
/v1/inbound-webhooksinbound-webhooks.list-people-sourcesNeeds 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.
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
400 workspace_required).Response 200
data is a list of InboundWebhookModel. Each item has these fields. The response also carries pagination.
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).campaign webhook feeds; omitted for the other kinds.people webhook's form preset, when it was created from one, or a website webhook's provider.people webhook's sending app: zapier, make or n8n. Omitted when none.people webhook creates. Omitted: the workspace's intake settings decide.people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.people webhook created. Omitted for a campaign webhook.people webhook matched and updated. Omitted for a campaign webhook.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"
{
"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
/v1/inbound-webhooksinbound-webhooks.create-people-sourceNeeds 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.
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
400 workspace_required).Request body
application/json, optional.
hubspot_forms, typeform, webflow, tally, rb2b, vector, generic, zapier, make, n8n); fills Ken.Scraper.API.Dtos.CreateInboundWebhookRequest.Mapping when that is empty.campaign or people. Optional: the route decides it (under a campaign, campaign; at the workspace level, people), and a different value is 400.people webhook's sending app: zapier, make or n8n. The zapier, make and n8n presets set it.people webhook only: the member who owns the people it creates. Omit it to let the intake settings decide.people webhook only: false never creates the person's account; true or omitted, the intake settings decide.Response 201
data is a InboundWebhookModel.
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).campaign webhook feeds; omitted for the other kinds.people webhook's form preset, when it was created from one, or a website webhook's provider.people webhook's sending app: zapier, make or n8n. Omitted when none.people webhook creates. Omitted: the workspace's intake settings decide.people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.people webhook created. Omitted for a campaign webhook.people webhook matched and updated. Omitted for a campaign webhook.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
}'{
"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
/v1/inbound-webhooks/{inboundWebhookId}inbound-webhooks.getA missing or cross-workspace id is not_found. Requires ReadAccess.
Parameters
400 workspace_required).Response 200
data is a InboundWebhookModel.
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).campaign webhook feeds; omitted for the other kinds.people webhook's form preset, when it was created from one, or a website webhook's provider.people webhook's sending app: zapier, make or n8n. Omitted when none.people webhook creates. Omitted: the workspace's intake settings decide.people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.people webhook created. Omitted for a campaign webhook.people webhook matched and updated. Omitted for a campaign webhook.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"
{
"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
/v1/inbound-webhooks/{inboundWebhookId}inbound-webhooks.updateAbsent 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
400 workspace_required).Request body
application/json, optional.
people webhook only: zapier, make or n8n, or null to clear it.people webhook only: a member of the workspace, or null to clear it.people webhook only: true or false.workflow webhook only: true or false.Response 200
data is a InboundWebhookModel.
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).campaign webhook feeds; omitted for the other kinds.people webhook's form preset, when it was created from one, or a website webhook's provider.people webhook's sending app: zapier, make or n8n. Omitted when none.people webhook creates. Omitted: the workspace's intake settings decide.people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.people webhook created. Omitted for a campaign webhook.people webhook matched and updated. Omitted for a campaign webhook.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
}'{
"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
/v1/inbound-webhooks/{inboundWebhookId}inbound-webhooks.deleteRequires the integrations permission (admins by default). Returns 204.
Parameters
400 workspace_required).Response 204
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"
HTTP/1.1 204 No Content
Rotate the ingest token
/v1/inbound-webhooks/{inboundWebhookId}/rotate-tokeninbound-webhooks.rotate-tokenThe previous URL stops working immediately.
Requires the integrations permission (admins by default).
Parameters
400 workspace_required).Response 200
data is a InboundWebhookModel.
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).campaign webhook feeds; omitted for the other kinds.people webhook's form preset, when it was created from one, or a website webhook's provider.people webhook's sending app: zapier, make or n8n. Omitted when none.people webhook creates. Omitted: the workspace's intake settings decide.people webhook's account choice: false never creates the person's account; omitted, the workspace's intake settings decide.people webhook created. Omitted for a campaign webhook.people webhook matched and updated. Omitted for a campaign webhook.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"
{
"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
/v1/inbound-webhooks/{inboundWebhookId}/test-mappinginbound-webhooks.test-mappingDoes not create a lead. Requires the integrations permission (admins by default).
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a InboundWebhookMappingTestModel.
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
}
}
]
}'{
"success": true,
"data": {
"resolvedFields": {
"key": "string"
},
"resolvedCustomVariables": {
"key": "string"
},
"unresolvedPaths": [
"string"
],
"wouldBeAccepted": true,
"rejectionReason": "string"
}
}List recent deliveries for an inbound webhook
/v1/inbound-webhooks/{inboundWebhookId}/deliveriesinbound-webhooks.deliveriesThe delivery log has no numeric id, so this window uses limit (1 to 100, default 100) and omits totalCount. Requires ReadAccess.
Parameters
400 workspace_required).Response 200
data is a list of InboundWebhookDeliveryModel. Each item has these fields. The response also carries pagination.
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"
{
"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
}
}