The Script That Couldn’t See Free Models

Quick conclusion

My model-routing script filtered out every free model on OpenRouter, because “free” and “no price data” looked identical to a filter that only checked for a number greater than zero. I fixed it, tested one of the free models it had been hiding, and found the usual list of small problems: slow, a data policy I had to read twice, and token overhead I hadn’t budgeted for. None of it changed how I actually work. The bottleneck was never the price of a draft. It’s the time I spend reviewing one.

The setup

I run a small script that talks to OpenRouter’s model catalog. Most of the time I use it to check pricing before routing a drafting task to a cheaper model, the same way I’ve written about before (why cheap models are cheap, but reviewing them is not).

On August 20, 2026, an anonymous model called stealth/ox-alpha showed up on OpenRouter. No maker listed, no announcement, just an ID. Free, with a 1M-token context window. I wanted to see what it looked like in my own catalog view before testing it directly.

It wasn’t there.

What I found

On August 23, 2026, I searched my catalog for it by name. Zero results. That was strange, because OpenRouter’s own site showed it clearly.

The problem was in my filter. I’d written it to only list models where the output price was greater than zero, on the assumption that a price of exactly zero meant the pricing data hadn’t loaded yet. That assumption made “free” and “broken” the same bucket, and free models never made it past the filter. When I checked how many models this affected, 22 out of 422 were free, and all 22 had been invisible to me the entire time.

I hadn’t been choosing not to use free models. I’d been choosing without knowing they existed. Absence of evidence isn’t evidence of absence, and my own tool had been quietly proving that point every time I ran it.

The bug I made while fixing the bug

I fixed the filter to separate “free” from “no price data,” and free models started showing up correctly. Then I ran a broader price-range query and saw a number at the top of the list that made no sense: negative one million.

The old filter had been doing two jobs without me realizing it. Besides hiding free models, it had also been hiding a different kind of entry: models routed dynamically, where a placeholder value marks “price decided later” rather than “no price.” Once I stopped treating anything at or below zero as invalid, that placeholder surfaced as a real number, and it sorted itself straight to the top.

The fix was to treat “free,” “price pending,” and “no data” as three separate cases instead of one. But the lesson is the one I keep relearning: when you fix a filter that was hiding something, run it again immediately and look at what else comes out. A fix that only adds isn’t done until you check what it also let through.

Testing the model I could finally see

With ox-alpha visible, I ran a few small requests against it directly, the same day.

  • Speed: a two-character reply (“OK”) took 45.7 seconds on one run and 85.4 seconds on another. That’s not a pace I’d want for anything longer than a sanity check.
  • Hidden overhead: an input of roughly 10 tokens showed up as 92 prompt tokens in the response metadata. There’s a system-level preamble I don’t control, and it isn’t free even when the model is.
  • The empty-response trap: with a tight output limit, the response was marked as cut off by the token limit, but it came back with zero visible characters instead of a partial answer. It’s the same failure mode I’ve run into with reasoning models before, just triggered by a different limit.
  • Data policy: the provider’s stated policy was that prompts are retained but not used for training. Retained and not-trained-on are two different promises, and only one of them was made here.

None of this is unusual for a preview model. It’s exactly the kind of thing an anonymous, free listing is allowed to be casual about, because nobody’s committed to supporting it yet.

The plot twist

I’d planned to write this as a story about an anonymous model that would eventually vanish without explanation, the way preview listings usually do. It didn’t quite go that way.

On August 26, 2026, Z.ai confirmed that ox-alpha was an early release of a new model in their GLM line: GLM-5.3-Flash. During its six days as an anonymous listing, it had reportedly become the second most-used model on OpenCode, a coding platform, processing roughly 16 trillion tokens across about 221,000 users, before anyone knew whose model it was.

It didn’t disappear. It graduated. z-ai/glm-5.3-flash is available under its real name now, and it isn’t free anymore, priced at roughly $0.075 per million input tokens and $0.25 per million output tokens. The free window turned out to be a launch tactic, not a permanent offer.

That’s actually a cleaner version of the risk I’d already written into my notes before any of this happened: a free preview model has no obligation to still be the same thing next week. This time it didn’t vanish, it just stopped being free and started having a name. Same risk, better ending.

What did not change

Even with the price at zero, nothing about how I evaluate a model’s output changed. The cost of a draft was never the expensive part. Reviewing a bad one is. A model that saves me $0.02 and costs me ten extra minutes of editing is not a good trade, and that math doesn’t move when the $0.02 becomes $0.

Free is a reason to try a model for a quick, low-stakes check. It’s not a reason to add it to anything I run regularly, and it wasn’t going to become one no matter what number was in the price column.

Lessons learned

  • A filter that excludes based on a threshold can accidentally exclude the exact case it was meant to catch. Zero and “no data” are not the same value, and treating them the same hides real options.
  • Fixing one filter bug can expose a second one that was riding along inside it. Test again right after you fix something, not just before.
  • A free, anonymous model is a preview, not a commitment. It can end by disappearing or by graduating into something with a name and a price. Either way, don’t build anything that depends on it staying exactly as it is.
  • The bottleneck in using AI models for drafting was never the token price. It’s the time spent verifying the output, and that number doesn’t move when the price does.

FAQ

Is it risky to use free AI models for real work?

For a quick, one-off check, no. For anything you plan to run repeatedly, the bigger risk isn’t the model itself, it’s that a free or anonymous listing can change or disappear with no warning, and you’ll have built a habit around something that no longer exists.

Why didn’t my own tool show me free models before now?

Because its filter treated a price of exactly zero the same as missing pricing data, and excluded both. The two cases needed to be told apart, and until they were, free models were invisible by design rather than by choice.

What happened to ox-alpha?

It was revealed on August 26, 2026 to be an early release of Z.ai’s GLM-5.3-Flash. It’s now available under that name, at a low but non-zero price.

Next steps

I’m curious whether the newer GLM models are worth adding to my regular routing options now that they have official pricing instead of a stealth listing. That’s a test for later, not a conclusion I’m ready to draw from one afternoon with an anonymous model.

Leave a Comment

CAPTCHA