Too permissive for most production auth.
Good if you deliberately want broad grouping, risky if you need identity-grade separation.
Stable, deterministic IDs from noisy embeddings. Think fuzzy extractors, but for complex, non-binary embeddings.
Four steps. Two API calls. One equality check in your application.
Keep your current model. IdemAPI starts where your encoder output begins.
POST /v1/bind gives you stable material for future use. Nothing is stored server-side.
Save the anchor and id in your own database, object store or keychain.
POST /v1/derive with a fresh embedding plus the anchor. The server returns a derived ID. Your app compares it to the stored one.
Once you can turn noisy embeddings into stable IDs, the pattern applies far beyond one product category. Here are three examples, shown end to end.
This is only an example. The same bind-then-derive flow applies to any embedding generated by any model.
Your face model outputs an embedding. You send it to /v1/bind.
POST /v1/bind
{
"embedding": [0.14, -0.82, 0.33, 0.91, -0.27, 0.45, ...],
"strictness": 0.55
}
{
"anchor": "0006a3f9...",
"id": "f29c6ab1...",
"dim": 512,
"strictness": 0.55
}
You store the returned material next to the user record. No raw embedding needs to live in your backend.
{
"user_id": "user_42",
"anchor": "0006a3f9...",
"id": "f29c6ab1..."
}
The user comes back, your model emits a new embedding, and you call /v1/derive with that embedding plus the stored anchor.
POST /v1/derive
{
"embedding": [0.11, -0.80, 0.31, 0.89, -0.24, 0.48, ...],
"anchor": "0006a3f9..."
}
{
"id": "f29c6ab1..."
}
Your backend compares the returned ID with the stored ID. Equal means same source. Different means reject.
stored_id = "f29c6ab1..."
derived_id = "f29c6ab1..."
accepted = (stored_id == derived_id)
Run one model over a labeled dataset, sweep strictness, and measure the actual match behavior you get in production terms.
Take two samples whose ground truth you already know, for example same person or different person, and embed them with the model you want to evaluate.
POST /v1/bind
{
"embedding": [0.23, -0.61, 0.08, 0.74, ...],
"strictness": 0.55
}
{
"anchor": "0091bc4d...",
"id": "8a14d02f...",
"dim": 768,
"strictness": 0.55
}
Bind the first sample, derive from the second, and compare IDs. Repeat that process across positive and negative pairs to see how the model really behaves.
POST /v1/derive
{
"embedding": [0.19, -0.59, 0.11, 0.71, ...],
"anchor": "0091bc4d..."
}
{
"id": "8a14d02f..."
}
Each pair gives you a ground-truth label and an exact-match result. Sweep strictness: if the model keeps good precision at higher values, the embeddings are strong; if accuracy falls apart early, the model is weak for that task.
{
"model": "face_encoder_v1",
"strictness": 0.55,
"pairs_evaluated": 10000,
"precision": 0.972,
"false_accept_rate": 0.004,
"false_reject_rate": 0.024
}
Use text embeddings from forms, bios or profile fields to decide when two slightly different records still describe the same person.
You embed the first form or profile record, then bind it once to get a stable anchor and ID for that entity.
{
"name": "John Doe",
"title": "Product Manager",
"company": "Acme",
"city": "New York"
}
POST /v1/bind
{
"embedding": [0.07, -0.42, 0.58, 0.11, ...],
"strictness": 0.55
}
{
"anchor": "00af92bd...",
"id": "7be31fd0...",
"dim": 768,
"strictness": 0.55
}
A second record may not be textually identical, but if it describes the same person, the derived ID can still match.
{
"name": "John A. Doe",
"title": "Product Lead",
"company": "Acme Inc.",
"city": "New York, NY"
}
POST /v1/derive
{
"embedding": [0.05, -0.39, 0.60, 0.13, ...],
"anchor": "00af92bd..."
}
{
"id": "7be31fd0..."
}
If the IDs match, your application can treat both records as the same underlying entity even when the raw text differs slightly.
{
"record_a": "crm_1021",
"record_b": "lead_8874",
"strictness": 0.55,
"same_entity": true,
"action": "merge"
}
strictness is the parameter you send to the API to decide how selective matching should be. The default is 0.5, which is usually the right starting point for production.
Good if you deliberately want broad grouping, risky if you need identity-grade separation.
Enough tolerance for noisy embeddings. Enough selectivity to keep different sources apart.
Useful only if your encoder is exceptionally stable and you have evidence that aggressive selectivity improves outcomes.
The exact same source will not emit the exact same vector every time, so perfect determinism is not free. If you always sent the exact same embedding, you would not need this product in the first place.
What teams usually want is a simpler operating model.
Instead of score thresholds, nearest-neighbor infrastructure and repeated comparison logic, IdemAPI gives you a deterministic ID flow. The strictness parameter controls how precisely embeddings must match: lower values accept more variation, higher values demand near-exact similarity.
One operation = one bind or one derive call. No storage fees, no seat pricing, no database markup.
Bind and derive run on the same stateless Railway-backed request path and show similar latency in current tests, so pricing them per operation is the cleanest model for both product clarity and margin.
Base URL: https://api.idem.algoritful.com · Direct access uses Authorization: Bearer <api_key>. If you expose the API through RapidAPI instead, use X-RapidAPI-Proxy-Secret and X-RapidAPI-User.
Send one embedding. Store the returned anchor and id.
curl -s -X POST https://api.idem.algoritful.com/v1/bind \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"embedding": [0.12, -0.54, 0.87, 0.33, -0.21, 0.66, -0.90, 0.44], "strictness": 0.55}'
# { "anchor": "0008a3f9...", "id": "f29c...", "dim": 8, "strictness": 0.55 }
Send a fresh embedding plus the stored anchor. Compare the returned id to the one you already saved.
ANCHOR="YOUR_ANCHOR_FROM_BIND"
NEW_EMBED='[0.11, -0.55, 0.85, 0.30, -0.23, 0.68, -0.88, 0.42]'
curl -s -X POST https://api.idem.algoritful.com/v1/derive \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"embedding\": $NEW_EMBED, \"anchor\": \"$ANCHOR\"}"
# { "id": "f29c..." } # compare to your stored id on your side
The quickstart above is enough for integration. These are the main request errors you may want to surface or log.
| HTTP | Message | Cause |
|---|---|---|
| 401 | Unauthorized | Missing or invalid Authorization header, or missing RapidAPI proxy headers when deployed behind RapidAPI |
| 400 | embedding must not be empty | Sent [] |
| 400 | strictness must be between 0.0 and 1.0 | strictness out of valid range |
| 400 | anchor is not valid hex | Corrupted or truncated anchor string |
| 400 | Dimension mismatch | Derive embedding has different dim than bind |
| 413 | — | Embedding exceeds 32 768 dimensions |
The main operational properties teams usually care about in production.
Re-enrolling the same source generates fresh material, which makes cross-database linking much harder.
The original embedding is not stored, and the anchor alone is not meant to serve as a recoverable template.
Close embeddings from the same source can still derive to the same ID even when exact hashing would split them apart.
The server stores nothing between calls. No session state, no template DB and no embedding retention on the API side.
If material is ever exposed, bind again and issue a fresh anchor/id pair instead of replacing your encoder stack.