What's new
2026-08: free trial, in-place reconnect, and a wider CLI
data.status on account events now always means one thing: the account's lifecycle
status. On an account_status delivery, data.status is the state the account is in
once the event has been applied, one of active, connecting, reconnect_needed,
restricted, disconnected. It is the same vocabulary
GET /v1/accounts/{account_id} returns.
This is a repair, not a breaking change, and it is worth being precise about why. The
field was already sending two different values for the same event depending on which
internal path noticed the change: a session expiry detected by the real-time push sent
"account.reconnect_needed", while the same event detected by the daily reconciliation
sent "reconnect_needed", and nothing in the delivery said which. No handler could have
been reliably depending on either form; one branching on the event-name form was already
failing silently about half the time. Every producer now sends the lifecycle status, so
the value is stable per event for the first time.
If you were branching on data.status, switch to the top-level event field (or its
guaranteed copy at data.event), which has always carried the canonical event name and
is unchanged. The account status events reference
carries the complete event to status mapping, and its examples now match what the server
sends; several of them previously showed a value no producer ever sent.
account.restricted is subscribable. LinkedIn restricting an account is now an
event you can receive. It was previously emitted by the platform but missing from the
catalogue, so POST /v1/webhooks rejected it and no subscription could ever match it;
a workspace subscribed to every other account_status event was told nothing when an
account was restricted. It is in the default set, so an account_status webhook created
without an explicit events array now receives it, and no existing subscription
changes: events is fixed when the webhook is created. It carries
availability: "not_realtime", because a daily reconciliation is what normally
notices the restriction (allow up to 24 hours for that path); a connect that observes
the account already restricted can also deliver this event immediately, and reading
the account directly with GET /v1/accounts/{account_id} always reports the state
sooner than either. Treat it as a stop signal and pause outreach for that account.
Free trial. New workspaces start on a trial seat. Five trial-specific error codes
are now part of the taxonomy: TRIAL_EXPIRED (402), TRIAL_SEAT_LIMIT (409),
TRIAL_ACTIVE_SEAT_LIMIT (409), TRIAL_IDENTITY_ALREADY_USED (409), and
TRIAL_IDENTITY_UNRESOLVED (422). A trial seat does not raise your rate-limit quota;
see Rate limits.
In-place reconnect. POST /v1/auth/intent re-authenticates an existing account
when you pass account_id in the body, keeping the id, the seat, and the webhook
subscriptions. The CLI exposes it as curviate account link --account-id acc_....
Disconnecting and re-linking is no longer the way to refresh a stale session.
Webhook delivery health now tells you the truth. Three corrections to
GET /v1/webhooks, worth reading if you monitor webhook health programmatically.
delivery_success_rate_7disnull, not100, when a webhook has made no delivery attempts in the last 7 days. It previously reported a perfect score for a webhook that had never delivered anything, which read as healthier than one that had failed every attempt. It is documented as a percentage (0-100), which is the scale it has always returned; the reference previously described it as a 0-1 fraction. The values on the wire are unchanged apart from the newnull.last_delivery_atnow carries the most recent delivery attempt, whether it succeeded or failed. It previously carried only the last successful one, so a webhook that had failed every attempt was indistinguishable from one that had never been used. Together the two fields now separate the cases:nullandnullmeans never used;0with a timestamp means failing. Note that the rate is windowed to 7 days and the timestamp is not, so a webhook whose only attempts are older than a week returns anullrate alongside a non-nulllast_delivery_at.last_delivery_atis also now RFC 3339, matchingcreated_atin the same object. It previously emitted the raw database format (2026-07-27 16:11:15.685623+00: a space separator, noZ, an hour-only offset), which strict parsers such as Go'stime.RFC3339and Java'sOffsetDateTime.parsereject. JavaScript'snew Date()accepts both forms, so lenient clients see no change; anyone strict could not have been parsing this field successfully before. It lands in the same release as the meaning change above, so re-read the field once and you are done.secret_prefixfromPOST /v1/webhooksis the first 8 characters of the secret, with no trailing.... It now matches whatGET /v1/webhooks/{id}andGET /v1/webhooksreturn for the same webhook, so a stored create value compares equal to a later read.
Deleting a webhook stops delivery immediately. Retries that were already queued for a deleted or disabled webhook are dropped rather than delivered. Previously a deletion left queued attempts to fire for hours afterwards.
Latest clients. @curviate/sdk 0.18.1 and @curviate/cli 0.19.0.
Notable client changes since 0.14.0:
- CLI
inbox search(free-text inbox search) andsales-nav search "<url>"for a pasted Sales Navigator URL. - CLI
jobcommand family: draft, price, publish, close, and review applicants. - CLI
profile update,profile follow,profile unfollow,profile following;profile connectionsrenamedprofile relations. - CLI company-page surface:
company managed,company chats,company messages,company search-chats,company reply. - CLI
inbox syncandinbox sync-chatremoved; message history syncs implicitly. - CLI
message inmail --surfaceremoved; every InMail sends from the account's own credits.
2026-07: webhooks, bigger event catalogue, honest delivery labels
That release took the webhook event catalogue to 27 events, 24 of them subscribable
across the messaging, user, and account_status sources, each annotated with a
delivery-availability label so you know how an event is delivered before you build on
it. See the entry above for the current size.
Delivery availability labels. GET /v1/webhooks/events returns an availability
field on the events that are not delivered in real time: not_realtime (delivered on
a poll delay of hours, applying to connection.accepted and connection.new) and
no_longer_realtime (not delivered on the current platform). account.restricted
joined the not_realtime set later; see the entry above. Most events omit the
field, which means real-time; the three account.initial_sync.* events carry
realtime explicitly. Do not build latency-sensitive logic on anything that is not
real-time.
Six new opt-in events. These are additive and never auto-subscribed. Name them
explicitly in the events array to receive them:
chat.updated,chat.deleted: chat-container state changes (messaging).connection.new: any new relation on the account, not only invitations you sent (user).account.initial_sync.running,account.initial_sync.completed,account.initial_sync.failed: these bracket the initial history backfill for a newly connected account (account_status).
Four account events are no longer delivered. account.synced,
account.creation_failed, account.connecting, and account.permission_revoked now
carry availability: "no_longer_realtime". For account.creation_failed and
account.permission_revoked, detect the state with an on-demand account read
(GET /v1/accounts/{account_id}); account.synced and account.connecting have no
equivalent read-path signal. Note that create still accepts all four and returns
201; you simply never receive a delivery.
Retrieve a single webhook. GET /v1/webhooks/{id} returns one webhook you own.
The plaintext secret is never present on a read, only its 8-character prefix. For
health, last_delivery_at, and delivery_success_rate_7d, use GET /v1/webhooks.
The SDK and CLI shipped these changes in 0.14.0.
2026-05: initial release
Curviate API v1 is live. Resource groups: Accounts, Messaging, Profiles, Invites, Search, Posts, Sales Navigator, Recruiter, Webhooks. Core tier available; Sales Navigator and Recruiter add-ons in early access.
Subscribe to release notes at hello@curviate.com.
Next steps
- API quick start: your first authenticated call.
- Webhooks overview: subscribe to the events above.
- Errors: the full error-code reference, including the trial codes.