Download OpenAPI specification:
The comstruct API is a comprehensive and flexible solution designed to streamline the process of procuring materials for businesses. This API provides a simple interface for developers to access and manage materials procurement data, including supplier information, deliveries and projects.
To gain access to the comstruct API, interested developers should reach out to their dedicated customer success manager. Our team of experts is committed to providing top-notch support and guidance to help you get the most out of our API.
All API endpoints under /v1 require authentication using an API key passed in the x-api-key header. Each API key has specific scopes that determine which endpoints and operations are available. Authentication is enforced through middleware that validates the API key and scopes for each request.
Calendar endpoints under /calendars use token-based authentication instead of API keys.
The API uses standard HTTP status codes and returns detailed error messages in JSON format. See the error response schemas for more details.
Returns a paginated list of deliveries with filtered item fields.
| limit | integer [ 1 .. 100 ] Default: 25 Example: limit=25 Number of items per page (max 100, default 25) |
| offset | integer >= 0 Default: 0 Example: offset=0 Number of items to skip for pagination |
| marked | boolean Whether or not the delivery note has been marked |
| from | string <date> Example: from=2025-09-01 ISO-8601 formatted start delivery date (inclusive) |
| till | string <date> Example: till=2025-09-10 ISO-8601 formatted end delivery date (inclusive) |
| supplierId | string <uuid> Filter by supplier ID |
| projectId | string <uuid> Filter by project ID |
{- "deliveries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "deliveryNumber": "1234'23",
- "deliveryDate": "2019-08-24T14:15:22Z",
- "projectNumber": "string",
- "project": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "external_id": "EXT-001",
- "title": "Example Site",
- "project_number": "23423420",
- "description": "string",
- "region": "Bavaria",
- "project_region_id": "fd92bd5e-269f-4c52-94e7-9589c0bb014c",
- "active": true,
- "status": "string",
- "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
- "address": {
- "address": "string",
- "city": "string",
- "zip": "string"
}, - "project_invites": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "role": "string",
- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0"
}
]
}, - "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
- "vehicleNumber": "M-AB 1234",
- "comment": "string",
- "items": [
- {
- "productNumber": "1234",
- "title": "Concrete 123",
- "description": "string",
- "type": "REMOVAL",
- "quantity": 0.1,
- "unit": "string",
- "unitNetPrice": 0,
- "itemNetPrice": 0
}
]
}
], - "total": 150,
- "limit": 25,
- "offset": 0,
- "hasNext": true,
- "hasPrevious": false,
- "totalPages": 6,
- "currentPage": 0
}| deliveryNumber | string The reference number for the delivery. Must be unique for the supplier. |
| deliveryDate | string <date-time> The reference number for the delivery. Must be unique for the supplier. |
| projectNumber | string the project name that the delivery belongs to. Should contain the project number of the contractor for easy matching. |
| supplierId | string <uuid> The id of the supplier that the delivery belongs to. |
| projectId | string <uuid> The id of the project that the delivery belongs to. |
| vehicleNumber | string The license plate number of the vehicle the delivery is brought with. |
| documentUrl | string <url> A link to the delivery note document. Can be the full document, base64 encoded. |
| comment | string An optional comment. |
Array of objects (LineItem) A list of items included in the delivery. |
{- "deliveryNumber": "1234'23",
- "deliveryDate": "2019-08-24T14:15:22Z",
- "projectNumber": "string",
- "supplierId": "e01eb4c4-8eb9-4fb7-b625-61f58c6148db",
- "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
- "vehicleNumber": "M-AB 1234",
- "comment": "string",
- "items": [
- {
- "productNumber": "1234",
- "title": "Concrete 123",
- "description": "string",
- "type": "REMOVAL",
- "quantity": 0.1,
- "unit": "string",
- "unitNetPrice": 0,
- "itemNetPrice": 0
}
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "deliveryNumber": "1234'23",
- "deliveryDate": "2019-08-24T14:15:22Z",
- "projectNumber": "string",
- "project": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "external_id": "EXT-001",
- "title": "Example Site",
- "project_number": "23423420",
- "description": "string",
- "region": "Bavaria",
- "project_region_id": "fd92bd5e-269f-4c52-94e7-9589c0bb014c",
- "active": true,
- "status": "string",
- "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
- "address": {
- "address": "string",
- "city": "string",
- "zip": "string"
}, - "project_invites": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "role": "string",
- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0"
}
]
}, - "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
- "vehicleNumber": "M-AB 1234",
- "comment": "string",
- "items": [
- {
- "productNumber": "1234",
- "title": "Concrete 123",
- "description": "string",
- "type": "REMOVAL",
- "quantity": 0.1,
- "unit": "string",
- "unitNetPrice": 0,
- "itemNetPrice": 0
}
]
}Returns the PDF bytes for a delivery note. The response is application/pdf. Requires deliveries:read permission.
| id required | string <uuid> Delivery ID (UUID) |
{- "message": "Invalid scope."
}| limit | integer [ 1 .. 500 ] Default: 25 Example: limit=10 Maximum number of projects to return per page |
| offset | integer >= 0 Default: 0 Number of projects to skip for pagination |
{- "projects": [
- {
- "id": "cefa2499-e11d-cada-b423-c3af41ae5232",
- "title": "Example Site 1",
- "project_number": "23423420",
- "description": "Description",
- "external_id": "EXT-001"
}, - {
- "id": "23d12932-2348-345d-b342-2323cd846323",
- "title": "23043 - Example Site 2",
- "project_number": null,
- "description": "Description",
- "external_id": "EXT-002"
}
]
}Creates a new project or updates an existing project. This endpoint performs an upsert operation based on the external_id field (if provided) or project_number.
Key Features:
external_id is provided and a project with that ID exists, it will be updated. Otherwise uses project_number for matching. If no match is found, a new project is created.region field can be used to lookup and link the project to a project region.legal_entity_number field can be used to lookup and link the project to a legal entity.title, project_number) are validated before processing.Required Scopes: This endpoint requires multiple scopes for full functionality:
projects:write - To create/update the projectusers:read - To lookup existing users for invitationsroles:read - To validate and assign user rolestenant_settings:read - To access tenant-specific configurationsBest Practices:
external_id for reliable upsert operationsregion or project_region_id for project region associationlegal_entity_number or legal_entity_id for legal entity associationproject_invites match existing roles in your tenant| external_id | string The external identifier of the project. Must be unique within the customer. Used for upsert operations. |
| title required | string The title of the project |
| project_number required | string The project number (required) |
| description | string A description of the project |
| region | string The region number where the project is located, used for filtering and project region lookup |
| project_region_id | string <uuid> Direct reference to a project region ID (alternative to region lookup) |
| legal_entity_id | string <uuid> Direct reference to a legal entity ID |
| legal_entity_number | string Legal entity number used to lookup and link the legal entity |
| alternative_project_number | string Alternative project number for reference |
| active | boolean Controls if the project is active |
object The address details of the project | |
Array of objects (UserInviteInput) User invites for the project |
{- "title": "Highway Construction Project",
- "project_number": "HCP-2024-001",
- "external_id": "EXT-2024-001",
- "description": "Construction of highway section A1-A2",
- "region": "Bavaria",
- "active": true
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "external_id": "EXT-001",
- "title": "Example Site",
- "project_number": "23423420",
- "description": "string",
- "region": "Bavaria",
- "project_region_id": "fd92bd5e-269f-4c52-94e7-9589c0bb014c",
- "active": true,
- "status": "string",
- "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
- "address": {
- "address": "string",
- "city": "string",
- "zip": "string"
}, - "project_invites": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "role": "string",
- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0"
}
]
}| external_id required | string The external identifier of the project |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "external_id": "EXT-001",
- "title": "Example Site",
- "project_number": "23423420",
- "description": "string",
- "region": "Bavaria",
- "project_region_id": "fd92bd5e-269f-4c52-94e7-9589c0bb014c",
- "active": true,
- "status": "string",
- "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
- "address": {
- "address": "string",
- "city": "string",
- "zip": "string"
}, - "project_invites": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "role": "string",
- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0"
}
]
}| project_number required | string The project number |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "external_id": "EXT-001",
- "title": "Example Site",
- "project_number": "23423420",
- "description": "string",
- "region": "Bavaria",
- "project_region_id": "fd92bd5e-269f-4c52-94e7-9589c0bb014c",
- "active": true,
- "status": "string",
- "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
- "address": {
- "address": "string",
- "city": "string",
- "zip": "string"
}, - "project_invites": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "role": "string",
- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0"
}
]
}Processes a custom invoice format using GPT/AI parsing. Accepts raw data up to 32MiB and processes them using generative AI for invoice data extraction.
Required Scopes: invoices:write
Authentication: API key must be linked to a customer and tenant ID must match.
Raw invoice data (up to 32MiB)
{- "success": true
}Processes invoices received via email using GPT/AI parsing. Accepts raw invoice data and processes them using generative AI for invoice data extraction.
Required Scopes: invoices:write
Authentication: API key must be linked to a customer and tenant ID must match.
Raw invoice data from email
{- "success": true
}Processes a custom invoice format (OAWD) for Hochtief using GPT/AI parsing. Accepts PDF files and processes them using generative AI for invoice data extraction.
Required Scopes: invoices:write
Authentication: API key must be linked to a customer.
| id required | string External ID for the invoice |
Raw PDF invoice data
{- "success": true,
- "data": { }
}Receives callback responses from SAP system regarding invoice processing status. Updates the invoice status based on the success/failure response from SAP.
| external_id required | string External ID of the invoice |
| success required | boolean Whether the SAP processing was successful |
| messages | Array of strings Messages from SAP processing |
{- "external_id": "string",
- "success": true,
- "messages": [
- "string"
]
}{- "success": true,
- "message": "string"
}Parses an invoice PDF using AI/GPT but does not save the result to the database. This is useful for testing invoice parsing or getting invoice data without persistence. Returns parsed invoice data without creating database records.
Raw invoice data to parse
{- "success": true,
- "data": { }
}Receives and processes purchase orders from SAP system. Accepts an array of SAP purchase orders as raw JSON data.
Required Scopes: purchase_orders:write
Authentication: API key must be linked to a customer.
Validation: All purchase orders must pass schema validation and reference existing suppliers.
Raw request body that will be parsed as JSON array of SAP purchase orders
[{"number":"PO-2024-001","title":"Concrete Materials Order","creditor_number":"SUPPLIER-123456","payment_term":"30T","items":[{"number":"001","title":"Concrete C25/30","quantity":50,"cost_bearer_number":"PROJECT-KTR-789","unit":"m3","account_number":"ACC-4000","tax_code":"VAT19"}]}]
{- "message": "Purchase Order data received successfully"
}Processes an IDS order by updating an existing order with XML data and redirects to the project calendar. Accepts XML data in the 'warenkorb' field via form-urlencoded format.
| order_id required | string <uuid> The UUID of the order to update |
| warenkorb required | string XML data containing the order information |
{- "error": "Missing order_id"
}| deliveryNumber | string The reference number for the delivery. Must be unique for the supplier. |
| deliveryDate | string <date-time> The reference number for the delivery. Must be unique for the supplier. |
| projectNumber | string the project name that the delivery belongs to. Should contain the project number of the contractor for easy matching. |
| supplierId | string <uuid> The id of the supplier that the delivery belongs to. |
| projectId | string <uuid> The id of the project that the delivery belongs to. |
| vehicleNumber | string The license plate number of the vehicle the delivery is brought with. |
| documentUrl | string <url> A link to the delivery note document. Can be the full document, base64 encoded. |
| comment | string An optional comment. |
Array of objects (LineItem) A list of items included in the delivery. |
{- "deliveryNumber": "1234'23",
- "deliveryDate": "2019-08-24T14:15:22Z",
- "projectNumber": "string",
- "supplierId": "e01eb4c4-8eb9-4fb7-b625-61f58c6148db",
- "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
- "vehicleNumber": "M-AB 1234",
- "comment": "string",
- "items": [
- {
- "productNumber": "1234",
- "title": "Concrete 123",
- "description": "string",
- "type": "REMOVAL",
- "quantity": 0.1,
- "unit": "string",
- "unitNetPrice": 0,
- "itemNetPrice": 0
}
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "deliveryNumber": "1234'23",
- "deliveryDate": "2019-08-24T14:15:22Z",
- "projectNumber": "string",
- "project": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "external_id": "EXT-001",
- "title": "Example Site",
- "project_number": "23423420",
- "description": "string",
- "region": "Bavaria",
- "project_region_id": "fd92bd5e-269f-4c52-94e7-9589c0bb014c",
- "active": true,
- "status": "string",
- "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
- "address": {
- "address": "string",
- "city": "string",
- "zip": "string"
}, - "project_invites": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "role": "string",
- "role_id": "ac4e70c8-d5be-48af-93eb-760f58fc91a9",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0"
}
]
}, - "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
- "vehicleNumber": "M-AB 1234",
- "comment": "string",
- "items": [
- {
- "productNumber": "1234",
- "title": "Concrete 123",
- "description": "string",
- "type": "REMOVAL",
- "quantity": 0.1,
- "unit": "string",
- "unitNetPrice": 0,
- "itemNetPrice": 0
}
]
}Receives a JSON delivery note from Q-Point system and creates a delivery record. Implements the Q-Point REST API V8 callback method for HTTP subscriptions.
Q-Point delivery data in JSON format
{ }{- "id": "string"
}Processes a custom invoice format using GPT/AI parsing. Accepts raw data up to 32MiB and processes them using generative AI for invoice data extraction.
Required Scopes: invoices:write
Authentication: API key must be linked to a customer and tenant ID must match.
Raw invoice data (up to 32MiB)
{- "success": true
}Processes invoices received via email using GPT/AI parsing. Accepts raw invoice data and processes them using generative AI for invoice data extraction.
Required Scopes: invoices:write
Authentication: API key must be linked to a customer and tenant ID must match.
Raw invoice data from email
{- "success": true
}Processes a custom invoice format (OAWD) for Hochtief using GPT/AI parsing. Accepts PDF files and processes them using generative AI for invoice data extraction.
Required Scopes: invoices:write
Authentication: API key must be linked to a customer.
| id required | string External ID for the invoice |
Raw PDF invoice data
{- "success": true,
- "data": { }
}Receives and processes purchase orders from SAP system. Accepts an array of SAP purchase orders as raw JSON data.
Required Scopes: purchase_orders:write
Authentication: API key must be linked to a customer.
Validation: All purchase orders must pass schema validation and reference existing suppliers.
Raw request body that will be parsed as JSON array of SAP purchase orders
[{"number":"PO-2024-001","title":"Concrete Materials Order","creditor_number":"SUPPLIER-123456","payment_term":"30T","items":[{"number":"001","title":"Concrete C25/30","quantity":50,"cost_bearer_number":"PROJECT-KTR-789","unit":"m3","account_number":"ACC-4000","tax_code":"VAT19"}]}]
{- "message": "Purchase Order data received successfully"
}Receives and processes suppliers from SAP system. Accepts an array of SAP suppliers as raw data.
Required Scopes: suppliers:write
Authentication: API key must be linked to a customer.
Validation: All suppliers must have valid payment terms and pass schema validation.
| number required | string Supplier number from SAP |
| title required | string Supplier name/title |
| legal_uid | string Optional legal UID |
| country_code required | string ISO 3166-1 alpha-2 country code |
| payment_term required | string SAP payment terms key; must exist in comstruct tenant |
| wth_tax_code | string Optional withholding tax code |
Array of objects (SapSupplierBankDetailsInput) Optional bank details | |
object (SapSupplierAddressInput) |
[- {
- "number": "EXTERNAL-09092",
- "title": "Beispiel GmbH-8",
- "legal_uid": "D456789900022202",
- "country_code": "US",
- "payment_term": "90T",
- "wth_tax_code": "90",
- "bank_details": [
- {
- "number": "9999912",
- "iban": "DE89370400440532013000"
}, - {
- "number": "8881112",
- "iban": "GB33BUKB20201555555555"
}
], - "address": {
- "address": "Müllerstraße 1",
- "city": "Berlin",
- "zip": "10115",
- "country_code": "DE"
}
}
]{- "message": "Supplier data received successfully"
}Receives callback responses from SAP system regarding invoice processing status. Updates the invoice status based on the success/failure response from SAP.
| external_id required | string External ID of the invoice |
| success required | boolean Whether the SAP processing was successful |
| messages | Array of strings Messages from SAP processing |
{- "external_id": "string",
- "success": true,
- "messages": [
- "string"
]
}{- "success": true,
- "message": "string"
}| id required | string The delivery ID |
{ }{- "message": "Invalid scope."
}Triggers invoice processing workflow for JobRouter integration.
Required Scopes: invoices:write
Authentication: API key must be linked to a customer.
{ }{- "success": true
}Retrieves the current status of a workflow process by external identifier.
Required Scopes: invoices:write
Authentication: API key must be linked to a customer.
| external_id required | string The external identifier of the workflow |
{- "success": true,
- "status": "string",
- "history": [
- { }
]
}Retrieves an iCalendar (.ics) file containing calendar events for a subscription. Uses calendar authentication middleware instead of standard API key authentication.
BEGIN:VCALENDAR VERSION:2.0 PRODID:-//comstruct//EN END:VCALENDAR