Beta — în dezvoltare activă

Un singur API.
Toate serviciile pe care le folosești.

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.

40 servicii · 46 endpoint-uri active
Deschide API Explorer

Cum obții o cheie

Pentru moment cheile se generează exclusiv prin admin (self-serve urmează). Contactează administratorul ca să primești o cheie de tip sk-xxx.

1

Primești cheia

O cheie sk-... unică, cu acces la modelele și serviciile permise.

2

Faci primul request

curl -H "Authorization: Bearer sk-..." https://mobinapi.com/api/services

3

Integrezi în app

Compatibil OpenAI SDK pentru LLM. REST clasic pentru restul.

Test rapid (catalog public)

curl https://mobinapi.com/api/services

Catalog complet, nu cere autentificare.

Test cu cheie (LLM — Claude)

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.

Servicii disponibile

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).

LLM Chat Completions

ID: llm

AI

Modele de limbaj prin proxy MobinApi (Claude, GPT, Grok și altele). Format compatibil OpenAI.

POST
/api/llm/chat/completions

Trimite 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!"}]
  }'

Wikidata

ID: wikidata

Data

Knowledge graph public — caută entități, rulează SPARQL, obține detalii pentru un Q-ID. Cache automat.

GET
/api/wikidata/search

Caută 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"
POST
/api/wikidata/sparql

Rulează 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"}'
GET
/api/wikidata/entity/:qid

Detalii 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"

Geocoding (OpenStreetMap)

ID: geo

Geo

Conversie adresă ↔ coordonate prin Nominatim. Gratis și nelimitat, cache 24h.

GET
/api/geo/search

Caută 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"
GET
/api/geo/reverse

Conversie 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"

Weather (Open-Meteo)

ID: weather

Weather

Date meteo curente + forecast 16 zile. Gratis, fără API key extern, cache 10 min.

GET
/api/weather

Vremea 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"

Countries (REST Countries)

ID: countries

Data

Informații complete despre țări: populație, monedă, drapel, limbi, fus orar, etc. Cache 7 zile.

GET
/api/countries/:code

Detalii 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"

Public Holidays

ID: holidays

Data

Sărbători legale per țară și an, prin Nager.Date. Util pentru calendar / scheduling. Cache 30 zile.

GET
/api/holidays/:country/:year

Să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"

Currency Exchange (ECB)

ID: currency

Finance

Rate de schimb oficiale BCE. Conversie + istoric pe interval. Cache 1h / 24h.

GET
/api/currency

Rate 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"
GET
/api/currency/history

Istoric 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"

IP Geolocation

ID: ip

Data

Detalii despre o adresă IP: țară, oraș, ISP, fus orar, coordonate. Util pentru analytics + fraud check.

GET
/api/ip/:address

Locaț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"

Quotes

ID: quote

Fun

Citate celebre random. Util pentru loading screens, daily inspiration, content fillers.

GET
/api/quote

Returnează un citat random (autor + text).

curl https://mobinapi.com/api/quote \
  -H "Authorization: Bearer sk-virtual-key-xxx"

Random Facts

ID: fact

Fun

Fapte aleatorii (Useless Facts API). Util pentru content fillers, trivia bots, daily emails.

GET
/api/fact

Returnează un fapt random. Parametru opțional: lang (en|de, default en).

curl https://mobinapi.com/api/fact \
  -H "Authorization: Bearer sk-virtual-key-xxx"

Dictionary

ID: dictionary

Data

Definiții, pronunție, sinonime și exemple pentru cuvinte (DictionaryAPI.dev). Cache 30 zile.

GET
/api/dictionary/:word

Definiț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"

Crypto Prices

ID: crypto

Finance

Preț crypto live + market cap + variație 24h (CoinGecko free). Cache 60s.

GET
/api/crypto/:coin

Preț 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"

Hacker News

ID: hackernews

Data

Căutare în Hacker News (Algolia). Util pentru tech monitoring + tendințe. Cache 5 min.

GET
/api/hackernews/search

Că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"

Cat Facts

ID: catfact

Fun

Fapte random despre pisici (catfact.ninja). Util pentru content fillers.

GET
/api/catfact

Returnează un fapt random despre pisici.

curl https://mobinapi.com/api/catfact \
  -H "Authorization: Bearer sk-virtual-key-xxx"

Dog Images

ID: dogimage

Fun

Imagini random cu câini (dog.ceo). Suport pentru rasă specifică.

GET
/api/dogimage

Imagine random. Parametru opțional: breed (ex: husky, beagle, labrador).

curl "https://mobinapi.com/api/dogimage?breed=husky" \
  -H "Authorization: Bearer sk-virtual-key-xxx"

Jokes

ID: joke

Fun

Glume random (JokeAPI). Safe-mode activ implicit, configurable.

GET
/api/joke

Glumă 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"

Advice

ID: advice

Fun

Sfaturi random (adviceslip.com). Util pentru loading screens, daily quotes.

GET
/api/advice

Returnează un sfat random.

curl https://mobinapi.com/api/advice \
  -H "Authorization: Bearer sk-virtual-key-xxx"

Random User

ID: randomuser

Data

Generator utilizatori falși realiști (randomuser.me). Util pentru testing, seeding, mockups.

GET
/api/randomuser

Generează 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"

Pokémon

ID: pokemon

Fun

Date complete despre orice Pokémon (PokeAPI). Cache 24h.

GET
/api/pokemon/:name

Detalii pentru un Pokémon (lowercase, ex: pikachu, charizard).

curl https://mobinapi.com/api/pokemon/pikachu \
  -H "Authorization: Bearer sk-virtual-key-xxx"

Wikipedia Summary

ID: wikipedia

Data

Rezumat + thumbnail + extract pentru un articol Wikipedia (REST API oficial). Cache 1h.

GET
/api/wikipedia/:title

Rezumat 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"

GitHub Public

ID: github

Data

Date publice GitHub: detalii repo (stele, fork-uri, limbaj, licență), profil utilizator. Cache 10-30 min.

GET
/api/github/repo/:owner/:name

Detalii repo GitHub. Cache 10 min.

curl https://mobinapi.com/api/github/repo/vercel/next.js \
  -H "Authorization: Bearer sk-virtual-key-xxx"
GET
/api/github/user/:username

Profil 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"

NPM Registry

ID: npm

Data

Date pachet npm: versiuni, dependencies, downloads, autori, repository. Cache 1h.

GET
/api/npm/package/:name

Detalii pachet npm. Suportă scoped packages (encode @scope/name).

curl https://mobinapi.com/api/npm/package/react \
  -H "Authorization: Bearer sk-virtual-key-xxx"

NASA APOD

ID: nasa

Fun

Astronomy Picture of the Day — imagine + explicație științifică, zilnic. Cache 6h.

GET
/api/nasa/apod

APOD 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"

Stack Overflow Search

ID: stackoverflow

Data

Căutare în Stack Overflow (Stack Exchange API). Util pentru documentation + Q&A. Cache 5 min.

GET
/api/stackoverflow/search

Că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"

arXiv Papers

ID: arxiv

Data

Căutare papers academice arXiv (CS, math, physics, etc.). Util pentru research. Cache 1h.

GET
/api/arxiv/search

Că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"

Open Library

ID: openlibrary

Data

Lookup carte după ISBN — titlu, autori, publisher, copertă, descriere. Cache 30 zile.

GET
/api/openlibrary/isbn/:isbn

Detalii 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"

Word Relations

ID: words

Data

Datamuse — sinonime, antonime, rime, cuvinte similare. Util pentru NLP, content tools, jocuri. Cache 7 zile.

GET
/api/words/:word

Relaț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"

World Bank Indicators

ID: worldbank

Finance

Date economice oficiale Banca Mondială: GDP, populație, inflație. 1500+ indicatori, 200+ țări, istoric 60 ani. Cache 24h.

GET
/api/worldbank/:country/:indicator

Indicator 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"

ISS Tracker

ID: iss

Fun

Poziție live a Stației Spațiale Internaționale (Open Notify). Lat/lon real-time + numărul astronauților curent în spațiu.

GET
/api/iss

Poziț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"

World Time

ID: time

Data

Timp curent + DST info pentru orice fus orar IANA. WorldTimeAPI. Util pentru aplicații multi-region.

GET
/api/time/:zone

Timp 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"

Air Quality

ID: air-quality

Weather

Calitate aer (AQI european + US, PM2.5, PM10, NO2, SO2, ozone). Open-Meteo Air Quality API, free. Cache 30 min.

GET
/api/air-quality

AQI 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"

My IP

ID: myip

Data

Detectează IP-ul caller-ului din request headers (X-Forwarded-For, X-Real-IP). Util pentru 'what's my IP' tools, debugging proxy chains.

GET
/api/myip

IP-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"

Trivia Questions

ID: trivia

Fun

Open Trivia DB — întrebări multiple-choice random. 24 categorii, 3 difficulty levels. Util pentru quiz apps, educational tools.

GET
/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"

Cocktail Recipes

ID: cocktail

Fun

TheCocktailDB — rețete de cocktail-uri random cu ingrediente, instrucțiuni, imagine. Util pentru aplicații de bar / lifestyle.

GET
/api/cocktail/random

Cocktail 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"

Food Recipes

ID: recipe

Fun

TheMealDB — rețete de mâncare random cu ingrediente, instrucțiuni step-by-step, video YouTube. Util pentru aplicații culinare.

GET
/api/recipe/random

Rețetă random cu instrucțiuni + ingrediente + link video.

curl https://mobinapi.com/api/recipe/random \
  -H "Authorization: Bearer sk-virtual-key-xxx"

QR Code Generator

ID: qr

Data

Generator de coduri QR. Ia text/URL, returnează imagine PNG/SVG sau data URL base64. Util pentru bilete, link-uri, configurări WiFi.

GET
/api/qr

Generează 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

DNS Lookup

ID: dns

Data

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.

GET
/api/dns/:domain

Lookup 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"

HTTP Status Codes

ID: http-status

Data

Catalog de coduri HTTP cu nume, descriere și RFC. 60+ coduri (1xx-5xx). Static, fără upstream.

GET
/api/http-status

Listează 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"
GET
/api/http-status/:code

Detalii pentru un cod specific (3 cifre).

curl https://mobinapi.com/api/http-status/429 \
  -H "Authorization: Bearer sk-virtual-key-xxx"

IBAN Validator

ID: iban

Finance

Validare IBAN cu lookup BIC/SWIFT. Suportă toate țările SEPA + alte 60. Cache 24h. Folosește OpenIBAN (free).

GET
/api/iban/:iban

Validează 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"

Lorem Ipsum Generator

ID: lorem

Fun

Text placeholder lorem ipsum. Format paragraphs/sentences/words, count 1-100, seed pentru output deterministic. Static, fără upstream.

GET
/api/lorem

Generează 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"

Code samples

Cum integrezi MobinApi în aplicația ta — câteva exemple în limbaje populare.

JavaScript / TypeScript

// 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());

Python

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"])

Go

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))
}

Rust

// 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

<?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";

Ruby

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

// 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());
    }
}

cURL — toate într-un loc

# 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"

Rețete — cod gata pentru cazuri reale

Combinații de servicii pentru aplicații concrete. Copy-paste, înlocuiește cheia, rulează.

🤖 Chatbot multi-turn (10 linii)

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."));

🌍 Vremea + sfat AI pentru locația mea

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);

📚 Research auto: Wikipedia + arXiv

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);

💰 Crypto portfolio cu valori live

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`);

📦 GitHub trending check

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);

🔍 Stack Overflow → AI explainer

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);

🌐 Multi-language translator

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"));

🎨 NASA APOD → AI poetry

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);

📖 ISBN → book recommendation engine

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);

Webhooks — verificare semnătură

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.

Headers pe care le primești

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)

Payload format

{
  "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
}

Verificare în Node.js / TypeScript

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");
});

Verificare în Python

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}

Retry behavior

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).

MobinApi vs alternative

Cum se poziționează MobinApi față de competitorii din spațiul AI gateway și utility API marketplace.

CaracteristicăMobinApiOpenRouterRapidAPIHelicone
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
PricingFree (open architecture)No markup pe AI$$$ subscription per APIFree 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).

Migrare de la alte gateway-uri

Tu deja folosești OpenRouter / RapidAPI / direct provider APIs? Iată cum migrezi în câteva linii.

De la OpenRouter

// Î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ă.

De la direct providers

// Î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.

De la RapidAPI

// 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.

Integrare în uneltele tale

Pentru explorare interactivă sau pentru a importa toate endpoint-urile într-un client REST, folosește spec-ul OpenAPI sau colecția Postman.

OpenAPI 3.0

Importă în Swagger UI, Insomnia, Stoplight, Redoc.

openapi.json

Postman Collection

Toate endpoint-urile gata configurate. Setează variabila api_key.

MobinApi.postman_collection.json