Placement tests
The Placement tests endpoints of the Kenso API.
List placement tests for a campaign, newest first
/v1/placement-testsplacement-tests.listRequires campaignId. Default sort is -createdAt. Rates are fractions from 0 to 1. Requires ReadAccess. A campaign outside the workspace is not_found.
Parameters
400 workspace_required).Response 200
data is a list of PlacementTestModel. Each item has these fields. The response also carries pagination.
openPixel: true on create, DEV-5587). Set on create and on GET /v1/placement-tests/{placementTestId}; omitted when the test carries no pixel.plusvibe. Omitted when the row has none.byProvider folder counts. Omitted when no stored provider maps to a screen bucket.weekly, on_demand or pre_launch.total is their sum.gmail, google_workspace, outlook, microsoft_365.curl -X GET "https://api.ken.so/v1/placement-tests" \ -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,
"campaignId": 812,
"inboxId": 812,
"domainId": 812,
"sequenceId": 812,
"sequenceVersionId": 812,
"status": "string",
"inboxRate": 0.5,
"spamRate": 0.5,
"categoryRate": 0.5,
"missingRate": 0.5,
"code": "string",
"openPixelHost": "string",
"provider": "string",
"dataPoints": [
{
"googleWorkspace": 0.5,
"googlePersonal": 0.5,
"outlookWorkspace": 0.5,
"outlookPersonal": 0.5
}
],
"createdAt": "2026-09-23T15:02:11Z",
"completedAt": "2026-09-23T15:02:11Z",
"type": "string",
"startedAt": "2026-09-23T15:02:11Z",
"sentCount": 1,
"failureReason": "string",
"senderInboxIds": [
812
],
"subject": "string",
"body": "string",
"counts": {
"inbox": 1,
"promotions": 1,
"other": 1,
"spam": 1,
"missing": 1,
"total": 1
},
"providers": [
{
"provider": "string",
"inbox": 1,
"promotions": 1,
"other": 1,
"spam": 1,
"missing": 1,
"total": 1
}
],
"senders": [
{
"email": "[email protected]",
"inbox": 1,
"promotions": 1,
"other": 1,
"spam": 1,
"missing": 1,
"total": 1
}
],
"seeds": [
{
"seed": "string",
"provider": "string",
"senderEmail": "[email protected]",
"placement": "string",
"folder": "string",
"detectedAt": "2026-09-23T15:02:11Z"
}
],
"errors": [
{
"message": "string",
"at": "2026-09-23T15:02:11Z"
}
],
"earlierTests": [
{
"id": 812,
"campaignId": 812,
"inboxId": 812,
"domainId": 812,
"status": "string",
"inboxRate": 0.5,
"spamRate": 0.5,
"categoryRate": 0.5,
"missingRate": 0.5,
"createdAt": "2026-09-23T15:02:11Z",
"completedAt": "2026-09-23T15:02:11Z"
}
]
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Start an inbox placement test for a campaign
/v1/placement-testsplacement-tests.createRequires Delivery edit. Exactly one of domainId or inboxId is required unless randomScope is true. Example: { "campaignId": 812, "inboxId": 44 }. Kenso pays for each test, so each call counts against a per-workspace budget: placementTestCreates (5 a minute, 20 a day, 50 in 30 days; a Free plan gets 1, 2 and 5), over it 429 rate_limited with Retry-After. Where placement_tests_public is on, the budget is placementTestCreatesPublic (2 a day, 8 in 30 days, on every plan), over it 429 quota_exceeded naming the limit, with Retry-After. Super admins are exempt. openPixel: true sends the copy with the campaign open pixel on link. or unsub. of the test's sending domain, whichever serves it; openPixelHost names the host used. No serving host, plain-text copy, or a test with the other pixel setting already running for the campaign and domain is 409 invalid_state.
Parameters
400 workspace_required).Request body
application/json, optional.
domainId unless randomScope is true.inboxId unless randomScope is true.link. or unsub. of the test's sending domain (whichever serves the pixel first), to compare placement with the pixel on and off. Default false.Response 201
data is a PlacementTestModel.
openPixel: true on create, DEV-5587). Set on create and on GET /v1/placement-tests/{placementTestId}; omitted when the test carries no pixel.plusvibe. Omitted when the row has none.byProvider folder counts. Omitted when no stored provider maps to a screen bucket.weekly, on_demand or pre_launch.total is their sum.gmail, google_workspace, outlook, microsoft_365.curl -X POST "https://api.ken.so/v1/placement-tests" \
-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 '{
"campaignId": 812,
"inboxId": 812,
"domainId": 812,
"sequenceVersionId": 812,
"sampleVariables": {
"key": "string"
},
"campaignSegmentId": 812,
"contactId": 812,
"randomSegment": true,
"randomLead": true,
"randomScope": true,
"randomCopyVersion": true,
"openPixel": true
}'{
"success": true,
"data": {
"id": 812,
"campaignId": 812,
"inboxId": 812,
"domainId": 812,
"sequenceId": 812,
"sequenceVersionId": 812,
"status": "string",
"inboxRate": 0.5,
"spamRate": 0.5,
"categoryRate": 0.5,
"missingRate": 0.5,
"code": "string",
"openPixelHost": "string",
"provider": "string",
"dataPoints": [
{
"googleWorkspace": 0.5,
"googlePersonal": 0.5,
"outlookWorkspace": 0.5,
"outlookPersonal": 0.5
}
],
"createdAt": "2026-09-23T15:02:11Z",
"completedAt": "2026-09-23T15:02:11Z",
"type": "string",
"startedAt": "2026-09-23T15:02:11Z",
"sentCount": 1,
"failureReason": "string",
"senderInboxIds": [
812
],
"subject": "string",
"body": "string",
"counts": {
"inbox": 1,
"promotions": 1,
"other": 1,
"spam": 1,
"missing": 1,
"total": 1
},
"providers": [
{
"provider": "string",
"inbox": 1,
"promotions": 1,
"other": 1,
"spam": 1,
"missing": 1,
"total": 1
}
],
"senders": [
{
"email": "[email protected]",
"inbox": 1,
"promotions": 1,
"other": 1,
"spam": 1,
"missing": 1,
"total": 1
}
],
"seeds": [
{
"seed": "string",
"provider": "string",
"senderEmail": "[email protected]",
"placement": "string",
"folder": "string",
"detectedAt": "2026-09-23T15:02:11Z"
}
],
"errors": [
{
"message": "string",
"at": "2026-09-23T15:02:11Z"
}
],
"earlierTests": [
{
"id": 812,
"campaignId": 812,
"inboxId": 812,
"domainId": 812,
"status": "string",
"inboxRate": 0.5,
"spamRate": 0.5,
"categoryRate": 0.5,
"missingRate": 0.5,
"createdAt": "2026-09-23T15:02:11Z",
"completedAt": "2026-09-23T15:02:11Z"
}
]
}
}Return one placement test with its full results
/v1/placement-tests/{placementTestId}placement-tests.getAdds what the list leaves out: type, startedAt, sentCount, senderInboxIds, the subject and body sent, counts, per providers, per senders, per seeds (masked addresses), InboxKit errors, and up to 10 earlierTests of the test's own campaign and domain (whichever are set) for a trend; a shared weekly test trends with the campaign that owns it, and an inbox test without a domain has none. Result fields are omitted until the test completes. Rates are fractions from 0 to 1. Requires ReadAccess. A test outside the workspace is not_found.
Parameters
400 workspace_required).Response 200
data is a PlacementTestModel.
openPixel: true on create, DEV-5587). Set on create and on GET /v1/placement-tests/{placementTestId}; omitted when the test carries no pixel.plusvibe. Omitted when the row has none.byProvider folder counts. Omitted when no stored provider maps to a screen bucket.weekly, on_demand or pre_launch.total is their sum.gmail, google_workspace, outlook, microsoft_365.curl -X GET "https://api.ken.so/v1/placement-tests/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,
"campaignId": 812,
"inboxId": 812,
"domainId": 812,
"sequenceId": 812,
"sequenceVersionId": 812,
"status": "string",
"inboxRate": 0.5,
"spamRate": 0.5,
"categoryRate": 0.5,
"missingRate": 0.5,
"code": "string",
"openPixelHost": "string",
"provider": "string",
"dataPoints": [
{
"googleWorkspace": 0.5,
"googlePersonal": 0.5,
"outlookWorkspace": 0.5,
"outlookPersonal": 0.5
}
],
"createdAt": "2026-09-23T15:02:11Z",
"completedAt": "2026-09-23T15:02:11Z",
"type": "string",
"startedAt": "2026-09-23T15:02:11Z",
"sentCount": 1,
"failureReason": "string",
"senderInboxIds": [
812
],
"subject": "string",
"body": "string",
"counts": {
"inbox": 1,
"promotions": 1,
"other": 1,
"spam": 1,
"missing": 1,
"total": 1
},
"providers": [
{
"provider": "string",
"inbox": 1,
"promotions": 1,
"other": 1,
"spam": 1,
"missing": 1,
"total": 1
}
],
"senders": [
{
"email": "[email protected]",
"inbox": 1,
"promotions": 1,
"other": 1,
"spam": 1,
"missing": 1,
"total": 1
}
],
"seeds": [
{
"seed": "string",
"provider": "string",
"senderEmail": "[email protected]",
"placement": "string",
"folder": "string",
"detectedAt": "2026-09-23T15:02:11Z"
}
],
"errors": [
{
"message": "string",
"at": "2026-09-23T15:02:11Z"
}
],
"earlierTests": [
{
"id": 812,
"campaignId": 812,
"inboxId": 812,
"domainId": 812,
"status": "string",
"inboxRate": 0.5,
"spamRate": 0.5,
"categoryRate": 0.5,
"missingRate": 0.5,
"createdAt": "2026-09-23T15:02:11Z",
"completedAt": "2026-09-23T15:02:11Z"
}
]
}
}