The number that stopped me
I did the math last Tuesday. It stopped me cold.
Ten million tokens sounds like a fortune. Until you divide it by what one call actually eats.
I was building a small agent. Each run pulled 30 issues, summarized each one, and logged the result. Nothing fancy.
The math: 30 issues × 800 input tokens each = 24,000 tokens per run. Plus 150 output tokens per summary = 4,500. Total: 28,500 tokens per run.
At that rate, 10 million tokens lasts 350 runs. If the job runs hourly, that's 14 days. Two weeks. Then the quota is gone.
Free tiers are not infinite. They are budgets with a number on them.
Disclosure: This article was prepared as part of MonkeyCode's product outreach. The free tier numbers I reference are MonkeyCode's current offering: 10 million tokens and a free server. Quotas change. Verify before you build.
Why "calls" is the wrong unit
Most people think in calls, not tokens. That's the mistake.
A call has three parts:
- The system prompt. Often 200–500 tokens, paid every time.
- The input. Your data, your context, your diff.
- The output. The model's answer.
Here's a table I use now:
| Task | Input tokens | Output tokens | Total per call |
|---|---|---|---|
| Summarize a GitHub issue | 800 | 150 | 950 |
| Review a small PR diff | 4,000 | 600 | 4,600 |
| Fix broken JSON | 1,500 | 300 | 1,800 |
| Classify a support ticket | 500 | 50 | 550 |
| Extract fields from a PDF page | 3,000 | 200 | 3,200 |
Now divide 10 million by each row. You get the real number: how many tasks you can actually run.
Build a 40-line budget calculator
I wrote a small CLI to stop guessing. It takes your prompt size, your data size, and your expected output. It tells you how many runs your quota survives.
#!/usr/bin/env python3
"""token_budget.py — how many runs does your free quota survive?"""
import sys
QUOTA = 10_000_000 # tokens per month, replace with your actual quota
def estimate_tokens(system_prompt: str, data: str, max_output: int) -> int:
# Rough heuristic: 4 chars ≈ 1 token for English text.
return len(system_prompt) // 4 + len(data) // 4 + max_output
def main() -> None:
if len(sys.argv) < 4:
print("Usage: token_budget.py 'system prompt' 'data file' max_output")
sys.exit(1)
system_prompt = sys.argv[1]
data = open(sys.argv[2]).read()
max_output = int(sys.argv[3])
per_call = estimate_tokens(system_prompt, data, max_output)
runs = QUOTA // per_call
print(f"Estimated tokens per call: {per_call:,}")
print(f"Runs your quota survives: {runs:,}")
print()
print("At these frequencies, the quota lasts:")
for label, runs_per_day in [("every minute", 1440), ("every 10 min", 144), ("hourly", 24)]:
days = runs / runs_per_day
print(f" {label}: {days:.1f} days")
if __name__ == "__main__":
main()
Run it:
python3 token_budget.py "Summarize this issue in 80 words." issue.txt 150
Output:
Estimated tokens per call: 950
Runs your quota survives: 10,526
At these frequencies, the quota lasts:
every minute: 7.3 days
every 10 min: 73.1 days
hourly: 438.6 days
Wait. 10,526 runs hourly is 438 days. But my earlier example said 350 runs. What changed?
The system prompt. My first estimate used a long instruction block with categories and examples. The calculator uses a short one. That's the whole point.
The three levers that stretch your quota
You control three numbers. Change them and the budget moves.
Lever 1: Shrink the system prompt.
Every token in your instructions is paid on every single call. Cut 200 tokens from a system prompt and you save 200 × runs. On 10,000 runs, that's 2 million tokens.
Lever 2: Trim the input.
You don't need the whole issue body. You need the first 500 characters and the title. Truncate before you send, not after.
Lever 3: Cap the output.
Set max_tokens to the smallest number that still gives a usable answer. A summary doesn't need 500 tokens. It needs 150.
Here's the same task with all three levers applied:
| Before | After | |
|---|---|---|
| System prompt | 320 tokens | 80 tokens |
| Input | 2,400 tokens | 900 tokens |
| Max output | 500 tokens | 150 tokens |
| Total per call | 3,220 | 1,130 |
| Runs per 10M quota | 3,105 | 8,849 |
Same task. 2.8× more runs. Zero quality loss that I could measure.
What the numbers mean for your build
Now you can make decisions before you write code.
- Hourly polling agent? At 1,130 tokens per run, you get 8,849 runs. That's 368 days. The quota is not your bottleneck.
- Batch job processing 10,000 records? At 3,200 tokens per record, you get 3,125 records. The quota is your wall. You need batching or a paid tier.
- Interactive chat? 50 turns per user per day at 2,000 tokens per turn is 100,000 tokens per user per day. Ten users. Ten days. Done.
The last one is the trap. Interactive apps burn quotas 100× faster than batch jobs.
The failure mode nobody mentions
Quota exhaustion is silent.
Your calls start failing. Or worse, they start returning empty responses. Your logs fill with errors. Your users see broken features. Nobody sends you an email saying "your free tier ran out."
You need a counter. Track cumulative tokens per day. Alert yourself at 80% of quota. That's the difference between a planned migration and an emergency.
Who should not build on a free quota
Free tokens are for experiments, prototypes, and low-volume tools.
Skip them if:
- You have paying users. Your uptime is their problem too.
- You process sensitive data. Free servers are not a data isolation promise.
- Your task is batch-heavy. 100,000 records will eat 10 million tokens in a weekend.
The part nobody sells you
Ten million tokens is a real budget. It's enough for a lot of solo builds. It's not enough for everything.
The difference is math. And math is the one thing you can control.
Calculate first. Build second. Watch the counter always.
What's the first task you'd put through this calculator? I'd start with the one you're already doing manually.
MonkeyCode provides free models that can run this workflow.
Top comments (0)