Fetch one project by its internal numeric id.
The id matches the project_id field carried on the offer.new_export_run webhook — pass the value verbatim (stringified) to round-trip.
The response carries a strong ETag over the editable content; pass it back as If-Match on PATCH /projects/{project_id} for optimistic concurrency.
- Mock serverhttps://docs.mercura.ai/_mock/openapi/projects/{project_id}
- https://docs.mercura.ai/api/public/v1https://docs.mercura.ai/api/public/v1/projects/{project_id}
- Productionhttps://prod-euapi.mercura.ai/api/public/v1/projects/{project_id}
curl -i -X GET \
'https://docs.mercura.ai/_mock/openapi/projects/{project_id}' \
-H 'authorization: string'Successful Response
ERP-facing grouping key (Objektnummer). Multiple projects can share an object_number — filter on GET /projects?object_number=... returns all matching rows. Writable via PATCH /projects/{project_id} or by supplying external_id on POST /projects/{project_id}/acknowledgements.
Lifecycle status of a Mercura project.
Translated from the internal ProjectStatus enum — the internal values are lower-cased for historical reasons; the public API uses UPPERCASE (matches PublicOfferStatus and the platform-wide enum convention in CLAUDE.md). New values are SemVer MINOR (additive); removed values are MAJOR. Translation table lives in projects.service._STATUS_MAP so a missing case is a test failure, not silent passthrough.
Free-form submission deadline as originally supplied (ISO date or free text).
The Mercura user assigned to a project.
Small denormalised bundle rather than a bare id — partners rendering an offer inbox rarely need to hit a second endpoint just to display "Assigned to Anna Schmidt". Email is included so downstream systems can key on it (Mercura's supabase_id is not portable).
{ "email": "anna.schmidt@example.com", "id": "3f8b6d21-9a4c-4e77-b0e2-1c5d8a9f4e10", "name": "Anna Schmidt" }
Postal address shared across customers and suppliers.
{ "city": "Düsseldorf", "country": "DE", "is_default": true, "kind": "billing", "postal_code": "40210", "region": "NRW", "street": "Industriestraße", "street_number": "12" }
Postal address shared across customers and suppliers.
{ "city": "Düsseldorf", "country": "DE", "is_default": true, "kind": "billing", "postal_code": "40210", "region": "NRW", "street": "Industriestraße", "street_number": "12" }
Postal address shared across customers and suppliers.
{ "city": "Düsseldorf", "country": "DE", "is_default": true, "kind": "billing", "postal_code": "40210", "region": "NRW", "street": "Industriestraße", "street_number": "12" }
Organisation-defined custom-field values. Keys and value shapes are governed by the organisation's custom_column_definitions.
{ "Gewerk": [ "EL - ELEMENTE TÜREN" ], "Vergabeart": "Öffentlich" }
Request ids linked to this project via Request.project_id. Round-trip against GET /offers/{id} to fetch per-request content.
[ 12345 ]
The partner's last reported ERP/CRM import outcome, when one was recorded via POST /projects/{project_id}/acknowledgements. Null when the project was never acknowledged.
{ "acknowledged_at": "2026-08-20T09:15:00Z", "external_id": "4500012345", "metadata": { "erp_client": "100" }, "status": "SUCCESS" }
{ "acknowledgement": { "acknowledged_at": "2026-08-20T09:15:00Z", "external_id": "4500012345", "metadata": { … }, "status": "SUCCESS" }, "construction_site_address": { "city": "Düsseldorf", "country": "DE", "is_default": true, "kind": "site", "postal_code": "40213", "region": "NRW", "street": "Rheinuferstraße", "street_number": "45" }, "created_at": "2026-07-08T09:10:00Z", "currency": "EUR", "custom_fields": { "Gewerk": [ … ], "Vergabeart": "Öffentlich" }, "estimated_value": 185000, "id": "90", "name": "Neubau Bürogebäude Rheinpark", "object_number": "OBJ-2026-0042", "planner_address": { "city": "Düsseldorf", "country": "DE", "kind": "planner", "postal_code": "40212", "street": "Königsallee", "street_number": "60" }, "request_ids": [ 12345 ], "responsible_user": { "email": "anna.schmidt@example.com", "id": "3f8b6d21-9a4c-4e77-b0e2-1c5d8a9f4e10", "name": "Anna Schmidt" }, "status": "ACTIVE", "submission_date": "2026-08-15", "updated_at": "2026-07-09T12:00:12Z" }