Skip to content
Documentation

Member API

The member API serves the job board to your own scripts and tools: the same rows, filters and grouping the board shows you when you are logged in, as JSON, with the same daily limits your account already has. It is read only. Marks, the tracker and alerts stay on the site.

You need an active paid membership and an API key. Create one in the Member API section of your account page. The key is shown once; store it like a password. You can hold up to three keys and revoke any of them at any time.

Authentication

Send the key as a bearer token on every request. The base URL is https://www.eurotoptech.com/api/v1.

curl -H "Authorization: Bearer ett_YOUR_KEY" \
  "https://www.eurotoptech.com/api/v1/me"

Every answer is JSON and is never cached. Membership is checked on each call: when a subscription ends, its keys stop working the same day.

Endpoints

GET /jobs

One page of the board, 24 rows per page, newest first unless you sort by pay. A parameter that takes a list may repeat (country=Germany&country=Poland) or carry a comma-separated list. The values the list parameters accept come from /facets.

ParameterValuesNotes
qfree textMatches job titles and company names.
workplaceonsite, hybrid, remote_country, remote_anywhereList. The two remote values are what the remote board opens with.
countrycountry namesList. A located role in that country, or one naming it among its places, or a remote role hiring there.
citycity namesList. Roles located there or naming it among their offices, plus remote roles hiring from its country.
companycompany namesList, case-insensitive.
seniorityseniority labelsList, for example senior or mid-level.
categoryengineering, data, product, design, marketing, sales, operations, otherList.
pay_tierT0, T1, T2, T3, T4List. The company pay tier against big tech pay in the same country: T0 Elite, T1 Top, T2 Big tech, T3 Below big tech, T4 Market rate. Remote companies with no pay read yet carry no tier and drop out while it is set.
min_compwhole numberEUR per year. The estimate, or the midpoint of a posted range, must reach it.
posted_sinceISO dateKeeps postings whose posted date (the postedDate field) is on or after this date.
sortnewest, pay_desc, pay_ascDefault newest: most recently posted first, by the posted date. The pay sorts order by the estimate or the posted range, rows without either last.
pagenumber from 1Default 1.
grouptrue or falseDefault true: one row per company and role, with the other postings of the role in groupMembers.
curl -H "Authorization: Bearer ett_YOUR_KEY" \
  "https://www.eurotoptech.com/api/v1/jobs?q=platform+engineer&workplace=remote_country,remote_anywhere&country=Germany&sort=pay_desc&page=1"

The response carries the page, the page size, how many rows the pages hold in total (groups when grouped, postings otherwise), how many postings they cover, and whether a next page exists.

{
  "jobs": [ { "jobId": 123456, "Job Title": "Platform Engineer", "Company": "Example", ... } ],
  "page": 1,
  "perPage": 24,
  "total": 1480,
  "totalPostings": 1612,
  "hasMore": true,
  "grouped": true
}

Each row is the board's own row: jobId, the title, the company, the city and country, a one-line location, the workplace mode, the countries a remote role hires from, the seniority, the posted date, the pay (a posted range, an estimate with a savings rate, or a remote company's senior engineer range in EUR), the other places a posting names, and the relocation and visa signals. No row carries an apply link: the apply endpoint hands one out per posting.

GET /jobs/{id}

One row by its jobId, plus description (the posting text as markdown, the way the board renders it) and groupMembers (the other postings of the same company and role). A posting the board does not show answers 404.

curl -H "Authorization: Bearer ett_YOUR_KEY" \
  "https://www.eurotoptech.com/api/v1/jobs/123456"

GET /jobs/{id}/apply

The posting's apply link: a 302 redirect to it, or { "url": ... } when the request sends Accept: application/json. Each call counts as one apply click on your account, as a click on the board does.

# The link as JSON
curl -H "Authorization: Bearer ett_YOUR_KEY" -H "Accept: application/json" \
  "https://www.eurotoptech.com/api/v1/jobs/123456/apply"

# Or follow the redirect
curl -L -H "Authorization: Bearer ett_YOUR_KEY" \
  "https://www.eurotoptech.com/api/v1/jobs/123456/apply"

GET /facets

The values the list parameters accept: workplace modes, countries, cities, companies, seniority labels, categories, pay tiers (code, label and meaning) and sorts.

curl -H "Authorization: Bearer ett_YOUR_KEY" \
  "https://www.eurotoptech.com/api/v1/facets"

GET /data

The numbers on the data page, one table at a time. view is overall (the default), financial (pay, tax, savings, cost of living), livability, jobs (open roles per place) or savings (modeled big tech savings). scope is country (the default) or city, and the jobs view also takes remote. statistic is median (the default) or average, for pay and savings. place narrows the table to one country or city. The savings view takes level (L3, L4, L5) and lifestyle (frugal, comfortable, luxurious). Each answer carries a note on how to read it. Rankings and totals only: individual submissions are not available here.

curl -H "Authorization: Bearer ett_YOUR_KEY" \
  "https://www.eurotoptech.com/api/v1/data?view=financial&scope=city&place=Germany"

GET /me

Whose key this is, the plan, the key's record, the limits, and what the account has used today against each of them. Reading it moves no counter.

curl -H "Authorization: Bearer ett_YOUR_KEY" \
  "https://www.eurotoptech.com/api/v1/me"

Limits

The API and the board share one budget per account: a number of board requests per hour and per day, a number of distinct postings per day, and a number of apply links per hour and per day. Your account page shows the daily limits, and /me shows where you stand. Both the list and the single-job endpoint count as board requests; the single-job endpoint also counts the postings it returns. Over a limit, the API answers 429 with the error code feed-account-limit and a Retry-After header in seconds. Each endpoint also has a per-address limit per minute, for everyone.

Errors

Errors are JSON with an error code and a message.

StatusCodeMeaning
400invalid_paramA parameter value the endpoint does not accept; the message names it.
401unauthorizedNo API key on the request.
401invalid_keyThe key is unknown or was revoked.
403membership_requiredThe key belongs to an account without an active paid membership.
404not_foundNo such posting on the board.
429feed-account-limitA per-account limit was reached; wait for the Retry-After seconds.
503unavailableThe API is not available right now.

Fair use

Your membership is for your own job search. Listings may not be republished, redistributed, or fed into another product or dataset, including through scripts, AI agents, or assistants acting on your behalf. Bulk exports and request patterns that mimic scraping are not allowed, and we may rate-limit, block, or terminate offending accounts. The full rule is section 5 of the terms of service. Need data at scale? Email info@eurotoptech.com about licensed access instead.


Using the API from an AI client

Your membership lets your own AI assistant read the job board for you, in two ways. The MCP server at https://www.eurotoptech.com/api/mcp is for assistants that speak the Model Context Protocol: Claude (claude.ai, the desktop and mobile apps), ChatGPT, Claude Code and Cursor. You add the address once, sign in with your Euro Top Tech email when the assistant asks, press Allow, and from then on the assistant can search the board, read a posting and fetch an apply link as part of a conversation. The REST API documented on this page is for scripts and for tools that call URLs directly, with an API key. Both show you exactly what the website shows you and count toward the same daily limits.

Claude

In claude.ai, open Customize, then Connectors, and click Add custom connector. Paste the address above as the server URL. If the dialog asks how to authenticate, keep the sign-in option (Sign in now or Sign in when needed) and leave the OAuth client fields as they are: Claude identifies itself on its own. Click Add, then press Connect on the connector's page (if it shows Disconnect and no tools instead, press Disconnect first, then Connect). Claude opens a Euro Top Tech page: if you are not logged in there, enter your email, open the login link from your inbox, and you land on a screen that names Claude and says what it will be able to do. Press Allow and you are sent back to Claude. The connector is then available in the desktop and mobile apps as well, with the same sign-in. This works on Claude's free plan too, which allows one custom connector; paid Claude plans allow more.

ChatGPT

Custom MCP servers in ChatGPT need developer mode, which is available on paid ChatGPT plans on the web (a free ChatGPT account does not show it). Open Settings, then Plugins (older versions call it Connectors, or Apps and connectors), turn on developer mode if it is not on yet, and add a custom MCP server. Give it a name, paste the address above as the server URL, choose OAuth as the authentication, confirm the warning about custom servers, and create it. ChatGPT asks you to sign in on its first use: the same Euro Top Tech login link and the same Allow screen as for Claude.

Claude Code and Cursor

Both can sign in the same way: add the server without a key and the assistant opens the login and Allow screens in your browser (in Claude Code, run /mcp after adding it if it does not ask on its own). Both also accept a key, which is handy on a machine where you would rather not open a browser. With a key, run this once in Claude Code, replacing YOUR_KEY with your key:

claude mcp add --transport http --scope user euro-top-tech \
  https://www.eurotoptech.com/api/mcp \
  --header "Authorization: Bearer YOUR_KEY"

If you would rather keep the key out of your shell history, put it in an environment variable named ETT_API_KEY and add the server to your .mcp.json with the header value Bearer ${ETT_API_KEY}. In Cursor, open ~/.cursor/mcp.json (or .cursor/mcp.json inside one project), add a server named euro-top-tech with the URL above and, for the key route, a headers object whose Authorization entry reads Bearer ${env:ETT_API_KEY}, set that variable, and restart Cursor.

Keys and connections

A key is created on your account page, under Member API, and is shown once: treat it like a password. An assistant you connected by signing in appears on the same page under Connected assistants, with a Disconnect button that stops it right away; a disconnected assistant asks you to sign in again the next time you use it. Both a key and a connection work for as long as your membership is paid. For scripts that call the REST API, a custom GPT Action in ChatGPT with API Key authentication of the Bearer type can hold your key; keep such a GPT private, since anyone who can use it uses your key.

What the assistant can do

The assistant gets six tools: search the board with the same filters as the website, read one posting with its full description, fetch the apply link of a posting you have chosen to apply to, list the filter values, read the salary, savings and livability numbers on the data page, and check which account it is connected to and how much of today's allowance it has used. Nothing writes: your marks, tracker, alerts and CV are not reachable through a key or a connection. Apply links are handed out one at a time and counted, like the Apply button on the website.

The same limits apply as on the website: an hourly and a daily number of board pages, a daily number of distinct postings and a separate allowance for apply links. When a limit is reached the assistant gets an error that says when it resets, and the whoami tool shows the counts at any time. The membership terms apply to what an assistant does on your behalf: the board is for your own job search, and bulk export, republishing or feeding the listings into another product or dataset is not allowed.