Your image pipeline is now a query string.
Upload your images or search ours, then serve any of them at any width, crop, quality and format by editing the URL. No build step, no variant storage, no worker to babysit.
5,000 requests a month on the free tier. No card.
img_7f3a · ImagesWP Open License
83% smaller than the same frame as JPEG at q85.
Three jobs, done at the edge.
Storage, transformation and delivery arrive as one product with one key. The parts you would normally glue together yourself are already glued.
Transform on request
Ask for ?w=800&fit=cover&format=avif and the edge renders that frame once, then serves it from cache. You never pre-generate a variant, never store one, and never write a resize job.
Negotiate the format
Send format=auto and every client gets the smallest thing it can decode — AVIF where it is supported, WebP next, JPEG as the floor. One URL in your markup, three formats on the wire.
Search a library you can ship
240,000 photographs from the ImagesWP collection, cleared for commercial use with attribution optional. Same key, same delivery URLs, same transform parameters as your own uploads.
Search it, then serve it.
Twelve frames from the collection. Filtering here runs in the page so you can feel the shape of a search response — in production the same query returns paginated JSON with a delivery URL on every result.
GET /v1/images/search?per_page=12
-
01
-
02
-
03
-
04
-
05
-
06
-
07
-
08
-
09
-
10
-
11
-
12
- No frames match that query. The API would return
200 OKwith an emptyresultsarray.
Two calls, then you are done.
Authenticate with a bearer token, search, and put the returned URL in your markup. Transform parameters are appended to that URL — there is no second SDK to learn.
# 1. search the collection
curl -G "https://api.imageswp.com/v1/images/search" \
-H "Authorization: Bearer $IMAGESWP_KEY" \
-d "q=coastline" -d "per_page=12"
# 2. serve any result at any size, no second call
https://cdn.imageswp.com/v1/img_7f3a?w=1440&fit=cover
const res = await fetch(
"https://api.imageswp.com/v1/images/search?q=coastline",
{ headers: { Authorization: `Bearer ${process.env.IMAGESWP_KEY}` } }
);
const { results } = await res.json();
// One URL, three formats on the wire.
const src = `${results[0].urls.raw}?w=800&fit=cover&format=auto`;
import os, httpx
r = httpx.get(
"https://api.imageswp.com/v1/images/search",
params={"q": "coastline", "per_page": 12},
headers={"Authorization": f"Bearer {os.environ['IMAGESWP_KEY']}"},
)
first = r.json()["results"][0]
src = f"{first['urls']['raw']}?w=800&fit=cover&format=auto"
{
"id": "img_7f3a",
"title": "Suspension bridge at sunset",
"width": 4800,
"height": 3200,
"dominant_color": "#c8794b",
"blurhash": "L9C%b0IU00~qofj[ayfQ4nWB",
"tags": ["architecture", "travel"],
"license": "ImagesWP Open License 1.0",
"urls": {
"raw": "https://cdn.imageswp.com/v1/img_7f3a",
"thumb": "https://cdn.imageswp.com/v1/img_7f3a?w=320"
},
"created_at": "2026-03-14T09:22:41Z"
}
Pay for requests and bytes. Nothing else.
Every plan includes the full transform pipeline, the whole collection, and unlimited variants per image. Cropping a photograph six ways costs the same as cropping it once.
Free
For side projects, prototypes and the first week of a real one.
Get a key- 5,000 requests / month
- 10 GB egress / month
- 500 stored images
- Full collection access
- 1 API key
Pro
For a production application with real traffic and a marketing site attached.
Get a key- 250,000 requests / month
- 500 GB egress / month
- 50,000 stored images
- Custom delivery domain
- Signed URLs & referrer rules
- 10 keys, email support
Scale
For catalogue, marketplace and media workloads where images are the product.
Talk to us- 2,000,000 requests / month
- 5 TB egress / month
- 1,000,000 stored images
- Multi-region origin
- 99.95% uptime SLA
- Unlimited keys, priority support
Overage is metered, not blocked. Past your plan allowance: $0.40 per 10,000 requests and $0.02 per GB of egress, billed monthly. Transforms are never metered — a request for the fourth crop of a photograph costs exactly what the first one did.
The things developers ask first.
If yours is not here, send us a message — an engineer answers, usually the same day.
Where do the library photographs come from?
The collection is ours. We commission photography directly or acquire it outright, then release it under the ImagesWP Open License: commercial use is cleared, attribution is optional, and no model or property release is left for you to chase. We do not resell, mirror or proxy anyone else’s catalogue. Images you upload stay yours, stay private to your account, and never enter the collection.
Do I get billed for every transform?
No. Billing counts requests and egress. A transform is rendered once, cached at the edge with Cache-Control: public, max-age=31536000, immutable, and served from cache after that. Ten crops of one photograph cost the same as ten requests for any other file.
What happens when I hit the rate limit?
You get 429 Too Many Requests with a Retry-After header in seconds. Every response — not just the rejected ones — carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, so a well-behaved client never has to guess. Delivery URLs on the CDN are not rate limited; only the JSON API is.
Can I serve images from my own domain?
Yes, on Pro and Scale. Point a CNAME at edge.imageswp.com, add the hostname in your dashboard, and we issue and renew the certificate. Delivery URLs keep the same path and parameters, so switching over is a find-and-replace on the hostname.
How do I stop other sites hotlinking my images?
Two options, and you can run both. A referrer allowlist rejects requests from origins you have not listed. Signed URLs go further: append &exp= and &sig=, computed with your signing secret, and the edge refuses anything expired or tampered with. Signing is HMAC-SHA256 over the full path and query string.
What is the uptime story?
Delivery runs from 34 edge locations with origin failover across three regions; the JSON API runs active-active in two. Scale plans carry a 99.95% monthly SLA with service credits. Status and incident history are public, and we post a written post-mortem for anything that lasts longer than five minutes.