MobinApi e un gateway unificat: o singură cheie pentru AI (Claude, GPT, Grok), date publice (Wikidata, geocoding, weather, monede) și mai mult. Format compatibil OpenAI pentru LLM, REST clasic pentru restul.
Pentru moment cheile se generează exclusiv prin admin (self-serve urmează). Contactează administratorul ca să primești o cheie de tip sk-xxx.
O cheie sk-... unică, cu acces la modelele și serviciile permise.
curl -H "Authorization: Bearer sk-..." https://mobinapi.com/api/services
Compatibil OpenAI SDK pentru LLM. REST clasic pentru restul.
curl https://mobinapi.com/api/services
Catalog complet, nu cere autentificare.
curl -X POST https://mobinapi.com/api/llm/chat/completions \
-H "Authorization: Bearer sk-XXX" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Salut!"}]
}'Format compatibil OpenAI. Suportă streaming SSE cu stream: true.
Toate endpoint-urile cer un Bearer token (cheie virtuală validă). Răspunsurile JSON includ un câmp _meta cu request_id, latență și TTL cache (când aplicabil).
ID: llm
Modele de limbaj prin proxy MobinApi (Claude, GPT, Grok și altele). Format compatibil OpenAI.
/api/llm/chat/completionsTrimite un prompt și primești răspunsul modelului. Suportă streaming cu stream: true.
curl -X POST https://mobinapi.com/api/llm/chat/completions \
-H "Authorization: Bearer sk-virtual-key-xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Salut!"}]
}'ID: wikidata
Knowledge graph public — caută entități, rulează SPARQL, obține detalii pentru un Q-ID. Cache automat.
/api/wikidata/searchCaută entități după text. Parametri: q (obligatoriu), limit (default 10), lang (default en). Cache 5 min.
curl "https://mobinapi.com/api/wikidata/search?q=Einstein&limit=5" \ -H "Authorization: Bearer sk-virtual-key-xxx"
/api/wikidata/sparqlRulează un query SPARQL. Body: { query: string }. Limită 10000 caractere. Cache 15 min.
curl -X POST https://mobinapi.com/api/wikidata/sparql \
-H "Authorization: Bearer sk-virtual-key-xxx" \
-H "Content-Type: application/json" \
-d '{"query":"SELECT ?item ?itemLabel WHERE { ?item wdt:P31 wd:Q146 } LIMIT 5"}'/api/wikidata/entity/:qidDetalii complete pentru o entitate Wikidata. QID trebuie să match ^Q\d+$. Cache 1h.
curl https://mobinapi.com/api/wikidata/entity/Q937 \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: geo
Conversie adresă ↔ coordonate prin Nominatim. Gratis și nelimitat, cache 24h.
/api/geo/searchCaută adresa și obține coordonate. Parametri: q (obligatoriu), limit (default 10), lang (default ro).
curl "https://mobinapi.com/api/geo/search?q=Strada+Lipscani+Bucuresti&limit=5" \ -H "Authorization: Bearer sk-virtual-key-xxx"
/api/geo/reverseConversie coordonate → adresă. Parametri: lat, lon (obligatorii), lang (default ro).
curl "https://mobinapi.com/api/geo/reverse?lat=44.4268&lon=26.1025" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: weather
Date meteo curente + forecast 16 zile. Gratis, fără API key extern, cache 10 min.
/api/weatherVremea curentă + forecast pentru o locație. Parametri: lat, lon (obligatorii), days (1-16, default 7).
curl "https://mobinapi.com/api/weather?lat=44.43&lon=26.10&days=3" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: countries
Informații complete despre țări: populație, monedă, drapel, limbi, fus orar, etc. Cache 7 zile.
/api/countries/:codeDetalii pentru o țară. Parametru: cod ISO alpha-2 sau alpha-3 (ex: RO, ROU).
curl https://mobinapi.com/api/countries/RO \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: holidays
Sărbători legale per țară și an, prin Nager.Date. Util pentru calendar / scheduling. Cache 30 zile.
/api/holidays/:country/:yearSărbători legale pentru o țară (cod ISO 2 litere) într-un an dat.
curl https://mobinapi.com/api/holidays/RO/2026 \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: currency
Rate de schimb oficiale BCE. Conversie + istoric pe interval. Cache 1h / 24h.
/api/currencyRate curente. Parametri: from (obligatoriu, ISO 3 litere), to (opțional), amount (default 1).
curl "https://mobinapi.com/api/currency?from=EUR&to=RON&amount=100" \ -H "Authorization: Bearer sk-virtual-key-xxx"
/api/currency/historyIstoric rate. Parametri: from (obligatoriu), to (opțional), start (YYYY-MM-DD obligatoriu), end (default azi). Max 365 zile.
curl "https://mobinapi.com/api/currency/history?from=EUR&to=RON&start=2026-01-01&end=2026-04-30" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: ip
Detalii despre o adresă IP: țară, oraș, ISP, fus orar, coordonate. Util pentru analytics + fraud check.
/api/ip/:addressLocație + informații ISP pentru un IP (IPv4 sau IPv6). Cache 24h.
curl https://mobinapi.com/api/ip/8.8.8.8 \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: quote
Citate celebre random. Util pentru loading screens, daily inspiration, content fillers.
/api/quoteReturnează un citat random (autor + text).
curl https://mobinapi.com/api/quote \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: fact
Fapte aleatorii (Useless Facts API). Util pentru content fillers, trivia bots, daily emails.
/api/factReturnează un fapt random. Parametru opțional: lang (en|de, default en).
curl https://mobinapi.com/api/fact \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: dictionary
Definiții, pronunție, sinonime și exemple pentru cuvinte (DictionaryAPI.dev). Cache 30 zile.
/api/dictionary/:wordDefiniții pentru un cuvânt. Parametru opțional: lang (default en).
curl https://mobinapi.com/api/dictionary/serendipity \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: crypto
Preț crypto live + market cap + variație 24h (CoinGecko free). Cache 60s.
/api/crypto/:coinPreț pentru o crypto (id CoinGecko, ex: bitcoin, ethereum). Parametru opțional: vs (default usd,eur).
curl "https://mobinapi.com/api/crypto/bitcoin?vs=usd,eur" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: hackernews
Căutare în Hacker News (Algolia). Util pentru tech monitoring + tendințe. Cache 5 min.
/api/hackernews/searchCăutare în HN. Parametri: q (obligatoriu), tags (default story), hits (1-50), page (0-50).
curl "https://mobinapi.com/api/hackernews/search?q=anthropic&hits=10" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: catfact
Fapte random despre pisici (catfact.ninja). Util pentru content fillers.
/api/catfactReturnează un fapt random despre pisici.
curl https://mobinapi.com/api/catfact \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: dogimage
Imagini random cu câini (dog.ceo). Suport pentru rasă specifică.
/api/dogimageImagine random. Parametru opțional: breed (ex: husky, beagle, labrador).
curl "https://mobinapi.com/api/dogimage?breed=husky" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: joke
Glume random (JokeAPI). Safe-mode activ implicit, configurable.
/api/jokeGlumă random. Parametri: category (Any|Programming|Misc|Pun|...), lang (en|de|...), safe (default true).
curl "https://mobinapi.com/api/joke?category=Programming" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: advice
Sfaturi random (adviceslip.com). Util pentru loading screens, daily quotes.
/api/adviceReturnează un sfat random.
curl https://mobinapi.com/api/advice \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: randomuser
Generator utilizatori falși realiști (randomuser.me). Util pentru testing, seeding, mockups.
/api/randomuserGenerează utilizatori. Parametri: results (1-50, default 1), gender (male|female), nat (cod ISO 2 litere, comma-sep).
curl "https://mobinapi.com/api/randomuser?results=5&nat=ro,fr" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: pokemon
Date complete despre orice Pokémon (PokeAPI). Cache 24h.
/api/pokemon/:nameDetalii pentru un Pokémon (lowercase, ex: pikachu, charizard).
curl https://mobinapi.com/api/pokemon/pikachu \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: wikipedia
Rezumat + thumbnail + extract pentru un articol Wikipedia (REST API oficial). Cache 1h.
/api/wikipedia/:titleRezumat articol Wikipedia. Parametru opțional: lang (default en, ex: ro, fr, de).
curl "https://mobinapi.com/api/wikipedia/Albert_Einstein?lang=en" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: github
Date publice GitHub: detalii repo (stele, fork-uri, limbaj, licență), profil utilizator. Cache 10-30 min.
/api/github/repo/:owner/:nameDetalii repo GitHub. Cache 10 min.
curl https://mobinapi.com/api/github/repo/vercel/next.js \ -H "Authorization: Bearer sk-virtual-key-xxx"
/api/github/user/:usernameProfil utilizator GitHub (urmăritori, repos publice, bio). Cache 30 min.
curl https://mobinapi.com/api/github/user/torvalds \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: npm
Date pachet npm: versiuni, dependencies, downloads, autori, repository. Cache 1h.
/api/npm/package/:nameDetalii pachet npm. Suportă scoped packages (encode @scope/name).
curl https://mobinapi.com/api/npm/package/react \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: nasa
Astronomy Picture of the Day — imagine + explicație științifică, zilnic. Cache 6h.
/api/nasa/apodAPOD pentru azi. Parametru opțional: date=YYYY-MM-DD pentru o zi anterioară.
curl "https://mobinapi.com/api/nasa/apod?date=2026-04-01" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: stackoverflow
Căutare în Stack Overflow (Stack Exchange API). Util pentru documentation + Q&A. Cache 5 min.
/api/stackoverflow/searchCăutare în Stack Overflow. Parametri: q (obligatoriu), tag (opțional), pagesize (1-50, default 20).
curl "https://mobinapi.com/api/stackoverflow/search?q=react+hooks&tag=javascript" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: arxiv
Căutare papers academice arXiv (CS, math, physics, etc.). Util pentru research. Cache 1h.
/api/arxiv/searchCăutare papers. Parametri: q (obligatoriu), max (1-50, default 10). Returnează entries cu titlu, autori, summary, link.
curl "https://mobinapi.com/api/arxiv/search?q=large+language+models&max=5" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: openlibrary
Lookup carte după ISBN — titlu, autori, publisher, copertă, descriere. Cache 30 zile.
/api/openlibrary/isbn/:isbnDetalii carte după ISBN (10 sau 13 caractere, cu sau fără cratimă).
curl https://mobinapi.com/api/openlibrary/isbn/9780132350884 \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: words
Datamuse — sinonime, antonime, rime, cuvinte similare. Util pentru NLP, content tools, jocuri. Cache 7 zile.
/api/words/:wordRelații pentru un cuvânt. Parametri: rel (related|synonym|antonym|rhyme|trigger|sounds-like|spelled-like), max (1-100, default 20).
curl "https://mobinapi.com/api/words/serendipity?rel=synonym&max=10" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: worldbank
Date economice oficiale Banca Mondială: GDP, populație, inflație. 1500+ indicatori, 200+ țări, istoric 60 ani. Cache 24h.
/api/worldbank/:country/:indicatorIndicator pentru o țară. Country: ISO 2/3 litere sau 'all'. Indicator: cod World Bank (ex: NY.GDP.MKTP.CD = GDP, SP.POP.TOTL = populație). Parametru opțional: date=2020:2023.
curl "https://mobinapi.com/api/worldbank/RO/NY.GDP.MKTP.CD?date=2020:2023" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: iss
Poziție live a Stației Spațiale Internaționale (Open Notify). Lat/lon real-time + numărul astronauților curent în spațiu.
/api/issPoziție ISS curentă (lat/lon). Parametru opțional: mode=people pentru lista astronauților în spațiu.
curl https://mobinapi.com/api/iss \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: time
Timp curent + DST info pentru orice fus orar IANA. WorldTimeAPI. Util pentru aplicații multi-region.
/api/time/:zoneTimp curent pentru un timezone IANA. Format: Region/City (ex: Europe/Bucharest, America/New_York, Asia/Tokyo).
curl https://mobinapi.com/api/time/Europe/Bucharest \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: air-quality
Calitate aer (AQI european + US, PM2.5, PM10, NO2, SO2, ozone). Open-Meteo Air Quality API, free. Cache 30 min.
/api/air-qualityAQI curent + forecast 3 zile pentru lat/lon. Parametri: lat, lon (obligatorii).
curl "https://mobinapi.com/api/air-quality?lat=44.43&lon=26.10" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: myip
Detectează IP-ul caller-ului din request headers (X-Forwarded-For, X-Real-IP). Util pentru 'what's my IP' tools, debugging proxy chains.
/api/myipIP-ul tău public + headers ce caller a trimis. No-cache (per-request).
curl https://mobinapi.com/api/myip \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: trivia
Open Trivia DB — întrebări multiple-choice random. 24 categorii, 3 difficulty levels. Util pentru quiz apps, educational tools.
/api/triviaÎntrebări trivia. Parametri: amount (1-50, default 10), difficulty (easy|medium|hard), type (multiple|boolean), category (cod numeric, vezi opentdb).
curl "https://mobinapi.com/api/trivia?amount=5&difficulty=medium" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: cocktail
TheCocktailDB — rețete de cocktail-uri random cu ingrediente, instrucțiuni, imagine. Util pentru aplicații de bar / lifestyle.
/api/cocktail/randomCocktail random cu ingrediente + instrucțiuni multilingv (EN/ES/DE/FR/IT).
curl https://mobinapi.com/api/cocktail/random \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: recipe
TheMealDB — rețete de mâncare random cu ingrediente, instrucțiuni step-by-step, video YouTube. Util pentru aplicații culinare.
/api/recipe/randomRețetă random cu instrucțiuni + ingrediente + link video.
curl https://mobinapi.com/api/recipe/random \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: qr
Generator de coduri QR. Ia text/URL, returnează imagine PNG/SVG sau data URL base64. Util pentru bilete, link-uri, configurări WiFi.
/api/qrGenerează QR. Parametri: text (obligatoriu), size (64-1024, default 256), format (png/svg/json), ecc (L/M/Q/H, default M). Format json returnează data URL base64.
curl "https://mobinapi.com/api/qr?text=https://mobinapi.com&size=256" \ -H "Authorization: Bearer sk-virtual-key-xxx" \ --output qr.png
ID: dns
DNS over HTTPS via Cloudflare 1.1.1.1. Verifică A, AAAA, MX, TXT, NS, CNAME etc. Cache 5 min, fără API key upstream.
/api/dns/:domainLookup DNS pentru domeniu. Parametru type (A/AAAA/MX/TXT/NS/SOA/PTR/SRV/CAA, default A).
curl "https://mobinapi.com/api/dns/google.com?type=MX" \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: http-status
Catalog de coduri HTTP cu nume, descriere și RFC. 60+ coduri (1xx-5xx). Static, fără upstream.
/api/http-statusListează toate codurile. Parametru opțional category (informational/success/redirect/client_error/server_error).
curl "https://mobinapi.com/api/http-status?category=client_error" \ -H "Authorization: Bearer sk-virtual-key-xxx"
/api/http-status/:codeDetalii pentru un cod specific (3 cifre).
curl https://mobinapi.com/api/http-status/429 \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: iban
Validare IBAN cu lookup BIC/SWIFT. Suportă toate țările SEPA + alte 60. Cache 24h. Folosește OpenIBAN (free).
/api/iban/:ibanValidează IBAN și returnează banca, BIC, country, account number. Acceptă cu/fără spații.
curl https://mobinapi.com/api/iban/RO49AAAA1B31007593840000 \ -H "Authorization: Bearer sk-virtual-key-xxx"
ID: lorem
Text placeholder lorem ipsum. Format paragraphs/sentences/words, count 1-100, seed pentru output deterministic. Static, fără upstream.
/api/loremGenerează text. Parametri: format (paragraphs/sentences/words, default paragraphs), count (1-100, default 3), seed (opțional, pentru repeatable output).
curl "https://mobinapi.com/api/lorem?format=paragraphs&count=3&seed=42" \ -H "Authorization: Bearer sk-virtual-key-xxx"
Cum integrezi MobinApi în aplicația ta — câteva exemple în limbaje populare.
// LLM (compatibil OpenAI SDK)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-XXX",
baseURL: "https://mobinapi.com/api/llm",
});
const r = await client.chat.completions.create({
model: "claude-sonnet-4-5",
messages: [{ role: "user", content: "Salut!" }],
});
// Wikidata search
const wd = await fetch(
"https://mobinapi.com/api/wikidata/search?q=Einstein",
{ headers: { Authorization: "Bearer sk-XXX" } }
).then((r) => r.json());
// Weather Bucharest
const w = await fetch(
"https://mobinapi.com/api/weather?lat=44.43&lon=26.10",
{ headers: { Authorization: "Bearer sk-XXX" } }
).then((r) => r.json());import requests
BASE = "https://mobinapi.com"
HEADERS = {"Authorization": "Bearer sk-XXX"}
# LLM (OpenAI SDK style)
from openai import OpenAI
client = OpenAI(api_key="sk-XXX", base_url=f"{BASE}/api/llm")
r = client.chat.completions.create(
model="claude-sonnet-4-5",
messages=[{"role": "user", "content": "Salut!"}]
)
# Currency
r = requests.get(
f"{BASE}/api/currency",
params={"from": "EUR", "to": "RON", "amount": 100},
headers=HEADERS
).json()
print(r["converted"]["RON"])package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
const (
BASE = "https://mobinapi.com"
APIKEY = "sk-XXX"
)
func main() {
// LLM chat
body, _ := json.Marshal(map[string]any{
"model": "claude-haiku-4-5",
"messages": []map[string]string{
{"role": "user", "content": "Salut!"},
},
})
req, _ := http.NewRequest("POST", BASE+"/api/llm/chat/completions", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+APIKEY)
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(string(out))
// Geocode
req2, _ := http.NewRequest("GET", BASE+"/api/geo/search?q=Bucharest", nil)
req2.Header.Set("Authorization", "Bearer "+APIKEY)
res2, _ := http.DefaultClient.Do(req2)
defer res2.Body.Close()
out2, _ := io.ReadAll(res2.Body)
fmt.Println(string(out2))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }
// serde_json = "1"
// tokio = { version = "1", features = ["full"] }
use reqwest::Client;
use serde_json::json;
const BASE: &str = "https://mobinapi.com";
const APIKEY: &str = "sk-XXX";
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
// LLM
let res = client.post(format!("{}/api/llm/chat/completions", BASE))
.bearer_auth(APIKEY)
.json(&json!({
"model": "claude-haiku-4-5",
"messages": [{"role": "user", "content": "Salut!"}]
}))
.send().await?
.json::<serde_json::Value>().await?;
println!("{:#?}", res);
// Weather
let w = client.get(format!("{}/api/weather?lat=44.43&lon=26.10", BASE))
.bearer_auth(APIKEY)
.send().await?
.json::<serde_json::Value>().await?;
println!("{:#?}", w);
Ok(())
}<?php
$BASE = 'https://mobinapi.com';
$APIKEY = 'sk-XXX';
function mobinApi($method, $path, $body = null) {
global $BASE, $APIKEY;
$ch = curl_init($BASE . $path);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $APIKEY,
'Content-Type: application/json',
],
]);
if ($body !== null) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
}
$res = curl_exec($ch);
curl_close($ch);
return json_decode($res, true);
}
// LLM
$reply = mobinApi('POST', '/api/llm/chat/completions', [
'model' => 'claude-haiku-4-5',
'messages' => [['role' => 'user', 'content' => 'Salut!']],
]);
echo $reply['choices'][0]['message']['content'];
// Currency
$rate = mobinApi('GET', '/api/currency?from=EUR&to=RON&amount=100');
echo "100 EUR = " . $rate['converted']['RON'] . " RON\n";require 'net/http'
require 'json'
require 'uri'
BASE = 'https://mobinapi.com'
APIKEY = 'sk-XXX'
def mobin_api(method, path, body = nil)
uri = URI("#{BASE}#{path}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
req = case method
when :get then Net::HTTP::Get.new(uri)
when :post then Net::HTTP::Post.new(uri)
end
req['Authorization'] = "Bearer #{APIKEY}"
req['Content-Type'] = 'application/json'
req.body = body.to_json if body
JSON.parse(http.request(req).body)
end
# LLM
reply = mobin_api(:post, '/api/llm/chat/completions', {
model: 'claude-haiku-4-5',
messages: [{ role: 'user', content: 'Salut!' }]
})
puts reply['choices'][0]['message']['content']
# Wikipedia
wiki = mobin_api(:get, '/api/wikipedia/Albert_Einstein')
puts wiki['extract']// Java 11+ HttpClient (zero-dependency)
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
public class MobinApi {
static final String BASE = "https://mobinapi.com";
static final String APIKEY = "sk-XXX";
static final HttpClient client = HttpClient.newHttpClient();
public static void main(String[] args) throws Exception {
// LLM
String body = """
{
"model": "claude-haiku-4-5",
"messages": [{"role":"user","content":"Salut!"}]
}
""";
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create(BASE + "/api/llm/chat/completions"))
.header("Authorization", "Bearer " + APIKEY)
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofString(body))
.build();
HttpResponse<String> res = client.send(req, BodyHandlers.ofString());
System.out.println(res.body());
// Wikidata search
HttpRequest req2 = HttpRequest.newBuilder()
.uri(URI.create(BASE + "/api/wikidata/search?q=Einstein"))
.header("Authorization", "Bearer " + APIKEY)
.GET()
.build();
System.out.println(client.send(req2, BodyHandlers.ofString()).body());
}
}# 1. Catalog public
curl https://mobinapi.com/api/services
# 2. LLM
curl -X POST https://mobinapi.com/api/llm/chat/completions \
-H "Authorization: Bearer sk-XXX" \
-H "Content-Type: application/json" \
-d '{"model":"claude-haiku-4-5","messages":[{"role":"user","content":"hi"}]}'
# 3. Wikidata
curl "https://mobinapi.com/api/wikidata/search?q=Einstein" \
-H "Authorization: Bearer sk-XXX"
# 4. Geo
curl "https://mobinapi.com/api/geo/search?q=Bucharest" \
-H "Authorization: Bearer sk-XXX"
# 5. Weather
curl "https://mobinapi.com/api/weather?lat=44.43&lon=26.10" \
-H "Authorization: Bearer sk-XXX"
# 6. Currency
curl "https://mobinapi.com/api/currency?from=EUR&to=RON" \
-H "Authorization: Bearer sk-XXX"
# 7. IP geolocation
curl "https://mobinapi.com/api/ip/8.8.8.8" \
-H "Authorization: Bearer sk-XXX"Combinații de servicii pentru aplicații concrete. Copy-paste, înlocuiește cheia, rulează.
Conversație cu memorie folosind Claude prin proxy compatibil OpenAI SDK.
import OpenAI from "openai";
const ai = new OpenAI({ apiKey: "sk-XXX", baseURL: "https://mobinapi.com/api/llm" });
const history = [{ role: "system", content: "Ești asistent prietenos." }];
async function chat(msg) {
history.push({ role: "user", content: msg });
const r = await ai.chat.completions.create({
model: "claude-haiku-4-5", messages: history
});
const reply = r.choices[0].message.content;
history.push({ role: "assistant", content: reply });
return reply;
}
console.log(await chat("Salut!"));
console.log(await chat("Mai zi-mi ceva."));Geocodează adresa, ia weather forecast, întreabă AI ce să porți.
const KEY = "sk-XXX";
const headers = { Authorization: `Bearer ${KEY}` };
// 1. Address → lat/lon
const geo = await fetch(
"https://mobinapi.com/api/geo/search?q=Strada+Lipscani+Bucuresti",
{ headers }
).then(r => r.json());
const { lat, lon } = geo.data[0];
// 2. Weather forecast 3 zile
const w = await fetch(
`https://mobinapi.com/api/weather?lat=${lat}&lon=${lon}&days=3`,
{ headers }
).then(r => r.json());
// 3. Sfat AI bazat pe forecast
const advice = await fetch("https://mobinapi.com/api/llm/chat/completions", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
model: "claude-haiku-4-5",
messages: [{
role: "user",
content: `Forecast: ${JSON.stringify(w.daily)}. Ce să port mâine?`
}]
})
}).then(r => r.json());
console.log(advice.choices[0].message.content);Caută un subiect pe Wikipedia + papers arXiv recente, sumarizează cu AI.
const KEY = "sk-XXX";
const headers = { Authorization: `Bearer ${KEY}` };
const TOPIC = "transformers architecture";
const [wiki, arxiv] = await Promise.all([
fetch(`https://mobinapi.com/api/wikipedia/${encodeURIComponent("Transformer (machine learning model)")}`, { headers }).then(r => r.json()),
fetch(`https://mobinapi.com/api/arxiv/search?q=${encodeURIComponent(TOPIC)}&max=5`, { headers }).then(r => r.json()),
]);
const summary = await fetch("https://mobinapi.com/api/llm/chat/completions", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
model: "claude-sonnet-4-5",
messages: [{
role: "user",
content: `Wikipedia: ${wiki.extract}\n\narXiv papers: ${
arxiv.entries.map(e => e.title).join("; ")
}\n\nDă-mi un brief de 5 puncte despre subiect.`
}]
})
}).then(r => r.json());
console.log(summary.choices[0].message.content);Preț crypto + conversie în RON folosind currency API.
const KEY = "sk-XXX";
const headers = { Authorization: `Bearer ${KEY}` };
const PORTFOLIO = [
{ coin: "bitcoin", amount: 0.5 },
{ coin: "ethereum", amount: 3.2 },
{ coin: "solana", amount: 50 },
];
let totalUSD = 0;
for (const { coin, amount } of PORTFOLIO) {
const p = await fetch(`https://mobinapi.com/api/crypto/${coin}?vs=usd`, { headers }).then(r => r.json());
const value = p[coin].usd * amount;
totalUSD += value;
console.log(`${coin}: ${amount} × $${p[coin].usd} = $${value.toFixed(2)}`);
}
const fx = await fetch(
`https://mobinapi.com/api/currency?from=USD&to=RON&amount=${totalUSD}`,
{ headers }
).then(r => r.json());
console.log(`Total: $${totalUSD.toFixed(2)} = ${fx.converted.RON.toFixed(2)} RON`);Verifică stele/forks pe un repo + AI rezumat README.
const KEY = "sk-XXX";
const headers = { Authorization: `Bearer ${KEY}` };
const repo = await fetch(
"https://mobinapi.com/api/github/repo/vercel/next.js",
{ headers }
).then(r => r.json());
console.log(`⭐ ${repo.stargazers_count} stars`);
console.log(`🍴 ${repo.forks_count} forks`);
console.log(`📝 ${repo.description}`);
// Întreabă AI ce-l face popular
const why = await fetch("https://mobinapi.com/api/llm/chat/completions", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
model: "claude-haiku-4-5",
messages: [{
role: "user",
content: `${repo.full_name} are ${repo.stargazers_count} stele. Description: "${repo.description}". Spune în 3 puncte de ce e popular.`
}]
})
}).then(r => r.json());
console.log(why.choices[0].message.content);Caută o întrebare pe Stack Overflow, dă răspunsul prin AI dacă nu e clar.
const KEY = "sk-XXX";
const headers = { Authorization: `Bearer ${KEY}` };
const so = await fetch(
"https://mobinapi.com/api/stackoverflow/search?q=async+await+vs+promises&pagesize=3",
{ headers }
).then(r => r.json());
const top = so.items[0];
console.log(`📌 ${top.title} (${top.score} votes)`);
// AI rezumă cele 3 răspunsuri și-l explică simplu
const explain = await fetch("https://mobinapi.com/api/llm/chat/completions", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
model: "claude-sonnet-4-5",
messages: [{
role: "user",
content: `Top 3 întrebări SO: ${
so.items.map(i => i.title).join("; ")
}. Explică pe scurt diferența între async/await și promises.`
}]
})
}).then(r => r.json());
console.log(explain.choices[0].message.content);LLM ca translator între limbi cu detecție automată.
const KEY = "sk-XXX";
async function translate(text, targetLang) {
const r = await fetch("https://mobinapi.com/api/llm/chat/completions", {
method: "POST",
headers: {
Authorization: `Bearer ${KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "claude-haiku-4-5",
messages: [
{ role: "system", content: `Translate to ${targetLang}. Output ONLY translation, no commentary.` },
{ role: "user", content: text }
],
temperature: 0.1
})
}).then(r => r.json());
return r.choices[0].message.content;
}
console.log(await translate("Salut, ce mai faci?", "English"));
console.log(await translate("Hello, how are you?", "Japanese"));
console.log(await translate("Bonjour", "Korean"));Imaginea zilei de la NASA + poem generat de AI inspirat de ea.
const KEY = "sk-XXX";
const headers = { Authorization: `Bearer ${KEY}` };
const apod = await fetch("https://mobinapi.com/api/nasa/apod", { headers }).then(r => r.json());
console.log(`📸 ${apod.title} — ${apod.url}`);
const poem = await fetch("https://mobinapi.com/api/llm/chat/completions", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
model: "claude-sonnet-4-5",
messages: [{
role: "user",
content: `NASA APOD title: "${apod.title}". Description: "${apod.explanation.slice(0, 500)}". Scrie un poem scurt în română (4 strofe) inspirat de această imagine cosmică.`
}],
temperature: 0.9
})
}).then(r => r.json());
console.log(poem.choices[0].message.content);Lookup carte după ISBN + AI sugerează 3 cărți similare.
const KEY = "sk-XXX";
const headers = { Authorization: `Bearer ${KEY}` };
const book = await fetch(
"https://mobinapi.com/api/openlibrary/isbn/9780132350884",
{ headers }
).then(r => r.json());
console.log(`📕 ${book.title} — ${book.authors?.[0]?.name}`);
const recs = await fetch("https://mobinapi.com/api/llm/chat/completions", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
model: "claude-haiku-4-5",
messages: [{
role: "user",
content: `Cititorul a citit "${book.title}" de ${book.authors?.[0]?.name}. Recomandă 3 cărți similare cu ISBN și motivul recomandării.`
}]
})
}).then(r => r.json());
console.log(recs.choices[0].message.content);Configurați webhook-uri pentru evenimente cheie (buget atins, rată erori, blocare cheie). Fiecare delivery este semnat HMAC-SHA256 cu secret-ul tău. Verifică semnătura înainte să accepți payload-ul.
Content-Type: application/json User-Agent: MobinApi-Webhooks/1.0 X-MobinApi-Event: budget_threshold # tipul evenimentului X-MobinApi-Signature: sha256=<hex> # HMAC-SHA256 al body-ului X-MobinApi-Attempt: 1 # 1..4 (retries cu exponential backoff)
{
"event": "budget_threshold",
"timestamp": "2026-05-08T12:34:56.000Z",
"key_token_prefix": "sk-virtual-x",
"message": "Workspace key reached 80% of monthly budget",
"current_spend": 80.50,
"max_budget": 100.00
}import crypto from "node:crypto";
export function verifyMobinApiSignature(
body: string,
signature: string | null,
secret: string
): boolean {
if (!signature || !signature.startsWith("sha256=")) return false;
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
// Constant-time compare ca să eviți timing attacks
const provided = signature.slice("sha256=".length);
if (provided.length !== expected.length) return false;
return crypto.timingSafeEqual(
Buffer.from(provided),
Buffer.from(expected)
);
}
// În handler-ul tău Express/Fastify:
app.post("/webhooks/mobinapi", async (req, res) => {
const signature = req.headers["x-mobinapi-signature"];
const rawBody = req.rawBody; // sau JSON.stringify(req.body) dacă nu ai raw
if (!verifyMobinApiSignature(rawBody, signature, process.env.WEBHOOK_SECRET)) {
return res.status(401).send("Invalid signature");
}
const event = JSON.parse(rawBody);
console.log("Verified event:", event.event, event.message);
res.status(200).send("OK");
});import hmac
import hashlib
def verify_signature(body: bytes, signature: str | None, secret: str) -> bool:
if not signature or not signature.startswith("sha256="):
return False
expected = hmac.new(
secret.encode(), body, hashlib.sha256
).hexdigest()
provided = signature[len("sha256="):]
return hmac.compare_digest(provided, expected)
# În FastAPI:
from fastapi import FastAPI, Request, HTTPException
app = FastAPI()
@app.post("/webhooks/mobinapi")
async def mobinapi_webhook(request: Request):
body = await request.body()
signature = request.headers.get("x-mobinapi-signature")
if not verify_signature(body, signature, os.environ["WEBHOOK_SECRET"]):
raise HTTPException(401, "Invalid signature")
event = json.loads(body)
print(f"Verified: {event['event']} — {event['message']}")
return {"ok": True}Backoff exponential: dacă endpoint-ul tău returnează 5xx sau timeout, încercăm până la 4 ori cu pauze 1s, 4s, 16s.
NU retry pe: 2xx (success) sau 4xx (client error — bad URL, auth issue în cod-ul tău).
Idempotență: folosește combinația event + timestamp ca dedup key — același eveniment poate veni de mai multe ori dacă prima livrare a eșuat dar serverul tău chiar a procesat-o.
Header X-MobinApi-Attempt: tracking client-side cât de des ratezi (1 = primul attempt, 4 = ultimul retry).
Cum se poziționează MobinApi față de competitorii din spațiul AI gateway și utility API marketplace.
| Caracteristică | MobinApi | OpenRouter | RapidAPI | Helicone |
|---|---|---|---|---|
| Modele AI (LLM) | ✓ Claude/GPT/Grok/Gemini | ✓ 290+ modele | ✓ via providers | ✓ orice OpenAI-compat |
| Utility APIs (geo, weather, etc.) | ✓ 26 servicii integrate | ✗ doar AI | ✓ marketplace fragmentat | ✗ doar AI |
| O cheie pentru tot | ✓ | ✓ doar pe AI | ✗ key per API | ✓ doar pe AI |
| OpenAPI + Postman auto-generate | ✓ /api/openapi.json + /api/postman.json | ✗ | ≈ per API | ✗ |
| Public docs | ✓ /docs branded | ✓ | ✓ marketplace | ✓ |
| Public status page | ✓ /status real-time ping | ≈ status pages provider-specific | ≈ | ✓ |
| Webhooks (HMAC signed) | ✓ exponential retry + dead letter | ✗ | ≈ per API | ✓ |
| Per-key permissions (ACL) | ✓ allowed_services array | ✓ per model | ✗ | ≈ teams |
| Custom rate limits per cheie | ✓ TPM/RPM + req/zi/lună | ≈ per credit balance | ≈ per plan | ≈ per project |
| Cost forecast + analytics | ✓ heatmap + retention + forecast | ✓ usage dashboard | ≈ basic | ✓ deep analytics |
| Pricing | Free (open architecture) | No markup pe AI | $$$ subscription per API | Free tier + paid |
| Self-hostable | ✓ Next.js + Postgres | ✗ | ✗ | ✓ open source |
Notă onestă: OpenRouter și Helicone sunt produse mature cu echipe dedicate; MobinApi e single-developer build, dar combină AI gateway + utility APIs sub aceeași cheie — un caz unic în piață. RapidAPI e un marketplace cu 10.000+ API-uri, dar fragmentat (subscription separat per API).
Tu deja folosești OpenRouter / RapidAPI / direct provider APIs? Iată cum migrezi în câteva linii.
// Înainte (OpenRouter):
import OpenAI from "openai";
const openrouter = new OpenAI({
apiKey: "sk-or-v1-...",
baseURL: "https://openrouter.ai/api/v1",
});
// După (MobinApi):
const mobinapi = new OpenAI({
apiKey: "sk-virtual-key-xxx",
baseURL: "https://mobinapi.com/api/llm", // ← single change
});
// Apoi:
const r = await mobinapi.chat.completions.create({
model: "claude-sonnet-4-5", // sau "gpt-4o", "grok-2", etc.
messages: [{ role: "user", content: "Salut!" }],
});Compatibilitate 100% OpenAI SDK — același cod funcționează.
// Înainte: chei separate pentru fiecare provider
const anthropic = new Anthropic({ apiKey: "sk-ant-..." });
const openai = new OpenAI({ apiKey: "sk-..." });
const xai = ...;
// Plus: chei separate pentru utility APIs
const weather = await fetch("https://api.openweathermap.org/...");
const geocode = await fetch("https://api.opencagedata.com/...");
// ...etc
// După: o singură cheie MobinApi pentru TOATE
const KEY = "sk-virtual-key-xxx";
const headers = { Authorization: `Bearer ${KEY}` };
const ai = new OpenAI({ apiKey: KEY, baseURL: "https://mobinapi.com/api/llm" });
const w = await fetch("https://mobinapi.com/api/weather?lat=44.43&lon=26.10", { headers });
const geo = await fetch("https://mobinapi.com/api/geo/search?q=Bucharest", { headers });
const wiki = await fetch("https://mobinapi.com/api/wikipedia/Albert_Einstein", { headers });
// ...
// O cheie, audit unificat, billing unificat, rate limits unificate.// RapidAPI requires X-RapidAPI-Host + X-RapidAPI-Key per API
// MobinApi: o singură cheie, header standard
// Înainte (RapidAPI):
fetch("https://wikidata-search.p.rapidapi.com/search", {
headers: {
"X-RapidAPI-Key": "...",
"X-RapidAPI-Host": "wikidata-search.p.rapidapi.com"
}
});
// După (MobinApi):
fetch("https://mobinapi.com/api/wikidata/search?q=Einstein", {
headers: { Authorization: "Bearer sk-virtual-key-xxx" }
});Avantaj: nu mai gestionezi N chei + audit unificat. Limitare actuală: catalog mai mic decât 10k+ API-uri RapidAPI.
Pentru explorare interactivă sau pentru a importa toate endpoint-urile într-un client REST, folosește spec-ul OpenAPI sau colecția Postman.
Importă în Swagger UI, Insomnia, Stoplight, Redoc.
Toate endpoint-urile gata configurate. Setează variabila api_key.