Text or image in. Label out.
Classify text and recognize images with your own labels. Free with a verified account.
Using Jev? sifty answers the same System One API. It is open source and free, and you can host it yourself. Use your Sifty API key and switch the base URL
Try an image example, or paste a public image URL.
1,000 free units per IP per day.
Result
Your result will appear here.
Register free to classify your own text and images: 1,000 units a day and an API key.
Try an example
Or use the API
curl -H 'Authorization: Bearer YOUR_SIFTY_API_KEY' https://sifty.dev/spam,not+spam/Win+a+free+iPhoneFor image recognition, send an image URL or upload with your labels. See the image API example.
Using sifty
Send text or an image with your own labels. Get the most likely label back.
HTTP API
Register and verify your email, then create an API key in your account. Send it as Authorization: Bearer YOUR_SIFTY_API_KEY. Keep it private.
curl -H 'Authorization: Bearer YOUR_SIFTY_API_KEY' https://sifty.dev/spam,not+spam/Win+a+free+iPhoneAdd ?verbose=1 for probabilities. Use POST for a batch:
curl -H 'Authorization: Bearer YOUR_SIFTY_API_KEY' https://sifty.dev/ -H 'Content-Type: application/json' \
-d '{"input":["Win a free iPhone","Lunch at noon?"],"labels":["spam","not spam"]}'Image recognition
Send an image instead of, or with, text: a public image URL, or a data:image/…;base64, upload of up to about 6 MB. The same labels, questions and answers apply.
curl -H 'Authorization: Bearer YOUR_SIFTY_API_KEY' https://sifty.dev/ -H 'Content-Type: application/json' \
-d '{"image":"https://upload.wikimedia.org/wikipedia/commons/3/3a/Cat03.jpg","labels":["cat","dog","other"]}'Ask a question with "question", add text about the image with "input", or use ?labels=cat,dog&image=<url> in a GET. System One requests take a top-level "image" that every question is asked about. Images are never stored: private logs keep only whether it was a URL or an upload, the URL's host, and its size.
Web pages
Send a public page's address as url in a POST body, instead of text. sifty reads the page, JavaScript-rendered ones too, and answers about what it says. Addresses written in your text are read the same way. Only the answer comes back, never the page. It suits an agent that must decide, before it reads a page, whether it is the right one or a login wall.
curl -H 'Authorization: Bearer YOUR_SIFTY_API_KEY' https://sifty.dev/ -H 'Content-Type: application/json' \
-d '{"url":"https://example.com/pricing","labels":["pricing page","login wall","other"]}'System One takes a top-level "url" as well and asks every question about that one page. A "state" you send beside it is joined to the page.
curl -H 'Authorization: Bearer YOUR_SIFTY_API_KEY' https://sifty.dev/v1/systemone -H 'Content-Type: application/json' \
-d '{"url":"https://example.com/pricing","questions":{"prices":{"type":"noul","instructions":"Does this page list prices?"}}}'Each page adds 2 units to the request, whether you send it as url or write its address in your text, and sifty reads at most 5 pages a request. A page that can't be read fails the request with a 502; its 2 units are kept and the rest refunded. The model sees up to about 6,000 characters of each page: the passages that best match your labels and question. Only public sites can be read, and url goes in a POST body; in a GET, write the address in text. Pages are read by Jina Reader, which sees their addresses. Private logs keep only a url's host and length, never the page.
Python, and coming from Jev
sifty answers the System One API (POST /v1/systemone), so typesafe-sdk works unchanged. Code written for Jev needs your Sifty API key and a different base_url; Noul, Choice and Score questions are all supported.
from typesafe_sdk import Noul, TypeSafeClient
client = TypeSafeClient(
api_key="YOUR_SIFTY_API_KEY",
base_url="https://sifty.dev",
timeout=120,
)
response = client.system_one(
state="I was charged twice.",
questions={"billing": Noul(instructions="Is this about billing?")},
)
print(response.nouls["billing"].noul)Differences from Jev: sifty runs an open model (Qwen3.5-4B) that is not trained for calibration, so treat probabilities as a ranking and check your labels on a few real examples. The code is on GitHub for self-hosting. sifty is an independent project, not affiliated with TypeSafe AI.
Limits
1,000 units per IP per day, reset at 00:00 UTC. A batch counts each text; a System One call counts each question; each web page adds 2. There is also a shared daily cap of 20,000 units.
Use 2–26 labels, up to 32 texts per batch. The X-RateLimit-Remaining header tracks your allowance. A 429 response includes Retry-After.
How it works
Qwen3.5-4B scores your labels using next-token probabilities in one forward pass. It does not generate a text response. One GPU is always on, so answers usually take about a second; in a traffic spike, an extra GPU can take up to a minute to start.
Requests pass through Cloudflare and RunPod. We retain request text, labels, results, and country/client metadata in private logs for 3 days to understand usage and debug problems. Public statistics contain only aggregates. Web pages are read by Jina Reader, which sees their addresses. Please don’t send sensitive data.