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 |
{- "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",
- "country": "string",
- "house_number": "string",
- "zip": "string"
}, - "ordering_enabled": true,
- "appscan_enabled": true,
- "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",
- "country": "string",
- "house_number": "string",
- "zip": "string"
}, - "ordering_enabled": true,
- "appscan_enabled": true,
- "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
}
]
}
{- "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.
Key Features:
external_id
exists, it will be updated. Otherwise, a new project is created.region
field is used to lookup and link the project to the appropriate project region.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 roles tenant_settings:read
- To access tenant-specific configurationsBest Practices:
external_id
values that are unique within your organizationregion
values correspond to existing project regions in your tenantexternal_id required | string The external identifier of the project. Must be unique within the customer. |
title required | string The title of the project |
project_number required | string The project number |
description | string A description of the project |
region required | string The region number where the project is located, used for filtering |
active | boolean Controls if the project is active |
object The address details of the project | |
Array of objects (UserInviteInput) User invites for the project | |
ordering_enabled | boolean Indicates if ordering is enabled for the project |
appscan_enabled | boolean Indicates if app scan is enabled for the project |
{- "external_id": "EXT-2024-001",
- "title": "Highway Construction Project",
- "project_number": "HCP-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",
- "country": "string",
- "house_number": "string",
- "zip": "string"
}, - "ordering_enabled": true,
- "appscan_enabled": true,
- "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",
- "country": "string",
- "house_number": "string",
- "zip": "string"
}, - "ordering_enabled": true,
- "appscan_enabled": true,
- "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",
- "country": "string",
- "house_number": "string",
- "zip": "string"
}, - "ordering_enabled": true,
- "appscan_enabled": true,
- "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"
}
]
}
Returns a list of all project regions for the authenticated tenant. Project regions are used to organize and categorize projects within hierarchical structures.
Required Scopes: projects:read
Authentication: API key must be linked to a customer.
{- "project_regions": [
- {
- "id": "cefa2499-e11d-cada-b423-c3af41ae5232",
- "title": "North Region",
- "number": "NR-001",
- "tenant_id": "12345678-1234-1234-1234-123456789012"
}, - {
- "id": "23d12932-2348-345d-b342-2323cd846323",
- "title": "South Region - Subdivision A",
- "number": "SR-A-001",
- "tenant_id": "12345678-1234-1234-1234-123456789012"
}
]
}
Creates a new project region for organizing projects within the tenant.
Required Scopes: projects:write
Authentication: API key must be linked to a customer.
Validation: Title and number are required and must be unique within the tenant.
Key Features:
title
and number
must be unique per tenanttenant_id
is automatically set from the API keytitle required | string The title of the project region |
number required | string The number of the project region |
{- "title": "North Region",
- "number": "NR-001"
}
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "North Region",
- "number": "NR-001",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
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 PDF invoices using GPT/AI parsing. Accepts raw PDF 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 PDF invoice data
{- "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",
- "country": "string",
- "house_number": "string",
- "zip": "string"
}, - "ordering_enabled": true,
- "appscan_enabled": true,
- "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
}
]
}
Accepts deliveries in the 1Lieferschein XML format, processes the XML and creates a delivery record.
XML data in 1Lieferschein format
{- "success": true
}
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 PDF invoices using GPT/AI parsing. Accepts raw PDF 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 PDF invoice data
{- "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