2026-07-24
Internal consistency pass — the Limitations and How-sync-works pages now match the
endpoint reference exactly. No change to the adapter contract; these corrections remove
documentation that contradicted the endpoint pages.
- Stage
kind— Limitations now matches/pipelines. An unrecognised or missing stagekindis rejected as an error (it fails the page, and because/pipelinesis required, the sync) — not silently classified asopen. The Limitations page had still described the old silent-fallback behaviour. - Partial success — optional-entity failure is contained.
How sync works now states that the overall
sync is marked failed only when a required entity fails; an optional entity
(
/tasks,/calls,/events) failing takes down only that entity and the sync still succeeds. The section previously said any entity failure failed the sync. - Page-level atomicity stated on the sync page. How sync works now spells out that a page is written as one transaction, so one malformed record fails its whole page (page-level, not per-record) — matching every endpoint page.
- Timestamp formats aligned. The Limitations timestamp section now defers to the
endpoint pages’ Timestamp format list instead of
a narrower one, so every page accepts the same forms (explicit offset, trailing
Z, no zone,T-or-space separator, bare date). - Redaction. The internal repo path was removed from the introduction, leaving the reference to the production adapter (writing conventions).
2026-07-24
The three optional endpoints brought to the reference standard, with several
field requirements now stated precisely.
/events,/tasks,/callsrewritten to the full endpoint-page standard: complete §4 field tables (type, required, nullability, constraint, example, notes), full response envelopes with paging, and explicit identity, incremental, deletion, and failure-mode sections.- Optional-entity failure is contained. For all three, a page that fails (a malformed record) fails only that entity and reports it failed; because the endpoint is optional, the overall sync still succeeds. A required entity’s page failure still fails the whole sync.
/events—lead_idis hard-required. An event without alead_idfails its page and thus the events entity.typeis never null — an absent value becomes an empty string (truncated to 100 chars).value_before/value_afteraccept a scalar, object, or array: a scalar is wrapped as{ "value": <scalar> }, an object or array is stored unchanged. The watermark prefersupdated_atand falls back tocreated_at;updated_atis read for the watermark only and is not stored./tasks— association rule stated unambiguously.lead_idwins when bothlead_idandcontact_idare present;contact_idis used only whenlead_idis absent; a task with neither is accepted but linked to nothing and is invisible in every report. A task’s owncreated_atis ignored entirely (no column) and is now listed under fields the adapter ignores./calls— stricter than/tasks, by design. A call with neitherlead_idnorcontact_idis rejected and fails its page — the opposite of a task, which tolerates it; the asymmetry is now called out on both pages.duration_secondsmust be an integer; a non-numeric value fails the page — stricter thanprice, which tolerates a numeric string (a known inconsistency).directionacceptsinorout; any other value,null, or an omitted value silently becomesout.
2026-07-24
Field-spec corrections and two endpoint pages brought to the reference standard.
/pipelines—sortmust be an integer. Both the pipeline-level and stage-levelsortmust be an integer; a fractional or non-numeric value now raises a validation error and fails the page. No minimum or maximum is enforced, and an omitted ornullvalue still defaults to0./pipelines—stagesis now required and non-nullable. A missing ornullstagesis rejected as an error and fails the page (an intended contract; the adapter tolerates it today). An emptystages: []stays valid — a genuinely empty funnel — but its leads cannot be classified won or lost./leads—idlimit stated. The leadidis documented asmax 255 chars, matching/pipelines; an over-lengthidfails its page. No behaviour change — the limit was always enforced by the shared identifier column./usersand/contactsrewritten to the full endpoint-page standard: complete field tables (types, required/optional, nullability, constraints), full response envelopes, and explicit identity, incremental, deletion, and failure-mode sections./usersis not incremental and dropsphone;/contactsis incremental onupdated_atand carries no deletion signal at all.custom_fieldson a contact must be a JSON object — a non-object value is silently stored asnull.
2026-07-24
First stable release, backed by a working adapter.The custom-CRM adapter is implemented. Its field tables — types, required/optional,
nullability, and truncation limits — follow the field-table standard and are verified
against that implementation. A small number of conformance requirements state the
intended contract for adapter behaviours scheduled to change, and read as the
target rather than today’s behaviour: a numeric
price (a non-numeric value is
rejected, not coerced to 0); a required, always-advancing updated_at; ascending
updated_at result ordering; page-atomic ingestion (one malformed record fails its
whole page, and for a required entity the whole sync); request timeouts retried like
5xx; and per-connection rate limiting.- Endpoints — four required (
/pipelines,/users,/contacts,/leads) and three optional (/events,/tasks,/calls), allGET, all read-only. - Authentication — long-lived read-only Bearer token, encrypted at rest. OAuth 2.0 documented as available on request, not implemented.
- Sync model — one-directional pull; initial full sync, then incremental via
updated_sincewith a per-entity watermark;has_morepaging; idempotent upsert. - Reference — full field tables with types, required/optional, and truncation limits for every entity.
- Limitations — documented in full, each with its consequence: currency not stored,
first-contact-only, lead-only tombstones, strict stage
kind, dropped fields, truncation, timestamp handling, and managers not yet linked to logins. - Onboarding — the real HunterAI connection endpoints (
/api/v1/crm/custom/…) and the test-connection call.
Pre-release
Internal draft written before the adapter existed. Superseded in full by v1.0, which is
the first version backed by a running implementation. Do not rely on any v0.9 artifact.