EyeSayYour account
For developers

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

EndpointWhat you getPer 1,000 photos
/v1/embedSearch 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/rerankUp to 128 candidates ranked against a query€0.10
/v1/tagsTags for a photo, each with a score; add its search vector in the same call€0.30
/v1/classifyA score for each of your own labels, up to 64, nothing to train€0.30
/v1/askA 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

  1. Get a keySign in and open your account page: the key on it is what your code sends, as the header X-Auth-Token.
  2. Send a photoEvery call is a POST with a JSON body to /v1/<endpoint>; the photo is a base64 string or a data URL.
  3. Read the answerTags come back as {"tags": [{"tag", "p"}], "min_score"}; a tag below min_score is a suggestion. Your own labels come back as {"class_scores", "top"}.
  4. Store vectors, search laterKeep each vector with the space value it came with; a sentence sent to /v1/embed then 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:

€10100,000 units: about 33,000 photos tagged or 100,000 vectors
€40420,000 units: about 140,000 photos tagged
€1501,650,000 units: about 550,000 photos tagged

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.