Grind a huge one-time job overnight on a free tier's tiny rate limit
Pace a big one-time batch (label a dataset, summarize an archive, draft alt text) through a free tier with a very low rate ceiling, proven to finish within the rate limit and the monthly token budget before you start it.
Run this workflow
CI-verified, 2/2 fixtures passing.
Build this with your agent
One copy-paste hands Claude Code, Codex, or Cursor the full recipe, steps included, nothing to fetch.
Intended Use
Anyone with a large one-time backlog and no budget. CI validates the batch plan: item count, the rate ceiling, per-item token estimate, and the monthly token budget, then confirms the job fits the budget and reports the wall-clock ETA at that rate. No key, no model call. The batch run is fenced.
Not for
- Anything live or interactive, a couple of requests per minute is for an overnight grind, not a chatbot
- Sensitive data, free tiers often use your prompts to improve models; keep confidential material on a paid tier
- Jobs that change every run, this pays off for a single big backlog, not recurring work that needs different handling each time
The Stack
Tested Against
Mistral free Experiment tier (2026-06)node@20Side effects & data flow
- Network
- none, local only
- Writes
- ./batch.json
- Credentials
- none required
Prerequisites
- A free Mistral La Plateforme account + key (only to actually run the batch)
- A runner that paces requests to the rate limit
Steps
- 1
Size the batch to the rate limit and the monthly budget
State how many items you have, the free rate ceiling, your per-item token estimate, and the monthly token budget. CI confirms the job fits the budget and reports how many hours it will take at that rate, so you know it finishes overnight rather than stalling. Running the batch needs your key and is fenced.
cat > batch.json <<'JSON' { "provider": "mistral", "items": 3000, "rate_limit_rpm": 2, "est_tokens_per_item": 1200, "monthly_token_budget": 1000000000 } JSON node -e ' const fs = require("fs"); const c = JSON.parse(fs.readFileSync("batch.json", "utf8")); function bad(m) { console.error("BAD: " + m); process.exit(1); } const items = c.items || 0; const rpm = c.rate_limit_rpm || 0; const per = c.est_tokens_per_item || 0; const budget = c.monthly_token_budget || 0; if (items < 1) bad("no items to process"); if (rpm < 1) bad("rate_limit_rpm must be at least 1"); if (per < 1) bad("est_tokens_per_item must be set"); const used = items * per; if (budget && used > budget) bad("job needs " + used + " tokens but the monthly budget is " + budget); const etaH = (items / (rpm * 60)).toFixed(1); console.log("config OK: " + items + " item(s) at " + rpm + " req/min ~" + etaH + "h, using " + used + " of " + budget + " monthly tokens"); ' - 2
Queue it and let it trickle overnight (the model step, not checked by CI)
Point your paced runner at the backlog with your Mistral key and let it grind at the rate limit while you sleep. Check the output in the morning. The run is fenced.
Eval, 2 fixtures
Last passed: verified todaybatch-okcontainstimeout 30s · max $0Expected:
config OK: 3000 item(s) at 2 req/min ~25.0h, using 3600000 of 1000000000 monthly tokensclean-exitexit_codetimeout 30s · max $0Expected:
0
Results
Some free tiers have an unusual shape: a painfully low rate ceiling (Mistral's free Experiment tier is about a couple of requests a minute) paired with a huge monthly token budget (around a billion). That is useless for live chat but ideal for a patient overnight grind against a backlog. The trick is to size the job to the rate and the budget up front, so it finishes by morning instead of stalling.
Did this work for you?
Our CI checks the setup runs. You tell us if the whole thing worked. Tell us straight.
Related workflows
- Teach OpenCode Go your weekly chore once, then run it in minutes
- Let a free model triage your reading: one-line summary + reply flag
- Scrape politely: honor robots.txt and a crawl delay (the part most skip)
- Firecrawl: turn a page into the exact JSON you asked for
- Claude Code Cloud Schedule: Runs With Your Laptop Off
- Claude Code Headless: An Always-On Local Schedule
Liked this workflow?
Get new verified workflows in WebAfterAI, three issues a week (Tue, Thu, Sat).