Developers
Eikino HTTP API: geolocate frames and detect AI media
Send a photo or sampled video frames to geolocate where it was filmed or check for AI generation artifacts. Base URL https://eikino.com/api/v1 with Authorization: Bearer ek_....
Get an API key
Sign in with your email link and create a key on API keys. The plaintext key is shown once. Keep it private—anyone holding it can spend checks on your account—and revoke it anytime if needed.
POST /api/v1/locate
Estimate where a photo or 1 to 4 evenly spaced video frames were filmed. Send JSON with image_url, image_base64 or image_urls (up to 4 https URLs), or multipart field "file". Uses 1 check when a location is found; 0 checks if unknown or failed.
curl https://eikino.com/api/v1/locate \
-H "Authorization: Bearer $EIKINO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_url": "https://example.com/street-frame.jpg",
"hint": "filmed in summer 2019",
"taken": "2019-07-14"
}'Response:
{
"found": true,
"place": "Rua de São Miguel, Alfama, Lisbon",
"country": "Portugal",
"lat": 38.7116,
"lng": -9.1292,
"confidence": "high",
"radius_km": 1,
"clues": ["Portuguese street nameplate tile", "Yellow tram catenary wires"],
"alternatives": [],
"charged": true,
"credits_left": 24
}POST /api/v1/detect
Check 1 to 6 still frames from a video (or a single image) for signs of AI generation vs. real camera footage. Uses 1 check.
curl https://eikino.com/api/v1/detect \
-H "Authorization: Bearer $EIKINO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image_urls": [
"https://example.com/frame-1.jpg",
"https://example.com/frame-2.jpg",
"https://example.com/frame-3.jpg"
],
"duration": 6.0
}'Response:
{
"likelihood": "high",
"score": 88,
"summary": "Background lettering warps between frames and fingers merge during the hand gesture.",
"signs_ai": ["Shop sign glyphs shift between frame 1 and frame 3"],
"signs_real": [],
"charged": true,
"credits_left": 23
}GET /api/v1/credits
Check remaining checks on the account. Free.
curl https://eikino.com/api/v1/credits \
-H "Authorization: Bearer $EIKINO_API_KEY"Response:
{ "credits": 23, "held": 0 }Errors
| Status | error | Meaning |
|---|---|---|
| 401 | unauthorized | Missing, invalid or revoked Bearer API key. |
| 402 | insufficient_credits | No checks left on the account. Packs start at $4.90 for 25 checks. |
| 400 | invalid_request | Malformed JSON, non-https image_url, or invalid frame count. |
| 400 | image_fetch_failed | Could not download image_url over https within 10 seconds. |
| 400 | bad_image | Image is not a valid JPEG, PNG or WebP (max 5 MB per frame). |
| 429 | rate_limited | Over 120 requests per minute on this API key. |
| 502 | upstream | Upstream vision model error; no check was charged. |
| 503 | busy | Daily site capacity reached or API temporarily paused. |
Using Claude Code, Cursor or Codex? Connect over MCP →
Checks and limits
- API and MCP calls use the checks on your account (packs start at $4.90 for 25 checks, valid 365 days).
- Each location or AI detection call uses 1 check. Location calls that return found: false or fail upstream use 0 checks.
- Rate limit: 120 requests per minute per API key. Balance is verified before downloading any remote image_url.
- Eikino does not store submitted images or answers.