EuroMakers
  • Software
  • Lançamentos
  • Journal
  • Publicidade
Submeter
  • Software
  • Lançamentos
  • Journal
  • Publicidade
Resumo de segundaSobre
Submeta o seu produto

API

Uma API JSON gratuita e só de leitura para o diretório publicado. Sem chave.

Início rápido

Todos os produtos do diretório, num só pedido:

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

Qual devo usar?

  • Ficheiros snapshot: gratuitos, legíveis a partir de qualquer site, refeitos todas as noites, sem limites. Para navegadores e tarefas com todo o diretório.
  • API em direto: para o seu servidor, cerca de 60 pedidos por minuto por endereço IP. Para um produto de cada vez e dados mais recentes.

Ficheiros snapshot

O diretório publicado em ficheiros JSON estáticos, refeitos todas as noites. Só os ficheiros alterados são reescritos, e nenhum conta para um limite.

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

Um array de produtos, ordenados por id de categoria e depois por id. O mesmo 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

Um array de nomes de países, cada um uma vez, pela ordem do diretório (não ordenado). O mesmo JSON que GET /api/software/countries.

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

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

Um objeto de id de categoria para número de produtos. As categorias sem produtos ficam de fora. O mesmo JSON que GET /api/categories/counts.

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

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

Ferramentas conhecidas, cada uma com os ids dos produtos feitos para o mesmo trabalho, como nas páginas das ferramentas.

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

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

Quando os ficheiros foram criados, quantos itens tem cada um, o tamanho e o SHA-256, e os termos.

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

A partir de uma 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 com JSON. As respostas de exemplo são reais, mas encurtadas.

GET /api/software

Um array de produtos, ordenados por id de categoria e depois por id.

Parâmetros

Nenhum

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

429 · 500 · 503

Cache

Guardada no edge até 24 horas e limpa quando o diretório muda. s-maxage=86400

GET /api/software/{id}

Um produto. Um id desconhecido ou não publicado dá um 404.

Parâmetros
  • id · string · path · obrigatórioO id do produto: letras minúsculas, algarismos e hífenes. ^[a-z0-9-]{1,80}$
Exemplo
curl https://www.euromakers.org/api/software/proton-mail
Resposta
{
  "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"
}
Erros

404 · 429 · 500

Cache

Guardada no edge até 24 horas e limpa quando o diretório muda. s-maxage=86400

GET /api/software/countries

Um array de nomes de países, cada um uma vez, pela ordem do diretório (não ordenado).

Parâmetros

Nenhum

Exemplo
curl https://www.euromakers.org/api/software/countries
Resposta
["Germany", "France", "Slovakia", "…"]
Erros

429 · 500 · 503

Cache

Guardada no edge até 24 horas e limpa quando o diretório muda. s-maxage=86400

GET /api/categories/counts

Um objeto de id de categoria para número de produtos. As categorias sem produtos ficam de fora.

Parâmetros

Nenhum

Exemplo
curl https://www.euromakers.org/api/categories/counts
Resposta
{
  "artificial-intelligence": 13,
  "cloud": 16,
  "communication": 14
}
Erros

429 · 500 · 503

Cache

Guardada no edge até 24 horas e limpa quando o diretório muda. s-maxage=86400

Um produto

Cada produto tem estes campos. Os opcionais ficam de fora quando estão vazios.

id · string
Id estável, também o fim do endereço da página do produto.
name · string
Nome do produto.
description · string
Descrição numa frase.
audience · string[]
Para quem é: b2b, individual ou ambos.
country · string
País de origem.
website · uri
O site do produto.
longDescription · string
Alguns parágrafos sobre o produto.
features · string[]
Funcionalidades principais.
useCases · string[]
Um a quatro ids de casos de utilização.
category · string
Id de categoria, como em /categories/{id}.
verified · boolean
opcional · true quando o criador verificou que é o dono; caso contrário, não aparece.
logoUrl · uri
opcional · Logótipo (PNG, JPEG ou WebP); não aparece quando não existe.

O mesmo em tipos 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[];
}

Erros

Os erros são JSON com uma mensagem, um código estável e uma dica:

{
  "code": "not_found",
  "error": "Software not found",
  "hint": "List known ids with GET /api/software, then retry with an existing kebab-case id."
}
EstadoCódigoQuando
404not_foundId desconhecido, ou nenhum endpoint nesse caminho.
429rate_limitedLimite de pedidos ultrapassado.
500internal_errorAlgo falhou do nosso lado.
503catalog_unavailableNão foi possível carregar o diretório.

Limites de pedidos

60 pedidos por 60 segundos por endereço IP, partilhados por todos os endpoints, incluindo respostas em cache. Acima do limite recebe um 429 com os cabeçalhos Retry-After (em segundos) e X-RateLimit-Limit. Quando a API no seu todo está muito ocupada, pode responder 429 antes de atingir o seu limite.

Uso justo: se precisar de mais, use os ficheiros snapshot.

Pedidos condicionais

Cada resposta traz um ETag. Envie-o de volta em If-None-Match e uma resposta sem alterações é um 304 sem corpo.

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

CORS

A API em direto não envia cabeçalhos CORS, por isso um navegador noutro site não a consegue ler. Num navegador, use os ficheiros snapshot: qualquer site os pode ler.

Versões

Esta é a versão 1 da API e dos ficheiros snapshot. Só acrescentamos: nenhum caminho, campo ou tipo muda ou desaparece. Uma alteração incompatível chegaria como uma nova versão ao lado desta.

Utilização e atribuição

A API é gratuita para qualquer utilização. Coloque um link para a EuroMakers onde mostrar os seus dados. Os logótipos pertencem aos seus criadores, e o diretório não pode ser revendido em bloco.

Termos de serviço

Legível por máquinas

  • /openapi.json · Descrição OpenAPI 3.1 de cada endpoint
  • /llms.txt · Resumo do site para modelos de linguagem
  • https://data.euromakers.org/v1/manifest.json · Quando os ficheiros foram criados, quantos itens tem cada um, o tamanho e o SHA-256, e os termos.
EuroMakers

A casa do software europeu.

Descobrir

  • Todo o software
  • Por ferramenta
  • Lançamentos
  • Mapa

Comunidade

  • Journal
  • Resumo de segunda
  • O seu feed

Para criadores

  • Submeta o seu produto
  • Reivindique a sua ficha
  • Publicidade
  • Critérios de listagem

EuroMakers

  • Sobre
  • Contacto
  • API
  • Privacidade
  • Termos
Ver o mapa →

© 2026 EuroMakers. Feito com convicção na Europa. Os logótipos pertencem aos seus criadores.

Idioma: Português
  • 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