---
title: "Get results"
method: GET
path: "/api/v1/results"
tags: ["API Reference"]
---

# Get results

`GET /api/v1/results`

## Request

- Base URL: `https://revnu.com`
- URL: `https://revnu.com/api/v1/results`
- Auth: HTTP bearer

The growth scoreboard for a window ending now: per-channel sections for email, outbound, LinkedIn, SEO, AI answers, ads and social, each available with data or unavailable with a reason.

Requires the `results:read` scope.

**Response.** ```json
{
  "results": {
    "window": { "from": 1789000000000, "to": 1789604800000 },
    "baseline": { "from": 1788395200000, "to": 1789000000000 },
    "harness": { "available": true, "data": { } },
    "email": {
      "available": true,
      "data": {
        "sent": 120,
        "sentBaseline": 96,
        "draftsAwaiting": 4,
        "tracking": { "available": false, "reason": "tracking_off" },
        "replies": {
          "available": true,
          "data": {
            "replies": 7,
            "bounces": 2,
            "repliedContacts": [{ "who": "Jo Park", "company": "Northwind", "agoDays": 1, "intent": "interested" }]
          }
        }
      }
    },
    "outbound": { "available": true, "data": { "routes": [ ] } },
    "linkedin": {
      "available": true,
      "data": {
        "invites": 14,
        "health": { "needsReauth": false, "pausedUntil": null, "pauseReason": null, "inviteHeadroom": 6 },
        "replies": { "available": true, "data": { "count": 3 } }
      }
    },
    "seo": {
      "available": true,
      "data": { "postsPublished": 2, "postsHeld": 1, "postsFailed": 0, "views": 340 }
    },
    "aeo": { "available": true, "data": { } },
    "ads": { "available": false, "reason": "no_campaigns" },
    "social": { "available": false, "reason": "not_connected" }
  }
}
```

The numbers above are an example of the shape, not real figures, and some fields are left out to keep it short. The tables below list every field. `baseline` is the equal-length window just before `window`, for comparisons such as `sent` against `sentBaseline`.

Each channel section is `{ "available": true, "data": {…} }`, optionally with `caveats`, or `{ "available": false, "reason": "…" }`. Zero and unknown are different numbers.

### Email

| Field | Meaning |
|---|---|
| `sent` | Emails sent in the window |
| `sentBaseline` | Emails sent in the baseline window |
| `draftsAwaiting` | Email drafts waiting in the review queue |
| `tracking` | Opens and clicks, a section of its own: unavailable with `tracking_off` when no tracking domain is set up or tracking is turned off |
| `replies.data.replies` | People who replied in the window, counted by when the reply arrived. Automatic replies are left out. |
| `replies.data.bounces` | Emails that bounced in the window |
| `replies.data.repliedContacts` | The newest five replies: `who`, `company`, `agoDays`, and `intent` when Revnu has read the reply |
| `replies.data.byIntent` | Replies grouped by intent, when at least one has been classified |

Reply rate is not a field: divide `replies` by `sent`. For everyone who replied, list [`GET /leads?status=replied`](/docs/leads).

### LinkedIn

The LinkedIn section reads the workspace owner's connected LinkedIn account. Counts are for the window unless the table says otherwise.

| Field | Meaning |
|---|---|
| `invites` | Connection requests sent in the window. Requests LinkedIn turned away because you were already connected or already invited are left out. |
| `alreadyConnectedHits` | Requests that hit that already-connected or already-invited wall |
| `newDMs` | Messages that started a new conversation |
| `chatReplies` | Messages sent into a conversation that already existed |
| `inmails` | InMails sent |
| `baseline` | `{ invites, dms, inmails }` for the baseline window, where `dms` is `newDMs` plus `chatReplies` |
| `health.needsReauth` | `true` when the LinkedIn connection has expired. Reconnect it in the dashboard. |
| `health.pausedUntil` | Epoch milliseconds when Revnu's LinkedIn pause ends, or `null` when it isn't paused. Live state, not windowed. |
| `health.pauseReason` | A short plain-text reason for the pause, such as a rate limit or several provider errors in a row, or `null` |
| `health.inviteHeadroom` | Connection requests Revnu can still send today: the smaller of what is left of today's limit and this week's |
| `replies.data.count` | Conversations that got a reply in the window, counted by when the reply arrived |
| `accepts.data.count` | Connection requests accepted in the window, counted by when Revnu saw the connection |
| `scoreboard` | All-time requests and acceptances by list, `{ label, invites, maturedInvites, accepts }` each. `maturedInvites` counts requests at least 7 days old plus accepted ones, a fair base for an acceptance rate. |

Why LinkedIn pauses and when it resumes is in [Why Did LinkedIn Sending Stop?](/docs/linkedin-paused). For one person's connection and conversation, use [`GET /linkedin/person`](/docs/linkedin-person).

### SEO

The SEO section is about the blog Revnu writes for. `postsPublished` and `postsHeld` count only posts Revnu wrote, not ones you added yourself.

| Field | Meaning |
|---|---|
| `postsPublished` | Posts Revnu wrote that were published or exported in the window |
| `postsHeld` | Posts waiting for your review right now. Live, not windowed. |
| `postsFailed` | Posts started in the window that failed. A count only: the cause isn't returned. |
| `refreshes` | `{ applied, skipped }`: updates to live posts Revnu applied or skipped in the window |
| `views` | Views of your blog posts in the window. `viewsPrev` is the baseline window. |
| `genCostCents` | Revnu's estimated cost of writing the posts it finished in the window, in cents |
| `gsc` | Search Console clicks and impressions, a section of its own: `{ clicks, impressions, prevClicks, from, through, ourPosts }`. Unavailable with `not_connected`, `needs_reauth` or `no_data_yet`. |
| `gsc.data.ourPosts` | The same numbers for your blog pages only, with the top five pages in `top`. `null` until Revnu has page-level data. |
| `scoreboard` | The last 14 days by content type, plus up to five pages with impressions and no clicks |

Search Console reports a day or two late, so `gsc` covers a window shifted back by two days. `from` and `through` give the exact dates. `prevClicks` is `null`, not 0, when the data doesn't reach back that far.

### Outbound

Outbound is all-time, not windowed: one row per campaign in `routes`, sorted by sends. Each row has `route`, `delivered`, `replied`, `bounced` and `pending` (leads found but not yet sent), plus `ready` and `drafted` when Revnu could count them, and `sequence` with the campaign's approval state.

### Why a section is unavailable

| Reason | Meaning |
|---|---|
| `not_connected` | The channel isn't connected |
| `needs_reauth` | It was connected, but the connection has expired; reconnect it in the dashboard |
| `tracking_off` | Open and click tracking isn't set up or is turned off |
| `no_blog` | Revnu hasn't written for your blog yet |
| `no_campaigns` | No ad campaigns exist |
| `not_tracked` | AI-answer visibility hasn't been measured yet |
| `measurement_stalled` | AI-answer measurements exist but none are recent enough to use |
| `no_data_yet` | Connected, but nothing has arrived for this window yet |
| `no_writer_yet` | Revnu doesn't measure this number yet |
| `read_failed` | This section couldn't be read this time; the others still rendered. Retry. |

## Query parameters

- `since` integer

## Response `200`

{ results }

- object
  - `results` union, required
    - object
      - `skip` true, required
      - `reason` 'deleted' | 'demo', required
    - object
      - `window` TimeWindow, required
        - `from` number, required
        - `to` number, required
      - `baseline` TimeWindow, required
        - `from` number, required
        - `to` number, required
      - `harness` union, required
        - object
          - `available` false, required
          - `reason` 'measurement_stalled' | 'needs_reauth' | 'no_blog' | 'no_campaigns' | 'no_data_yet' | 'no_writer_yet' | 'not_connected' | 'not_tracked' | 'read_failed' | 'tracking_off', required
        - object
          - `available` true, required
          - `data` HarnessData, required
            - `wakesFired` number, required
            - `wakesFailed` number, required
            - `queuePending` number, required
            - `queueNeedsRevision` number, required
            - `oldestPendingAgeHours` number, nullable, required
          - `caveats` string[]
      - `email` union, required
        - object
          - `available` false, required
          - `reason` 'measurement_stalled' | 'needs_reauth' | 'no_blog' | 'no_campaigns' | 'no_data_yet' | 'no_writer_yet' | 'not_connected' | 'not_tracked' | 'read_failed' | 'tracking_off', required
        - object
          - `available` true, required
          - `data` EmailData, required
            - `sent` number, required
            - `sentBaseline` number, required
            - `draftsAwaiting` number, required
            - `tracking` union, required
              - …
            - `replies` union, required
              - …
          - `caveats` string[]
      - `outbound` union
        - object
          - `available` false, required
          - `reason` 'measurement_stalled' | 'needs_reauth' | 'no_blog' | 'no_campaigns' | 'no_data_yet' | 'no_writer_yet' | 'not_connected' | 'not_tracked' | 'read_failed' | 'tracking_off', required
        - object
          - `available` true, required
          - `data` OutboundScoreboardData, required
            - `routes` object[], required
              - …
            - `readyIsFloor` boolean
            - `breakdownUnavailable` boolean
            - `readAt` number
          - `caveats` string[]
      - `linkedin` union, required
        - object
          - `available` false, required
          - `reason` 'measurement_stalled' | 'needs_reauth' | 'no_blog' | 'no_campaigns' | 'no_data_yet' | 'no_writer_yet' | 'not_connected' | 'not_tracked' | 'read_failed' | 'tracking_off', required
        - object
          - `available` true, required
          - `data` LinkedinData, required
            - `invites` number, required
            - `alreadyConnectedHits` number, required
            - `newDMs` number, required
            - `chatReplies` number, required
            - `inmails` number, required
            - `baseline` object, required
              - …
            - `health` object, required
              - …
            - `replies` union, required
              - …
            - `accepts` union, required
              - …
            - `scoreboard` union
              - …
          - `caveats` string[]
      - `seo` union, required
        - object
          - `available` false, required
          - `reason` 'measurement_stalled' | 'needs_reauth' | 'no_blog' | 'no_campaigns' | 'no_data_yet' | 'no_writer_yet' | 'not_connected' | 'not_tracked' | 'read_failed' | 'tracking_off', required
        - object
          - `available` true, required
          - `data` SeoData, required
            - `postsPublished` number, required
            - `postsHeld` number, required
            - `postsFailed` number, required
            - `refreshes` object, required
              - …
            - `genCostCents` number, required
            - `views` number, required
            - `viewsPrev` number, required
            - `gsc` union, required
              - …
            - `scoreboard` union
              - …
          - `caveats` string[]
      - `aeo` union, required
        - object
          - `available` false, required
          - `reason` 'measurement_stalled' | 'needs_reauth' | 'no_blog' | 'no_campaigns' | 'no_data_yet' | 'no_writer_yet' | 'not_connected' | 'not_tracked' | 'read_failed' | 'tracking_off', required
        - object
          - `available` true, required
          - `data` AeoData, required
            - `measuredThrough` string, required
            - `incomplete` boolean, required
            - `trackedPrompts` number, required
            - `window7d` AeoPeriodData, required
              - …
            - `prior7d` AeoPeriodData, required
              - …
            - `deltas` object, required
              - …
            - `sentiment` object, nullable, required
              - …
            - `byEngine` object[], required
              - …
            - `scoreboard` union
              - …
          - `caveats` string[]
      - `ads` union, required
        - object
          - `available` false, required
          - `reason` 'measurement_stalled' | 'needs_reauth' | 'no_blog' | 'no_campaigns' | 'no_data_yet' | 'no_writer_yet' | 'not_connected' | 'not_tracked' | 'read_failed' | 'tracking_off', required
        - object
          - `available` true, required
          - `data` AdsData, required
            - `liveCampaigns` number, required
            - `drafts` number, required
            - `changesInWindow` number, required
            - `spend` union, required
              - …
            - `charter` object
              - …
            - `experiment` object
              - …
            - `scoreboard` union
              - …
            - `tried` object[]
              - …
          - `caveats` string[]
      - `social` union, required
        - object
          - `available` false, required
          - `reason` 'measurement_stalled' | 'needs_reauth' | 'no_blog' | 'no_campaigns' | 'no_data_yet' | 'no_writer_yet' | 'not_connected' | 'not_tracked' | 'read_failed' | 'tracking_off', required
        - object
          - `available` true, required
          - `data` SocialData, required
            - `videosGenerated` number, required
            - `videosReady` number, required
            - `deliveryIntended` number, required
          - `caveats` string[]

## Other responses

- `400`: since is not epoch milliseconds
- `401`: Missing, revoked or unknown token
- `402`: setup_pending: the account hasn't started its trial
- `403`: The token lacks results:read
- `429`: Over the read limit; wait Retry-After seconds
- `503`: Temporarily unavailable; retry the same call.

---

[API](https://skmtc.dev/revnu/apis/revnu-api.md) · [All operations](https://skmtc.dev/revnu/apis/revnu-api/llms.txt) · [OpenAPI document](https://skmtc.dev/revnu/apis/revnu-api/revisions/52e523c2db61?raw)
