Skip to content

Catalogue API

The connector catalogue is public. It is the same list the console’s app library shows to anyone.

GET https://api.flowplane.eu/public/connectors

No sign-in needed.

An array, in the console’s order:

[
{
"id": "gmail",
"name": "Gmail",
"summary": "Read, search and send Gmail, and sort it, as the person signed in.",
"kind": "communication",
"kind_label": "Messages and email",
"maker": null,
"logo": "gmail",
"logo_url": "https://console.flowplane.eu/logos/gmail.svg",
"own_address": false
}
]
Field
id Stable id. Use it as a key, or in a link to the console: https://console.flowplane.eu/connectors/new?pick=<id>.
name, summary As in the console.
kind communication, productivity, development, sales, finance, ai, home or generic.
kind_label The kind as the console names it, for example “Messages and email”.
maker Self-hosted (an app on your own server), Bring your own (any MCP server, or a connector you build), or null for Flowplane’s own connectors.
logo, logo_url The logo id and its address. Both null when there is no logo.
own_address true when you add it at an address you give, reached over the internet or through a tunnel.

The list is cached for a few minutes, so there is no need to poll it. Fetch it on a server or at build time, not from every visitor’s browser. Too many requests get a 429 with Retry-After.

Fetch it once at build time, so your page still builds when the API is down:

type Connector = {
id: string;
name: string;
summary: string;
kind: string;
kind_label: string;
maker: string | null;
logo: string | null;
logo_url: string | null;
own_address: boolean;
};
let connectors: Connector[] = [];
try {
const r = await fetch('https://api.flowplane.eu/public/connectors', { headers: { accept: 'application/json' } });
if (r.ok) connectors = await r.json();
} catch {
// keep the list empty
}