Aurelmark
API documentation

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

GET/v1/procurement/eu/notices/{id}/changes
ParameterInDescription
idpathTED publication number of the tender's first notice, such as 662865-2026.
cursorqueryOptional. A checkpoint_cursor or next_cursor from an earlier response.
limitqueryOptional. 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.

FieldDescription
rootThe tender you asked about.
current_noticeThe latest notice in the procedure.
current_deadlinesEach lot's deadline: date and time exactly as published, and utc.
current_source_urlLink to the latest notice on TED.
eventsRecorded deadline changes, oldest first, up to limit.
next_cursorSet when more changes are waiting. Request it to get the next page.
checkpoint_cursorStore this and send it next time to receive only new changes.
observation_startWhen monitoring began. Changes before this are not included.
checked_atWhen TED was last checked for this tender.
fresh, completeAlways true on a 200. Stale or partial data is refused, never served.

Each change event

FieldDescription
event_idIncreasing ID for the change.
lot_idThe lot whose deadline changed, such as LOT-0001.
fieldAlways submission_deadline.
old_value, new_valueThe deadline before and after, each with date, time and utc.
previous_notice, new_noticeThe TED notices the change came from.
source_urlsLinks to both notices on TED.
source_publication_datePublication date of the new notice, as given by TED.
observed_atWhen Aurelmark recorded the change.

Errors

Errors return JSON with an error code. Only a 200 uses a credit.

StatusErrorMeaning
400invalid_query_or_cursorA parameter is malformed.
401invalid_api_keyThe key is missing a Bearer prefix, unknown or revoked.
402free_tier_exhaustedNo key was sent and today's free responses are used up. The body includes a purchase_url.
402credits_exhaustedThe key has no credits left. Top up to continue.
404notice_not_trackedThis tender isn't watched yet. It isn't a fault: request it and it will be added.
410cursor_expiredThe cursor is older than 24 hours. Call again without it.
429rate_limitedToo many requests. Wait for the Retry-After seconds.
503source_stale_or_incompleteTED 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_cursor is set, request it straight away to fetch the next page.
  • Cursors last 24 hours. After a 410, call without a cursor and compare current_deadlines with 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.

GET/v1/cbam/default-values
ParameterDescription
cnA 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.
countryOptional. 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.
yearOptional. 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.

GET/v1/eudr/scope?cn=1806

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.

GET/v1/eu/deadlines
ParameterDescription
lawOptional. One law, such as EUDR, CBAM or AI Act. The response lists them all in laws.
statusOptional. upcoming or applies.
from, toOptional. 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.

Add to an MCP clientjson
{ "mcpServers": { "aurelmark": { "type": "http", "url": "https://aurelmark.ishanpatel.workers.dev/mcp" } } }
Or with Claude Codeshell
$ claude mcp add --transport http aurelmark https://aurelmark.ishanpatel.workers.dev/mcp

Free endpoints

EndpointReturns
/v1/coverageTracked tenders and when each was last checked.
/v1/pricingCurrent price and how to authenticate.
/openapi.jsonThe OpenAPI 3 description of the API.
/v1/agentA machine-readable descriptor for AI agents.
/healthWhether the service is running.

Questions or a tender to add? Email ishanpatel3416@gmail.com.