apiblaze recipes
Recipes, explained
Someone got an API working — the login, the header rewriting, the AI tools, all of it. A recipe is how you get the same setup running in your own account, without asking them how they did it, and without ever holding their credentials.
npx apiblaze install @jayjaychicago/pokeapiThat one is real. It is the Pokémon API — 97 routes and a working MCP server — and every command on this page uses it, so you can paste any of them.
Start here
What a recipe is
A proxy is one API you run on apiblaze: a URL of your own that receives requests, checks who is calling, rewrites the request if it needs to, and forwards it to the real API behind it. A recipe is a frozen copy of one proxy's configuration — its settings, its login setup, its transform rules, its API description and the AI tools generated from that description.
It is one JSON file. @jayjaychicago/pokeapi is about 400 KB of it, most of which is a 97-route API description.
The name has two parts. @jayjaychicago is the handle — the publisher's namespace, claimed once and owned by their team. pokeapi is the recipe's name. Recipes also have a revision: 1, 2, 3. That is the version of the recipe, not the version of the API inside it.
We call it a recipe rather than a template or a package because a recipe lists ingredients you supply yourself. The publisher wrote down the method. You bring your own OAuth client, your own API key, your own account.
What a recipe is not
- It is not a copy of the publisher's account. No users, no API keys, no email addresses, no team identifiers. Not because they are stripped out, but because a recipe has nowhere to put them — there is no tenant inside a recipe, and a tenant is where users live.
- It never carries the publisher's credentials. Their Google client secret, their Stripe key, their private signing key: none of it travels. A recipe is assembled from a written-down list of fields that are allowed out, so anything not on that list was never read in the first place.
- It is not a running service. Installing does not point you at the publisher's proxy. It builds a new one, on your own URL, in your own account, billed to you.
- It is not inert data either. A recipe can carry transform rules, and those rules run on every request your proxy serves. There is a fence around what they may touch — see below.
Read one before you run it
Every public recipe is readable in full, by anyone, with no login. There is nothing hidden in it.
# the whole filenpx apiblaze show @jayjaychicago/pokeapi # just one part of itnpx apiblaze show @jayjaychicago/pokeapi --transformsOr open /api/recipes/jayjaychicago/pokeapi/2 in a browser.
For installers
Installing one
npx apiblaze install @jayjaychicago/pokeapiYou need an apiblaze account, because install creates things in it. If you are not signed in, run npx apiblaze login first — it opens a browser once and remembers.
What it asks you, and why
First, a name for the new proxy. It suggests one — mypokeapi — and you press enter or type your own. Names are lowercase letters and digits only, at least three characters: mypokeapi, never my-pokeapi.
The name comes first for a reason. Everything else is built from it. If the recipe needs an OAuth client, the redirect address you have to paste into Google's or GitHub's console is https://mypokeapiusers.auth.apiblaze.com/callback, and that address does not exist until the name does. Asking in this order means you do the console work once, in the middle of the install, and the install finishes finished — not "installed, now two more steps."
Then a summary, and a yes or no. Before anything is created you see what it will create, every host it will send requests to, what it will ask you for, and whether your API's description becomes public. Nothing happens until you answer.
Then the recipe's own questions — the values only you can supply. @jayjaychicago/pokeapi asks for two: an OAuth client ID and an OAuth client secret, because the publisher's proxy signs its users in with GitHub and the OAuth client has to be yours, not theirs.
- Secret answers are masked as you type.
- Each answer is held in memory and sent on the single step that needs it. The client secret goes to the step that creates your login provider and nowhere else. It is never written to a file and never echoed back.
- Running without a terminal? Answers come from environment variables —
ABZ_ANSWER_OAUTH_CLIENT_SECRET— and never from a command-line flag, because a flag lands in your shell history and in your CI logs.
What gets created
One step at a time, reported as it goes, so a failure names the step rather than leaving you with a half-built proxy and a job id.
creating mypokeapi ✓ proxy + tenantsettings and environments ✓GitHub login provider ✓2 key types ✓6 transforms, 1 mapping table ✓API spec → 97 routes, MCP tools ✓ done in 18s. proxy https://mypokeapi.abz.run mcp https://mypokeapi-mypokeapiusers.mcp.apiblaze.comA tenant is apiblaze's word for one set of your API's end users together with the login that serves them. Install always creates a brand-new one to hold the recipe's login setup. It never touches a tenant you already have, and it never copies one of the publisher's — there is no tenant in the file to copy.
Recipes with transform rules need team admin
Editing transform rules is an admin action on your team, and install writes them, so installing a recipe that carries transforms needs the admin role. Creating a plain proxy needs only member.
Pinning a revision
@jayjaychicago/pokeapi means "the newest public revision", which today is revision 2. Tomorrow it might be 3. To install exactly the one you read, add @2:
npx apiblaze install @jayjaychicago/pokeapi@2A published revision is frozen. Revision 2 is the same bytes forever — nobody can edit it in place, not even the publisher. Their fix becomes revision 3, and revision 2 keeps working for everyone who pinned it. The only way a revision changes is that it stops existing; withdrawing is that.
Whichever number you install is recorded on the proxy, so its history is always a specific revision, never "latest".
Skipping the prompts
# name it yourself, skip the rename questionnpx apiblaze install @jayjaychicago/pokeapi --as pokedex # re-run over a proxy that already exists (see below)npx apiblaze install @jayjaychicago/pokeapi --into pokedex # no terminal at all — CI, a scriptnpx apiblaze install @jayjaychicago/pokeapi --as pokedex --yes--yes answers the routine confirmations and declines everything on the consent list — exactly the same as pressing enter at that screen. A script can never agree, on your behalf, to a stranger's quota or a stranger's open-to-the-internet setting.
Re-running it, and when a step fails
If a step fails, the command tells you which one and why, and gives you the way back in. That way back is --into, which starts from step two — the proxy already exists, so it is never created twice.
npx apiblaze install @jayjaychicago/pokeapi --into mypokeapi--into is also how you move an existing proxy to a newer revision. Same proxy, same URL, same API keys, same users — the configuration is replaced. Questions you already answered are not asked again.
There is no undo
--into overwrites the proxy's configuration permanently. It lists what it is about to replace and makes you type the proxy's name to confirm, even with --yes.
Read this one
What “needs your consent” means
A recipe can carry settings that change who can reach your proxy, what it trusts, and what it costs you. Install shows those settings on their own screen and makes you type yes. Press enter instead and it installs the recipe using your own current settings for everything on the list — which, for most recipes, is still a completely working proxy.
Every public recipe's page shows the same list before you run anything. Here is the real one for @jayjaychicago/pokeapi.
| What it is | Why it matters |
|---|---|
| Upstream host | The real API your proxy forwards to — pokeapi.co for that recipe. Every request goes there, including your users' third-party access tokens if your proxy carries them. A recipe pointing at a host its publisher controls would receive that traffic. This is why the first line of the consent screen is the hostname. |
| Request policy | passthrough means no API key is needed: anyone on the internet who knows the URL can call your proxy. That is the right setting for a public API and the wrong one for almost everything else. |
| CORS | A list of websites whose pages may call your API from a visitor's browser. With credentials allowed, pages on that site can read your API using whatever session the visitor already has. |
| Rate limits and quota | A raised quota is a bill. If a recipe sets 10,000 requests/day and your account is used to 100, the difference is billed to you, not to the publisher. |
| Dev portal | Turning it on creates a public page for this API on your account, where anyone can read the docs and request a key. |
| MCP server | Turning it on creates a public endpoint that AI assistants can call. It is how a recipe makes an API usable from a chat window — and it is a new public surface on your account. |
| Transform rules that write headers | Shown as their literal rule text, so you can read them. A rule may set a header from an answer you gave — that is the ordinary bring-your-own-API-key recipe. It may never read your users' credentials or claim to be a different user; that is enforced, not requested. |
Things you will never be asked to consent to
Webhook URLs, IP allowlists, external token issuers and sidecar origins are not on the list of fields a recipe may contain at all. There is nothing to consent to, because no recipe can carry one.
For publishers
Publishing one
Publishing takes a proxy you already run and freezes a copy of it. You do not write a recipe file; the platform reads your live proxy.
npx apiblaze publish pokeapiThat becomes @yourgithubhandle/pokeapi. Your handle defaults to your GitHub login, so the first publish asks nothing — inventing a namespace before you have published anything is a decision you have no basis to make, and your GitHub login is already unique and already the name people know you by.
# set just the recipe namenpx apiblaze publish pokeapi --as pokedex # set the handle too — a team that wants @acme claims it herenpx apiblaze publish pokeapi --as @acme/pokedex # only your team can see or install itnpx apiblaze publish pokeapi --privateOnce claimed, a handle belongs to the team, not to the person; your GitHub login only seeds it. About 124 handles are reserved — @google, @stripe, @openai, plus apiblaze's own words like @admin and @portal — because the risk worth stopping is a recipe pretending to be the API it wraps. @jayjaychicago is instant.
Names cannot be changed later. Renaming would break every record of where an installed proxy came from, so this is settled at the start.
Public or private
| Who can find it | Who can install it | |
|---|---|---|
| public | Anyone, including search engines | Anyone with an apiblaze account |
| private | Only members of your team | Only members of your team. To everyone else it returns 404, not 403 — a 403 would confirm the name exists. |
Private is not a lesser mode. An internal platform team publishes @acme/billingapi once and every squad installs the same working setup instead of copying settings by hand.
Visibility is set per revision. Flipping a recipe from private to public publishes only from that point on — it does not retroactively publish the four private revisions you pushed while it was internal.
Publishing publicly makes your API's description public
A proxy's OpenAPI description is private unless you opt in, because it is the full contract of your API. A recipe contains it, so a public recipe makes it readable at https://yourproxy.abz.run/v1/openapi.json. Publish says so and asks before it flips the flag. A private recipe does not touch it.
Installing one never does this to you. A recipe does not carry that setting, so an install cannot make your own API description public — that stays your decision, on your proxy, whenever you want to make it.
What the scanner does — and what it cannot promise
Before it freezes anything, publish reads inside every value it is about to send out — each entry of each mapping table, each transform rule, each field of the API description — and matches them against known secret shapes: AIza, sk-, ghp_, AKIA, xox, GOCSPX-, -----BEGIN … PRIVATE KEY, long high-entropy strings, email addresses, and private hostnames like .internal or 10.0.0.5.
Anything it flags stops the publish and asks you what to do with it:
checked 340 values against 9 known patterns. 2 need your decision: transformations → rule "auth header" → X-Api-Key AIzaSyD4k2...9mQ looks like a Google API key [k] keep [a] ask the installer [r] remove openapi → servers[0].url https://relay.internal.acme.com not a public hostname [k] keep [a] ask the installer we cannot judge the other 338 values. run with --show to read the whole recipe.[a] is the interesting one: it turns that value into a question the installer answers for themselves, and replaces it in the file with a placeholder. That is how "my Salesforce instance URL" becomes "your Salesforce instance URL". Your choices are remembered on the proxy, so publishing revision 4 next month stops only for values that are new or newly suspicious.
It never says “no secrets found”
It says what it checked and what it could not judge, and those are different sentences. Patterns catch a key that looks like a key. They do not catch a thirteen-character password, or a token sitting in the middle of a description field, or a secret shaped like nothing in particular. "Nothing matched our 9 patterns" is never "no secrets found".
Read the file before you publish it. When the scanner is wrong in public, withdraw is the remedy, and rotating the key is the real one.
Values that are already encrypted in your account are replaced with a marker rather than carried across. The ciphertext is tied to your proxy and could never be decrypted by an installer, so carrying it would only publish the fact that a secret sits at that spot.
It also tells you what it left out
A recipe contains only the fields on a written-down list. Everything else is excluded — not blocked, just never read. That is safe but silent, so every publish prints what did not travel and waits:
3 settings were not included, because they are not on the publish list: rateLimit.perUser cors.maxAge listenToTraffic continue without them? [y/N]Nothing there can leak. The risk it catches is the opposite one — a recipe quietly missing a setting that ought to travel, which you can now see and report.
Publishing from a script
--yes accepts the routine confirmations. It does not accept scanner findings: if anything is flagged, the command fails and prints them. Fix the value in the proxy, or publish interactively and decide. Otherwise the first --yes in a GitHub Action turns the scanner into decoration.
Publishing is also in the dashboard, on a proxy's General → Advanced settings tab, together with the public/private switch and the list of what your team has published.
When it goes wrong
Withdrawing one
The most likely reason to pull a revision is that the scanner missed a real secret, and minutes matter, so it is self-service and immediate.
npx apiblaze withdraw @jayjaychicago/pokeapi@1this permanently deletes revision 1. installs of it will fail.3 accounts installed it — rotate any secrets it contained.type the recipe name to confirm: _The file is deleted, the cached public copy is purged, and @jayjaychicago/pokeapi@1 answers 410 withdrawn by publisher. You have to type the name; --yes does not skip it.
Withdrawing does not un-install
Everyone who already installed that revision still has their proxy, still configured the way it was. Withdrawal removes the file, not its consequences. If a secret was in it, rotate that secret now, not later — a leaked key stays leaked.
Withdrawing also does not notify the people who installed it. Who installed your recipe is their business, not yours; you see the count.
Withdrawing is the only way a published revision ever changes. There is no editing one: a published revision is frozen. Publish again and you get revision N+1, while everyone pinned to the old number carries on unaffected.
The guarantees
How it stays safe
A recipe is written by a stranger and runs in your account. Four things make that a reasonable thing to do, and one thing it deliberately does not protect you from.
1. The publish list is an allowlist
There is one list, in one file, naming the fields a recipe is allowed to contain: some settings, the shape of the login client, the login provider's type and scopes, key types, transform rules, mapping tables, the API description. Anything not named does not travel.
Not a denylist, not a judgement call per column. Your email, your team id, your project id, your custom domain, your GitHub repository, your workspace claim code and every field added to apiblaze next year are all excluded — because being excluded is what happens when you are not named. A recursive secret scrubber (client_secret, private_jwk, claim_code, password, at any depth) runs behind it as a second pass.
2. Transform rules may not read credentials or claim an identity
A transform rule is the most powerful thing a recipe carries, because of when it runs. On every request apiblaze first attaches who is calling and, for a bring-your-own-OAuth proxy, swaps in the end user's real third-party access token. Publisher rules run after that. Left unrestricted, a rule could copy a live Google token into a query parameter and send it to the recipe's own upstream — for every user of every install, silently, forever.
The fence is about reading, not writing:
| A recipe rule may… | Why | |
|---|---|---|
read Authorization, Cookie, or the headers holding a user's third-party token | no | That is the user’s live credential, usable at Google without apiblaze. A value it cannot read is a value it cannot send anywhere. |
write Authorization from an answer you gave, or a fixed value | yes | This is the ordinary recipe: “enter your own Stripe key, it goes in the Authorization header”. The value is yours. |
write x-end-user-id or any other identity header | no | Those tell your own backend who is calling. Only the platform sets them; a recipe that could would be a permanent impersonation key into your application. |
| read and write the body, content headers, ordinary custom headers | yes | This is what transforms are for — base64 bodies, message assembly, renaming a field. |
Publish refuses a rule outside that fence and names it. Install refuses it too, in case a recipe was assembled by hand against the API.
3. Identities never leave, structurally
A recipe has no tenant in it, so there is no container for users, memberships, API keys, email addresses or team identifiers to travel in. What travels is login configuration. That is a stronger guarantee than "we remember to strip the users", because there is nothing to remember.
4. A private recipe does not exist to anyone else
Fetching one while logged out returns 404, not 403. So does a withdrawn revision to a stranger, and so does a name nobody ever used. One indistinguishable answer, because a different answer is itself information: it tells you the name is taken and by whom.
And only the team that first published a name can publish revision N+1 to it, withdraw it, or change its visibility. Otherwise anyone could push a new head revision onto a popular name and every unpinned install would pick it up.
What this does not protect you from
The upstream is real. A recipe's upstream host receives real traffic and, if your proxy carries them, real user tokens. Nothing prevents that — a proxy without an upstream is not a proxy. It is shown to you, in plain words, before you install.
The scanner is patterns, not understanding. Low-entropy secrets and secrets in free-text descriptions get through.
Text in a recipe is a stranger's text. Descriptions inside a recipe's API spec become the descriptions of the AI tools it generates, and an assistant reads those as instructions. They are sanitised, length-capped and labelled as the publisher's words rather than the API owner's — but they are still a stranger's words.
The short version
A recipe never contains the publisher's credentials, never contains anyone's users, and cannot read yours. Everything it can do that costs you money or opens a door is printed on one screen and needs a typed yes.
Reference
Every command
| Command | What it does |
|---|---|
npx apiblaze search pokeapi | Find public recipes. No login needed. |
npx apiblaze show @jayjaychicago/pokeapi | Print the whole recipe. Add --transforms, --settings, --auth or --openapi for one section. |
npx apiblaze install @jayjaychicago/pokeapi | Create a new proxy from the newest revision. |
npx apiblaze install @jayjaychicago/pokeapi@2 | Install exactly revision 2. |
… --as pokedex | Name the new proxy yourself instead of being asked. |
… --into pokedex | Re-run over an existing proxy — same URL, same keys, configuration replaced. Typed confirmation, no undo. |
… --yes | Answer routine prompts. Declines everything needing consent. |
npx apiblaze publish pokeapi | Publish your proxy as @yourgithubhandle/pokeapi. |
npx apiblaze publish pokeapi --private | Publish so only your team can see or install it. |
npx apiblaze withdraw @jayjaychicago/pokeapi@1 | Permanently delete one revision. Typed confirmation always. |