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
GET
Requiressquidx.io/api/v1/analytics/overviewanalytics:readFollowers, 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.
| Name | In | Type | Description |
|---|---|---|---|
range | query | string | 7d, 30d, 90d or all. Default 30d. |
from | query | string | First day of a custom period, YYYY-MM-DD, inclusive, UTC. Give it with to; the pair replaces range. |
to | query | string | Last day of a custom period, YYYY-MM-DD, inclusive, UTC. |
series | query | boolean | true 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
GET
Requiressquidx.io/api/v1/analytics/postsanalytics:readEvery 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.
| Name | In | Type | Description |
|---|---|---|---|
range | query | string | 7d, 30d, 90d or all. Default 30d. |
from | query | string | First day of a custom period, YYYY-MM-DD, inclusive, UTC. Give it with to; the pair replaces range. |
to | query | string | Last day of a custom period, YYYY-MM-DD, inclusive, UTC. |
sort | query | string | impressions (default), engagements, likes, replies, reposts, bookmarks or posted_at. Always descending. |
limit | query | integer | Rows per page, 1 to 200. Default 50. |
offset | query | integer | Rows 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
GET
Requiressquidx.io/api/v1/analytics/hoursanalytics:readWhich 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.
| Name | In | Type | Description |
|---|---|---|---|
range | query | string | 7d, 30d, 90d or all. Default 90d. |
from | query | string | First day of a custom period, YYYY-MM-DD, inclusive, UTC. Give it with to; the pair replaces range. |
to | query | string | Last 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
}
]
}
}