SquidX logo

Analytics

The connected account's public performance, collected once a day by SquidX: followers, impressions and engagement over time, and the posts behind the numbers.

Get the overview

GETsquidx.io/api/v1/analytics/overview
Requiresanalytics:read

Followers, posts, impressions and engagements over a window, each with the delta against the previous window of the same length. followers.since is set when follower history does not reach the start of the window.

Get the overview parameters
NameInTypeDescription
rangequerystring7d, 30d, 90d or all. Default 30d.
fromquerystringFirst day of a custom period, YYYY-MM-DD, inclusive, UTC. Give it with to; the pair replaces range.
toquerystringLast day of a custom period, YYYY-MM-DD, inclusive, UTC.
seriesquerybooleantrue adds the daily points behind each number, as [{ date, value }].
Request
curl "https://squidx.io/api/v1/analytics/overview?range=30d" \
  -H "Authorization: Bearer sqx_your_key"
Response · 200
{
  "data": {
    "range": "30d",
    "window": {
      "start": "2026-08-25",
      "end": "2026-09-23"
    },
    "followers": {
      "value": 4821,
      "delta": 312
    },
    "posts": {
      "value": 46,
      "delta": 9
    },
    "impressions": {
      "value": 391204,
      "delta": 58870
    },
    "engagements": {
      "value": 7210,
      "delta": 1204
    },
    "streak": 12
  }
}

List X posts

GETsquidx.io/api/v1/analytics/posts
Requiresanalytics:read

Every post on the connected X account, also posts made outside SquidX, with its public metrics, best first. For drafts and the queue, use GET /posts.

List X posts parameters
NameInTypeDescription
rangequerystring7d, 30d, 90d or all. Default 30d.
fromquerystringFirst day of a custom period, YYYY-MM-DD, inclusive, UTC. Give it with to; the pair replaces range.
toquerystringLast day of a custom period, YYYY-MM-DD, inclusive, UTC.
sortquerystringimpressions (default), engagements, likes, replies, reposts, bookmarks or posted_at. Always descending.
limitqueryintegerRows per page, 1 to 200. Default 50.
offsetqueryintegerRows to skip. Default 0. The response meta carries the total.
Request
curl "https://squidx.io/api/v1/analytics/posts?range=90d&sort=engagements&limit=5" \
  -H "Authorization: Bearer sqx_your_key"
Response · 200
{
  "data": [
    {
      "id": "1969431290813001729",
      "url": "https://x.com/aschapmann/status/1969431290813001729",
      "text": "Built a thing. Here is what I learned.",
      "kind": "post",
      "postedAt": "2026-09-20T09:01:13.000Z",
      "impressions": 18420,
      "likes": 212,
      "replies": 34,
      "reposts": 19,
      "quotes": 4,
      "bookmarks": 61,
      "engagements": 330,
      "engagementRate": 0.0179
    }
  ],
  "meta": {
    "total": 131,
    "limit": 5,
    "offset": 0,
    "range": "90d"
  }
}

Get the best posting hours

GETsquidx.io/api/v1/analytics/hours
Requiresanalytics:read

Which weekday and two-hour slot earn the most impressions, in the workspace timezone. top ranks the slots with at least two posts by average impressions; slots lists every slot that has posts.

Get the best posting hours parameters
NameInTypeDescription
rangequerystring7d, 30d, 90d or all. Default 90d.
fromquerystringFirst day of a custom period, YYYY-MM-DD, inclusive, UTC. Give it with to; the pair replaces range.
toquerystringLast day of a custom period, YYYY-MM-DD, inclusive, UTC.
Request
curl "https://squidx.io/api/v1/analytics/hours?range=90d" \
  -H "Authorization: Bearer sqx_your_key"
Response · 200
{
  "data": {
    "range": "90d",
    "timezone": "Europe/Paris",
    "slotHours": 2,
    "minPosts": 2,
    "top": [
      {
        "day": "Tuesday",
        "from": "08:00",
        "to": "10:00",
        "posts": 9,
        "avgImpressions": 6120,
        "avgEngagementRate": 0.0211
      }
    ],
    "slots": [
      {
        "day": "Monday",
        "from": "18:00",
        "to": "20:00",
        "posts": 4,
        "avgImpressions": 2890,
        "avgEngagementRate": 0.0164
      },
      {
        "day": "Tuesday",
        "from": "08:00",
        "to": "10:00",
        "posts": 9,
        "avgImpressions": 6120,
        "avgEngagementRate": 0.0211
      }
    ]
  }
}