Jump to section
API Reference

OSINTSTAR API

Official documentation for integrating OSINT search and upstream proxies. This page covers authentication (API key and Firebase session), credit and daily quota consumption (UTC), per-key and global IP limits, CORS rules, allowed JSON shapes, response normalization, and a full HTTP error reference—aligned with the running server.

  • Base URL = your deployment origin; API responses include X-API-Version: 1
  • JSON bodies are UTF-8; Content-Type required where noted
  • Use HTTPS in production; never expose keys in query strings or public front-end code
JSONHTTPS1 usage unit / call~60/min per key + global IP cap
Base URL
Production: your site origin.
https://osintstar.vip
Public status
No key — maintenance + pricing snapshot.
GET https://osintstar.vip/api/public/status
Search types
Path or JSON enum — case-insensitive path.

username · email · domain · phone · ip · hash · discord

Quickstart

  1. Use a plan that includes API access (the free plan cannot call with an API key).
  2. Generate your key from the Dashboard (osk_live_ + 48 hex chars). Store it server-side only.
  3. For each billable search, call POST /api/search or POST /api/search/{type} with the appropriate auth headers.
  4. Inspect quota and bonus credits with GET /api/usage using your Firebase ID token (not the OSINTSTAR API key).

Search types — what to send when

type values are fixed and validated server-side. Pick the type that matches your query; the upstream applies its own parsing rules and data sources.

username
Username / handle

Handles and screen names used across online services. Useful for correlating accounts across platforms.

email
Email

Full email address. The upstream engine may match against breaches, leaks, and public sources.

domain
Domain

Domain name or hostname (e.g. example.com). For infrastructure and web-presence intelligence.

phone
Phone

Phone number in the format expected by the upstream backend (e.g. E.164 where supported).

ip
IP address

IPv4 or IPv6 for approximate geolocation, ASN, and network metadata when available.

hash
Hash

Cryptographic digests (e.g. MD5, SHA-1/256) for lookups against known sets or upstream tooling.

discord
Discord

Numeric Discord ID or text identifier. On 400/422 the server automatically retries once as username.

POST /api/search vs POST /api/search/{type}?
  • POST /api/search — optional body { "query", "type" } or an empty body (forwarded as-is after auth). Supports API key or Firebase Bearer (dashboard session).
  • POST /api/search/{type} — type is in the path; body is only { "query" }. Requires an API key only (ideal for server-to-server integrations).

Endpoint matrix

All paths are under your base URL. Billable routes charge one usage unit after authentication and before the upstream call (except /api/public/status and /api/usage).

MethodPathAuthUsageNotes
GET/api/public/statusNoneMaintenance, announcements, pricing
POST/api/searchAPI key or Firebase Bearer1Optional JSON body; strict keys query + type
POST/api/search/{type}API key only1Body { "query" }; types: username, email, domain, phone, ip, hash, discord
POST/api/stealerAPI key only1Proxies JSON to upstream /api/stealer
GET/api/get/*API key only1Proxies GET upstream /api/…; max 10 segments
GET/api/usageFirebase BearerDaily UTC quota, bonus, plan

Authentication

API keys use the prefix osk_live_ followed by exactly 48 hexadecimal characters (normalized to lowercase). Send the key using either header:

  • x-api-key: <key>
  • Authorization: Bearer <key> (same value as x-api-key—not a Firebase JWT)

Keys are issued from the Dashboard; they may expire. Revoked or expired keys return 401.

Headers (API key)
x-api-key: osk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Authorization: Bearer osk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
POST /api/search — Firebase session

If Authorization: Bearer is not a valid API key string, it is treated as a Firebase ID token. That path uses dashboard guards (free plan may call; paid API-key block does not apply). All other OSINT routes in the matrix require a valid API key.

Credits & daily quotas (UTC)

Each successful authentication on a billable route consumes one usage unit from your account before the upstream request runs. Order: bonus credits (if any) are decremented first; otherwise the paid-plan daily UTC counter applies, or the lifetime counter for free. If neither has capacity, 402with a message like "No credits remaining for your plan."

The usage unit is charged even when the upstream returns 4xx/5xx—design retries accordingly.

PlanLimit (UTC / lifetime)API key access
free10 usage units (lifetime counter)403 — plan does not include API key access
basic100 / UTC dayAllowed
medium250 / UTC dayAllowed
pro2000 / UTC dayAllowed

Disabled account, suspension, or expired plan → 403 with a specific error string.

Limits & middleware

Per API key (search)

Sliding window ~60 requests/minute per key (in-process; multiple instances multiply effective throughput).

Global per IP (/api/*)

Edge middleware caps all API requests per client IP (default ~360/min, env-tunable). Exceeded → 429 with Retry-After 60.

POST body size

Content-Length over ~1 MB → 413 where pre-checked. Typed search JSON parsing caps at ~256 KB.

Upstream timeout

Proxy aborts around 28s → 504 on generic search; other routes may surface upstream errors differently.

Abuse guard (search POST)

Repeated invalid payloads from an IP can return 403 with Retry-After.

Auth API (/api/auth/*)

Stricter per-IP limit on auth routes in addition to the global cap.

CORS & browser clients

  • Browser requests that send an Origin header must use an allowlisted origin (app URL, localhost in dev, configured public URLs). Otherwise middleware may return 403.
  • OPTIONS preflight is supported; allowed headers include Content-Type, Authorization, x-api-key.
  • Server-to-server calls (no Origin) skip browser CORS checks but still hit global IP limits.

GET /api/public/status

GET/api/public/status
None

No authentication. Returns JSON: maintenance object, up to 3 active announcements (newest first), and sanitized pricing fields when configured.

curl -sS "https://osintstar.vip/api/public/status"
Sample JSON
{
  "maintenance": { "enabled": false, "message": null, "updatedAt": null },
  "announcements": [ { "id": "…", "title": "", "message": "", "createdAt": 0 } ],
  "pricing": { "basic": 9.99, "medium": 19.99, "pro": 49.99, "currency": "USD" }
}

POST /api/search

POST/api/search
API key or Firebase Bearer1 usage unit

Proxies to upstream POST /api/search. Body optional. If non-empty, Content-Type must be application/json and the object must be strict: only query (string, max 4000) and type (enum: username, email, domain, phone, ip, hash, discord)—no extra keys.

Empty body is forwarded after auth (still consumes one usage unit). Invalid JSON / wrong Content-Type / extra keys → 400 or 415; validation errors may include an issues object (Zod flatten).

cURL
curl -X POST https://osintstar.vip/api/search \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"target@example.com","type":"email"}'
JavaScript
const res = await fetch("https://osintstar.vip/api/search", {
  method: "POST",
  headers: {
    "x-api-key": process.env.OSINTSTAR_API_KEY!,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ query: "acme.com", type: "domain" }),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error ?? "Request failed");
Python
import requests

r = requests.post(
    "https://osintstar.vip/api/search",
    headers={
        "x-api-key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={"query": "john_doe", "type": "username"},
    timeout=30,
)
r.raise_for_status()
print(r.json())

POST /api/search/{type}

POST/api/search/{type}
API key only1 usage unit

The URL segment type is one of: username, email, domain, phone, ip, hash, discord (case insensitive). Body must be exactly { "query": "<1..4000 chars>" } (strict JSON).

Discord: if upstream returns 400 or 422 for type discord, the server retries once with type username.

curl -X POST https://osintstar.vip/api/search/email \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"target@example.com"}'

POST /api/stealer

POST/api/stealer
API key only1 usage unit

Proxies the raw body to upstream POST /api/stealer. Content-Type: application/json is required. Non-empty bodies must be valid JSON and satisfy internal depth/size checks.

curl -X POST https://osintstar.vip/api/stealer \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"example":"payload"}'

GET /api/get/…

GET/api/get/*
API key only1 usage unit
  • Forwards to upstream GET /api/<segments>.
  • Each segment must match [a-zA-Z0-9_.-]+; . and .. are rejected; 1–10 segments.
  • Query keys must be [a-zA-Z0-9_]+; values are passed through.
curl "https://osintstar.vip/api/get/breach/check?email=target@example.com" \
  -H "x-api-key: YOUR_API_KEY"

GET /api/usage

GET/api/usage
Firebase Bearer (session)

Returns usage for the signed-in user: plan, daily limit (or lifetime for free), current consumption, remaining allowance, and bonus credits. Requires Authorization: Bearer <Firebase ID token> (same token the web app uses after login), not the OSINTSTAR API key.

Dedicated rate limit: ~30 requests/minute per user account. Does not consume search usage units.

curl -sS "https://osintstar.vip/api/usage" \
  -H "Authorization: Bearer FIREBASE_ID_TOKEN"
Sample response (paid plan)
{
  "planId": "basic",
  "dailyLimit": 100,
  "usedToday": 12,
  "remaining": 88,
  "dayKey": "2026-04-23",
  "bonusCredits": 0
}

For free, dayKey is "lifetime" and usedToday reflects the lifetime total counter.

Responses & headers

JSON shaping

If upstream returns JSON with a top-level results property, the body is normalized to { "results": … } while preserving the HTTP status. Other JSON objects are returned as-is. Non-JSON bodies keep original bytes and Content-Type.

Common response headers
  • X-API-Version: 1
  • Cache-Control: no-store on API routes
  • Errors may include Retry-After (429, some 403s)

Error reference

JSON errors usually include { "error": "…" }. Some 400s add issues (Zod). Maintenance returns { "error": "Maintenance", "message": "…" }.

CodeWhen
400Invalid body, search type, proxy path; malformed JSON; payload too nested.
401Missing credentials; invalid or expired API key; invalid Firebase token.
402No credits / daily quota / bonus left.
403Free plan API blocked; disabled/suspended account; expired plan; origin blocked (browser); IP abuse cooldown.
413Request body too large (Content-Length).
415Content-Type must be application/json where required.
429Per-key search limit or global per-IP API limit—honor Retry-After.
500Unhandled server error.
502Upstream fetch failed (e.g. generic search).
503Maintenance mode enabled.
504Upstream request timed out.

Lookups & privacy

When enabled on your profile, search queries may be stored server-side (endpoint name, query, type, HTTP status, timestamp). You can control this from the Dashboard. Billing is unchanged: billable routes still consume one usage unit per call as described above.

Security checklist

  • Never embed API keys in front-end bundles or public repositories.
  • Prefer server-side integration so the key stays on your infrastructure.
  • The GET proxy is not a general-purpose open proxy—only whitelisted path shapes are allowed.
  • Rotate keys immediately if leaked; monitor usage from the Dashboard.

Documentation reflects application behavior at build time; environment variables may tune rate-limit values in production.