Una API REST pública y gratuita para buscar, consultar e insertar las fuentes de nuestra biblioteca de código abierto. Compatible con la sintaxis de Google Fonts CSS2: añade una etiqueta <link> y listo.

<!-- Embed a font in your page -->
<link rel="stylesheet" href="https://jinero.online/api/v1/fonts/css?family=Inter:wght@400,700&display=swap">

<style>
  body { font-family: "Inter", system-ui, sans-serif; }
</style>
// Search fonts
const r = await fetch("https://jinero.online/api/v1/fonts?name=mono&per_page=10");
const { data } = await r.json();
console.log(data.map(f => f.name));

Todos los endpoints de lectura son públicos: no se necesita clave. Las solicitudes sin autenticar están limitadas a 60 solicitudes por minuto por IP. Las solicitudes autenticadas tienen 600 solicitudes/min. Genera un token en tu página de perfil (inicia sesión primero): allí puedes verlo y copiarlo en cualquier momento, y el mismo token sirve para la API, el servidor MCP, la extensión para Chrome y el plugin para Figma. Envíalo como token Authorization Bearer o en la cabecera X-API-Token.

# Public — no auth, 60 rpm per IP
curl https://jinero.online/api/v1/fonts?name=inter

# X-API-Token header — 600 rpm
curl -H "X-API-Token: YOUR_TOKEN" https://jinero.online/api/v1/user

# Bearer (also accepted)
curl -H "Authorization: Bearer YOUR_TOKEN" https://jinero.online/api/v1/user
// Same token, fetch from the browser
const r = await fetch("https://jinero.online/api/v1/user", {
  headers: { "X-API-Token": "YOUR_TOKEN" },
});
const me = await r.json();
$user = Http::withHeaders(['X-API-Token' => env('JINERO_API_TOKEN')])
    ->get("https://jinero.online/api/v1/user")
    ->json();

Lista paginada y filtrable de familias de fuentes. Úsala para un cuadro de búsqueda, un selector de fuentes o para obtener metadatos en bloque.

GET https://jinero.online/api/v1/fonts
ParámetroTipoDescripción
name string Busca una subcadena en el nombre de la familia (sin distinguir mayúsculas y minúsculas).
category string|csv Filtra por categoría: sans, serif, display, slab, mono.
langs csv Subconjuntos de idioma obligatorios, p. ej. latin,cyrillic.
style csv Etiquetas de estilo obligatorias (deben coincidir TODAS): handwriting, script, display, slab, rounded, condensed, expanded, stencil, pixel, blackletter, outline, retro.
variable boolean Solo fuentes variables si es true.
monospace boolean Solo fuentes monoespaciadas si es true.
styles_min integer Número mínimo de grosores/estilos.
styles_max integer Número máximo de grosores/estilos.
order string likes (predeterminado), downloads, views, name, created_at.
sort string asc o desc (predeterminado: desc).
per_page integer Tamaño de página (máximo 100, predeterminado: 48).
page integer Número de página (empieza en 1).
curl "https://jinero.online/api/v1/fonts?name=mono&variable=true&per_page=5"
const params = new URLSearchParams({
  name: "mono",
  variable: "true",
  per_page: "5",
});
const r = await fetch(`https://jinero.online/api/v1/fonts?${params}`);
const { data, total } = await r.json();
$r = Http::get("https://jinero.online/api/v1/fonts", [
    "name" => "mono",
    "variable" => "true",
    "per_page" => 5,
]);
$data = $r->json("data");
Ejemplo de respuesta
{
  "current_page": 1,
  "per_page": 5,
  "total": 23,
  "data": [
    {
      "id": 142,
      "name": "JetBrains Mono",
      "slug": "jetbrains-mono",
      "category": "monospace",
      "variable": true,
      "langs": ["latin","cyrillic"],
      "style_tags": [{ "slug": "slab", "label": "Slab Serif" }],
      "styles_count": 16,
      "downloads": 4821,
      "regular_url": "/storage/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2"
    }
  ]
}

Metadatos completos de una sola familia de fuentes: cada grosor, cada cursiva, la URL de cada archivo. También devuelve URL listas para download/files/css.

GET https://jinero.online/api/v1/fonts/{slug}
curl https://jinero.online/api/v1/fonts/inter
const r = await fetch("https://jinero.online/api/v1/fonts/inter");
const family = await r.json();
console.log(family.fonts);
$family = Http::get("https://jinero.online/api/v1/fonts/inter")->json();
Ejemplo de respuesta
{
  "name": "Inter",
  "slug": "inter",
  "category": "sans",
  "designer": "Rasmus Andersson",
  "license": "OFL",
  "variable": true,
  "styles_count": 18,
  "download_url": "https://jinero.online/api/v1/fonts/inter/download",
  "files_url": "https://jinero.online/api/v1/fonts/inter/files",
  "css_url": "https://jinero.online/api/v1/fonts/css?family=inter",
  "fonts": [
    {
      "weight": 400,
      "italic": false,
      "style_name": "Regular",
      "files": [
        { "format": "woff2", "url": "/storage/fonts/inter/Inter-Regular.woff2", "size": 96241 }
      ]
    }
  ]
}

Lista plana de todos los archivos de fuente de una familia: útil cuando necesitas URL directas para tus propias reglas @font-face.

GET https://jinero.online/api/v1/fonts/{slug}/files
curl https://jinero.online/api/v1/fonts/inter/files
const r = await fetch("https://jinero.online/api/v1/fonts/inter/files");
const { files } = await r.json();
Ejemplo de respuesta
{
  "family": "Inter",
  "slug": "inter",
  "files": [
    { "weight": 400, "italic": false, "style": "Regular", "format": "woff2", "url": "/storage/fonts/inter/Inter-Regular.woff2", "size": 96241 },
    { "weight": 700, "italic": false, "style": "Bold", "format": "woff2", "url": "/storage/fonts/inter/Inter-Bold.woff2", "size": 99812 }
  ]
}

Devuelve un archivo ZIP con todos los archivos WOFF2 y un fonts.css listo para usar. Úsalo cuando quieras alojar la familia en tu propio servidor.

GET https://jinero.online/api/v1/fonts/{slug}/download
curl -L -o inter.zip https://jinero.online/api/v1/fonts/inter/download
// Trigger a browser download
window.location.href = "https://jinero.online/api/v1/fonts/inter/download";

Sustituto directo de la API CSS2 de Google Fonts. Carga reglas @font-face que apuntan a nuestros archivos woff2 alojados. Sintaxis idéntica: los mismos especificadores family/weight/italic.

GET https://jinero.online/api/v1/fonts/css
ParámetroTipoDescripción
family string Slug de la familia, opcionalmente seguido de los ejes. Repítelo para varias familias.
display string Valor CSS de font-display: swap (predeterminado), auto, block, fallback, optional.
<!-- Simplest form: regular weight only -->
<link rel="stylesheet" href="https://jinero.online/api/v1/fonts/css?family=inter">

<!-- Specific weights -->
<link rel="stylesheet" href="https://jinero.online/api/v1/fonts/css?family=inter:wght@400,500,700&display=swap">

<!-- Italic + weight tuples (Google syntax) -->
<link rel="stylesheet" href="https://jinero.online/api/v1/fonts/css?family=inter:ital,wght@0,400;1,400;0,700">

<!-- Multiple families -->
<link rel="stylesheet" href="https://jinero.online/api/v1/fonts/css?family=inter:wght@400,700&family=jetbrains-mono:wght@400">
/* Returned content */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://jinero.online/storage/fonts/inter/Inter-Regular.woff2') format('woff2');
}

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://jinero.online/storage/fonts/inter/Inter-Bold.woff2') format('woff2');
}
Pruébalo en vivo Escribe el slug de una familia y cárgala con el endpoint CSS
Fabio me exige, sin tapujos, que añada cerveza al whisky — 0123456789
—

Identifica qué fuente aparece en una imagen recortada de texto. Funciona con un modelo de embeddings CNN entrenado que compara las fuentes por su forma y estilo visual: no necesita texto ni OCR, solo sube un recorte ajustado del texto. Funciona con los alfabetos latino y cirílico. Para obtener los mejores resultados, recorta ajustándote a una sola línea de texto.

POST https://jinero.online/api/v1/fonts/recognize
ParámetroTipoDescripción
image archivo (multipart) Recorte ajustado del texto. jpg/jpeg/png/webp/bmp, máximo 8 MB.
top_k integer Número de coincidencias que se devuelven. 3–20, predeterminado: 8.
curl -X POST https://jinero.online/api/v1/fonts/recognize \
  -F "[email protected]" \
  -F "top_k=5"
const form = new FormData();
form.append("image", file);   // a tight crop of the text — no text needed
form.append("top_k", "5");

const r = await fetch("https://jinero.online/api/v1/fonts/recognize", { method: "POST", body: form });
const { recognition } = await r.json();
// recognition.matches: [{ slug, name, score, ... }]
$res = Http::attach(
    "image",
    file_get_contents("crop.png"),
    "crop.png"
)->post("https://jinero.online/api/v1/fonts/recognize", [
    "top_k" => 5,
]);
$matches = $res->json("recognition.matches");
Ejemplo de respuesta
{
  "success": true,
  "top_k": 5,
  "recognition": {
    "matches": [
      { "slug": "inter",            "name": "Inter",            "score": 0.92, "category": "sans" },
      { "slug": "manrope",          "name": "Manrope",          "score": 0.88, "category": "sans" },
      { "slug": "plus-jakarta-sans","name": "Plus Jakarta Sans","score": 0.85, "category": "sans" }
    ],
    "elapsed_ms": 210
  }
}

Semántica HTTP estándar. Los errores devuelven un cuerpo JSON con el campo `message` (o un comentario CSS en el endpoint /css).

// 404 — family not found
{ "message": "Font family not found" }

// 422 — validation (oversized image, wrong mime, bad top_k)
{ "message": "Upload a tight crop of the text to analyze." }

// 422 — recognizer index missing on the server
{ "message": "Recognizer index is missing." }

// 429 — rate limit exceeded (recognize = 3 req/min)
{ "message": "Too Many Attempts." }

// 400 — bad request (CSS endpoint, no family)
/* Missing 'family' parameter */

Acerca de la Fonts API de jinero.online

API REST pública para buscar, descargar e insertar las fuentes de nuestra biblioteca de código abierto, compatible con la sintaxis de Google Fonts CSS2.

CSS de sustitución directa

La misma estructura de URL que Google Fonts CSS2: cambia el host y tus etiquetas <link> seguirán funcionando.

Licencias abiertas

Cada familia incluye metadatos de licencia y de diseñador. Crea catálogos, páginas de atribución y selectores de fuentes sin hacer scraping.

Alojamiento propio

Descarga un ZIP listo para usar de cada familia: archivos WOFF2 y un fonts.css generado. Sin paso de compilación.

Sin clave de API

Los endpoints públicos de lectura son gratuitos, con un límite de solicitudes por IP. Genera un token de API en tu perfil cuando necesites límites más altos.

Preguntas frecuentes

No. Todos los endpoints de lectura (list, show, files, download, css) son públicos y tienen un límite de solicitudes por IP. Solo necesitas un token para marcar fuentes como favoritas en nombre de un usuario o para tener un límite de solicitudes más alto.

La sintaxis coincide con la de Google Fonts CSS2 (family, wght, ital, display). El identificador de la familia es nuestro slug (p. ej. "inter", "jetbrains-mono") en lugar del nombre con "+"; el endpoint de búsqueda devuelve los slugs.

WOFF2 para el endpoint CSS y la mayoría de las descargas, con TTF como alternativa en las descargas de un solo estilo. El endpoint /fonts/{slug} devuelve todos los formatos disponibles con su tamaño y URL.

Cada familia de fuentes tiene su propia licencia (OFL, Apache, etc.). Los campos license y license_url de /fonts/{slug} indican exactamente qué está permitido. Revisa siempre la licencia original antes de un uso comercial.