EuroMakers
  • Software
  • Lanzamientos
  • Journal
  • Publicidad
Enviar
  • Software
  • Lanzamientos
  • Journal
  • Publicidad
Resumen del lunesAcerca de
Envía tu producto

API

Una API JSON gratuita y de solo lectura para el directorio publicado. Sin clave.

Inicio rápido

Todos los productos del directorio, en una sola petición:

curl https://www.euromakers.org/api/software
[
  {
    "id": "proton-mail",
    "name": "Proton Mail",
    "description": "End-to-end encrypted email from Switzerland.",
    …
  },
  …
]

¿Cuál uso?

  • Archivos snapshot: gratis, legibles desde cualquier web, se regeneran cada noche, sin límites. Para navegadores y tareas con todo el directorio.
  • API en vivo: para tu servidor, unas 60 peticiones por minuto por dirección IP. Para un producto cada vez y datos más recientes.

Archivos snapshot

El directorio publicado como archivos JSON estáticos, regenerados cada noche. Solo se reescriben los archivos que cambian, y ninguno cuenta para un límite.

https://data.euromakers.org/v1/software.json

Un array de productos, ordenados por id de categoría y luego por id. El mismo JSON que GET /api/software.

[
  {
    "id": "proton-mail",
    "name": "Proton Mail",
    "description": "End-to-end encrypted email from Switzerland.",
    …
  },
  …
]

https://data.euromakers.org/v1/countries.json

Un array de nombres de países, cada uno una vez, en el orden del directorio (sin ordenar). El mismo JSON que GET /api/software/countries.

["Germany", "France", "Slovakia", "…"]

https://data.euromakers.org/v1/categories.json

Un objeto de id de categoría a número de productos. Las categorías sin productos se omiten. El mismo JSON que GET /api/categories/counts.

{
  "artificial-intelligence": 13,
  "cloud": 16,
  "communication": 14
}

https://data.euromakers.org/v1/alternatives.json

Herramientas conocidas, cada una con los ids de los productos hechos para el mismo trabajo, como en las páginas de herramientas.

[
  {
    "tool": "slack",
    "name": "Slack",
    "page": "https://www.euromakers.org/alternatives/slack",
    "ids": ["element", "rocket-chat", "…"]
  }
]

https://data.euromakers.org/v1/manifest.json

Cuándo se crearon los archivos, cuántos elementos tiene cada uno, su tamaño y SHA-256, y las condiciones.

{
  "version": "v1",
  "generatedAt": "2026-11-12T22:05:00.000Z",
  "docs": "https://www.euromakers.org/developers",
  "license": "Free for any use. Logos belong to their makers, and the directory can’t be resold in bulk.",
  "attribution": "Link back to EuroMakers (https://www.euromakers.org) where you show this data.",
  "terms": "https://www.euromakers.org/terms",
  "files": [
    {
      "name": "software.json",
      "url": "https://data.euromakers.org/v1/software.json",
      "items": "…",
      "bytes": "…",
      "sha256": "…"
    },
    "…"
  ]
}

Desde una página web:

const response = await fetch("https://data.euromakers.org/v1/software.json");
const products = await response.json();

Endpoints

Cada endpoint responde a GET con JSON. Las respuestas de ejemplo son reales, pero recortadas.

GET /api/software

Un array de productos, ordenados por id de categoría y luego por id.

Parámetros

Ninguno

Ejemplo
curl https://www.euromakers.org/api/software
Respuesta
[
  {
    "id": "proton-mail",
    "name": "Proton Mail",
    "description": "End-to-end encrypted email from Switzerland.",
    …
  },
  …
]
Errores

429 · 500 · 503

Caché

Se guarda en el edge hasta 24 horas y se vacía cuando cambia el directorio. s-maxage=86400

GET /api/software/{id}

Un producto. Un id desconocido o no publicado devuelve un 404.

Parámetros
  • id · string · path · obligatorioEl id del producto: letras minúsculas, dígitos y guiones. ^[a-z0-9-]{1,80}$
Ejemplo
curl https://www.euromakers.org/api/software/proton-mail
Respuesta
{
  "id": "proton-mail",
  "name": "Proton Mail",
  "description": "End-to-end encrypted email from Switzerland.",
  "audience": ["b2b", "individual"],
  "country": "Switzerland",
  "website": "https://proton.me/mail",
  "longDescription": "Proton Mail is the flagship encrypted email …",
  "features": ["End-to-end encrypted email", "…"],
  "useCases": ["business-email"],
  "category": "communication"
}
Errores

404 · 429 · 500

Caché

Se guarda en el edge hasta 24 horas y se vacía cuando cambia el directorio. s-maxage=86400

GET /api/software/countries

Un array de nombres de países, cada uno una vez, en el orden del directorio (sin ordenar).

Parámetros

Ninguno

Ejemplo
curl https://www.euromakers.org/api/software/countries
Respuesta
["Germany", "France", "Slovakia", "…"]
Errores

429 · 500 · 503

Caché

Se guarda en el edge hasta 24 horas y se vacía cuando cambia el directorio. s-maxage=86400

GET /api/categories/counts

Un objeto de id de categoría a número de productos. Las categorías sin productos se omiten.

Parámetros

Ninguno

Ejemplo
curl https://www.euromakers.org/api/categories/counts
Respuesta
{
  "artificial-intelligence": 13,
  "cloud": 16,
  "communication": 14
}
Errores

429 · 500 · 503

Caché

Se guarda en el edge hasta 24 horas y se vacía cuando cambia el directorio. s-maxage=86400

Un producto

Cada producto tiene estos campos. Los opcionales se omiten cuando están vacíos.

id · string
Id estable; también es el final de la dirección de la página del producto.
name · string
Nombre del producto.
description · string
Descripción de una frase.
audience · string[]
Para quién es: b2b, individual o ambos.
country · string
País de origen.
website · uri
El sitio web del producto.
longDescription · string
Unos párrafos sobre el producto.
features · string[]
Funciones principales.
useCases · string[]
De uno a cuatro ids de casos de uso.
category · string
Id de categoría, como en /categories/{id}.
verified · boolean
opcional · true cuando el creador ha verificado que es suyo; si no, no aparece.
logoUrl · uri
opcional · Logotipo (PNG, JPEG o WebP); no aparece si no hay.

Lo mismo como tipos de TypeScript:

export interface Software {
  /** Stable id, also the end of the product’s page address. */
  id: string;
  /** Product name. */
  name: string;
  /** One-sentence description. */
  description: string;
  /** Who it’s for: b2b, individual or both. */
  audience: ("b2b" | "individual")[];
  /** Country of origin. */
  country: string;
  /** The product’s website. */
  website: string;
  /** A few paragraphs about the product. */
  longDescription: string;
  /** Main features. */
  features: string[];
  /** One to four use-case ids. */
  useCases: string[];
  /** Category id, as in /categories/{id}. */
  category: string;
  /** true when the maker verified ownership; absent otherwise. */
  verified?: true;
  /** Logo (PNG, JPEG or WebP); absent when there is none. */
  logoUrl?: string;
}

/** countries.json, GET /api/software/countries */
export type Countries = string[];

/** categories.json, GET /api/categories/counts */
export type CategoryCounts = Record<string, number>;

/** One entry of alternatives.json */
export interface Alternative {
  tool: string;
  name: string;
  page: string;
  ids: string[];
}

Errores

Los errores son JSON con un mensaje, un código estable y una pista:

{
  "code": "not_found",
  "error": "Software not found",
  "hint": "List known ids with GET /api/software, then retry with an existing kebab-case id."
}
EstadoCódigoCuándo
404not_foundId desconocido, o no hay endpoint en esa ruta.
429rate_limitedLímite de uso superado.
500internal_errorAlgo falló por nuestra parte.
503catalog_unavailableNo se pudo cargar el directorio.

Límites de uso

60 peticiones cada 60 segundos por dirección IP, compartidas por todos los endpoints, incluidas las respuestas en caché. Si superas el límite, recibes un 429 con las cabeceras Retry-After (en segundos) y X-RateLimit-Limit. Cuando la API en conjunto está muy ocupada, puede responder 429 antes de que llegues a tu límite.

Uso razonable: si necesitas más, usa los archivos snapshot.

Peticiones condicionales

Cada respuesta lleva un ETag. Devuélvelo en If-None-Match y una respuesta sin cambios será un 304 sin cuerpo.

curl -i https://www.euromakers.org/api/software/proton-mail -H 'If-None-Match: "<ETag of the last answer>"'

CORS

La API en vivo no envía cabeceras CORS, así que un navegador en otra web no puede leerla. En un navegador, usa los archivos snapshot: cualquier web puede leerlos.

Versiones

Esta es la versión 1 de la API y de los archivos snapshot. Solo añadimos: ninguna ruta, campo o tipo cambia ni desaparece. Un cambio incompatible llegaría como una versión nueva junto a esta.

Uso y atribución

La API es gratuita para cualquier uso. Enlaza a EuroMakers donde muestres sus datos. Los logotipos pertenecen a sus creadores, y el directorio no se puede revender en bloque.

Condiciones de uso

Legible por máquinas

  • /openapi.json · Descripción OpenAPI 3.1 de cada endpoint
  • /llms.txt · Resumen del sitio para modelos de lenguaje
  • https://data.euromakers.org/v1/manifest.json · Cuándo se crearon los archivos, cuántos elementos tiene cada uno, su tamaño y SHA-256, y las condiciones.
EuroMakers

El hogar del software europeo.

Descubrir

  • Todo el software
  • Por herramienta
  • Lanzamientos
  • Mapa

Comunidad

  • Journal
  • Resumen del lunes
  • Tu feed

Para creadores

  • Envía tu producto
  • Reclama tu ficha
  • Publicidad
  • Criterios de inclusión

EuroMakers

  • Acerca de
  • Contacto
  • API
  • Privacidad
  • Condiciones
Ver el mapa →

© 2026 EuroMakers. Hecho con convicción en Europa. Los logotipos pertenecen a sus creadores.

Idioma: Español
  • English
  • Български
  • Čeština
  • Dansk
  • Deutsch
  • Ελληνικά
  • Español
  • Eesti
  • Suomi
  • Français
  • Gaeilge
  • Hrvatski
  • Magyar
  • Italiano
  • Lietuvių
  • Latviešu
  • Malti
  • Nederlands
  • Polski
  • Português
  • Română
  • Slovenčina
  • Slovenščina
  • Svenska