Access rules on a provider key
When you list a provider key, you are handing Surplus a credential and saying which calls may run on it. This page is the full reference for that decision: the order the checks run in, the rule syntax, and the parts of a provider's API that are never reachable no matter what anyone configures.
Three checks, and the first refusal wins
Every call is checked in this order. Nothing later can undo an earlier refusal.
1. The Surplus fence
Ours, not yours, and you cannot switch it off or widen it. It refuses:
- every host that is not the provider's own API host;
- every account route — billing, team members, API keys, usage and plan settings;
- paths that try to escape their shape (encoded separators, traversal, duplicated job ids).
For Fal this means calls reach fal.run and queue.fal.run and nowhere else — its platform API is a different
host, so every operation on it is unreachable, including the one that mints new keys. For ElevenLabs, which
publishes over four hundred operations, exactly three routes are open: POST /v1/sound-generation,
POST /v1/music and GET /v1/models. The fence is why listing a key is not the same as handing someone your
password.
Each provider's own page enumerates its reachable surface: Fal, ElevenLabs, Wavespeed.
2. Your refuse rules
Checked next, and a match ends the call. A refuse rule beats a ticked capability — it is the only thing on the page that overrides what is above it, which is what makes it useful as an escape hatch.
3. Your capabilities
Whatever survives must fall inside a capability you ticked. Nothing ticked means nothing serves.
Writing a rule
A rule is METHOD /path or just /path. The path may end in a wildcard.
| Rule | What it refuses |
|---|---|
POST /fal-ai/recraft* | Only POST, and only paths starting with that text. |
/fal-ai/recraft* | No method given, so every method. |
/fal-ai/flux-pro/* | Everything under it — and the bare path itself. |
/fal-ai/flux-pro/+ | Only deeper paths. The bare path still serves. |
* | Refuses the key entirely. Pause the listing instead. |
POST /fal-ai/recraft*What it refuses · Only POST, and only paths starting with that text./fal-ai/recraft*What it refuses · No method given, so every method./fal-ai/flux-pro/*What it refuses · Everything under it — and the bare path itself./fal-ai/flux-pro/+What it refuses · Only deeper paths. The bare path still serves.*What it refuses · Refuses the key entirely. Pause the listing instead.* spans /, so /a/* matches /a/b/c. + requires at least one more character, which is the difference
between "this family of models" and "everything below this path but not the path".
A rule can only ever take away
There is no rule that adds a route. If a capability is unticked, no rule here brings it back, and nothing you write can reach past the fence in step 1.
That is deliberate, and it is why experimenting is safe: the worst a typo can do is refuse too much. A mistyped rule costs you traffic until you notice. It cannot open anything.
What happens when a call is refused
The buyer gets a specific reason, not a generic error, so they can tell your choice apart from ours:
| What the buyer sees | What it means |
|---|---|
platform_route_refused | The Surplus fence. Never reachable, for any seller. |
policy_refused | Offers exist for this provider, but no seller's rules allow this call. |
seller_cap_reached | Capable offers exist; every one has spent its daily cap. Resets at 00:00 UTC. |
trait_unavailable | No live offer advertises something the buyer required (for example EU region). |
provider_unpriceable | Surplus cannot price the call, so it refuses rather than guessing. |
platform_route_refusedWhat it means · The Surplus fence. Never reachable, for any seller.policy_refusedWhat it means · Offers exist for this provider, but no seller's rules allow this call.seller_cap_reachedWhat it means · Capable offers exist; every one has spent its daily cap. Resets at 00:00 UTC.trait_unavailableWhat it means · No live offer advertises something the buyer required (for example EU region).provider_unpriceableWhat it means · Surplus cannot price the call, so it refuses rather than guessing.Your refusals show up on your own analytics as demand your rules refused, priced at your rates, so you can see what a rule costs you before deciding whether to keep it.
Related
- Listing your key — the end-to-end path through the API, and where these rules go.
- Pricing — how a call is priced and what your discount comes off.
- Security and privacy — what reaches a seller's account, and what never does.