inspired — the command-line client
One file, no dependencies, Node 20 or newer. Shop a photograph from a terminal:
export INSPIRED_KEY=isk_your_key
./inspired.mjs shop living-room.jpg --domain furniture --out ./cutouts
It starts a durable read, polls it at the interval the server asks for, prints which object is being worked on as it goes, and writes every cutout, the mood board and the raw JSON into a directory.
Why not curl
A read is asynchronous and takes minutes, so a useful client has to do four
things that are tedious to retype: start a job, poll it on the server's own
pollAfterMs rather than a guessed interval, show progress per object, and
decode the base64 data: URLs the result carries into actual image files.
Commands
| Command | Does | Costs |
| --- | --- | --- |
| shop <image\|pin-url> | Start a read and wait for it | one request |
| start <image\|pin-url> | Start a read, print the id, exit | one request |
| get <request-id> | Look at a read you started earlier | free |
| domains | List the focus domains — no key needed | free |
| key new <email> | Mint a trial key, mailed to that address | free |
| key status / key revoke | Allowance and expiry, or revoke | free |
Options: --domain, --focus, --out, --json, --quiet, --timeout,
--key, --base.
What it refuses to do
- Retry a spent allowance. A
quota_exhaustedresponse is printed and the process exits non-zero. Minting another key would not help — re-minting carries the old balance over. - Fetch an arbitrary image URL. The API takes bytes or a public Pinterest
pin URL. Passing any other
https://image link is an error telling you to download it first, because there is no parameter that would make the platform an open image proxy. - Send an oversized file. Over 10 MB is refused locally, before the upload, with the file's actual size in the message.
- Poll forever. After
--timeoutminutes (20 by default) it stops and tells you the request id, which stays valid:inspired get <id>collects it later.
Requirements
Node 20 or newer — it uses the built-in fetch, FormData, File and
Buffer. No npm install, no lockfile, nothing to audit. It talks only to
inspired.jetskibay.com unless you point --base somewhere else.
Limits
It is a client, not a library: the output is text and files, and --json gives
you the API's payload verbatim if you want to pipe it. It does not cache, batch,
or run reads in parallel — one photograph per invocation, because one read is
one charged request and making that easy to do by accident would be a bug.
Make it yours.
Choose the format that fits your workflow.
inspired.mjs
text/javascript · v1.0.0 · en · 17 KB
node >=20 · macos / linux / windows
node inspired.mjs shop photo.jpg --domain furniture --out ./cutoutsFile details & reuse
License: All rights reserved
Redistribution: prohibited
SHA-256 63d7a40620a85dbbada7c7e0253017601981071f15429de6a7b489b1d5103863
Ships with.
Make it your own.
EXAMPLES & PROMPTSA real session
==============
$ node --version
v24.19.0
$ ./inspired.mjs domains
fashion (default)
Clothing & accessories — Garments, shoes, bags, and jewellery worn by a person.
aliases: clothing, clothes, style, outfit, apparel
An outfit photo returns each layer as its own shoppable piece.
furniture
Furniture & interiors — Sofas, chairs, tables, lighting, rugs, shelving, and decor.
A living room photo returns the sofa, the lamp, and the rug.
devices
Devices & electronics — Phones, laptops, audio, cameras, peripherals, and appliances.
A desk photo returns the laptop, the keyboard, and the monitor.
beauty
Beauty & personal care — Skincare, makeup, fragrance, haircare, and tools.
A shelfie returns each bottle and jar as its own shoppable product.
everything
Anything — No category filter. Every distinctly purchasable object in the frame.
Use with `focus` to aim the same pipeline at a category we have not named.
(Free, and no key needed — this is the live catalogue, verbatim.)
Refusals, before anything is charged
------------------------------------
$ ./inspired.mjs shop notes.txt
notes.txt: send a .jpg, .png, .webp or .gif file (or a Pinterest pin URL).
$ echo $?
1
$ ./inspired.mjs shop https://example.com/photo.jpg
Inspired takes image bytes or a public Pinterest pin URL, not an arbitrary
image URL. Download the image first.
$ echo $?
1
$ ./inspired.mjs shop huge.jpg
huge.jpg is 14.2 MB. The limit is 10 MB — resize it first.
$ echo $?
1
$ unset INSPIRED_KEY; ./inspired.mjs shop outfit.jpg
No API key. Set INSPIRED_KEY or pass --key.
Get one with: inspired key new you@example.com
$ echo $?
1
$ ./inspired.mjs shop outfit.jpg --nope
Unknown option --nope. Try 'inspired help'.
$ echo $?
1
A whole read
------------
$ ./inspired.mjs key new me@example.com
Mailed a key to me@example.com.
prefix isk_7f3a
requests 10
The key itself is only in that email — it is stored here as a hash and
nowhere else.
$ export INSPIRED_KEY=isk_7f3a… # pasted from the email
$ ./inspired.mjs shop living-room.jpg --domain furniture --out ./cutouts
started 3f0c8a5e-1d4b-4a9e-9a1c-2b8f5d7e6c40 · 9 request(s) left
waiting — a full read takes a few minutes
Reading the room
Cutting out the floor lamp
Searching for the floor lamp · 1 of 3
Cutting out the sofa
Searching for the sofa · 2 of 3
Cutting out the rug
Building the mood board
wrote 5 files to ./cutouts
Found 3 clearly visible furniture items.
3 object(s) · domain furniture
floor lamp
Slim brass floor lamp with a white cone shade and a round weighted base
€149 Brass arc floor lamp
https://shop.example/brass-arc-lamp
€189 Tall brass reading lamp
https://shop.example/reading-lamp
sofa
Three-seat sofa in sage green boucle, straight arms, tapered wooden legs
€899 Boucle three-seater, sage
https://shop.example/boucle-three-seater
rug
Flatweave rug in oatmeal with a narrow charcoal border
(nothing visually similar found)
Objects are spotted, not identified; results are visually similar, not the
same product.
$ ls ./cutouts
mood-board.webp piece-1-floor-lamp.webp piece-2-sofa.webp
piece-3-rug.webp result.json
Starting and collecting separately
----------------------------------
$ ID=$(./inspired.mjs start desk.jpg --domain devices --quiet)
$ echo "$ID"
9b2e41c7-5a08-4c3d-8f61-7d4e2a9b0c31
$ ./inspired.mjs get "$ID"
running: Cutting out the headphones
laptop — searching
headphones — extracting
keyboard — queued
(get looks once and exits. Polling is free, so look as often as you like.)
$ ./inspired.mjs get "$ID" --out ./desk
wrote 5 files to ./desk
Found 3 clearly visible device items.
…
When the allowance runs out
---------------------------
$ ./inspired.mjs shop another.jpg
This key's 10 included requests are used up. (quota_exhausted)
$ echo $?
1
Minting a new key for the same address will not help: it revokes the old one
and carries the remaining allowance over. That is the point.
Note on this transcript
-----------------------
The `domains` output and every refusal above are verbatim from running this
client against the live platform. The finished read is shown with placeholder
retailers and ids — the field names, ordering, progress lines and file layout
are exactly what a real read produces.
Published by Inspired. Fictional brand, working prototype.