Skip to main content
POST
Create project

Authorizations

X-API-Key
string
header
required

Per-manufacturer API key in the X-API-Key header, format emidat-{key_id}-{secret} where key_id is a random public handle. Issued by an owner in the Emidat dashboard; carries its own permission scopes, optional plant restrictions, and optional expiry. A revoked, expired, or unknown key returns 401. See the Authentication guide for details.

Headers

Idempotency-Key
string

Optional client-generated key of 1–255 characters (e.g. a UUID) that makes a create idempotent — the only mechanism that does so. A replay carrying the same key returns the original response unchanged (200); reusing a key with a different request body (compared byte for byte) or create endpoint is rejected with 409 err_idempotency_key_reused. Concurrent requests with the same key receive 409 err_idempotency_in_progress. Keys are scoped to your manufacturer; successful responses are retained for 6h without extending that window on replay. Current permissions are required on every retry; product-instance replays also require the original production-data scopes. Deduplication is best effort: Redis data loss can end the window early, and Redis unavailability, timeouts, or unreadable cache entries can allow creation without replay protection. Successful creates still return 201 if caching fails. Redis waits share a two-second budget excluding creation time. Incompatible replay-format upgrades reset replay protection, so retries across that boundary can create again. An interrupted create can reserve the key for up to 6h. See External IDs for recovery guidance.

Required string length: 1 - 255

Body

application/json
name
string
required

Surrounding spaces are ignored; an empty name returns 422.

Minimum string length: 1
Example:

"Tower A"

customer_name
string
required

Name of one of your customers, exactly as it is in the Emidat app (surrounding spaces are ignored). Customers are not created through the API: a name with no customer returns 422 (err_customer_not_found).

Minimum string length: 1
Example:

"Bauherr GmbH"

address
object
required

The site address of a project, stored exactly as sent; a field you leave out is stored empty. A new or changed address needs city, and is located to place the site: no location found in country returns 422 (err_address_not_found), and a lookup that cannot be carried out right now returns 503 (err_geocoding_unavailable). An address identical to the stored one (ignoring surrounding spaces) is kept as it is, without a lookup.

products
object[]
required
Minimum array length: 1
external_id
string | null

Your own code for this project. Optional. When provided it is unique among your active projects — creating another with the same code returns 409 (see External IDs).

Example:

"PRJ-2026-014"

Response

Returned unchanged — an Idempotency-Key replay.

id
string<uuid>
required

UUID of the project.

external_id
string | null
required

Your own code for this project. null when none is set.

name
string
required
Example:

"Tower A"

customer
object
required

The client a project is built for. Customers are managed in the Emidat app; a project names its customer by customer_name.

address
object
required

The site address of a project, exactly as it was sent. Fields left out are empty strings, except house_number, which is null.

products
object[]
required
gwp_total
number | null
required

A1–A3 GWP-total (EN 15804+A2) of the whole delivery in kg CO₂e: the sum over the lines of quantity times gwp_per_unit. null while any line's gwp_per_unit is null; the lines show which.

gwp_total_net
number | null
required

As gwp_total, from the lines' gwp_per_unit_net. null while any line's gwp_per_unit_net is null.

created_at
string<date-time>
required