Bulk API

For scripts: send many finished items in one request with a personal token, and read your play time back.

Get a personal token

In the game: Account > Finished items > Create a personal token. Copy it straight away; it's shown once. You can have up to 5. A token can only send finished items and read your play time, and you can revoke it at any time on the same panel. Only a hash of it is stored.

POST /api/items

curl -X POST https://ironvaleidle.com/api/items \
  -H "Authorization: Bearer ivp_..." -H "Content-Type: application/json" \
  -d '{"items":[{"source":"github","id":"PR_kwDO123","type":"pr_merged","completedAt":"2026-10-29T16:05:00Z"}]}'
FieldRules
sourceLowercase letters, digits, ., - or _, up to 32 characters. github.com is reserved for the built-in GitHub connection (refused as reserved_source)
idThe tool's id for the item: a string of 1 to 256 characters, or a number. Hashed on arrival
typeSame characters as source; sets the weight
completedAtISO 8601 or epoch milliseconds; not more than 35 days old nor 10 minutes in the future

The answer lists what was accepted, what was already known, what was refused and why, and your play time:

{ "accepted": 1, "duplicates": 0, "rejected": [], "credit": { ... } }

Each refused item comes back as { "index": 3, "code": "..." } with the item's position in your list.

GET /api/credit

With the same Bearer token: play time left, the most your bank can hold (96 h), your time zone and rest days, today's items against your benchmark, your sources with their benchmarks and weights, and this and last week's counts.

curl https://ironvaleidle.com/api/credit -H "Authorization: Bearer ivp_..."

Limits

GET /api/leaderboard

The public boards, with no token: the top 100 of one board, refreshed about every 15 minutes.

curl "https://ironvaleidle.com/api/leaderboard?board=season&metric=gold"
ParameterValues
metricskill (default): total level, ties broken by total XP, then by who got there first. gold: lifetime coins earned. Any other value gets skill
boardalltime (default), 30d or season. The last two rank what was gained in the window: levels (ties: XP) or coins. Anything else is refused as bad_board
{ "board": "season", "metric": "gold", "metrics": ["skill", "gold"], "generatedAt": 1793000000000,
  "season": { "number": 1, "startsAt": ..., "endsAt": ..., "started": true },
  "rows": [{ "rank": 1, "name": "Brisk Otter", "value": 48200, "tie": 9310000, "level": 412, "xp": 31800000, "coins": 520400 }] }

value is what the board ranks and tie the XP that breaks ties, both as gains on the 30-day and season boards; level, xp and coins are all-time totals.