Skip to content

Public Projects Get

Request

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.

Path
project_idstring(Project Id)required
Headers
authorizationstring or null(Authorization)

Bearer <mrc_live_…> API key

curl -i -X GET \
  'https://docs.mercura.ai/_mock/openapi/projects/{project_id}' \
  -H 'authorization: string'

Responses

Successful Response

Bodyapplication/json
idstring(Id)required

Public id; equals the internal Project.id as string.

Example:"90"
object_numberstring or null(Object Number)

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.

Example:"OBJ-2026-0042"
namestring or null(Name)
Example:"Neubau Bürogebäude Rheinpark"
statusstring(PublicProjectStatus)required

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.

Enum:"ACTIVE""PROCESSED""BID_SUBMITTED""CUSTOMER_LOST""CUSTOMER_WON_PENDING""CUSTOMER_WON_AWARDED_ELSEWHERE""CUSTOMER_WON_AWARDED_TO_US"
Example:"ACTIVE"
estimated_valuenumber or null(Estimated Value)
Example:185000
currencystring or null(Currency)
Example:"EUR"
submission_datestring or null(Submission Date)

Free-form submission deadline as originally supplied (ISO date or free text).

Example:"2026-08-15"
responsible_userobject(PublicResponsibleUser)

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).

Example:
{ "email": "anna.schmidt@example.com", "id": "3f8b6d21-9a4c-4e77-b0e2-1c5d8a9f4e10", "name": "Anna Schmidt" }
construction_site_addressobject(Address)

Postal address shared across customers and suppliers.

Example:
{ "city": "Düsseldorf", "country": "DE", "is_default": true, "kind": "billing", "postal_code": "40210", "region": "NRW", "street": "Industriestraße", "street_number": "12" }
planner_addressobject(Address)

Postal address shared across customers and suppliers.

Example:
{ "city": "Düsseldorf", "country": "DE", "is_default": true, "kind": "billing", "postal_code": "40210", "region": "NRW", "street": "Industriestraße", "street_number": "12" }
developer_addressobject(Address)

Postal address shared across customers and suppliers.

Example:
{ "city": "Düsseldorf", "country": "DE", "is_default": true, "kind": "billing", "postal_code": "40210", "region": "NRW", "street": "Industriestraße", "street_number": "12" }
custom_fieldsobject or null(Custom Fields)

Organisation-defined custom-field values. Keys and value shapes are governed by the organisation's custom_column_definitions.

Example:
{ "Gewerk": [ "EL - ELEMENTE TÜREN" ], "Vergabeart": "Öffentlich" }
request_idsArray of integers(Request Ids)

Request ids linked to this project via Request.project_id. Round-trip against GET /offers/{id} to fetch per-request content.

Example:
[ 12345 ]
acknowledgementobject(PublicProjectAcknowledgement)

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.

Example:
{ "acknowledged_at": "2026-08-20T09:15:00Z", "external_id": "4500012345", "metadata": { "erp_client": "100" }, "status": "SUCCESS" }
created_atstring, (date-time)(Created At)required
Example:"2026-07-08T09:10:00Z"
updated_atstring, (date-time)(Updated At)required
Example:"2026-07-09T12:00:12Z"
Response
{ "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" }