Track Accounts
Manage which X accounts you're monitoring for follow activity.
Add Account
POST /v1/track
Cost: Draws on your monthly usage (free if the account is already in the shared coverage pool)
Starts monitoring an X account for new follows.
curl -X POST https://frontrun.vc/v1/track \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-d '{"username": "pmarca"}'Request body
| Field | Type | Required | Description |
|---|---|---|---|
username | string | Yes | X username to track. Leading @ is stripped automatically. |
Response
{
"username": "pmarca",
"tracking": true,
"ready": true,
"follow_count": 70,
"usage_pct": 12,
"usage_resets_at": "2026-11-01T00:00:00Z",
"message": "Tracking active. New activity will appear shortly."
}| Field | Type | Description |
|---|---|---|
ready | boolean | true once the account is fully initialized and queryable. Newly added accounts may return false briefly. |
follow_count | integer | Number of accounts currently being followed. |
Errors
| Status | Description |
|---|---|
| 402 | Out of usage (out_of_usage) |
| 402 | Account outside the Frontrun network and no private-source slot left (code: "PRIVATE_SOURCE_PACK"). Private sources are $20/mo per 100, bought in Settings > Billing. |
| 403 | Tracking limit reached (error_code: "tracking_cap"). See Tracking limits. |
| 404 | X account not found |
| 409 | Already tracking this account |
Add Accounts in Bulk
POST /v1/track
Cost: Draws on your monthly usage per account new to the platform. Accounts already in the shared coverage pool are free.
Send an array instead of a single username and the same endpoint takes a
batch. Onboarding a 150-firm list is 3 calls, not 150.
curl -X POST https://frontrun.vc/v1/track \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-d '{"usernames": ["pmarca", "naval", "paulg"], "max_credits": 40}'Request body
| Field | Type | Required | Description |
|---|---|---|---|
usernames | string[] | Yes | X usernames to track. Max 50 per request. handles is accepted as an alias. Duplicates are collapsed. |
max_credits | integer | No | Cap what this call may cost. See Budgets & Cursors. |
The single-username form above is unchanged and still returns 201 / 409 /
404. Only an array body takes the batch path.
Response
Always 200. Partial success is the normal case, so read the per-item
status rather than the HTTP code.
{
"batch": true,
"results": [
{ "username": "pmarca", "status": "tracked", "tracking": true, "ready": true, "follow_count": 70, "new_introduction": false },
{ "username": "naval", "status": "already_tracked", "tracking": true, "ready": true, "error": "Already tracking this account" },
{ "username": "not_a_real_handle", "status": "not_found", "error": "Twitter account @not_a_real_handle not found" }
],
"summary": { "submitted": 3, "tracked": 1, "already_tracked": 1, "not_found": 1 },
"usage_pct": 12,
"usage_resets_at": "2026-11-01T00:00:00Z"
}Per-item status values
| Status | Meaning |
|---|---|
tracked | Added. new_introduction: true means it was new to the platform and billed. |
already_tracked | You were already tracking it. Free. |
not_found | The handle does not resolve on X. Never billed. |
invalid | Empty or malformed handle. |
deferred | Not attempted: this request had already used its 10 new-account introductions. Resubmit just these handles. |
intro_cap | The daily new-account introduction limit for your tier was reached (free 20, starter 100, pro 250, enterprise 2000). Accounts already in the coverage pool are unlimited. |
insufficient_credits | Usage ran out partway through the batch. |
tracking_cap | You are at your plan's tracking limit. See Tracking limits. The response adds a tracking_cap_note. |
private_source_pack | The handle is outside the Frontrun network and your private-source slots are used up. Buy a pack (100 for $20/mo) in Settings > Billing and resubmit. |
tracked_limit | Your plan's tracked-account quota is full. |
upstream_unavailable | X was temporarily unreachable for this handle. Retry it. |
failed | Server-side failure for this handle. Retry it. |
Limits worth knowing
- 50 handles per request. Larger batches return
400witherror_code: "batch_too_large". - 10 new-account introductions per request. An introduction means a handle
the platform has never seen, which costs us a live X lookup. Handles past the
tenth come back
deferredrather than failed, and the rest of the batch still processes. Handles already in the coverage pool do not count. - The daily introduction cap is shared across the whole batch, not applied per item, and it is the same counter the single-handle endpoint uses.
- Your tracking limit applies to the batch too. Handles past it come back
tracking_cap. With automatic expansion on, the cap is raised once for the whole batch (one charge), not once per handle.
Tracking limits
Keys created from a Frontrun account are held to the same tracking limit as the web app.
| Plan | Tracked accounts | Of which outside the Frontrun network |
|---|---|---|
| Free | 0 | 0 |
| Pro | 250 | 100 |
| Max | 750 | 500 |
| Custom plans | Your plan's cap | Your plan's cap |
| Enterprise | Your contract's cap | Your contract's cap |
Accounts outside the network stay private to you: they never join the Frontrun Network.
Admin keys are exempt. Accounts already over their limit are never trimmed: everything you track keeps working, you just cannot add more until you are back under it.
Going past 250 on Pro
Turn on automatic expansion in Settings > Billing. Each account past 250
then costs $0.25 per month, billed the same way as the web app. A batch
POST /v1/track raises the cap once for the whole batch, so you get one
charge, not one per handle.
Swaps
You get 25 free swaps per rolling 7 days. A swap is untracking one account and tracking another: the slot frees immediately.
Past 25 swaps in a week, an account you untrack keeps its slot for 7 days before it frees up. Re-tracking the same account you just dropped is always free, it takes its own slot back.
Over the limit
A single-handle POST /v1/track returns 403:
{
"error": "Tracking limit reached (250 accounts).",
"error_code": "tracking_cap",
"account_limit": 250,
"tracking": 250,
"swaps_this_week": 27,
"free_swaps_per_week": 25,
"held_slots": 2,
"overage_hint": "Pro can go past 250 at $0.25 per account per month: turn on automatic expansion in Settings > Billing.",
"hold_note": "You get 25 free swaps a week. Past that, an account you stop tracking keeps its slot for 7 days.",
"next_slot_free_at": "2026-10-02T15:20:00.000Z"
}| Field | Type | Description |
|---|---|---|
account_limit | integer | Your plan's tracking limit. |
tracking | integer | Accounts you track right now. |
swaps_this_week | integer | Accounts you untracked in the last 7 days. |
free_swaps_per_week | integer | Always 25. |
held_slots | integer | Slots still held by untracks past your free swaps. |
overage_hint | string | How to go past the limit on Pro. |
hold_note | string | Only when slots are held. |
next_slot_free_at | string | Only when slots are held. When the next held slot frees up. |
In a batch, the handle's status is tracking_cap and the response carries a
tracking_cap_note.
Remove Account
DELETE /v1/track/:username
Cost: Free
Stops monitoring an account.
curl -X DELETE https://frontrun.vc/v1/track/pmarca \
-H "X-API-Key: your_api_key"Response
{
"username": "pmarca",
"tracking": false,
"slot_freed": true,
"free_swaps_left": 24,
"free_swaps_per_week": 25,
"slot_note": "Slot freed. 24 of 25 free swaps left this week."
}| Field | Type | Description |
|---|---|---|
slot_freed | boolean | true when the slot is free to use now. false once you are past your 25 free swaps this week: the slot then frees in 7 days. |
free_swaps_left | integer | Free swaps left in the rolling 7-day window. |
free_swaps_per_week | integer | Always 25. |
slot_note | string | Plain-English summary of the above. |
The swap fields are returned for keys created from a Frontrun account. See Swaps.
List Tracked Accounts
GET /v1/track
Cost: Free
Returns all accounts you're currently monitoring.
curl https://frontrun.vc/v1/track \
-H "X-API-Key: your_api_key"Response
{
"count": 3,
"accounts": [
{
"username": "pmarca",
"ready": true,
"created_at": "2026-03-01T12:00:00Z"
},
{
"username": "naval",
"ready": true,
"created_at": "2026-03-01T12:01:00Z"
},
{
"username": "paulg",
"ready": false,
"created_at": "2026-03-07T18:30:00Z"
}
]
}