Reminders and Tasks
The ten endpoints behind personal reminders and the team's task planner.
Overview
These ten endpoints run two separate books. A reminder is personal: you leave yourself a note and it comes back at the right time. A task is shared: it is assigned to an admin, can be tied to a client and a department, and its status is followed.
The important difference is visibility. Reminders are scoped to their owner and no one else's are visible to the key; tasks are a team-wide list.
Reference
Listing the Reminders
Returns the reminders of the admin the key belongs to.
active or inactive.onetime fires once, recurring repeats.curl 'https://panel.example.com/api/v1/admin/tools/reminders' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/tools/reminders', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/reminders');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Reminders belong to their OWNER: another admin's are not visible with this key.
$reminders = Api::Tools()->GetReminders()['data'];Reminder Detail
Returns one reminder. The schema is the same as a list item.
active or inactive.onetime fires once, recurring repeats.curl 'https://panel.example.com/api/v1/admin/tools/reminders/12' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/tools/reminders/12', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/reminders/12');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Someone else's reminder answers 'not found' rather than 'not allowed'.
$response = Api::Tools()->GetReminder(['id' => 12]);Creating a Reminder
Opens a reminder for the admin the key belongs to.
active or inactive. It defaults to active.onetime or recurring. It defaults to one-off.curl -X POST 'https://panel.example.com/api/v1/admin/tools/reminders' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"note":"Follow up with client","period":"onetime","scheduled_at":"2026-02-01 09:00:00"}'const res = await fetch('https://panel.example.com/api/v1/admin/tools/reminders', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
note: 'Follow up with client',
period: 'onetime',
scheduled_at: '2026-02-01 09:00:00',
}),
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/reminders');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'note' => 'Follow up with client',
'period' => 'onetime',
'scheduled_at' => '2026-02-01 09:00:00',
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// For the first of every month: day 1, month -1 (every month).
Api::Tools()->CreateReminder([
'note' => 'Monthly reconciliation',
'period' => 'recurring',
'time' => '09:00',
'month' => -1,
'day' => 1,
]);Updating a Reminder
Applies the fields you send and leaves the rest as they are.
active or inactive. It defaults to active.onetime or recurring. It defaults to one-off.curl -X PATCH 'https://panel.example.com/api/v1/admin/tools/reminders/12' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"status":"inactive"}'const res = await fetch('https://panel.example.com/api/v1/admin/tools/reminders/12', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ status: 'inactive' }),
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/reminders/12');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['status' => 'inactive']),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Switching the status off does not DELETE it: the record stays and simply does not fire.
Api::Tools()->UpdateReminder(['id' => 12, 'status' => 'inactive']);Deleting a Reminder
Deletes the reminder.
curl -X DELETE 'https://panel.example.com/api/v1/admin/tools/reminders/12' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/tools/reminders/12', {
method: 'DELETE',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/reminders/12');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Tools()->DeleteReminder(['id' => 12]);Listing the Tasks
Returns the records in the task planner. Unlike reminders, all of them are visible.
waiting, inprocess, postponed or completed.curl 'https://panel.example.com/api/v1/admin/tools/tasks' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/tools/tasks', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/tasks');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Unlike reminders, tasks are not scoped to their owner: the list carries everyone's.
$mine = array_filter(
Api::Tools()->GetTasks()['data'],
fn (array $t): bool => $t['admin_id'] === $adminId,
);Task Detail
Returns one task. The schema is the same as a list item.
waiting, inprocess, postponed or completed.curl 'https://panel.example.com/api/v1/admin/tools/tasks/8' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/tools/tasks/8', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/tasks/8');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Tools()->GetTask(['id' => 8]);Creating a Task
Opens a task and assigns it to an admin.
curl -X POST 'https://panel.example.com/api/v1/admin/tools/tasks' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"title":"Renew SSL","c_date":"2026-02-01","user_id":42,"notify":true}'const res = await fetch('https://panel.example.com/api/v1/admin/tools/tasks', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
title: 'Renew SSL',
c_date: '2026-02-01',
user_id: 42,
notify: true,
}),
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/tasks');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Renew SSL',
'c_date' => '2026-02-01',
'user_id' => 42,
'notify' => true,
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// With no assignee the task lands on the KEY'S OWNER, which matters on an integration key.
Api::Tools()->CreateTask([
'title' => 'Renew SSL',
'c_date' => '2026-02-01',
'admin_id' => 3,
'notify' => true,
]);Updating a Task
Applies the fields you send; the title and the date cannot be emptied.
curl -X PATCH 'https://panel.example.com/api/v1/admin/tools/tasks/8' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"status":"completed","status_note":"Done"}'const res = await fetch('https://panel.example.com/api/v1/admin/tools/tasks/8', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ status: 'completed', status_note: 'Done' }),
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/tasks/8');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'status' => 'completed',
'status_note' => 'Done',
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// A completed task does not LEAVE the list; filter by status on your side.
Api::Tools()->UpdateTask([
'id' => 8,
'status' => 'completed',
]);Deleting a Task
Deletes the task.
curl -X DELETE 'https://panel.example.com/api/v1/admin/tools/tasks/8' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/tools/tasks/8', {
method: 'DELETE',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/tools/tasks/8');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// The delete does not check ownership: you can remove another admin's task too.
Api::Tools()->DeleteTask(['id' => 8]);Pitfalls
The reminder endpoints see only the records of the admin who owns the key; someone else's answers "not found". The task endpoints have no such boundary: the list carries everyone's and the delete does not check ownership. Bear in mind that an integration key can remove another admin's task.
Creating a task with no assignee puts it on the key's owner. On an integration key that means piling tasks onto an account nobody actually watches. Name the assignee explicitly.
When the period is one-off the time field is required and the request is refused without it. A repeating reminder reads its pattern from the time, the month and the day instead, where minus one means "every": month minus one with day one is the first of every month.
Marking a task complete does not remove it from the list; the record stays with its status. Counting open work means filtering by status on your side.
Related Articles
Thanks for your feedback!
Our support team is here around the clock for anything you can't find above.