eikino

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

StatuserrorMeaning
401unauthorizedMissing, invalid or revoked Bearer API key.
402insufficient_creditsNo checks left on the account. Packs start at $4.90 for 25 checks.
400invalid_requestMalformed JSON, non-https image_url, or invalid frame count.
400image_fetch_failedCould not download image_url over https within 10 seconds.
400bad_imageImage is not a valid JPEG, PNG or WebP (max 5 MB per frame).
429rate_limitedOver 120 requests per minute on this API key.
502upstreamUpstream vision model error; no check was charged.
503busyDaily 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.