curl --request GET \
--url https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/split-results \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/split-results"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/split-results', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"splits": [
{
"splitStepId": "6a8dce2ef83628aea1088041",
"arms": [
{
"key": "a",
"label": "Email first",
"weight": 50
},
{
"key": "b",
"label": "LinkedIn first",
"weight": 50
}
],
"weightsChangedAt": null,
"waiting": 0,
"allTime": {
"entered": 200,
"replied": 9,
"isSmallSample": true,
"arms": [
{
"key": "a",
"entered": 101,
"share": 0.505,
"reached": 98,
"invitesSent": 0,
"invitesAccepted": 0,
"acceptanceRate": null,
"replied": 3,
"replyRate": 0.0297,
"positiveReplies": 1,
"positiveReplyRate": 0.0099,
"meetingsBooked": 1,
"meetingRate": 0.0099,
"bounced": 2,
"unsubscribed": 1
},
{
"key": "b",
"entered": 99,
"share": 0.495,
"reached": 90,
"invitesSent": 90,
"invitesAccepted": 21,
"acceptanceRate": 0.2333,
"replied": 6,
"replyRate": 0.0606,
"positiveReplies": 2,
"positiveReplyRate": 0.0202,
"meetingsBooked": 1,
"meetingRate": 0.0101,
"bounced": 0,
"unsubscribed": 0
}
]
},
"sinceChange": null,
"replySeries": [
{
"date": "Aug 31",
"isoDate": "2026-08-31",
"a": 1,
"b": 1
},
{
"date": "Sep 7",
"isoDate": "2026-09-07",
"a": 1,
"b": 3
},
{
"date": "Sep 14",
"isoDate": "2026-09-14",
"a": 1,
"b": 2
}
]
}
]
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Per-arm results of a campaign's A/B splits
For each A/B split in the campaign’s sequence: per arm, the leads routed to it and their share, the leads it reached, LinkedIn invitations sent and accepted, human replies, positive replies and meetings booked (rates are per lead routed), bounces and unsubscribes; for all time and, once the split’s weights changed on the running campaign, for the leads the split routed since (leads the change moved to the other arm count in all time only, in their new arm). Each split also carries replySeries, its replies per arm over time. since and to keep only the leads that entered an arm in that range; leads waiting at a split are counted whatever the range. A lead counts in the arm it is in, whatever step it replied to. There is no winner and no significance test: isSmallSample is true below 20 replies across both arms, where a gap is most likely chance. Only the token owner’s own campaigns resolve here. Rate limit: 30 requests/minute and 1,000/day per token owner, shared by every campaign, scheduled-send, campaign-template and knowledge-hub endpoint.
Errors:
404CAMPAIGN_NOT_FOUND— No campaign with this id exists, it belongs to another account (including a campaign delegated to you or shared by your team’s visibility settings), or it has been deleted.422VALIDATION_FAILED— campaignId is not a 24-character hex id, since or to is not an ISO 8601 date-time, since is in the future, to is earlier than since, or timezone is not a known IANA name.429RATE_LIMITED— More than 30 campaign requests in a minute, or 1,000 in a day, for this token owner (the bucket is shared by every /business/campaigns, /business/scheduled-sends, /business/campaign-templates and /business/knowledge-hubs call).500UNEXPECTED_ERROR— An unhandled failure; the detail stays in our logs and is never returned.
Requires one of the following token scopes: campaigns.
curl --request GET \
--url https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/split-results \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/split-results"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/split-results', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"splits": [
{
"splitStepId": "6a8dce2ef83628aea1088041",
"arms": [
{
"key": "a",
"label": "Email first",
"weight": 50
},
{
"key": "b",
"label": "LinkedIn first",
"weight": 50
}
],
"weightsChangedAt": null,
"waiting": 0,
"allTime": {
"entered": 200,
"replied": 9,
"isSmallSample": true,
"arms": [
{
"key": "a",
"entered": 101,
"share": 0.505,
"reached": 98,
"invitesSent": 0,
"invitesAccepted": 0,
"acceptanceRate": null,
"replied": 3,
"replyRate": 0.0297,
"positiveReplies": 1,
"positiveReplyRate": 0.0099,
"meetingsBooked": 1,
"meetingRate": 0.0099,
"bounced": 2,
"unsubscribed": 1
},
{
"key": "b",
"entered": 99,
"share": 0.495,
"reached": 90,
"invitesSent": 90,
"invitesAccepted": 21,
"acceptanceRate": 0.2333,
"replied": 6,
"replyRate": 0.0606,
"positiveReplies": 2,
"positiveReplyRate": 0.0202,
"meetingsBooked": 1,
"meetingRate": 0.0101,
"bounced": 0,
"unsubscribed": 0
}
]
},
"sinceChange": null,
"replySeries": [
{
"date": "Aug 31",
"isoDate": "2026-08-31",
"a": 1,
"b": 1
},
{
"date": "Sep 7",
"isoDate": "2026-09-07",
"a": 1,
"b": 3
},
{
"date": "Sep 14",
"isoDate": "2026-09-14",
"a": 1,
"b": 2
}
]
}
]
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Authorizations
Your API token (af_…) as the Basic-auth username, with an empty password.
Path Parameters
The campaign's id (24-character hex ObjectId), as returned by POST /business/campaigns or as the campaignId of a GET /business/campaigns row.
Query Parameters
ISO 8601 date-time: count only the leads that entered an arm at or after it. Default: since the campaign started.
ISO 8601 date-time, not earlier than since: count only the leads that entered an arm at or before it. Default: up to now.
IANA timezone name (e.g. Europe/Kyiv, America/New_York) whose calendar days replySeries is bucketed by. Offsets such as +03:00 are rejected. Default: UTC.
64Response
Success
Show child attributes
Show child attributes