EuroMakers
  • Software
  • Launches
  • Journal
  • Advertise
Submit
  • Software
  • Launches
  • Journal
  • Advertise
Monday digestAbout
Submit your product

API

A free, read-only JSON API for the published directory. No key needed.

Quick start

Every product in the directory, in one request:

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

Which one do I use?

  • Snapshot files: free, readable from any website, rebuilt every night, no limits. For browsers and whole-directory jobs.
  • Live API: for your server, about 60 requests a minute for each IP address. For one product at a time and fresher data.

Snapshot files

The published directory as static JSON files, rebuilt every night. Only changed files are rewritten, and none of them counts towards a limit.

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

An array of products, ordered by category id and then by id. The same JSON as GET /api/software.

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

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

An array of country names, each once, in directory order (not sorted). The same JSON as GET /api/software/countries.

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

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

An object of category id to number of products. Categories without products are left out. The same JSON as GET /api/categories/counts.

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

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

Well-known tools, each with the ids of the products made for the same work, as on the tool pages.

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

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

When the files were made, how many items each holds, their sizes and SHA-256, and the terms.

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

From a web page:

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

Endpoints

Every endpoint answers GET with JSON. Example answers are real but shortened.

GET /api/software

An array of products, ordered by category id and then by id.

Parameters

None

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

429 · 500 · 503

Cache

Kept at the edge for up to 24 hours and cleared when the directory changes. s-maxage=86400

GET /api/software/{id}

One product. An unknown or unpublished id is a 404.

Parameters
  • id · string · path · requiredThe product’s id: lowercase letters, digits and hyphens. ^[a-z0-9-]{1,80}$
Example
curl https://www.euromakers.org/api/software/proton-mail
Response
{
  "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"
}
Errors

404 · 429 · 500

Cache

Kept at the edge for up to 24 hours and cleared when the directory changes. s-maxage=86400

GET /api/software/countries

An array of country names, each once, in directory order (not sorted).

Parameters

None

Example
curl https://www.euromakers.org/api/software/countries
Response
["Germany", "France", "Slovakia", "…"]
Errors

429 · 500 · 503

Cache

Kept at the edge for up to 24 hours and cleared when the directory changes. s-maxage=86400

GET /api/categories/counts

An object of category id to number of products. Categories without products are left out.

Parameters

None

Example
curl https://www.euromakers.org/api/categories/counts
Response
{
  "artificial-intelligence": 13,
  "cloud": 16,
  "communication": 14
}
Errors

429 · 500 · 503

Cache

Kept at the edge for up to 24 hours and cleared when the directory changes. s-maxage=86400

A product

Every product has these fields. Optional ones are left out when empty.

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

The same as TypeScript types:

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[];
}

Errors

Errors are JSON with a message, a stable code and a hint:

{
  "code": "not_found",
  "error": "Software not found",
  "hint": "List known ids with GET /api/software, then retry with an existing kebab-case id."
}
StatusCodeWhen
404not_foundUnknown id, or no endpoint at that path.
429rate_limitedOver the rate limit.
500internal_errorSomething failed on our side.
503catalog_unavailableThe directory couldn’t be loaded.

Rate limits

60 requests per 60 seconds for each IP address, shared by every endpoint, cached answers included. Over the limit you get a 429 with Retry-After (in seconds) and X-RateLimit-Limit headers. When the API as a whole is very busy, it can answer 429 before you reach your limit.

Fair use: if you need more, use the snapshot files.

Conditional requests

Every answer carries an ETag. Send it back in If-None-Match, and an answer that hasn’t changed is a 304 with no body.

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

CORS

The live API sends no CORS headers, so a browser on another site can’t read it. In a browser, use the snapshot files: any website may read them.

Versions

This is version 1 of the API and of the snapshot files. We only add to it: no path, field or type changes or goes away. A breaking change would come as a new version beside this one.

Use and attribution

The API is free for any use. Link back to EuroMakers where you show its data. Logos belong to their makers, and the directory can’t be resold in bulk.

Terms of service

Machine-readable

  • /openapi.json · OpenAPI 3.1 description of every endpoint
  • /llms.txt · Site summary for language models
  • https://data.euromakers.org/v1/manifest.json · When the files were made, how many items each holds, their sizes and SHA-256, and the terms.
EuroMakers

The home of European software.

Discover

  • All software
  • By tool
  • Launches
  • Map

Community

  • Journal
  • Monday digest
  • Your feed

For makers

  • Submit your product
  • Claim your listing
  • Advertise
  • Listing criteria

EuroMakers

  • About
  • Contact
  • API
  • Privacy
  • Terms
Explore the map →

© 2026 EuroMakers. Made with conviction in Europe. Product logos belong to their makers.

Language: English
  • 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