How Curviate counts
Every number the Analytics reads return, and the rule behind it. Every figure on this page is the one the API computes with.
Analytics is read-only: GET /v1/analytics/motions, GET /v1/analytics/motions/{motion_id}, GET /v1/analytics/activity and GET /v1/analytics/events, or get_analytics over MCP. A read makes no LinkedIn call and spends no limit, and it answers on every Tier. Every number is computed when you ask; nothing is cached.
Two rates, never a score
Acceptance and replies measure different things, and which one matters depends on your goal. Curviate returns both side by side, each with its numerator, its denominator and low_sample, and never blends them into a score, a rank or a winner.
- Acceptance: invitations accepted over invitations sent. Each invitation counts on the day it was sent, and only once it is 7 days old, so a batch sent yesterday never looks like a failure. An acceptance detected later, even after the Enrollment ended, still counts for its send day. Withdrawn invitations stay in the denominator. An invitation whose send result was unknown counts as sent once it is accepted.
- Reply: Enrollments that replied over Enrollments first messaged at least 7 days ago with no reply before that message. A message sent after a reply (an answer, not outreach) never enters the denominator.
- Small samples:
low_sampleis true when the denominator is below 30. The rate is still returned. A denominator of 0 givesrate: null.
The acceptance floor on a Motion uses the same 7-day rule, so the rate you read compares directly with your floor setting.
What counts as a reply
A reply is an inbound message in a 1:1 chat on the Enrollment's account from the enrolled person, counted once per Enrollment, at the first one. Three messages from one person are one reply. Any other inbound message (another chat, a group chat, the same person writing to another of your accounts) is not counted: Analytics never counts "any inbound". A reply up to 30 days after the Enrollment finished is still its reply, recorded without restarting anything and without a webhook.
Per step, a reply counts for the message step it followed, before the next message step (last touch).
Units
Enrollment states, cohorts and replies count Enrollments: a person enrolled with two accounts counts twice, once per account, so per-account numbers add up to the total. Sent and engagement figures count actions. Core activity counts budget units.
Enrollment states are a snapshot of now, whatever the window: queued (waiting to start), in_progress, paused, finished (any reason but a lost account, replied included), failed (the account became unavailable or was removed) and skipped.
Core activity, per budget row
GET /v1/analytics/activity reports every budgeted LinkedIn call your accounts made, whoever triggered it: direct calls, Motion steps, scheduled posts and syncs share one budget. Per budget row, used is what the row's counter holds (successful and failed calls, as quotas counts them), failed is the failed part of it, and refused is the number of calls stopped before they reached LinkedIn. Each row counts its own unit, so no figure ever adds rows together:
| Budget row | One unit is |
|---|---|
connection_requests_with_note | one invitation sent with a note |
connection_requests_no_note | one invitation sent without a note |
messages_first_degree | one message to a 1st-degree connection |
inmail | one InMail sent |
open_profile_inmail | one free message to an Open Profile |
profile_views | one profile read |
search | one search result line, not one query |
comments | one comment posted |
post_likes | one reaction to a post, a comment or a message |
follows | one follow |
content_poll | one content read: a page of posts, a feed, a company page or its followers |
job_poll | one read of job postings |
posts | one post published |
endorsements | one skill endorsed |
invite_responses | one received invitation accepted or declined |
withdrawal_sweep | one sent invitation withdrawn |
connections_sync | one background read of the connection list |
inbox_sync | one background read of the inbox |
Window and timezone
from and to are calendar days, YYYY-MM-DD, inclusive, read in timezone (IANA, default UTC). With neither, the window is the last 30 days; at most 365. An event belongs to the day it happened in your timezone, so a late-evening action lands on the right day.
Lags
A step counts as soon as it settles. A reply counts within a minute of arriving. An acceptance counts once detected, about 2 hours after it happens. Read a fresh gap with that in mind.