Guides

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_sample is true when the denominator is below 30. The rate is still returned. A denominator of 0 gives rate: 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 rowOne unit is
connection_requests_with_noteone invitation sent with a note
connection_requests_no_noteone invitation sent without a note
messages_first_degreeone message to a 1st-degree connection
inmailone InMail sent
open_profile_inmailone free message to an Open Profile
profile_viewsone profile read
searchone search result line, not one query
commentsone comment posted
post_likesone reaction to a post, a comment or a message
followsone follow
content_pollone content read: a page of posts, a feed, a company page or its followers
job_pollone read of job postings
postsone post published
endorsementsone skill endorsed
invite_responsesone received invitation accepted or declined
withdrawal_sweepone sent invitation withdrawn
connections_syncone background read of the connection list
inbox_syncone 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.