One API for tagging, sorting, searching and describing images
Tags in everyday words, scores against your own labels, vectors that put photos and text in one search space, a one-sentence description for alt text, and answers about a photo. No model to host and no ML team: €0.10 per 1,000 photos for search vectors, €0.30 for tags, with a free key.
Every capability, priced per photo
| Endpoint | What you get | Per 1,000 photos |
|---|---|---|
/v1/embed | Search vectors for photos and text in one space, up to 64 a call, for search and finding similar photos; text is free | €0.10 |
/v1/rerank | Up to 128 candidates ranked against a query | €0.10 |
/v1/tags | Tags for a photo, each with a score; add its search vector in the same call | €0.30 |
/v1/classify | A score for each of your own labels, up to 64, nothing to train | €0.30 |
/v1/ask | A one-sentence description, usable as alt text, or a short answer about one photo | €0.90 |
A unit is €0.0001: a search vector is 1 unit, tags or a sort 3, a description or an answer 9. The iPhone app, the Claude and ChatGPT connector and the tool on the home page all run on the same service. All prices, packs and limits.
How it works
- Get a keySign in and open your account page: the key on it is what your code sends, as the header
X-Auth-Token. - Send a photoEvery call is a
POSTwith a JSON body to/v1/<endpoint>; the photo is a base64 string or a data URL. - Read the answerTags come back as
{"tags": [{"tag", "p"}], "min_score"}; a tag belowmin_scoreis a suggestion. Your own labels come back as{"class_scores", "top"}. - Store vectors, search laterKeep each vector with the
spacevalue it came with; a sentence sent to/v1/embedthen finds the closest photos.
curl https://eyesay.app/v1/tags \
-H "X-Auth-Token: $KEY" -H "Content-Type: application/json" \
-d '{"image": "data:image/jpeg;base64,...", "k": 8}'
# answer: {"tags": [{"tag", "p"}, ...], "min_score", ...}
# add "with_embedding": true for its search vector, counted as one photo
Every endpoint, its fields and its errors are in the API docs; the same endpoints for tools and code generators are in the OpenAPI spec.
Free key, limits and packs
A free key has 3,000 units every month — 1,000 tagged photos, 3,000 search vectors or 333 descriptions — at up to 60 requests a minute; while an account has bought units left, up to 600. A request may be up to 32 MB and a photo up to 16 million pixels; an account takes at most 50,000 image vectors a day. Units come in packs that are paid once and never expire:
Questions
Are the photos stored or used for training?
No. A photo is held in memory only while it is being answered and is never written to disk. Nothing you send is used to train models or for advertising. The details are in the privacy policy.
Which photo formats work?
Send JPEG or PNG as a base64 string or a data URL; convert HEIC first. A request may be up to 32 MB, and a photo up to 16 million pixels.
How many requests can I send?
Up to 60 requests a minute on a free key and 600 while the account has bought units left; embed takes up to 64 inputs a call. On a 429 with Retry-After, wait that many seconds and retry; without it, the month’s units are used up. An account takes at most 50,000 image vectors a day; write to support@eyesay.app if you need more.
Can an assistant use it instead of my code?
Yes. Claude, ChatGPT, Claude Code and Codex connect to https://eyesay.app/mcp and sign in with your EyeSay account, without your key. Claude Code and Codex can send a whole folder of photos.
Photos are not kept. Each photo is looked at in memory and dropped once the answer is sent, and nothing you send is used to train models. It reads and answers in English and is weakest on small text in a photo.