Optional.
/tasks returns manager tasks — the to-dos your managers own. If
you do not implement it, return 404 — HunterAI skips it and the sync still
succeeds. It is incremental.Purpose
A task is one to-do a manager owns in your CRM — a follow-up call, a document to send, a meeting to hold. HunterAI reads/tasks to compute manager-discipline
metrics: overdue tasks, completion rate, and follow-up cadence. A task is linked
to the lead or contact it concerns, so those metrics can be attributed per manager
and per record.
Request
You must return tasks ordered by
updated_at ascending. HunterAI advances
its watermark page by page and relies on that order; an out-of-order page can cause
older tasks on a later page to be skipped.
Response envelope
200 OK
data, has_more, page, limit) is the same on every endpoint
— see How sync works → The envelope.
Only data and has_more are read.
Fields
Association
A task is linked to at most one entity, resolved in this exact order:- If
lead_idis present, the task is linked to that lead.lead_idwins even whencontact_idis also present —contact_idis then ignored. - If
lead_idis absent andcontact_idis present, the task is linked to that contact. - If neither is present, the task is accepted and ingested, but linked to nothing.
Timestamp format
due_at, completed_at, and updated_at accept a calendar date and time in these
concrete forms:
- With an explicit offset —
2025-07-05T09:00:00+05:00. - With a trailing
Zfor UTC —2025-07-05T09:00:00Z. - With no zone at all —
2025-07-05T09:00:00, which is read as UTC. - The date and time may be separated by a
Tor by a single space (2025-07-05 09:00:00). - A bare date —
2025-07-05— is accepted; the time becomes00:00UTC.
null for that
field, and no error is raised — the task is still ingested. A task’s own
created_at is not a timestamp field here; it is ignored entirely (see
Fields the adapter ignores).
Fields the adapter ignores
Sending any of these has no effect — do not spend effort populating them:created_at— ignored entirely. A task has no creation-time column; onlyupdated_at,due_at, andcompleted_atare read. See Limitations → Fields dropped entirely.task_type,duration,result— not part of this spec; dropped.- Any other key not listed in the Fields table — tasks retain no raw copy, so anything unlisted is dropped entirely.
Identity & cross-references
- Identity:
idis the stable primary key. HunterAI upserts by(connection, id), so a task’sidmust never change — a changedidis ingested as a brand-new task. lead_id→ resolves against/leads.contact_id→ resolves against/contacts.responsible_user_id→ resolves against/users.- Association between the task and a lead or contact follows the Association rule above.
Incremental sync
/tasks is incremental. HunterAI sends updated_since; return only tasks whose
updated_at is greater than or equal to it (inclusive — re-returning the
boundary task is harmless, since the upsert is idempotent).
updated_atdrives the per-entity watermark — the largestupdated_atHunterAI has committed. The next run resumes from there.- You must return tasks ordered by
updated_atascending, so the watermark can advance page by page without skipping an older task on a later page. updated_atmust change on every modification of a task — completion, a due- date change, a reassignment, or a text edit. A change that does not advanceupdated_atfalls at or below the watermark and is never pulled again.
Deletion behaviour
Tasks have no tombstone — there is nois_deleted on a task. Because the
upsert only inserts and updates, a task you delete in your CRM, or simply stop
returning, is not removed from HunterAI; its historical row persists. Marking a
task is_completed: true records completion but does not delete it. Only leads
support deletion, via is_deleted — see
Limitations → Tombstones.
Failure modes
A page of tasks (up to 100 records) is validated and written as one transaction. The consequences:- A single malformed task fails the whole page. If any task on a page cannot be
processed — a missing
id, or an over-lengthid— none of the tasks on that page are saved. This is page-level, not per-record. - A failed page fails the tasks entity, not the whole sync. Because
/tasksis optional, a page that fails takes the tasks entity down and reports it failed, but the overall sync still succeeds — unlike a required entity, whose failure fails the sync. Pages that already committed stay committed, and the next run resumes from the watermark. - A task with neither
lead_idnorcontact_iddoes not fail. It is accepted and ingested, just linked to nothing and therefore invisible in every report. This is the opposite of/calls, where an unassociated call fails the page. - An unparseable timestamp does not fail anything — the field becomes
nulland the task is still ingested. See the consequence forupdated_atabove. 429,5xx, and request timeouts are retried with exponential backoff up to 5 times, then the entity fails; a timeout is retried the same way as a5xx. HunterAI applies its request rate limit per connection, so two connections to the same base URL are throttled independently.- A repeated or unbounded page — a page whose IDs match the previous page, or a run past the page ceiling — fails the entity. See How sync works → Paging.
If this endpoint is missing
/tasks is optional. Returning 404 skips it cleanly — the entity reports
success with zero records and the overall sync still succeeds./tasks, HunterAI has no manager-discipline metrics — overdue tasks,
completion rate, and follow-up cadence are all empty. Leads, contacts, calls, and
attribution are unaffected.