Overview
Inspired takes an image, finds every separately purchasable object in it, cuts each one out as its own product shot, and returns live retail listings for each. The subject is a parameter: clothing, furniture, devices, beauty, or anything you name.
The base URL is https://inspired.jetskibay.com/api/v1. Every response is JSON. Requests that carry an image are multipart/form-data; everything else is application/json.
POST /jobs starts a durable read and returns immediately with something to poll — use it by default, because a full read takes minutes. POST /inspire holds the connection open until the read is finished, which is simpler but fails on any client or proxy with a short timeout.
Keys
Keys are minted per email address and mailed to it. A trial key works for a fixed number of requests and expires 24 hours after it is issued. Only a hash of the key is stored, so the email is the one place it exists.
POST/api/v1/keys
curl -X POST https://inspired.jetskibay.com/api/v1/keys \ -H "content-type: application/json" \ -d '{"email":"you@company.com"}'
{
"status": "sent",
"message": "Your API key is on its way to you@company.com.",
"key": {
"keyPrefix": "isk_9f2c41a…",
"tier": "trial",
"requestLimit": 10,
"requestsRemaining": 10,
"expiresAt": "2026-08-31T09:12:44.000Z"
}
}
The key itself is never in this response. Requesting a second key for an address that already has a live one revokes the first and carries the remaining allowance over, so re-requesting is safe and does not reset the quota.
Authentication
Send the key on every request, either way:
x-api-key: isk_9f2c41a8b03d5e6712c4f890
# or
Authorization: Bearer isk_9f2c41a8b03d5e6712c4f890
A missing or unusable credential returns 401; an exhausted one returns 429. Metered responses carry x-inspired-requests-remaining.
Focus domains
The domain field tells the reader what kind of object to look for. It changes the vision prompt, the JSON schema the model must fill, and the extraction instruction. Omitting it means fashion.
| Domain | What it returns | Aliases |
|---|---|---|
fashion | Garments, shoes, bags, jewellery worn by a person. Layers separated. | clothing, clothes, outfit, apparel, style |
furniture | Sofas, chairs, tables, lighting, rugs, shelving, decor. | interior, home |
devices | Phones, laptops, audio, cameras, peripherals, appliances. | tech, electronics |
beauty | Skincare, makeup, fragrance, haircare, tools. | — |
everything | Every distinctly purchasable object, no category filter. | any, all |
Add focus — up to 160 characters of plain text — to narrow any domain to one thing: domain=everything with focus=kitchen appliances only. It is appended to the reader's instruction, not to the search query.
Start a request
POST/api/v1/jobs
Starts a durable read and returns immediately. This is the endpoint to build on. Charges one request against your key.
| Field | Type | Notes |
|---|---|---|
image | file | JPG, PNG, WEBP, or GIF up to 10 MB. photo is accepted as an alias. |
pinterestUrl | string | A public Pinterest pin URL, instead of image. |
domain | string | One of the focus domains. Defaults to fashion. |
focus | string | Optional free-text narrowing, up to 160 characters. |
curl -X POST https://inspired.jetskibay.com/api/v1/jobs \ -H "x-api-key: $INSPIRED_KEY" \ -F "image=@living-room.jpg" \ -F "domain=furniture"
{
"requestId": "6f1c9b2e-4d3a-4f77-9a01-2b8f6c0d51aa",
"status": "queued",
"statusUrl": "https://inspired.jetskibay.com/api/v1/jobs/6f1c9b2e-…",
"pollAfterMs": 3000
}
Poll a request
GET/api/v1/jobs/{requestId}
Polling is free and does not consume quota. A job is readable only with the key that started it. Poll about every three seconds; a typical read finishes in one to four minutes depending on how many objects are in the image.
{
"requestId": "6f1c9b2e-…",
"status": "running",
"progress": {
"stage": "extracting",
"title": "Separating the first piece",
"summary": "Found 3 clearly visible furniture items.",
"items": [
{ "id": "piece-1", "simple_name": "sofa", "status": "complete" },
{ "id": "piece-2", "simple_name": "floor lamp", "status": "extracting" }
]
},
"pollAfterMs": 3000
}
When status becomes complete the body carries the full result described in the item object. A failed status carries a plain-language error and nothing else.
Synchronous read
POST/api/v1/inspire
Same inputs, same result shape, one open connection. The response arrives only when the whole read is finished, which can take several minutes — most HTTP clients, load balancers, and serverless runtimes will give up first. Use /jobs unless you control the timeout.
curl -X POST https://inspired.jetskibay.com/api/v1/inspire \ -H "x-api-key: $INSPIRED_KEY" \ -F "image=@outfit.jpg" \ --max-time 600
List domains
GET/api/v1/domains
Unauthenticated. Returns the catalogue the API currently supports, which is the honest source for a picker in your own UI.
{
"domains": [
{
"id": "furniture",
"label": "Furniture & interiors",
"description": "Sofas, chairs, tables, lighting, rugs, shelving, and decor.",
"aliases": ["interior", "home"],
"default": false
}
]
}
Key status
GET/api/v1/keys/current
Reports what is left of the key on the request: allowance, requests used, expiry. Free.
DELETE/api/v1/keys/current
Revokes it immediately. Use this if a key ends up somewhere it should not be.
The item object
A completed read returns a summary, a mood board assembled from the cut-outs, and one entry per object.
{
"requestId": "6f1c9b2e-…",
"status": "complete",
"domain": "furniture",
"focus": "",
"summary": "Found 3 clearly visible furniture items.",
"grid": {
"imageDataUrl": "data:image/webp;base64,…",
"mimeType": "image/webp",
"cells": [{ "cell": 1, "itemId": "piece-1", "name": "sofa" }]
},
"items": [
{
"id": "piece-1",
"simple_name": "sofa",
"full_description": "Low three-seat sofa in sage bouclé with rounded arms",
"gridCell": 1,
"imageDataUrl": "data:image/webp;base64,…",
"candidates": [
{
"title": "Bouclé three-seater",
"link": "https://shop.example/sofa-boucle",
"imageUrl": "https://images.example/sofa.jpg",
"price": "€1,299"
}
]
}
],
"metadata": { "source": "photo", "domain": "furniture", "visionModel": "…" }
}
| Field | Meaning |
|---|---|
simple_name | Two or three words naming the object. |
full_description | What the reader saw: colour, material, shape, distinctive details. This is also the text query behind the search. |
imageDataUrl | The cut-out itself, as a WEBP data URL on a white background. |
candidates | Up to ten retail listings, in the order the search engine ranked them. |
grid.imageDataUrl | All cut-outs composed into one square board. |
Errors
Every error is { "error": "…", "code": "…" }. The message is safe to show a person; the code is what to branch on.
| Status | Code | Means |
|---|---|---|
| 400 | unknown_domain | The domain field is not one we support. |
| 400 | — | No image or Pinterest URL, an unsupported file type, or a file over 10 MB. |
| 401 | missing_api_key | No credential on the request. |
| 401 | invalid_api_key | The key is not one of ours. |
| 401 | expired_api_key | Past its 24 hours. Mint another. |
| 401 | revoked_api_key | Revoked, by you or by a re-mint. |
| 404 | — | No such request, or it belongs to a different key. |
| 422 | — | The image contains nothing shoppable in the chosen domain. |
| 429 | quota_exhausted | The key's included requests are used up. |
| 429 | rate_limited | Too many key requests from one address or network. |
| 502/503 | — | A provider or binding failed. The request is refunded to your key. |
A request that fails because of us is given back to your allowance. A request that fails because of the image — nothing shoppable in it, wrong file type — is not.
Limits & cost
- Six objects per image. The reader is capped, not the image.
- Ten candidates per object, in the search engine's own ranking.
- 10 MB per upload; JPG, PNG, WEBP, GIF.
- One to four minutes for a typical read. It scales with the number of objects, because extractions run one at a time.
- Trial keys: a fixed allowance, 24 hours, mailed to one address.
Every request behind a key costs a vision call, one image edit per object, and up to two searches per object. That is why the allowance is small and why quota is charged when a read starts rather than when it finishes.
Data & retention
- Uploaded images and results are held for one day so a job can be polled and re-read, then deleted.
- Each attempt writes an evaluation bundle — the input image, prompts, and provider responses — used to measure quality. Credentials and authorization headers are never in it.
- We store your email address and a hash of your key so keys can be mailed and capped. We never store the key itself.
- Do not send images of people who have not agreed to it, or anything you would not be comfortable having processed by our model providers.
Questions, or production volume: hello@welovelooks.com.