curl --request GET \
--url https://{subdomain}.conveyour.com/api/schedule \
--header 'x-conveyour-token: <api-key>'const options = {method: 'GET', headers: {'x-conveyour-token': '<api-key>'}};
fetch('https://{subdomain}.conveyour.com/api/schedule', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {method: 'GET', headers: {'x-conveyour-token': '<api-key>'}};
fetch('https://{subdomain}.conveyour.com/api/schedule', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{subdomain}.conveyour.com/api/schedule"
headers = {"x-conveyour-token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{subdomain}.conveyour.com/api/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-conveyour-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": "ok",
"message": "success",
"data": {
"page": 1,
"pages": 8,
"count": 372,
"results": [
{
"event": "answered_question",
"campaign": "64a1b2c3d4e5f6a7b8c9d0e1",
"trigger": "64a1b2c3d4e5f6a7b8c9d0e2",
"answer": "Yes",
"points": 5,
"vanity": {
"campaign": "Onboarding",
"trigger": "Interest Check",
"lesson": ""
},
"reviews": [],
"comments": [],
"$id": "64a1b2c3d4e5f6a7b8c9d0e3",
"$timestamp": 1753800000,
"$date": "2026-07-29 10:00:00",
"$cid": "64a1b2c3d4e5f6a7b8c9d0e4",
"$name": "Jane Doe",
"$photo": "https://cdn.conveyour.com/photo.jpg"
}
]
}
}{
"status": "failed",
"message": "Token is either expired or does not have the correct permissions",
"data": []
}List activity
Returns a paginated feed of contact activity events for the org, sorted by timestamp (newest first). Non-admin keys are automatically scoped to the contacts the user manages.
List a paginated feed of contact activity events
Response shape: data is an object with count, page, pages and results. It does not return per_page, has_more or has_less.
This is the contact activity feed, not a scheduling API. The route is named /api/schedule for historical reasons — it returns the event feed you see on the right-hand side of a contact’s profile.
curl --request GET \
--url https://{subdomain}.conveyour.com/api/schedule \
--header 'x-conveyour-token: <api-key>'const options = {method: 'GET', headers: {'x-conveyour-token': '<api-key>'}};
fetch('https://{subdomain}.conveyour.com/api/schedule', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {method: 'GET', headers: {'x-conveyour-token': '<api-key>'}};
fetch('https://{subdomain}.conveyour.com/api/schedule', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{subdomain}.conveyour.com/api/schedule"
headers = {"x-conveyour-token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{subdomain}.conveyour.com/api/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-conveyour-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": "ok",
"message": "success",
"data": {
"page": 1,
"pages": 8,
"count": 372,
"results": [
{
"event": "answered_question",
"campaign": "64a1b2c3d4e5f6a7b8c9d0e1",
"trigger": "64a1b2c3d4e5f6a7b8c9d0e2",
"answer": "Yes",
"points": 5,
"vanity": {
"campaign": "Onboarding",
"trigger": "Interest Check",
"lesson": ""
},
"reviews": [],
"comments": [],
"$id": "64a1b2c3d4e5f6a7b8c9d0e3",
"$timestamp": 1753800000,
"$date": "2026-07-29 10:00:00",
"$cid": "64a1b2c3d4e5f6a7b8c9d0e4",
"$name": "Jane Doe",
"$photo": "https://cdn.conveyour.com/photo.jpg"
}
]
}
}{
"status": "failed",
"message": "Token is either expired or does not have the correct permissions",
"data": []
}Authorizations
Your API key token. Contacts endpoints require a Server-only — Full API key — see Authentication.
Query Parameters
Restrict the feed to a single contact (contact id or pid). When set, results are not additionally filtered by the search/bookmark contact scope.
Filter to events produced by a specific trigger id.
Restrict results to the day range containing this date. Parsed in the org's rep-bucket timezone (e.g. 2026-07-29).
Sort option passed through to the feed query.
Comma-separated list (or array) of fields to project. name and data are always included.
Contact search string used to scope which contacts' events are returned. filters is accepted as an alias.
Fuzzy-match across related campaign, trigger, and lesson names.
Apply a saved bookmark's contact filter to scope the feed.
Team id (or array of team ids — the first is used) to scope contacts by team.
Base64-encoded public key used to re-encrypt decrypted secret values when the org requires a public encryption key.
Team scope for the request, as one or more team ObjectIds. The brackets are required: PHP keeps only the last value for a repeated plain key, so teams=A&teams=B silently resolves to B alone. On requests with a JSON body you may send teams (no brackets) in the body instead.
Values that are not valid ObjectIds are silently ignored — a mistyped team ID behaves as if no team was sent. See the teams section of the API conventions guide.
CSV export only. What the encrypted column should contain. Defaults to encrypted.
Page number.
Records per page. Defaults to the limits.schedule config value.
Search fallback, not a filter object. search takes precedence; filters is only consulted when search is absent. The value is used as a search string, so it does not behave like the filters object on other endpoints.
Response
Success.
The common response envelope shared by all ConveYour endpoints.