Open license · Grows with use · OpenAI-compatible

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.

Zero egress fees ~100 ms cache hits Drop-in OpenAI API
A red arm and a black arm locked in an arm-wrestling handshake
Cloudflare
GMI Cloud
Backblaze
The library right now

500,000+ images. And counting.

Every one openly licensed and free to use. The strip below is what the community is liking right now — tap any image to explore the rest.

What you get back

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.

1Generic prompt
"a dog and a cat"
"result": "hit" · strong match · 0.1 s
A golden retriever and a grey cat sitting side by side — the library's match High match
2Very specific prompt
"a flamingo in a top hat doing my taxes"
"result": "hit" · flamingo ✓ · top hat ✗ · taxes ✗
A flamingo on a tropical beach — no top hat, taxes not filed Closest match · may differ
A smiling man at his laptop giving a thumbs up, happy with the closest match
Closest match from library
A cheerful cartoon avatar reacting with a big “Nice!”
wagmi.photos

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 image
wagmi hit
0.1 s
FLUX schnell
~1.5 s
Imagen 4
~9 s
GPT Image 1
~30 s
Instant on a cache hit

Price

List price per image
wagmi hit
$0.000
FLUX schnell
$0.003
Imagen 4
$0.040
GPT Image 1
$0.042
Free on a cache hit

Times and prices vary with model, load, and settings; a cache hit skips generation entirely. Sources: OpenAI · Google · fal.ai · Artificial Analysis.

How it works

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.

Your request
"a vintage bicycle against a brick wall"
POST /v1/images/generations
The response
https://cdn.wagmi.photos/assets/pd12m-8f31…/image.webp
"result": "hit" · 41 ms · $0.055 saved

Cloudflare edge worker — authenticates your key, embeds your prompt with BGE on Workers AI, and answers from the edge. It never runs a GPU in the request path.

The shared library
  1. 1Your prompt's BGE vector is matched against the stored prompt of every image in the library.
  2. 2Near match — the image is served instantly. That's a hit.
  3. 3Truly new — you get a 202 and the prompt joins the build queue. No waiting.
  4. 4The backfill generates the most-requested misses, so tomorrow they're hits.
GMI Cloud

Runs the background GPUs that generate truly new images.

Backblaze B2

Stores every image durably — zero egress back to the edge.

Vectorize

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.
Safety

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.

Trademark & brand filter

Prompts that name brands, logos, or protected characters are stopped before generation — so we never mint images that infringe someone else's marks.

Content moderation

Every prompt runs an automated safety check — hate, violence, sexual, and self-harm — and anything flagged is turned away.

Closest match, always

A stopped prompt still returns the nearest image already in the library. You get a result — we just never generate the risky one.

OpenAI compatible

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.

The API always returns the closest match with a similarity score — threshold client-side if you need stricter matching.

Try it in the library →
Same SDK Same response shape Cache metadata
OpenAI SDK
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",
)
print(img.data[0].url)
API
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 hit · 41 ms · $0.055 saved
{
  "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
  }
}
Pricing

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.

$0/forever
  • 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
Start browsing

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.

FAQ

Questions, answered

The short version of how the shared library works, what you get back, and what it costs.

What is wagmi.photos?
A free, openly licensed image library that gets better the more it's used. Every prompt is matched against every image already generated — you get the closest match instantly, and prompts the library can't answer yet are generated in the background and added to the shared pool.
Do I always get exactly my prompt?
No — you always get the closest existing match, served instantly from the edge. Everyday prompts almost always land a strong match; hyper-specific ones return the nearest image that already exists — close, but maybe not every detail. If nothing close exists yet, your exact prompt is queued and generated in the background, so it becomes a hit for everyone next time.
Can I control how close a match has to be?
Not on the request — there's no cache_tolerance parameter. The API always returns the closest match with a similarity score in shared_cache; threshold client-side by comparing that score to whatever floor your use case needs.
What happens when my prompt isn't in the library yet?
The prompt is recorded, and if enough people ask for something close to it, it's generated in the background by the shared backend and added to the library — so the pool keeps growing toward real demand. There's no per-request opt-out. Want a fresh image on your own schedule instead? Generate into a collection with your own provider key on the Collections tab.
Is it OpenAI-compatible?
Yes. Point the official OpenAI image SDK at the wagmi.photos base URL — no other code changes. You get the standard response shape plus a 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?
Images are shared under a permissive open license and free to use. You pay for access to the library through a plan (from $0/mo), never per image — and every cache hit is $0 to serve.

Account

Telemetry & performance

0 Total requests
0 Cache hits
0 Cache misses
0% Cache hit rate

Total savings realized

Estimated credits and network latency costs saved through semantic hits.

$0.00

Plan

Loading…

Credentials & authentication

For calling the wagmi.photos API from your own code (Authorization: Bearer sc-…). This site is already authenticated by your login.
No keys yet.

Advanced actions

This clears your browser's local state — the telemetry counters. Your account and API keys are stored server-side and are not affected.

Developers

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

Before — OpenAI
base_url = "https://api.openai.com/v1"
After — wagmi.photos
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.

Call it

POST /v1/images/generations
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",
)

print(img.data[0].url)
# shared_cache always carries the closest match + a similarity score.
# Scope to a collection with extra_body={"collection": "col_..."}.

What you get back

{
  "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. result is one of three values:

resultStatusMeaning
hit200 At or above the match floor. Served; nothing is queued.
approximate200 The best image is below the floor. Served anyway so you have something to show; the prompt is queued and cost_saved_usd is 0.
pending202 data is empty — nothing close exists yet. The prompt is queued; retry the same prompt later and it is a hit for everyone.

Matching is prompt-to-prompt: BGE cosine similarity against a fixed server-side floor (≈0.85). There is no cache_tolerance or generate_on_miss — threshold on similarity client-side. See how semantic matching works.

Every miss records demand: the most-requested prompts are built by the shared backfill and become hits for everyone. shared_cache.generation_queued tells you whether yours is in that queue.

What stays the same, what you gain

Unchanged

  • The official OpenAI SDKs and method names
  • The prompt field and request flow
  • Reading the image from data[0].url

Added by wagmi.photos

  • A shared_cache block: result, similarity, cost saved
  • ~0.1 s cache hits at $0 per image
  • Always the closest match, with a similarity score to threshold client-side

Request fields

FieldTypeDefaultDescription
promptstringrequired What you want. Prompts are normalized (trimmed, lowercased, whitespace collapsed) before matching and queueing.
collectionstring Scope matching to one collection by ID (col_…) — official SDKs pass it via extra_body. The collection's theme prompt is appended before matching, and scoped requests never queue background generation; to generate with your own key, see below.
ninteger1 Only 1 is supported; anything else returns 422.
sizestring Accepted for OpenAI compatibility; every response already includes thumb, medium and large URLs.
modelstring Accepted for OpenAI compatibility; shared_cache.model_used reports the model that created the served image.

Create images in your collections

The one path that always spends: generate your exact prompt now, with your own provider key, straight into a collection you own (set up on the Collections tab). It starts a background job and hands back a ticket.

POST /v1/collections/:id/generations
GET /v1/generations/:id
# Start a generation (requires your own provider key + a collection you own)
curl -X POST https://api.wagmi.photos/v1/collections/col_abc123/generations \
  -H "Authorization: Bearer sc-..." -H "Content-Type: application/json" \
  -d '{"prompt": "a watercolor fox in morning fog"}'
# -> 202 {"generation": {"id": "gen_...", "status": "generating", ...}, "byok": {"used": 3, "cap": 50, ...}}

# Poll the ticket until it leaves queued/generating
curl https://api.wagmi.photos/v1/generations/gen_... -H "Authorization: Bearer sc-..."
# -> {"generation": {"status": "succeeded", "image": {"url": "...", "thumb_url": "..."}}}
  • A ticket moves queuedgeneratingsucceeded or failed; poll while it is in the first two.
  • failed is auto-refunded — it never counts toward your monthly cap.
  • A collection you don't own, or an unknown generation id, returns 404.

Auth & keys

Log in with a magic link (no password), create a key on the Account page, and send it as Authorization: Bearer sc-your-key. Keys are hashed before storage and shown once — store them yourself. Minting is rate-limited (10 per minute per IP).

Prefer the API? POST /v1/keys/generate also works with a logged-in session cookie — unauthenticated calls return 401.

Errors

StatusWhen
400Body is not valid JSON, or not a JSON object.
401Missing or invalid API key.
422n is anything but 1, prompt is missing/empty/too long, or collection is not a non-empty string.
429Rate limit exceeded — generations (per account) and key minting (per IP) are each 10 per minute.
502An upstream dependency failed; the body includes a detail string.

Health

GET /healthz

Returns {"status":"ok"}. No authentication.

Developers

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

  1. Your prompt is normalized (trimmed, lowercased, whitespace collapsed).
  2. BGE turns it into a 768-dim text vector at the edge.
  3. Vectorize finds the single nearest stored prompt vector by cosine similarity.
  4. That similarity is compared to a fixed match floor — at or above it is a hit; below it is approximate.

Similarity, illustrated

"a dog and a cat"
hit · 0.93
"a flamingo in a top hat doing my taxes"
approximate · 0.78

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.

A fixed floor decides hit vs. approximate

The cosine-similarity floor a match must clear is fixed server-side (≈0.85, between 0.75 and 0.87) — it's not a request parameter, so there's no cache_tolerance to tune. The API always returns the closest match with its similarity score in shared_cache; threshold client-side if your use case needs something stricter.

0.87 · strict end of the range 0.75 · loose end — server floor sits at ≈0.85

At or above the floor you get a hit. Below it, the closest image is still served as approximate and the prompt is queued for demand-ranked background generation.

Same model, same space — that is why a generic prompt reliably hits while a hyper-specific one returns the closest existing image. See the matching details in the API reference, or the walkthrough on the home page.
Developers

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)
- collection  (string, optional) scope the search to a collection you own (col_...)
- n           (integer, optional) only 1 is supported
- size        (string, optional) accepted for OpenAI compatibility, ignored

There is no cache_tolerance or generate_on_miss field. The API always returns
the closest match with a similarity score in shared_cache — threshold
client-side if the task needs stricter matching.

## 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"}'

## 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 demand-ranked
                  background generation.
- "pending"      (HTTP 202): nothing close yet, data is empty. Generate with
                  your own model if you need an image now. The prompt was
                  queued, so retrying later will hit for $0.

## Rules for the agent
1. Always check shared_cache.similarity before treating a result as good
   enough — the API never withholds a result, it just tells you how close it is.
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. 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 approximate when it fits the task.
  • On pending, don't block waiting — proceed or retry later.

When exact matters

  • Check shared_cache.similarity and reject matches below your own bar.
  • Scope to a collection when you need a narrower, themed pool.
  • 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.

Could not load image resource.