Aurelmark API
One endpoint returns the current submission deadlines for a tender and every change recorded since you last asked.
Overview
All requests go to https://aurelmark.ishanpatel.workers.dev over HTTPS and return JSON. A tender is identified by the TED publication number of the first notice in its procedure, for example 662865-2026. Only enrolled tenders are tracked; /v1/coverage lists them, and anyone can request one.
Authentication
Send your API key as a bearer token. Keys look like am_1a2b3c4d_…. Keep them secret: requests made with your key use your credits.
Authorization: Bearer $AURELMARK_KEY
Don't have a key yet? Request a free trial key with 100 requests.
No key at all
You can call the changes endpoint without any key. Each caller gets 100 successful responses a day for free, reset at midnight UTC, and every response says how many are left in X-Free-Requests-Remaining. Errors never count. After that, the API answers 402 free_tier_exhausted until the next day, or you can use an API key.
Get changes
| Parameter | In | Description |
|---|---|---|
id | path | TED publication number of the tender's first notice, such as 662865-2026. |
cursor | query | Optional. A checkpoint_cursor or next_cursor from an earlier response. |
limit | query | Optional. Changes per page, 1 to 50. Defaults to 50. |
$ curl -H "Authorization: Bearer $AURELMARK_KEY" \ https://aurelmark.ishanpatel.workers.dev/v1/procurement/eu/notices/662865-2026/changes
Response
A successful response has status 200 and an X-Credits-Remaining header.
| Field | Description |
|---|---|
root | The tender you asked about. |
current_notice | The latest notice in the procedure. |
current_deadlines | Each lot's deadline: date and time exactly as published, and utc. |
current_source_url | Link to the latest notice on TED. |
events | Recorded deadline changes, oldest first, up to limit. |
next_cursor | Set when more changes are waiting. Request it to get the next page. |
checkpoint_cursor | Store this and send it next time to receive only new changes. |
observation_start | When monitoring began. Changes before this are not included. |
checked_at | When TED was last checked for this tender. |
fresh, complete | Always true on a 200. Stale or partial data is refused, never served. |
Each change event
| Field | Description |
|---|---|
event_id | Increasing ID for the change. |
lot_id | The lot whose deadline changed, such as LOT-0001. |
field | Always submission_deadline. |
old_value, new_value | The deadline before and after, each with date, time and utc. |
previous_notice, new_notice | The TED notices the change came from. |
source_urls | Links to both notices on TED. |
source_publication_date | Publication date of the new notice, as given by TED. |
observed_at | When Aurelmark recorded the change. |
Errors
Errors return JSON with an error code. Only a 200 uses a credit.
| Status | Error | Meaning |
|---|---|---|
| 400 | invalid_query_or_cursor | A parameter is malformed. |
| 401 | invalid_api_key | The key is missing a Bearer prefix, unknown or revoked. |
| 402 | free_tier_exhausted | No key was sent and today's free responses are used up. The body includes a purchase_url. |
| 402 | credits_exhausted | The key has no credits left. Top up to continue. |
| 404 | notice_not_tracked | This tender isn't watched yet. It isn't a fault: request it and it will be added. |
| 410 | cursor_expired | The cursor is older than 24 hours. Call again without it. |
| 429 | rate_limited | Too many requests. Wait for the Retry-After seconds. |
| 503 | source_stale_or_incomplete | TED couldn't be confirmed in the last three hours. Try again later. |
Request a tender
Coverage grows on request. Email ishanpatel3416@gmail.com with the TED publication number of the first notice in the procedure, for example 662865-2026. We add it within one working day, usually the same day, as long as TED publishes it as a standard eForms contract notice with lot deadlines. If we can't, we reply and say why.
Until a tender is added, the changes endpoint answers 404 with notice_not_tracked. That means "not watched yet", not an error in the request. Once added, the tender appears in /v1/coverage. Its first check is the baseline, and every deadline change after that is recorded.
API stability
Everything under /v1, as described in /openapi.json, is a stable contract. Changes there are only additive: new optional fields or new endpoints. We don't rename or remove a path, parameter, response field or error code. A breaking change would ship only under /v2, with at least 90 days' notice by email to everyone integrating with us, and /v1 keeps working throughout.
Polling
Deadlines are checked once an hour, so polling each tender hourly is plenty.
- Make the first call without a cursor and store
checkpoint_cursor. - Next time, send
?cursor=with the stored value. You receive only changes recorded since then. - If
next_cursoris set, request it straight away to fetch the next page. - Cursors last 24 hours. After a
410, call without a cursor and comparecurrent_deadlineswith what you have.
Billing
Buy credits at pricing. Checkout is run by Dodo Payments, our merchant of record, and your API key arrives by email straight after payment. Use it exactly like any other key; the first request activates it and loads your credits.
With a key, each 200 response uses one credit; HEAD requests and every error are free. Without a key, the first 100 successful responses each day are free. Credits are prepaid at $0.02 each, $10 for 500, and never expire. See pricing and our refund policy.
CBAM lookup
Free, with no key. It gives the official CBAM default emissions for a good and country, the mark-up for the year, and the latest CBAM certificate price. Every response names the regulation and the Commission page each number comes from.
| Parameter | Description |
|---|---|
cn | A CN or TARIC code, 2 to 10 digits, such as 7208 or 2523 29 00. A short code lists every CBAM good below it; a long one finds the closest heading. |
country | Optional. Two-letter country of production, such as IN. Countries not in the regulation, and blank values, use the "Other countries and territories" table, as the regulation says. UNKNOWN gives the Annex IV values for precursors whose country can't be identified. |
year | Optional. 2026 or later; defaults to this year. It sets the mark-up: 10 % in 2026, 20 % in 2027 and 30 % from 2028, or 1 % for fertilisers. |
$ curl "https://aurelmark.ishanpatel.workers.dev/v1/cbam/default-values?cn=7208&country=IN&year=2027"
Each match has default_value (direct, indirect and total, in tCO2e per tonne of good), markup_percent, total_with_markup, the production_route for the CBAM benchmark, and gross_cost_eur_per_tonne. That cost is before the free allocation adjustment and any carbon price paid abroad, so the real bill is usually lower. The binding figure with the mark-up is calculated in the EU's CBAM Registry.
Also free: /v1/cbam/certificate-price for the published certificate prices, and /v1/cbam/countries for the countries in the regulation.
EUDR scope check
Free, with no key. Is a CN code covered by the EU Deforestation Regulation? The answer comes from Annex I of Regulation (EU) 2023/1115 as amended by 2025/2650.
verdict is yes, partly (an "ex" line: only the goods described are covered), some_codes_below (enter a longer code) or no. Each answer lists the matching Annex I lines, the dates it applies from, and the official sources. /v1/eudr/products returns the whole list. There is also a web page.
EU deadlines
Free, with no key. These are the dates when EU rules start to apply: EUDR, CBAM, the AI Act, CSRD, CSDDD, the Cyber Resilience Act and more. Each one shows the date in force today, every earlier date it had, and the Official Journal act and word-for-word quote behind each date.
| Parameter | Description |
|---|---|
law | Optional. One law, such as EUDR, CBAM or AI Act. The response lists them all in laws. |
status | Optional. upcoming or applies. |
from, to | Optional. Only dates in this range, such as 2027-01-01. |
$ curl "https://aurelmark.ishanpatel.workers.dev/v1/eu/deadlines?law=EUDR"
Each deadline has date, days_until, times_moved, previous_date, source and history. Every source carries the act, the article, the quote, the official url and the sha256 of the exact file we read. One deadline is at /v1/eu/deadlines/{id}, for example eudr-large-medium-operators. This is information, not legal advice.
MCP server
Agents that speak the Model Context Protocol can use every tool above directly. https://aurelmark.ishanpatel.workers.dev/mcp is a remote MCP server (Streamable HTTP) with nine read-only tools: the watched tenders, tender deadline changes, CBAM default values, certificate price and countries, EU deadlines and the EUDR scope check. It is listed in the official MCP Registry as io.github.Ishan73744/aurelmark. The same free tier applies. For prepaid credits, add your key as an Authorization header.
{ "mcpServers": { "aurelmark": { "type": "http", "url": "https://aurelmark.ishanpatel.workers.dev/mcp" } } }$ claude mcp add --transport http aurelmark https://aurelmark.ishanpatel.workers.dev/mcpFree endpoints
| Endpoint | Returns |
|---|---|
/v1/coverage | Tracked tenders and when each was last checked. |
/v1/pricing | Current price and how to authenticate. |
/openapi.json | The OpenAPI 3 description of the API. |
/v1/agent | A machine-readable descriptor for AI agents. |
/health | Whether the service is running. |
Questions or a tender to add? Email ishanpatel3416@gmail.com.