Free, open images.
Shaped by everyone.
A free, openly licensed image library shaped by what people search for. Every prompt returns the closest match in milliseconds; the ones the library can't answer yet are generated in the background and added for everyone. It only grows because people use it — no searches, no new images. The more we all search, the better it gets for all of us.
Closest match, not always exact.
wagmi.photos searches the shared library before anything else. Everyday prompts almost always land a strong match. Hyper-specific prompts return the closest image that already exists — close, but maybe not every detail.
High match
Closest match · may differ
Faster. Cheaper. Better.
Built for speed and efficiency, so you create more for less — and every cache hit is served free from the shared library.
Speed
Average time per imagePrice
List price per imageTimes and prices vary with model, load, and settings; a cache hit skips generation entirely. Sources: OpenAI · Google · fal.ai · Artificial Analysis.
An image library shaped by the people who use it
Your request flows down, your image comes straight back up — and every prompt you send shapes what gets built next. The library is a record of what people actually want; with no one searching, nothing new is ever made.

- 1Your prompt's BGE vector is matched against the stored prompt of every image in the library.
- 2Near match — the image is served instantly. That's a hit.
- 3Truly new — you get a 202 and the prompt joins the build queue. No waiting.
- 4The backfill generates the most-requested misses, so tomorrow they're hits.
Runs the background GPUs that generate truly new images.
Stores every image durably — zero egress back to the edge.
Indexes each new image's prompt vector so the next similar prompt is a hit.
No users, no library.
Every search is a vote for what gets made next. The library isn't ours — it's the shape of what everyone's looking for. Use it and you grow it.
We're all gonna make it.Every prompt is checked before it's built
Two filters run before we ever spend a GPU. If a prompt trips either one, we don't generate it — and you still get the closest image already in the library.
Prompts that name brands, logos, or protected characters are stopped before generation — so we never mint images that infringe someone else's marks.
Every prompt runs an automated safety check — hate, violence, sexual, and self-harm — and anything flagged is turned away.
A stopped prompt still returns the nearest image already in the library. You get a result — we just never generate the risky one.
Use the OpenAI SDK.
Get wagmi caching.
No new SDK, no custom response format. Point your existing image-generation requests at
wagmi.photos and we return OpenAI-compatible responses with an extra
shared_cache block.
from openai import OpenAI client = OpenAI( base_url="https://api.wagmi.photos/v1", api_key="YOUR_WAGMI_KEY", ) img = client.images.generate( prompt="a corgi wearing sunglasses on a beach", extra_body={"cache_tolerance": 0.15, "generate_on_miss": True}, ) print(img.data[0].url)
curl -X POST https://api.wagmi.photos/v1/images/generations \ -H "Authorization: Bearer $WAGMI_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt": "a corgi wearing sunglasses on a beach", "cache_tolerance": 0.15, "generate_on_miss": true}'
{
"data": [{ "url": "https://cdn.wagmi.photos/assets/pd12m-8f31…/image.webp" }],
"shared_cache": {
"result": "hit",
"similarity": 0.9312,
"source": "pd12m",
"model_used": "flux-schnell",
"cost_saved_usd": 0.055
}
}
One plan. Every image.
A free, openly licensed image library that gets better the more it's used — full-resolution and open to everyone, plus a single upgrade that adds a commercial license and unlimited access. Two dollars a month, cheaper than every stock site.
Free
Search the whole library and pull the closest match, instantly. It grows the more it's used — and so does what you get back.
- Unlimited search & instant closest-match
- Full-resolution image URL in every response
- Full open-license public library
- Missing prompts generated in the background
- Commercial-use license & indemnity
- Unlimited rate + API access
Unlimited
Everything in Free, plus a clear commercial license and unlimited access — for a fraction of what every stock site charges.
Billed annually at $24 · cancel anytime
- Everything in Free
- Commercial-use license, no attribution
- Unlimited downloads, no rate limits
- Priority generation of your exact prompt
- OpenAI-compatible API access
Openly licensed. Close enough, on purpose.
Every image here is openly licensed — the seed pool is public-domain PD12M, and generated images are shared under the same permissive terms. Reach for wagmi.photos when you don't need a pixel-exact, one-off render: you need a good image now, with a license you don't have to think about. Need guaranteed commercial use? That's the one upgrade.
Questions, answered
The short version of how the shared library works, what you get back, and what it costs.
What is wagmi.photos?
Do I always get exactly my prompt?
What does cache_tolerance do?
hit versus an approximate match. Without a BYOK key it never changes what you get back — you always receive the closest image — it just controls the label and which prompts get flagged as gaps worth generating. With a BYOK key enabled, tolerance also decides when your key fires: anything below the floor generates fresh instead of settling for the closest match.What happens when my prompt isn't in the library yet?
generate_on_miss: true) the prompt is queued and generated in the background by the shared backend, then stored in the library — so the pool keeps growing toward real demand. Set generate_on_miss: false to only ever pull from the cache and never trigger a generation.Is it OpenAI-compatible?
shared_cache block telling you whether it was a hit, how close the match was, and what it saved you.Is it really free? What's the license?
Generator config
Session history
Telemetry & performance
Plan
Bring your own key
Add your own OpenAI or GMI Cloud API key and the playground generates a fresh image whenever the library has no close-enough match. Generated images join the shared library. Spend shown is an estimate (images × list price) — your provider bills you directly.
Credentials & authentication
Authorization: Bearer sc-…). The playground here is already authenticated by your login.
API keys are an Unlimited feature — upgrade to create one.
Advanced actions
This clears your browser's local state — the telemetry counters, session history, and playground settings. Your account and API keys are stored server-side and are not affected.
API reference
One OpenAI-compatible endpoint, a shared image library in front of it. Everything below is the whole API.
Authentication
All generation requests need a Bearer key, and keys belong to your account. Log in with a magic link (we email it to you — no password), then create a key on the Account page. Or call the endpoint directly with your logged-in session cookie:
# requires a logged-in session — unauthenticated calls return 401 curl -X POST https://api.wagmi.photos/v1/keys/generate \ -H "Cookie: wagmi_session=…" \ -H "Content-Type: application/json" \ -d '{ "label": "my-laptop" }' { "key": "sc-nA93…", "created_at": 1783468800 }
Key minting is rate-limited (10 per minute per IP). Store the key yourself — it is
hashed (SHA-256) before it touches our database, so it cannot be shown again. Send
it on every request as Authorization: Bearer sc-your-key.
Generate or fetch an image
The request shape matches the OpenAI Images API, so the official SDKs work by
pointing base_url at https://api.wagmi.photos/v1.
Your prompt is embedded with BGE and matched against the stored prompt of every
image in the shared library; the closest match above your tolerance floor is
served instantly.
Request body
| Field | Type | Default | Description |
|---|---|---|---|
| prompt | string | required | What you want. Prompts are normalized (trimmed, lowercased, whitespace collapsed) before matching and queueing. |
| cache_tolerance | number 0–1 | 0.15 | How far a match may drift from your prompt. 0 accepts only the closest matches, 1 accepts the loosest. See how matching works. |
| generate_on_miss | boolean | true | Whether a miss queues background GPU generation for this prompt. Set false for cache-only behaviour. See semantics. |
| n | integer | 1 | Only 1 is supported; anything else returns 422. |
| size | string | — | Accepted for OpenAI compatibility. Every response already includes thumb, medium and large URLs. |
| model | string | — | Accepted for OpenAI compatibility. Matching is model-agnostic; shared_cache.model_used reports the model that created the served image. |
Example
curl -X POST https://api.wagmi.photos/v1/images/generations \ -H "Authorization: Bearer $WAGMI_KEY" -H "Content-Type: application/json" \ -d '{ "prompt": "a lighthouse in a storm", "cache_tolerance": 0.15, "generate_on_miss": false }'
Response — served from the library (200)
{
"created": 1783468800,
"data": [{ "url": "https://cdn.wagmi.photos/assets/pd12m-8f31…/image.webp" }],
"shared_cache": {
"result": "hit",
"similarity": 0.93,
"cost_saved_usd": 0.055,
"model_used": "flux-schnell",
"source": "pd12m",
"sizes": { "thumb": "…", "medium": "…", "large": "…" },
"original_url": "https://pd12m.s3.us-west-2.amazonaws.com/…"
}
}
original_url is the external source image when one exists, and
null for generated images.
Response — nothing close enough yet (202)
{
"created": 1783468800,
"data": [],
"shared_cache": {
"result": "pending",
"similarity": 0,
"cost_saved_usd": 0,
"generation_queued": true
}
}
Result values
| result | Status | Meaning |
|---|---|---|
| hit | 200 | Similarity is at or above your tolerance floor. The image is served; nothing is queued. |
| approximate | 200 | The best image falls below your floor. It is served anyway so you have something to show, and the prompt is queued for generation (unless opted out). generation_queued is included and cost_saved_usd is 0 — only true hits count as savings. |
| pending | 202 | The library has nothing to serve. data is empty and the prompt is queued for generation (unless opted out). Retry the same prompt later — once built, it is a hit for everyone. |
| generated | 200 | You have a BYOK provider key enabled and the result would have been approximate or pending, so a fresh image was generated with your key and added to the shared library. shared_cache.byok carries your usage: {"used", "cap", "est_spend_usd"}. When your key can't fire (monthly cap reached, provider error), the normal approximate/pending response is returned with shared_cache.byok.status set to cap_reached or provider_error. |
With BYOK enabled, a prompt that fails the content policy (denylist or moderation) returns 400 with {"error": "content_policy", "category": "…"} and nothing is generated or counted.
How matching works
Matching is prompt-to-prompt: your prompt's BGE text embedding
(bge-base-en-v1.5 on Workers AI) is compared by cosine similarity
against the stored prompt embedding of every library image. Your
cache_tolerance (clamped to 0–1) maps linearly to the similarity
floor: floor = 0.87 − tolerance × (0.87 − 0.75), so tolerance 0
→ floor 0.87 and tolerance 1 → floor 0.75. The single nearest library
prompt is compared against that floor — at or above it you get a
hit, below it an approximate. Realistic scores live in
the ~0.7–0.95 band. See how
semantic matching works for the full picture.
generate_on_miss semantics
Generation costs GPU time, so it is opt-out per request — but the queue is shared, and one prompt can be requested by many callers with different flags. The rules:
- Default is generate. A miss with the field unset (or
true) queues the prompt for background generation. - Opting out is per prompt, not per library.
generate_on_miss: falsestill records the prompt and its demand count — it just tells the backfill to skip it. - Generation wins. If the prompt is already queued for generation, a later request with
falsedoes not un-queue it. And if the prompt was stored opted-out, the first request that arrives with the field unset ortrueupgrades it, so it gets generated. Once a prompt wants generation, it stays wanted. - The response tells you the effective state.
shared_cache.generation_queuedonpendingandapproximateresponses reflects the merged result, not just your request — sendfalsefor a prompt someone else queued and you will getgeneration_queued: trueback.
generate_on_miss: false when you only want
instant, $0 answers — placeholder art, previews, high-volume UI fills — and a miss
should stay a miss instead of spending GPU time.
Errors
| Status | When |
|---|---|
| 400 | Body is not valid JSON, or not a JSON object. |
| 401 | Missing or invalid API key. |
| 422 | n is set to anything but 1, or generate_on_miss is not a boolean. |
| 429 | Rate limit exceeded — generation requests (per account) and key minting (per IP) are each limited to 10 per minute. |
| 502 | An upstream dependency failed; the body includes a detail string. |
Health
Returns {"status":"ok"}. No authentication.
A drop-in for the OpenAI Images API
Keep the official OpenAI SDK. Change one line — the base URL — and every request is answered cache-first, with a shared_cache block riding along in the response.
The only change
base_url = "https://api.openai.com/v1"
base_url = "https://api.wagmi.photos/v1"
Swap your key for a wagmi.photos key (sc-…). Method names, the prompt field, and the way you read data[0].url stay exactly the same.
Python
from openai import OpenAI client = OpenAI( base_url="https://api.wagmi.photos/v1", api_key="sc-your-key", ) img = client.images.generate( prompt="a lighthouse in a storm", extra_body={ "cache_tolerance": 0.15, "generate_on_miss": True, }, ) print(img.data[0].url) # raw response also carries a shared_cache block
JavaScript
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://api.wagmi.photos/v1", apiKey: "sc-your-key", }); const img = await client.images.generate({ prompt: "a lighthouse in a storm", cache_tolerance: 0.15, generate_on_miss: true, }); console.log(img.data[0].url);
cURL
curl -X POST https://api.wagmi.photos/v1/images/generations \ -H "Authorization: Bearer $WAGMI_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "a lighthouse in a storm" }'
What stays the same, what you gain
Unchanged
- The official OpenAI SDKs and method names
- The
promptfield and request flow - Reading the image from
data[0].url
Added by wagmi.photos
- A
shared_cacheblock: result, similarity, cost saved - ~0.1 s cache hits at $0 per image
cache_toleranceandgenerate_on_misscontrols
202 means nothing close was cached yet — data is empty and (unless you opted out) the prompt was queued to generate. Handle it like a soft miss: proceed without an image or retry later. Full details in the API reference.How semantic matching works
Every library image is stored with the prompt that made it. A match is just the nearest stored prompt to your prompt — text to text, no keywords, no tags.
Prompts match prompts
wagmi.photos embeds text prompts into a 768-dimensional space with the
bge-base-en-v1.5 model, running on Workers AI at the edge. Every
image in the library is indexed by the embedding of
its own prompt —
there are no image vectors. Because your prompt and the stored prompts are embedded
by the same model, "a golden retriever" lands right next to the prompts that
already produced one.
From prompt to match
- Your prompt is normalized (trimmed, lowercased, whitespace collapsed).
- BGE turns it into a 768-dim text vector at the edge.
- Vectorize finds the single nearest stored prompt vector by cosine similarity.
- That similarity is compared to your tolerance floor — at or above it is a hit; below it is approximate.
Similarity, illustrated
Illustrative cosine-similarity scores — in practice they land in a fairly narrow ~0.7–0.95 band. The generic prompt lands squarely on an existing prompt; the very specific one only finds a distant cousin.
Tolerance sets the floor
Your cache_tolerance (clamped to 0–1) maps linearly to the cosine-similarity floor a match must clear: floor = 0.87 − tolerance × (0.87 − 0.75).
At or above the floor you get a hit. Below it, the closest image is still served as approximate and the prompt is queued to generate (unless you opted out).
Give your agent cheap images
Paste this skill file into your coding agent — a Claude Code SKILL.md, a Cursor rule, or a system-prompt block — so it reaches for the shared cache before paying to generate.
The skill file
Save it as SKILL.md or drop it straight into your agent's instructions. It hands the agent the endpoint, the request shape, and — the part that matters — how to act on hit / approximate / pending.
---
name: wagmi-photos-images
description: Fetch images cheaply and instantly from the wagmi.photos shared cache before paying to generate. Use whenever a task needs an image and "close enough" beats pixel-perfect.
---
# wagmi.photos — cache-first images
Get an image in ~100 ms for $0 by matching the shared library first. Only pay a
generator when the prompt is genuinely new or must be exact.
## When to use this
- You need a stock-style or illustrative image and an approximate match is fine.
- You want to avoid generation cost and latency by default.
Do NOT rely on the cache when the image must match a hyper-specific prompt
exactly (brand assets, precise composition). Use a dedicated image model there.
## Endpoint
POST https://api.wagmi.photos/v1/images/generations
Authorization: Bearer sc-your-key
Content-Type: application/json
Body fields:
- prompt (string, required)
- cache_tolerance (0..1, default 0.15) lower = stricter match
- generate_on_miss (bool, default true) false = never spend GPU on a miss
## Call it
curl -X POST https://api.wagmi.photos/v1/images/generations \
-H "Authorization: Bearer $WAGMI_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "a vintage bicycle against a brick wall",
"cache_tolerance": 0.15,
"generate_on_miss": true}'
## Act on shared_cache.result
- "hit" (HTTP 200): use data[0].url. Free and instant, you are done.
- "approximate" (HTTP 200): a close image is in data[0].url. Use it only if it
fits the task; the exact prompt was queued for next time.
- "pending" (HTTP 202): nothing close yet, data is empty. Generate with
your own model if you need an image now. The prompt was queued
(unless you opted out), so retrying later will hit for $0.
- "generated" (HTTP 200): the account has a BYOK provider key enabled and a
fresh image was generated with it (below-tolerance requests
only). data[0].url is the new image; shared_cache.byok reports
{used, cap, est_spend_usd}. If byok.status is "cap_reached" or
"provider_error" instead, the response degraded to the normal
approximate/pending shape.
- HTTP 400 {"error":"content_policy"}: the prompt was blocked by the denylist or
moderation (BYOK path only). Do not retry the same prompt.
## Rules for the agent
1. Default to the cache. Send generate_on_miss=false when you only want free,
instant results and a miss is acceptable.
2. Never treat "approximate" as exact — verify it matches the request.
3. On 202, do not block waiting. Proceed without an image or fall back to a real
generator, then retry the same prompt later for a cheap hit.
4. "generated" costs the account owner real provider spend — respect
generate_on_miss=false as the way to guarantee a $0 call.
4. Reuse one wagmi.photos key. It is hashed server-side; keep it secret.
How the agent should behave
Default path — cheap & fast
- Ask the cache first for anything illustrative.
- Accept
approximatewhen it fits the task. - Set
generate_on_miss=falsefor throwaway previews.
When exact matters
- Lower
cache_tolerancetoward 0 for near-exact only. - Leave
generate_on_miss=trueso misses get built. - On
pending, fall back to a dedicated model.
Wire up a key
Keys are tied to your account. Log in with a magic link (email, no password), create a key on the Account page, then export it as WAGMI_KEY:
# 1. Log in at https://wagmi.photos/#/login (magic-link email) # 2. Account → Create API key → copy the sc-… key (shown once) export WAGMI_KEY=sc-…
Prefer the API? POST /v1/keys/generate also works with a logged-in session cookie — unauthenticated calls return 401. The full field reference lives in the API docs.
Terms of Use
Effective Date: July 8, 2026 · Version 2026-07-08
These terms are an agreement between you and Suppers Software Limited ("we", "us"), a company based in Hamilton, New Zealand, which operates wagmi.photos ("the service"). By creating an account or using the service, you accept them. If you don't agree, please don't use the service.
1. Who can use it
You must be at least 18, or the age of majority where you live, and able to enter a binding agreement. If you use the service for an organization, you confirm you're authorized to accept these terms on its behalf.
2. The service
wagmi.photos is a shared, semantic image cache. Your prompt is matched against an openly licensed library and the closest image is returned instantly; genuinely new prompts are generated in the background by a shared worker and added to the library. A free tier and a paid upgrade are offered — current prices are on the pricing page and may change.
3. Your account
Sign-in is by magic link sent to your email. You're responsible for your account, your email inbox, and any API keys you create — keys are shown once, so keep them safe. Don't share your access or let others use your account, and tell us promptly if you suspect unauthorized use.
4. Acceptable use
You agree that:
- Your prompts and their outputs are your responsibility. You will not request, generate, download, or redistribute images that infringe any third party's copyright, trademark, publicity, or other rights, or that are illegal, harmful, or that violate our content rules.
- You will not attempt to produce sexual content involving minors, realistic depictions of identifiable real people without consent, or other prohibited or unlawful content.
- You will not abuse the service — no denial-of-service, scraping, cache pollution, reverse engineering, bulk extraction of the library, or circumventing our filters, rate limits, or security.
5. Filtering and moderation
Before generation we screen prompts with a trademark/brand denylist and automated content moderation, and we may refuse a prompt, remove content, or suspend an account. Screening is a safeguard, not a guarantee — you remain responsible for your use and outputs.
6. Content and the shared library
This is a shared cache: prompts you submit and the images generated for them join the openly licensed library so future requests can reuse them. By submitting a prompt you grant us a worldwide, royalty-free license to store, process, display, and redistribute the prompt and its resulting image as part of that library. You confirm you have the right to submit each prompt, and you agree not to include private or personal information in prompts.
7. Ownership and licensing
- Seeded catalog: the pre-seeded images come from the PD12M dataset (Spawning), licensed CDLA-Permissive-2.0 — you may copy, distribute, modify, and use them for commercial or personal purposes without attribution.
- Generated images: outputs are produced by third-party AI models. As between you and us, you may use the outputs returned to you, subject to those providers' terms. Note that purely AI-generated images may not qualify for copyright protection, and we make no warranty that any output is free of protected or trademarked content.
8. Disclaimers
The service and all outputs are provided "as is" and "as available", without warranties of any kind — including non-infringement, merchantability, fitness for a particular purpose, accuracy, or uninterrupted availability.
9. Limitation of liability
To the fullest extent permitted by law, we are not liable for indirect, incidental, special, or consequential damages, or for lost profits or data. Our total liability for any claim is limited to the greater of what you paid us in the three months before the claim, or US$50.
10. Indemnification
You will indemnify and hold wagmi.photos harmless from claims, damages, liabilities, and reasonable costs (including legal fees) arising from your prompts, your use of the service, your outputs, or your breach of these terms.
11. Suspension and termination
You may stop using the service and delete your account at any time. We may suspend or end access if you breach these terms or to protect the service or others. Content already contributed to the shared library may remain after your account is closed.
12. Changes
We may update the service and these terms. When we make a material change to these terms we bump the version and ask you to accept the new version before continuing; continued use after minor changes means you accept them.
13. Governing law
These terms are governed by the laws of New Zealand, without regard to conflict-of-law rules, and you agree to the exclusive jurisdiction of the New Zealand courts.
14. Contact
Questions about these terms: support@suppers.ai. wagmi.photos is a service of Suppers Software Limited, Hamilton, New Zealand.
See also our Privacy Policy.
Privacy Policy
Effective Date: July 8, 2026
wagmi.photos is operated by Suppers Software Limited (Hamilton, New Zealand), the data controller. This explains what we collect, why, and who processes it.
1. What we collect
- Email address — for magic-link sign-in and to operate your account. Not sold, and not shared except with the providers below to run the service.
- Session cookie — one HttpOnly, essential cookie that keeps you signed in. No advertising or tracking cookies.
- API keys, as hashes — stored only as a SHA-256 hash; we cannot recover or display the key itself, so keep your copy safe.
- Prompts and images — stored (with demand counts) to run the shared cache and rank background generation; generated images join the shared, openly licensed library. Please don't put private or personal information in prompts.
- Terms-acceptance record — when you accept our Terms of Use we record the version, the time, your IP address, and your browser's user-agent, as proof of consent.
- Local browser state — the playground's counters and history live only in your browser and can be cleared any time from the Account page.
2. How we use it
To operate your account, run and rank the shared cache, keep the service safe (prompt filtering and moderation), prove consent, and prevent abuse. We don't sell your data.
3. Who processes your data
We rely on these providers to run the service; your prompts and/or account data pass through them:
- Cloudflare — hosting, the edge worker, prompt embeddings, vector search, and the account database.
- OpenAI — automated safety moderation of prompt text before generation.
- GMI Cloud — image generation for cache misses (receives the prompt).
- Backblaze B2 — durable storage of the images.
- Resend — sends your magic-link sign-in emails.
4. Retention
Account data is kept while your account exists. Prompts and images contributed to the shared cache persist as part of the library. Acceptance and security records are kept as long as needed for legal and safety purposes.
5. Your choices
You can delete your API keys any time, and request deletion of your account by contacting us. Images already contributed to the shared library may remain.
6. Security
All communication with wagmi.photos is encrypted with HTTPS, API keys are stored only as hashes, and the session cookie is HttpOnly.
7. Children
The service isn't intended for anyone under 18 (or the age of majority where you live).
8. Changes & contact
We may update this policy; the effective date shows the latest version. Privacy questions: support@suppers.ai.
See also our Terms of Use.