EuroMakers
  • Logiciels
  • Lancements
  • Journal
  • Publicité
Proposer
  • Logiciels
  • Lancements
  • Journal
  • Publicité
Le digest du lundiÀ propos
Proposer votre produit

API

Une API JSON gratuite, en lecture seule, pour l’annuaire publié. Aucune clé nécessaire.

Démarrage rapide

Tous les produits de l’annuaire, en une requête :

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

Lequel utiliser ?

  • Fichiers snapshot : gratuits, lisibles depuis n’importe quel site, reconstruits chaque nuit, sans limite. Pour les navigateurs et les traitements de tout l’annuaire.
  • API en direct : pour votre serveur, environ 60 requêtes par minute pour chaque adresse IP. Pour un produit à la fois et des données plus fraîches.

Fichiers snapshot

L’annuaire publié sous forme de fichiers JSON statiques, reconstruits chaque nuit. Seuls les fichiers modifiés sont réécrits, et aucun ne compte dans une limite.

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

Un tableau de produits, triés par id de catégorie puis par id. Le même 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 tableau de noms de pays, chacun une fois, dans l’ordre de l’annuaire (non trié). Le même JSON que GET /api/software/countries.

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

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

Un objet qui associe chaque id de catégorie à son nombre de produits. Les catégories sans produit sont omises. Le même JSON que GET /api/categories/counts.

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

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

Des outils connus, chacun avec les identifiants des produits faits pour le même travail, comme sur les pages d’outils.

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

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

Quand les fichiers ont été créés, combien d’éléments chacun contient, leur taille et leur SHA-256, et les conditions.

{
  "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": "…"
    },
    "…"
  ]
}

Depuis une page web :

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

Endpoints

Chaque endpoint répond à GET en JSON. Les réponses d’exemple sont réelles mais raccourcies.

GET /api/software

Un tableau de produits, triés par id de catégorie puis par id.

Paramètres

Aucun

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

429 · 500 · 503

Cache

Conservée en edge jusqu’à 24 heures et vidée quand l’annuaire change. s-maxage=86400

GET /api/software/{id}

Un produit. Un id inconnu ou non publié renvoie une 404.

Paramètres
  • id · string · path · obligatoireL’id du produit : lettres minuscules, chiffres et tirets. ^[a-z0-9-]{1,80}$
Exemple
curl https://www.euromakers.org/api/software/proton-mail
Réponse
{
  "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"
}
Erreurs

404 · 429 · 500

Cache

Conservée en edge jusqu’à 24 heures et vidée quand l’annuaire change. s-maxage=86400

GET /api/software/countries

Un tableau de noms de pays, chacun une fois, dans l’ordre de l’annuaire (non trié).

Paramètres

Aucun

Exemple
curl https://www.euromakers.org/api/software/countries
Réponse
["Germany", "France", "Slovakia", "…"]
Erreurs

429 · 500 · 503

Cache

Conservée en edge jusqu’à 24 heures et vidée quand l’annuaire change. s-maxage=86400

GET /api/categories/counts

Un objet qui associe chaque id de catégorie à son nombre de produits. Les catégories sans produit sont omises.

Paramètres

Aucun

Exemple
curl https://www.euromakers.org/api/categories/counts
Réponse
{
  "artificial-intelligence": 13,
  "cloud": 16,
  "communication": 14
}
Erreurs

429 · 500 · 503

Cache

Conservée en edge jusqu’à 24 heures et vidée quand l’annuaire change. s-maxage=86400

Un produit

Chaque produit a ces champs. Les champs facultatifs sont omis quand ils sont vides.

id · string
Id stable, aussi la fin de l’adresse de la page du produit.
name · string
Nom du produit.
description · string
Description en une phrase.
audience · string[]
À qui il s’adresse : b2b, individual ou les deux.
country · string
Pays d’origine.
website · uri
Le site web du produit.
longDescription · string
Quelques paragraphes sur le produit.
features · string[]
Fonctionnalités principales.
useCases · string[]
Un à quatre ids de cas d’usage.
category · string
Id de catégorie, comme dans /categories/{id}.
verified · boolean
facultatif · true quand le créateur a vérifié qu’il en est propriétaire ; absent sinon.
logoUrl · uri
facultatif · Logo (PNG, JPEG ou WebP) ; absent s’il n’y en a pas.

La même chose en types 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[];
}

Erreurs

Les erreurs sont du JSON avec un message, un code stable et une indication :

{
  "code": "not_found",
  "error": "Software not found",
  "hint": "List known ids with GET /api/software, then retry with an existing kebab-case id."
}
StatutCodeQuand
404not_foundId inconnu, ou aucun endpoint à cette adresse.
429rate_limitedLimite de débit dépassée.
500internal_errorUn problème de notre côté.
503catalog_unavailableL’annuaire n’a pas pu être chargé.

Limites de débit

60 requêtes par 60 secondes pour chaque adresse IP, partagées par tous les endpoints, réponses en cache comprises. Au-delà de la limite, vous recevez une 429 avec les en-têtes Retry-After (en secondes) et X-RateLimit-Limit. Quand l’API dans son ensemble est très sollicitée, elle peut répondre 429 avant que vous n’atteigniez votre limite.

Usage raisonnable : s’il vous en faut plus, utilisez les fichiers snapshot.

Requêtes conditionnelles

Chaque réponse porte un ETag. Renvoyez-le dans If-None-Match : une réponse inchangée est une 304 sans corps.

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

CORS

L’API en direct n’envoie pas d’en-têtes CORS : un navigateur sur un autre site ne peut donc pas la lire. Dans un navigateur, utilisez les fichiers snapshot, que tout site peut lire.

Versions

Voici la version 1 de l’API et des fichiers snapshot. Nous ne faisons qu’ajouter : aucun chemin, champ ou type ne change ni ne disparaît. Un changement incompatible arriverait comme une nouvelle version, à côté de celle-ci.

Utilisation et attribution

L’API est gratuite pour tout usage. Mettez un lien vers EuroMakers là où vous affichez ses données. Les logos appartiennent à leurs créateurs, et l’annuaire ne peut pas être revendu en bloc.

Conditions d’utilisation

Lisible par machine

  • /openapi.json · Description OpenAPI 3.1 de chaque endpoint
  • /llms.txt · Résumé du site pour les modèles de langage
  • https://data.euromakers.org/v1/manifest.json · Quand les fichiers ont été créés, combien d’éléments chacun contient, leur taille et leur SHA-256, et les conditions.
EuroMakers

La maison du logiciel européen.

Découvrir

  • Tous les logiciels
  • Par outil
  • Lancements
  • Carte

Communauté

  • Journal
  • Le digest du lundi
  • Votre fil

Pour les créateurs

  • Proposer votre produit
  • Revendiquer votre fiche
  • Publicité
  • Critères de référencement

EuroMakers

  • À propos
  • Contact
  • API
  • Confidentialité
  • Conditions
Voir la carte →

© 2026 EuroMakers. Fait avec conviction en Europe. Les logos des produits appartiennent à leurs créateurs.

Langue: Français
  • 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