# PartnerHub API — Full Reference (LLM consolidation) > Generated from the OpenAPI spec and the workflow state machines. > Raw OpenAPI: https://sandbox.partner.miete24.com/api/docs.jsonopenapi > Consolidated OpenAPI (with x-extensions): https://sandbox.partner.miete24.com/developers/openapi.json ## Guides & concepts These narrative guides live in the developer portal; follow the links for the full text. - [Introduction](https://sandbox.partner.miete24.com/developers) - [For AI](https://sandbox.partner.miete24.com/developers/ai) - [Getting Started](https://sandbox.partner.miete24.com/developers/getting-started) - [Authentication](https://sandbox.partner.miete24.com/developers/authentication) - [Versioning & Deprecation](https://sandbox.partner.miete24.com/developers/versioning) - [Create a Quote](https://sandbox.partner.miete24.com/developers/use-cases/create-a-quote) - [Financing & Solvency](https://sandbox.partner.miete24.com/developers/use-cases/financing) - [e-Signature](https://sandbox.partner.miete24.com/developers/use-cases/e-signature) - [Webhooks](https://sandbox.partner.miete24.com/developers/use-cases/webhooks) - [Sandbox Simulate](https://sandbox.partner.miete24.com/developers/use-cases/sandbox-simulate) - [Lifecycle](https://sandbox.partner.miete24.com/developers/lifecycle) ## API reference ### Calculation Rental price calculation endpoints. #### POST /api/calculate Creates a Calculation resource. Creates a Calculation resource. **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | sandboxScenario | string | no | Sandbox only (PH-1017). Optional. Value calculation_not_possible forces the same empty-calculation failure (HTTP 500, EmptyCalculationException shape) as a real zero-offer miss. Outside API_ENVIRONMENT=sandbox the field is rejected with 422 and calculation is not suppressed. Omit for normal calculation. | | serviceCost | number\|null | no | | | paymentInterval | string | no | Zahlungsweise; Default monthly. monthly schlägt den konfigurierten Aufschlag (PH-577) auf die Monatsrate auf, quarterly nicht. | | durations | array | yes | Gewünschte Laufzeiten in Monaten. Berechnet werden nur Laufzeiten, für die der Partner Matrix-Konditionen hat (Filter). Je Finanzierungsart zählt deren eigene Mietfaktorenliste bei der vorausgewählten Provisionsstufe (0 %, sonst die niedrigste gepflegte Stufe): Fehlt eine Laufzeit in dieser Liste, enthält die Antwort für diese Finanzierungsart kein Angebot. Ist keine der angefragten Laufzeiten verfügbar, antwortet die API mit 422 (Violation calculation.validation.duration_not_available an durations). | | calculationTypes | array | yes | | | acquisitionCost | number\|null | no | | | productSector | string | no | API write accessor: accepts the raw JSON string so invalid values surface as Choice violations instead of enum denormalization fatals (PH-984). | | categorySlug | string\|null | no | only for internal use for now | | installationCost | number\|null | no | | | userType | string | no | | **Request example** ```json { "sandboxScenario": "calculation_not_possible", "paymentInterval": "monthly", "durations": [ 12, 24, 36, 48, 60, 72, 84, 96, 120 ], "calculationTypes": [ "leasing", "partial_amortisation_leasing", "rent_to_own" ], "acquisitionCost": 1000.23, "productSector": "IT_AND_OFFICE_EQUIPMENT", "public": true, "active": true, "distributionHub": "https://example.com/", "distributionHubOverride": "https://example.com/" } ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Calculation resource created | Calculation | | 400 | Invalid input | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/calculate' \ -H 'X-Api-Key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"sandboxScenario":"calculation_not_possible","paymentInterval":"monthly","durations":[12,24,36,48,60,72,84,96,120],"calculationTypes":["leasing","partial_amortisation_leasing","rent_to_own"],"acquisitionCost":1000.23,"productSector":"IT_AND_OFFICE_EQUIPMENT","public":true,"active":true,"distributionHub":"https://example.com/","distributionHubOverride":"https://example.com/"}' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/calculate', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({"sandboxScenario":"calculation_not_possible","paymentInterval":"monthly","durations":[12,24,36,48,60,72,84,96,120],"calculationTypes":["leasing","partial_amortisation_leasing","rent_to_own"],"acquisitionCost":1000.23,"productSector":"IT_AND_OFFICE_EQUIPMENT","public":true,"active":true,"distributionHub":"https://example.com/","distributionHubOverride":"https://example.com/"}), }); const data = await response.json(); ``` #### POST /api/calculate/estimate Creates a Calculation resource. Creates a Calculation resource. **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | sandboxScenario | string | no | Sandbox only (PH-1017). Optional. Value calculation_not_possible forces the same empty-calculation failure (HTTP 500, EmptyCalculationException shape) as a real zero-offer miss. Outside API_ENVIRONMENT=sandbox the field is rejected with 422 and calculation is not suppressed. Omit for normal calculation. | | serviceCost | number\|null | no | | | paymentInterval | string | no | Zahlungsweise; Default monthly. monthly schlägt den konfigurierten Aufschlag (PH-577) auf die Monatsrate auf, quarterly nicht. | | durations | array | yes | Gewünschte Laufzeiten in Monaten. Berechnet werden nur Laufzeiten, für die der Partner Matrix-Konditionen hat (Filter). Je Finanzierungsart zählt deren eigene Mietfaktorenliste bei der vorausgewählten Provisionsstufe (0 %, sonst die niedrigste gepflegte Stufe): Fehlt eine Laufzeit in dieser Liste, enthält die Antwort für diese Finanzierungsart kein Angebot. Ist keine der angefragten Laufzeiten verfügbar, antwortet die API mit 422 (Violation calculation.validation.duration_not_available an durations). | | calculationTypes | array | yes | | | acquisitionCost | number\|null | no | | | productSector | string | no | API write accessor: accepts the raw JSON string so invalid values surface as Choice violations instead of enum denormalization fatals (PH-984). | | categorySlug | string\|null | no | only for internal use for now | | installationCost | number\|null | no | | | userType | string | no | | **Request example** ```json { "sandboxScenario": "calculation_not_possible", "paymentInterval": "monthly", "durations": [ 12, 24, 36, 48, 60, 72, 84, 96, 120 ], "calculationTypes": [ "leasing", "partial_amortisation_leasing", "rent_to_own" ], "acquisitionCost": 1000.23, "productSector": "IT_AND_OFFICE_EQUIPMENT", "public": true, "active": true, "distributionHub": "https://example.com/", "distributionHubOverride": "https://example.com/" } ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Calculation resource created | Calculation.CalculationResponse | | 400 | Invalid input | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/calculate/estimate' \ -H 'X-Api-Key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"sandboxScenario":"calculation_not_possible","paymentInterval":"monthly","durations":[12,24,36,48,60,72,84,96,120],"calculationTypes":["leasing","partial_amortisation_leasing","rent_to_own"],"acquisitionCost":1000.23,"productSector":"IT_AND_OFFICE_EQUIPMENT","public":true,"active":true,"distributionHub":"https://example.com/","distributionHubOverride":"https://example.com/"}' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/calculate/estimate', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({"sandboxScenario":"calculation_not_possible","paymentInterval":"monthly","durations":[12,24,36,48,60,72,84,96,120],"calculationTypes":["leasing","partial_amortisation_leasing","rent_to_own"],"acquisitionCost":1000.23,"productSector":"IT_AND_OFFICE_EQUIPMENT","public":true,"active":true,"distributionHub":"https://example.com/","distributionHubOverride":"https://example.com/"}), }); const data = await response.json(); ``` #### POST /api/calculate/estimate/bulk Estimate several products in one call (2-50 items). Creates a Calculation resource. **Request example** ```json { "items": [ { "acquisitionCost": 1000.23, "durations": [ 24, 36, 48 ], "serviceCost": 4, "productSector": "IT_AND_OFFICE_EQUIPMENT", "calculationTypes": [ "leasing", "rent_to_own", "rent" ] }, { "acquisitionCost": 2500, "durations": [ 36 ], "serviceCost": 4, "productSector": "IT_AND_OFFICE_EQUIPMENT", "calculationTypes": [ "leasing" ] } ] } ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/calculate/estimate/bulk' \ -H 'X-Api-Key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"items":[{"acquisitionCost":1000.23,"durations":[24,36,48],"serviceCost":4,"productSector":"IT_AND_OFFICE_EQUIPMENT","calculationTypes":["leasing","rent_to_own","rent"]},{"acquisitionCost":2500,"durations":[36],"serviceCost":4,"productSector":"IT_AND_OFFICE_EQUIPMENT","calculationTypes":["leasing"]}]}' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/calculate/estimate/bulk', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({"items":[{"acquisitionCost":1000.23,"durations":[24,36,48],"serviceCost":4,"productSector":"IT_AND_OFFICE_EQUIPMENT","calculationTypes":["leasing","rent_to_own","rent"]},{"acquisitionCost":2500,"durations":[36],"serviceCost":4,"productSector":"IT_AND_OFFICE_EQUIPMENT","calculationTypes":["leasing"]}]}), }); const data = await response.json(); ``` ### Quote Deprecated: superseded by Financing Case. #### GET /api/quotes/{id} Retrieves a Quote resource. Deprecated: use /api/financing_cases instead. Sunset: 2027-02-01. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | Quote identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Quote resource | Quote | | 404 | Resource not found | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/quotes/{id}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/quotes/{id}', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### Quote Request Quote requests submitted by partners. #### GET /api/quote_requests Retrieves the collection of QuoteRequest resources. Retrieves the collection of QuoteRequest resources. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | page | query | integer | no | The collection page number | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | QuoteRequest collection | array | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/quote_requests' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/quote_requests', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### POST /api/quote_requests Creates a QuoteRequest resource. Creates a QuoteRequest resource. **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | email | string | yes | Contact email address of the applicant. | | name | string\|null | no | Contact person full name (optional). | | phone | string\|null | no | Contact phone number (optional). | | company | string\|null | no | Company or organization name (optional). | | message | string\|null | no | Free-text note for the quote request (optional). | | acknowledgedPrivacy | boolean | no | Confirms the applicant accepts the privacy policy; must be true. | | firstName | string | yes | Contact person given name. | | lastName | string | yes | Contact person family name. | | customerType | string | yes | Customer classification: company, sole proprietor, or private person. | | street | string | yes | Street name of the contact address. | | houseNumber | string\|null | no | House or building number (optional). | | postalCode | string | yes | Postal / ZIP code of the address. | | city | string | yes | City or town of the address. | | country | string | yes | Country of the address. | | crefoNo | string\|null | no | Optional Crefo credit-rating number for solvency checks. | | category | mixed | no | Product category the request relates to (optional). | | calculation | string\|null | yes | Rental price calculation the request is based on (required). | | duration | integer\|null | no | Optional: duration in months of the offer the customer picked. Pass it together with calculationType; the pair must match one of the calculation's offers. A calculation with exactly one offer needs no selection. | | calculationType | string\|null | no | Optional: calculation type of the offer the customer picked (e.g. leasing). Pass it together with duration. | **Request example** ```json { "customerType": "company", "calculation": "https://example.com/" } ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | QuoteRequest resource created | QuoteRequest-quote_request.read | | 400 | Invalid input | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/quote_requests' \ -H 'X-Api-Key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"customerType":"company","calculation":"https://example.com/"}' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/quote_requests', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({"customerType":"company","calculation":"https://example.com/"}), }); const data = await response.json(); ``` #### GET /api/quote_requests/{id} Retrieves a QuoteRequest resource. Retrieves a QuoteRequest resource. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | QuoteRequest identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | QuoteRequest resource | QuoteRequest-quote_request.read | | 404 | Resource not found | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/quote_requests/{id}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/quote_requests/{id}', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### Cart Shopping cart and checkout. #### POST /api/carts Creates a Cart resource. Creates a cart and returns its financing options. A cart holds items of one article type only. The article type follows the productSector of each item: IT_AND_OFFICE_EQUIPMENT and HOME_AND_ENTERTAINMENT_ELECTRONICS are ITK, TESVOLT_ENERGY_STORAGE is TESVOLT, and every other sector is NON_ITK. The category does not decide the article type. A cart whose items have different article types is rejected with 422. **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | items | array | yes | | **Request example** ```json { "items": [ { "productNumber": "P-100200", "productName": "Industrial Drill Press", "productSku": "SKU-DRILL-5000", "quantity": 2, "price": 4540.11, "productOptions": { "color": "blue", "size": "M" }, "categoryId": 3, "categorySlug": "hardware", "devices": [ { "bwBaselineCount": 1000, "bwBaselinePrice": 0.01, "bwOveragePrice": 0.02, "colorBaselineCount": 200, "colorBaselinePrice": 0.05, "colorOveragePrice": 0.07, "scanBaselineCount": 300, "scanBaselinePrice": 0.03, "scanOveragePrice": 0.04, "locked": false }, { "bwBaselineCount": 1500, "bwBaselinePrice": 0.01, "bwOveragePrice": 0.02, "locked": false } ] } ] } ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Cart resource created | Cart.CartFinancingResponse-cart.financing | | 400 | Invalid input | | | 422 | Unprocessable entity. A field is missing or invalid, or the cart items have different article types. A cart with items of different article types is rejected before anything is stored or priced. The response (application/problem+json) carries a violations array with exactly one entry per cart item (propertyPath items[n], code MIXED_ARTICLE_TYPES, a message naming the product number and its article type). Create one cart per article type. | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/carts' \ -H 'X-Api-Key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"items":[{"productNumber":"P-100200","productName":"Industrial Drill Press","productSku":"SKU-DRILL-5000","quantity":2,"price":4540.11,"productOptions":{"color":"blue","size":"M"},"categoryId":3,"categorySlug":"hardware","devices":[{"bwBaselineCount":1000,"bwBaselinePrice":0.01,"bwOveragePrice":0.02,"colorBaselineCount":200,"colorBaselinePrice":0.05,"colorOveragePrice":0.07,"scanBaselineCount":300,"scanBaselinePrice":0.03,"scanOveragePrice":0.04,"locked":false},{"bwBaselineCount":1500,"bwBaselinePrice":0.01,"bwOveragePrice":0.02,"locked":false}]}]}' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/carts', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({"items":[{"productNumber":"P-100200","productName":"Industrial Drill Press","productSku":"SKU-DRILL-5000","quantity":2,"price":4540.11,"productOptions":{"color":"blue","size":"M"},"categoryId":3,"categorySlug":"hardware","devices":[{"bwBaselineCount":1000,"bwBaselinePrice":0.01,"bwOveragePrice":0.02,"colorBaselineCount":200,"colorBaselinePrice":0.05,"colorOveragePrice":0.07,"scanBaselineCount":300,"scanBaselinePrice":0.03,"scanOveragePrice":0.04,"locked":false},{"bwBaselineCount":1500,"bwBaselinePrice":0.01,"bwOveragePrice":0.02,"locked":false}]}]}), }); const data = await response.json(); ``` #### GET /api/carts/{id} Retrieves a Cart resource. Retrieves a Cart resource. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | Cart identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Cart resource | Cart.CartFinancingResponse-cart.financing_cart.status | | 404 | Resource not found | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/carts/{id}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/carts/{id}', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### PUT /api/carts/{id} Replaces the Cart resource. A cart holds items of one article type only. The article type follows the productSector of each item: IT_AND_OFFICE_EQUIPMENT and HOME_AND_ENTERTAINMENT_ELECTRONICS are ITK, TESVOLT_ENERGY_STORAGE is TESVOLT, and every other sector is NON_ITK. The category does not decide the article type. A cart whose items have different article types is rejected with 422. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | Cart identifier | **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | items | array | yes | | **Request example** ```json { "items": [ { "productNumber": "P-100200", "productName": "Industrial Drill Press", "productSku": "SKU-DRILL-5000", "quantity": 2, "price": 4540.11, "productOptions": { "color": "blue", "size": "M" }, "categoryId": 3, "categorySlug": "hardware", "devices": [ { "bwBaselineCount": 1000, "bwBaselinePrice": 0.01, "bwOveragePrice": 0.02, "colorBaselineCount": 200, "colorBaselinePrice": 0.05, "colorOveragePrice": 0.07, "scanBaselineCount": 300, "scanBaselinePrice": 0.03, "scanOveragePrice": 0.04, "locked": false }, { "bwBaselineCount": 1500, "bwBaselinePrice": 0.01, "bwOveragePrice": 0.02, "locked": false } ] } ] } ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Cart resource updated | Cart.CartFinancingResponse-cart.financing | | 400 | Invalid input | | | 404 | Resource not found | | | 422 | Unprocessable entity. A field is missing or invalid, or the cart items have different article types. A cart with items of different article types is rejected before anything is stored or priced. The response (application/problem+json) carries a violations array with exactly one entry per cart item (propertyPath items[n], code MIXED_ARTICLE_TYPES, a message naming the product number and its article type). Create one cart per article type. | | **cURL** ```bash curl -X PUT 'https://sandbox.partner.miete24.com/api/carts/{id}' \ -H 'X-Api-Key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"items":[{"productNumber":"P-100200","productName":"Industrial Drill Press","productSku":"SKU-DRILL-5000","quantity":2,"price":4540.11,"productOptions":{"color":"blue","size":"M"},"categoryId":3,"categorySlug":"hardware","devices":[{"bwBaselineCount":1000,"bwBaselinePrice":0.01,"bwOveragePrice":0.02,"colorBaselineCount":200,"colorBaselinePrice":0.05,"colorOveragePrice":0.07,"scanBaselineCount":300,"scanBaselinePrice":0.03,"scanOveragePrice":0.04,"locked":false},{"bwBaselineCount":1500,"bwBaselinePrice":0.01,"bwOveragePrice":0.02,"locked":false}]}]}' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/carts/{id}', { method: 'PUT', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({"items":[{"productNumber":"P-100200","productName":"Industrial Drill Press","productSku":"SKU-DRILL-5000","quantity":2,"price":4540.11,"productOptions":{"color":"blue","size":"M"},"categoryId":3,"categorySlug":"hardware","devices":[{"bwBaselineCount":1000,"bwBaselinePrice":0.01,"bwOveragePrice":0.02,"colorBaselineCount":200,"colorBaselinePrice":0.05,"colorOveragePrice":0.07,"scanBaselineCount":300,"scanBaselinePrice":0.03,"scanOveragePrice":0.04,"locked":false},{"bwBaselineCount":1500,"bwBaselinePrice":0.01,"bwOveragePrice":0.02,"locked":false}]}]}), }); const data = await response.json(); ``` #### POST /api/carts/{id}/checkout Check out a cart Creates the quote and its financing case from the cart and, unless submitFinancing is false, submits it for finance review. The response returns the financeCaseId; follow the case via GET /api/financing_cases/{id} or the financing_case.status_changed webhook. The request is rejected before anything is created with 400 when the product sector is not enabled for the partner, a category id or slug is unknown or belongs to another sector, the financing type is not offered for this duration, the duration is outside the depreciation (AfA) range of the products, or a rent quote has no valid custom SLA; 403 when the cart belongs to another partner; 404 when the cart does not exist; 409 when the cart has already been checked out, a checkout for it is still running, or the quoteNumber is already used for another quote of the partner; 422 when a field is missing, invalid or unknown, the payment interval or commission tier is not available to the partner, a Print-Plan rule is not met, an Idempotency-Key is reused with a different body, the cart items have different article types (one violation per item with code MIXED_ARTICLE_TYPES; this also applies to carts created before the rule, which GET /api/carts/{id} still returns), or the partner account has no financing partner assigned yet (detail starting with partner_financing_not_ready:). Product availability is not checked at checkout: products are created from the submitted item data, and whether the order goes ahead is decided in the review afterwards. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | Idempotency-Key | header | string | no | Unique key per checkout (a UUID v4 is recommended), at most 255 characters. A retry with the same key and body returns the original response instead of creating a second quote. Optional during the transition period announced on Versioning & Deprecation; required afterwards. | | id | path | string | yes | Cart identifier | **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | duration | integer | yes | Ausgewählte Laufzeit in Monaten | | financingType | string | yes | Financing type. Use "print_plan" (PH-590) to check the cart out as a Print-Plan contract: the cart items per-device click-billing data (CartItemCreateDto.devices) plus the printPlanContractTerms block are turned into a Print-Plan quote. serviceCost and customSlaFileName are not allowed for print_plan. PH-755: "print_plan_3kdg_12verl" and "print_plan_6kdg_12verl" are Print-Plan contract variants that behave identically but send their own producttype to GRENKE. PH-1084: every Print-Plan variant requires each cart item to reference a Print-Plan-capable category (categoryId or categorySlug of a category with hasPrintPlanCapability=true, see GET /api/product-categories); otherwise the checkout is rejected with 422 and nothing is created. | | paymentInterval | string | no | Zahlungsweise; Default monthly. | | commission | integer | no | Commission tier in percent. If omitted, the preselected tier applies: 0 if a 0 % rental factor list exists for the financing type, otherwise the lowest available tier. Only tiers for which a rental factor list is assigned to the partner are allowed. | | quoteNumber | string\|null | no | Optional custom quote number. | | submitFinancing | boolean | no | Whether the checkout starts the financing request. Optional, default true (unchanged behaviour: the quote is accepted by the customer and submitted to GRENKE). false creates the quote only, like "create quote" in the PartnerHub: status in_progress, no financing request, no GRENKE submission, no e-mail to the customer and no customer credit check. The response then reads "Quote created without financing request". The partner completes the quote, sends it to the customer or starts the financing request in the PartnerHub; read the resulting status via GET /api/financing_cases/{id} or the financing_case.status_changed webhook. Applies to every financing type including Print-Plan. | | printPlanContractTerms | mixed | no | Print-Plan contract terms (PH-590); only applied when financingType=print_plan. Optional — defaults: 5% page coverage, 15% color ratio, full maintenance. | | customer | CustomerData-cart.checkout | yes | Kundendaten | | deliveryAddress | mixed | no | Delivery address with its own recipient (PH-1119). Optional: without it the customer address is the delivery address. If that address matches the customer's stored default delivery address, the stored address is used, including a recipient stored for it in the PartnerHub; otherwise it is headed by the customer company and contact person. When present, quote, contract and offer PDF show exactly this recipient — the lessee company from the customer block is not prepended. recipientName and the address fields are mandatory, company is optional. For deliveries to a private address (e.g. an employee's home) always send this block and leave company out — a private address sent in the customer block is headed by the lessee company. Customer master data is never changed. | | serviceCost | number\|null | no | Monatliche Servicegebühr für die Miete. | | customSlaFileName | string\|null | no | Kairos "file" identifier of the custom SLA selected for this quote. | **Request example** ```json { "duration": 36, "financingType": "leasing", "paymentInterval": "monthly", "commission": 0, "quoteNumber": "PARTNER-2026-001", "submitFinancing": true, "printPlanContractTerms": { "pageCoverage": 5, "colorRatio": 15, "maintenanceTonerColor": true, "maintenanceDrums": true, "maintenanceStaples": true, "maintenancePaper": true }, "customer": { "firstName": "Anna", "lastName": "Schmidt", "email": "anna.schmidt@example.com", "street": "Hauptstrasse", "houseNumber": "12a", "zipCode": "10115", "city": "Berlin", "country": "Deutschland", "phone": "+49 30 1234567", "company": "Schmidt GmbH", "vatId": "DE123456789" }, "deliveryAddress": { "recipientName": "David Bühler", "company": null, "street": "Weingartenstraße", "houseNumber": "5", "zipCode": "79211", "city": "Denzlingen", "country": "Deutschland" }, "serviceCost": 4.5, "customSlaFileName": "gold-sla.pdf" } ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | Cart resource created | Cart.CheckoutResponseDto-checkout.response | | 400 | Invalid input | | | 422 | Unprocessable entity. Validation errors, or a business rule rejected the checkout. A detail starting with "partner_financing_not_ready:" means the partner account has no financing partner assigned yet (Miete24 is still setting it up): nothing is created, the cart stays active and the same request can be retried once the setup is complete. A violation with code MIXED_ARTICLE_TYPES (one per cart item, propertyPath items[n]) means the cart items have different article types: no quote is created and the cart stays active; this also applies to carts created before the rule. Create one cart per article type. | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/carts/{id}/checkout' \ -H 'X-Api-Key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"duration":36,"financingType":"leasing","paymentInterval":"monthly","commission":0,"quoteNumber":"PARTNER-2026-001","submitFinancing":true,"printPlanContractTerms":{"pageCoverage":5,"colorRatio":15,"maintenanceTonerColor":true,"maintenanceDrums":true,"maintenanceStaples":true,"maintenancePaper":true},"customer":{"firstName":"Anna","lastName":"Schmidt","email":"anna.schmidt@example.com","street":"Hauptstrasse","houseNumber":"12a","zipCode":"10115","city":"Berlin","country":"Deutschland","phone":"+49 30 1234567","company":"Schmidt GmbH","vatId":"DE123456789"},"deliveryAddress":{"recipientName":"David Bühler","company":null,"street":"Weingartenstraße","houseNumber":"5","zipCode":"79211","city":"Denzlingen","country":"Deutschland"},"serviceCost":4.5,"customSlaFileName":"gold-sla.pdf"}' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/carts/{id}/checkout', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({"duration":36,"financingType":"leasing","paymentInterval":"monthly","commission":0,"quoteNumber":"PARTNER-2026-001","submitFinancing":true,"printPlanContractTerms":{"pageCoverage":5,"colorRatio":15,"maintenanceTonerColor":true,"maintenanceDrums":true,"maintenanceStaples":true,"maintenancePaper":true},"customer":{"firstName":"Anna","lastName":"Schmidt","email":"anna.schmidt@example.com","street":"Hauptstrasse","houseNumber":"12a","zipCode":"10115","city":"Berlin","country":"Deutschland","phone":"+49 30 1234567","company":"Schmidt GmbH","vatId":"DE123456789"},"deliveryAddress":{"recipientName":"David Bühler","company":null,"street":"Weingartenstraße","houseNumber":"5","zipCode":"79211","city":"Denzlingen","country":"Deutschland"},"serviceCost":4.5,"customSlaFileName":"gold-sla.pdf"}), }); const data = await response.json(); ``` ### Contract Rental contracts. #### GET /api/contracts/{id} Retrieves a Contract resource. Retrieves a Contract resource. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | Contract identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Contract resource | Contract | | 404 | Resource not found | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/contracts/{id}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/contracts/{id}', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### PATCH /api/contracts/{id}/edit-contract-number Updates the Contract resource. Updates the Contract resource. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | Contract identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | Contract resource updated | Contract.ContractNumberResponse | | 400 | Invalid input | | | 403 | Forbidden | | | 404 | Resource not found | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X PATCH 'https://sandbox.partner.miete24.com/api/contracts/{id}/edit-contract-number' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/contracts/{id}/edit-contract-number', { method: 'PATCH', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### Financing Case Financing cases and their status. #### GET /api/financing_cases Retrieves the collection of FinancingCase resources. Retrieves the collection of FinancingCase resources. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | page | query | integer | no | The collection page number | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | FinancingCase collection | array | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/financing_cases' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing_cases', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### GET /api/financing_cases/{id} Retrieves a FinancingCase resource. Retrieves a FinancingCase resource. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | FinancingCase identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | FinancingCase resource | FinancingCase-financing_case.read | | 404 | Resource not found | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/financing_cases/{id}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing_cases/{id}', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### POST /api/financing_cases/{id}/cancel Cancel a financing case Cancels a financing case owned by the calling partner: the associated quote and, where applicable, contract are transitioned to CANCELED, document tokens are invalidated and open callback requests are closed. Requires a valid API key (ROLE_API_USER) and only operates on financing cases belonging to the calling partner. Status rules: a partner may cancel while the case is in a regular status. Cancellation past internal-approval points is reserved for the Miete24 Approval Team and is refused for partners — quotes in IN_PROGRESS, REJECTED_BY_CUSTOMER or FINANCE_REJECTED, and contracts after signing (signed, post_processing_required, delivery_approved, invoice_checked, completed). A signed contract therefore stays active even when its quote is canceled; an already canceled case is terminal. On success the financer / distribution hub is notified by email (where a contact address is configured) and, for partners with an active webhook endpoint, a financing_case.status_changed webhook is emitted. Responds 204 on success, 401 without a valid API key, 403 for a case owned by another partner, 404 if the case does not exist, and 422 if the case cannot be canceled in its current status. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | FinancingCase identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 204 | FinancingCase resource created | | | 400 | Invalid input | | | 403 | Forbidden | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/financing_cases/{id}/cancel' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing_cases/{id}/cancel', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### Financing Document Documents attached to a financing case. #### DELETE /api/documents/{id} [DISABLED] Delete a document [DISABLED] Soft-deletes the document. Not available: document deletion via API is out of scope and stays disabled for now. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | FinancingDocument identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 204 | FinancingDocument resource deleted | | | 403 | Forbidden | | | 404 | Resource not found | | **cURL** ```bash curl -X DELETE 'https://sandbox.partner.miete24.com/api/documents/{id}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/documents/{id}', { method: 'DELETE', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### GET /api/documents/{id} Get document metadata Returns metadata (name, size, category, review status, etc.) for a single document. Answers 404 for documents that are not available to you — the same set the document list omits. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | FinancingDocument identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | FinancingDocument resource | FinancingDocument.FinancingDocumentResponse-financing_document.read | | 403 | Forbidden | | | 404 | Resource not found | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/documents/{id}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/documents/{id}', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### GET /api/documents/{id}/download Download document file Downloads the actual file content of a document belonging to one of your financing cases. Only documents you are entitled to receive are served: files you provided yourself, plus the signed contract and the signed handover confirmation. Documents the end customer provided, Miete24-internal documents and superseded versions are not available and answer with 404 — the same documents are omitted from the document list. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | FinancingDocument identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | FinancingDocument resource | FinancingDocument | | 403 | Forbidden | | | 404 | Resource not found | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/documents/{id}/download' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/documents/{id}/download', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### GET /api/financing-cases/{financingCaseId}/documents List the documents of a financing case you may access Returns the documents of the specified financing case that are available to you: the files you provided yourself, plus the signed contract and the signed handover confirmation. Customer-provided documents, Miete24-internal documents and superseded versions are omitted, so every returned downloadUrl is guaranteed to work. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | financingCaseId | path | string | yes | FinancingDocument identifier | | page | query | integer | no | The collection page number | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | FinancingDocument collection | array | | 403 | Forbidden | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/documents' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/documents', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### POST /api/financing-cases/{financingCaseId}/documents Upload a document to a financing case Uploads a file (PDF, PNG, JPG, max 10MB) to the specified financing case. Requires category. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | financingCaseId | path | string | yes | FinancingDocument identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | FinancingDocument resource created | FinancingDocument.FinancingDocumentResponse-financing_document.read | | 400 | Invalid input | | | 403 | Forbidden | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/documents' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/documents', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### Document Request Requests for customer documents. #### GET /api/financing-cases/{financingCaseId}/document-requests List all document requests for a financing case Returns all requested documents, information requests, and fill-and-return templates for the specified financing case that are visible to the partner. Miete24-internal items are omitted. Each item includes callbackRequestId and callbackStatus when the request was created with a linked CallbackRequest. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | financingCaseId | path | string | yes | DocumentRequestListResource identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | DocumentRequestListResource collection | array | | 403 | Forbidden | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/document-requests' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/document-requests', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### GET /api/financing-cases/{financingCaseId}/document-requests/fill-and-return-templates/{templateId}/download Download a fill-and-return template Downloads the template file for a fill-and-return document request. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | financingCaseId | path | string | yes | FillAndReturnTemplateDownloadResource identifier | | templateId | path | string | yes | FillAndReturnTemplateDownloadResource identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | FillAndReturnTemplateDownloadResource resource | FillAndReturnTemplateDownloadResource | | 403 | Forbidden | | | 404 | Resource not found | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/document-requests/fill-and-return-templates/{templateId}/download' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/document-requests/fill-and-return-templates/{templateId}/download', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### POST /api/financing-cases/{financingCaseId}/document-requests/information/{informationId}/respond Respond to an information request Submits a text response to an information request on a financing case. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | financingCaseId | path | string | yes | InformationResponseRequest identifier | | informationId | path | string | yes | InformationResponseRequest identifier | **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | response | string\|null | no | | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | InformationResponseRequest resource created | InformationResponseRequest.DocumentRequestItemResponse-document_request.read | | 400 | Invalid input | | | 403 | Forbidden | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/document-requests/information/{informationId}/respond' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/document-requests/information/{informationId}/respond', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### POST /api/financing-cases/{financingCaseId}/document-requests/{type}/{itemId}/not-available Mark a document request item as not available Marks an optional partner-visible request item as not available ("liegt mir nicht vor"). Same guards as the partner portal: the item must belong to the financing case, be visible to the partner (Miete24-internal items are rejected), be optional, and still be pending. Wrong partner scope returns 403; unknown or internal items return 404. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | financingCaseId | path | string | yes | DocumentRequestNotAvailableRequest identifier | | type | path | string | yes | DocumentRequestNotAvailableRequest identifier | | itemId | path | string | yes | DocumentRequestNotAvailableRequest identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | DocumentRequestNotAvailableRequest resource created | DocumentRequestNotAvailableRequest.DocumentRequestItemResponse-document_request.read | | 400 | Invalid input | | | 403 | Forbidden | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/document-requests/{type}/{itemId}/not-available' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/document-requests/{type}/{itemId}/not-available', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### E-Signature Electronic signing of contracts. #### POST /api/financing-cases/{financingCaseId}/start-esignature Start the eSignature process for a financing case Submits authorized persons and starts the eSignature process. The financing case must have a quote in FINANCE_ACCEPTED status. Where GRENKE has issued a statement on who may sign for this customer, the submitted persons must be covered by it: every person has to appear on the statement, and the submitted set has to be able to sign under the signing rule GRENKE gave. If it is not, the request is rejected with 422 and the reason is returned in the response body. Where GRENKE has issued no statement, the submitted persons are accepted as given; the only check is that they can validly sign at all, so a single person sent with `soloSigneePermitted: false` is rejected with 422. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | financingCaseId | path | string | yes | StartESignatureRequest identifier | **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | authorizedPersons | array | yes | Persons authorized to sign; at least one is required. Generic mailbox addresses (for example info@) are rejected. A single person must be permitted to sign alone (soloSigneePermitted = true); otherwise provide at least two persons. | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | StartESignatureRequest resource created | StartESignatureRequest.StartESignatureResponse | | 400 | Invalid input | | | 403 | Forbidden | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/start-esignature' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/financing-cases/{financingCaseId}/start-esignature', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### Webhook Endpoint Webhook endpoint management. #### GET /api/webhook_endpoints Retrieves the collection of WebhookEndpoint resources. Retrieves the collection of WebhookEndpoint resources. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | page | query | integer | no | The collection page number | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | WebhookEndpoint collection | array | | 403 | Forbidden | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/webhook_endpoints' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/webhook_endpoints', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### POST /api/webhook_endpoints Creates a WebhookEndpoint resource. Creates a WebhookEndpoint resource. **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | url | string\|null | yes | HTTPS URL that receives event notifications via POST. | | active | boolean | no | Whether deliveries to this endpoint are enabled. | **Request example** ```json { "url": "https://crm.example.com/webhooks/printer4you", "active": true } ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 201 | WebhookEndpoint resource created | WebhookEndpoint.WebhookEndpointSecretResponse-webhook_endpoint.secret | | 400 | Invalid input | | | 403 | Forbidden | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/webhook_endpoints' \ -H 'X-Api-Key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"url":"https://crm.example.com/webhooks/printer4you","active":true}' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/webhook_endpoints', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({"url":"https://crm.example.com/webhooks/printer4you","active":true}), }); const data = await response.json(); ``` #### DELETE /api/webhook_endpoints/{ulid} Removes the WebhookEndpoint resource. Removes the WebhookEndpoint resource. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | ulid | path | string | yes | WebhookEndpoint identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 204 | WebhookEndpoint resource deleted | | | 403 | Forbidden | | | 404 | Resource not found | | **cURL** ```bash curl -X DELETE 'https://sandbox.partner.miete24.com/api/webhook_endpoints/{ulid}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/webhook_endpoints/{ulid}', { method: 'DELETE', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### GET /api/webhook_endpoints/{ulid} Retrieves a WebhookEndpoint resource. Retrieves a WebhookEndpoint resource. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | ulid | path | string | yes | WebhookEndpoint identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | WebhookEndpoint resource | WebhookEndpoint-webhook_endpoint.read | | 403 | Forbidden | | | 404 | Resource not found | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/webhook_endpoints/{ulid}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/webhook_endpoints/{ulid}', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### PATCH /api/webhook_endpoints/{ulid} Updates the WebhookEndpoint resource. Updates the WebhookEndpoint resource. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | ulid | path | string | yes | WebhookEndpoint identifier | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | WebhookEndpoint resource updated | WebhookEndpoint-webhook_endpoint.read | | 400 | Invalid input | | | 403 | Forbidden | | | 404 | Resource not found | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X PATCH 'https://sandbox.partner.miete24.com/api/webhook_endpoints/{ulid}' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/webhook_endpoints/{ulid}', { method: 'PATCH', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### Product Category Product category catalog. #### GET /api/product-categories List all product categories Returns all available product categories with id, slug, and name. Use the slug in cart checkout requests (categorySlug field) for precise AfA duration validation. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | page | query | integer | no | The collection page number | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | ProductCategoriesResource collection | array | | 403 | Forbidden | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/product-categories' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/product-categories', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### Product Sector Product sector catalog. #### GET /api/product-sectors List the allowed product sectors of the authenticated partner Returns the product sectors the authenticated partner is allowed to use, each with its machine-readable value and a human-readable label. Partners without a configured allowlist receive all sectors. Use the value in cart checkout requests to stay within the allowed sectors. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | page | query | integer | no | The collection page number | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | ProductSectorsResource collection | array | | 403 | Forbidden | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/product-sectors' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/product-sectors', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### SLA Service level agreements. #### GET /api/sla-files List custom SLA files available for the authenticated partner Returns the list of custom SLA descriptors (name + file identifier) fetched from Kairos for the authenticated partner's distribution hub. Soft-deleted SLAs are filtered out. Returns an empty list if the partner has no hub, the hub is not connected to Kairos, or Kairos is temporarily unreachable. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | page | query | integer | no | The collection page number | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | SlaFileListResource collection | array | | 403 | Forbidden | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/sla-files' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/sla-files', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ### Sandbox Sandbox test endpoints. Also: optional sandboxScenario on POST /api/calculate and /api/calculate/estimate (calculation_not_possible). #### POST /api/sandbox/financing_cases/{id}/finance-decision Sandbox only: trigger a finance decision for a test financing case Sandbox-only endpoint for integration partners: drives the quote of a test financing case to FINANCE_ACCEPTED or FINANCE_REJECTED end-to-end, without an HMAC signature, response hash or Kairos call. Requires a sandbox API key (ROLE_API_USER) and only operates on financing cases owned by the calling partner. The quote state machine is driven directly, so the same downstream subscribers (partner mails, webhooks) fire as for a real decision. Responds 204 on success, 422 when the quote is in a non-decidable state, and 404 outside the sandbox environment (where the endpoint is inactive). **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | FinancingCase identifier | **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | decision | string\|null | yes | | **Responses** | Status | Description | Schema | | --- | --- | --- | | 204 | FinancingCase resource created | | | 400 | Invalid input | | | 403 | Forbidden | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/sandbox/financing_cases/{id}/finance-decision' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/sandbox/financing_cases/{id}/finance-decision', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` #### POST /api/sandbox/financing_cases/{id}/simulate Sandbox only: simulate a financing-case scenario Sandbox-only generic simulation endpoint for integration partners: drives a test financing case into a named state via real quote/contract state-machine transitions or creates real document-request entities, without HMAC, response hash or live Kairos/GRENKE/DocuSign calls. Request body: {"scenario":"","data":{...}} where data is optional. Supported scenario values: finance_review (REQUEST_FINANCE_REVIEW with skip_financing_submission, synthesises an active FinancingResponse), manual_finance_review (START_MANUAL_FINANCE_REVIEW), finance_accepted (same path as finance-decision accepted, including an active FinancingResponse so start-esignature works), finance_rejected (same path as finance-decision rejected; optional data.rejectionReason is stored and exposed as rejectionReason on GET /financing_cases/{id}), canceled (same cancellation rules as POST /financing_cases/{id}/cancel, including CancelOverridePolicy), information_requested (creates RequestedInformation from data.question or data.items[].question; appears in GET document-requests and is answerable via the regular information respond endpoint), requested_document (creates RequestedDocument from data.label+data.category or data.items[]; financing-stage document categories only; invalid category → 422 listing allowed values), requested_fill_and_return (same shape for fill-and-return financing-stage categories), change_requested (Quote REQUEST_CHANGES from in_review only with required data.message; otherwise 422), document_rejected (rejects a PENDING_REVIEW FinancingDocument via required data.documentId; optional data.reason; linked request reappears open in GET document-requests for re-upload; foreign documentId → 404; already rejected / not rejectable → 422), upload_rejected_type / upload_rejected_size (require data.documentId of an open RequestedDocument or RequestedFillAndReturn; return the same HTTP 400 Bad Request payload as a real MIME-/size-rejected upload — no special sandbox format; missing / foreign / closed documentId → 422), wait_for_signing / signed / post_processing_required / delivery_approved / invoice_checked / completed (Contract SM places; creates a Contract at wait_for_signing when missing without DocuSign; signed attaches an idempotent SIGNED_CONTRACT FinancingDocument that is listable and PDF-downloadable; completed requires a contract number else 422; unreachable transitions → 422 naming current and desired status), signature_sent / signature_signed / signature_declined (e-signature intermediate envelope states without DocuSign API; require Contract at wait_for_signing — created when missing; create/update a local DocuSignEnvelope + customer recipient; optional data.reason for signature_declined; unreachable → 422 naming current and desired status), reset (data.targetStatus required; rewinds to an earlier quote/contract place with cleanup of open requests and simulated SIGNED_CONTRACT docs; does not delete the case; allowed targetStatus: accepted_by_customer, finance_review, manual_finance_review, finance_accepted, finance_rejected, wait_for_signing, signed, post_processing_required, delivery_approved, invoice_checked; missing/invalid → 422 listing allowed values). Created request entities have no sandbox marker in the payload. Requires a sandbox API key (ROLE_API_USER) and only operates on financing cases owned by the calling partner. Responds 204 on success (or HTTP 400 with the production upload error payload for upload_rejected_*), 401 without a valid API key, 403 for a case owned by another partner, 404 if the case does not exist or outside the sandbox environment (API_ENVIRONMENT != sandbox, where the endpoint is inactive and applies no transition), and 422 for an unknown scenario (message lists allowed values), invalid category, missing required data, or when the scenario is unreachable from the current state (message names current and desired status). The legacy finance-decision endpoint remains available and unchanged. Related (PH-1017): POST /api/calculate and /api/calculate/estimate accept optional body field sandboxScenario. Value calculation_not_possible forces the same empty-calculation failure (HTTP 500, EmptyCalculationException shape) as a real zero-offer miss; outside API_ENVIRONMENT=sandbox the field is rejected with 422 and calculation is not suppressed. Omit the field for normal calculation. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | id | path | string | yes | FinancingCase identifier | **Request body** | Property | Type | Required | Description | | --- | --- | --- | --- | | scenario | string\|null | yes | Scenario to apply. Supported values: finance_review, manual_finance_review, finance_accepted, finance_rejected, canceled, information_requested, requested_document, requested_fill_and_return, change_requested, document_rejected, upload_rejected_type, upload_rejected_size, wait_for_signing, signed, post_processing_required, delivery_approved, invoice_checked, completed, signature_sent, signature_signed, signature_declined, reset. | | data | object | no | Optional scenario-specific payload. finance_rejected: rejectionReason (string). information_requested: question (string) or items[{question}]. requested_document: label+category or items[{label,category}]; allowed categories: business_registration, annual_financial_statement, business_assessment, self_disclosure, medical_license, purchase_offer, notarized_transfer_contract, land_register_extract, property_owner_consent, partnership_agreement. requested_fill_and_return: same shape; allowed categories: self_disclosure_template, default_guarantee. change_requested: message (string, required; Quote must be in_review). document_rejected: documentId (int, required) of a PENDING_REVIEW FinancingDocument on this case; optional reason (string). Foreign/missing documentId → 404; already rejected / not rejectable → 422. Re-opens the linked request in GET document-requests for re-upload. Contract-phase scenarios (wait_for_signing, signed, post_processing_required, delivery_approved, invoice_checked, completed) take no data; signed attaches an idempotent SIGNED_CONTRACT FinancingDocument (listable + PDF downloadable, no DocuSign); completed requires a contract number else 422; unreachable transitions return 422 naming current and desired status. upload_rejected_type / upload_rejected_size: data.documentId (int, required) of an open RequestedDocument or RequestedFillAndReturn on this case; returns the same HTTP 400 Bad Request payload as a real MIME-/size-rejected upload (no special sandbox format). Missing / foreign / closed documentId → 422. signature_sent / signature_signed / signature_declined (PH-1048): require Contract at wait_for_signing (created when missing, no DocuSign API); create/update a local DocuSignEnvelope + customer recipient into sent / signed / declined; optional data.reason for signature_declined; unreachable envelope transitions → 422 naming current and desired status; idempotent when already at the target envelope status. reset: data.targetStatus (string, required) rewinds the case to an earlier place with cleanup of open requests and simulated SIGNED_CONTRACT docs; does not delete the case. Allowed targetStatus: accepted_by_customer, finance_review, manual_finance_review, finance_accepted, finance_rejected, wait_for_signing, signed, post_processing_required, delivery_approved, invoice_checked. Missing/invalid targetStatus → 422 listing allowed values. | **Request example** ```json { "scenario": "finance_accepted" } ``` **Responses** | Status | Description | Schema | | --- | --- | --- | | 204 | FinancingCase resource created | | | 400 | Invalid input | | | 403 | Forbidden | | | 422 | Unprocessable entity | | **cURL** ```bash curl -X POST 'https://sandbox.partner.miete24.com/api/sandbox/financing_cases/{id}/simulate' \ -H 'X-Api-Key: YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"scenario":"finance_accepted"}' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/sandbox/financing_cases/{id}/simulate', { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({"scenario":"finance_accepted"}), }); const data = await response.json(); ``` ### Calculation Type Financing types the partner may offer. #### GET /api/calculation-types List the calculation types the authenticated partner may offer Returns the financing types the authenticated partner is allowed to offer, each with its machine-readable value and a human-readable label, in the order the portal displays them. The set follows the rental factor matrices configured for the partner, complemented per article type by those of its distribution hub where the partner has none of its own. A partner with no matrices at all and no hub receives an empty list — that is a valid answer, not an error. Use the value in calculation requests. **Parameters** | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | page | query | integer | no | The collection page number | **Responses** | Status | Description | Schema | | --- | --- | --- | | 200 | CalculationTypesResource collection | array | | 403 | Forbidden | | **cURL** ```bash curl -X GET 'https://sandbox.partner.miete24.com/api/calculation-types' \ -H 'X-Api-Key: YOUR_API_KEY' ``` **JavaScript** ```javascript const response = await fetch('https://sandbox.partner.miete24.com/api/calculation-types', { method: 'GET', headers: { 'X-Api-Key': 'YOUR_API_KEY', }, }); const data = await response.json(); ``` ## Lifecycles ### Quote Lifecycle The full server-side state machine of a rental quote, from draft to completion. **Transitions** | Transition | From | To | | --- | --- | --- | | finalize | in_progress | in_review | | reactivate | review_expired | in_review | | apply_changes | change_requested | in_review | | accept_by_customer | in_review | accepted_by_customer | | accept_by_customer | in_progress | accepted_by_customer | | request_finance_review | accepted_by_customer | finance_review | | request_finance_review_direct | in_progress | finance_review | | finance_accept | finance_review | finance_accepted | | finance_accept | manual_finance_review | finance_accepted | | finance_accept | finance_questions | finance_accepted | | finance_accept | finance_rejected | finance_accepted | | complete | finance_accepted | completed | | execute_frame_call_off | in_progress | completed | | execute_frame_call_off | accepted_by_customer | completed | | request_frame_call_off_confirmation | in_progress | in_review | | request_frame_call_off_confirmation | accepted_by_customer | in_review | | request_changes | in_review | change_requested | | finance_needs_help | finance_review | finance_questions | | finance_needs_help | manual_finance_review | finance_questions | | start_manual_finance_review | accepted_by_customer | manual_finance_review | | start_manual_finance_review | in_progress | manual_finance_review | | reject_by_customer | in_review | rejected_by_customer | | expire | in_review | review_expired | | cancel | in_progress | canceled | | cancel | in_review | canceled | | cancel | review_expired | canceled | | cancel | change_requested | canceled | | cancel | accepted_by_customer | canceled | | cancel | rejected_by_customer | canceled | | cancel | finance_review | canceled | | cancel | manual_finance_review | canceled | | cancel | finance_questions | canceled | | cancel | finance_accepted | canceled | | cancel | finance_rejected | canceled | | cancel | completed | canceled | | finance_reject | finance_review | finance_rejected | | finance_reject | manual_finance_review | finance_rejected | | finance_reject | finance_questions | finance_rejected | | finance_resume | finance_rejected | finance_accepted | ```mermaid graph TB place0(["in_progress"]) place1(("in_review")) place2(("review_expired")) place3(("change_requested")) place4(("accepted_by_customer")) place5(("rejected_by_customer")) place6(("finance_review")) place7(("manual_finance_review")) place8(("finance_questions")) place9(("finance_accepted")) place10(("finance_rejected")) place11(("completed")) place12(("canceled")) place0-->|"finalize"|place1 place2-->|"reactivate"|place1 place3-->|"apply_changes"|place1 place1-->|"accept_by_customer"|place4 place0-->|"accept_by_customer"|place4 place4-->|"request_finance_review"|place6 place0-->|"request_finance_review_direct"|place6 place6-->|"finance_accept"|place9 place7-->|"finance_accept"|place9 place8-->|"finance_accept"|place9 place10-->|"finance_accept"|place9 place9-->|"complete"|place11 place0-->|"execute_frame_call_off"|place11 place4-->|"execute_frame_call_off"|place11 place0-->|"request_frame_call_off_confirmation"|place1 place4-->|"request_frame_call_off_confirmation"|place1 place1-->|"request_changes"|place3 place6-->|"finance_needs_help"|place8 place7-->|"finance_needs_help"|place8 place4-->|"start_manual_finance_review"|place7 place0-->|"start_manual_finance_review"|place7 place1-->|"reject_by_customer"|place5 place1-->|"expire"|place2 place0-->|"cancel"|place12 place1-->|"cancel"|place12 place2-->|"cancel"|place12 place3-->|"cancel"|place12 place4-->|"cancel"|place12 place5-->|"cancel"|place12 place6-->|"cancel"|place12 place7-->|"cancel"|place12 place8-->|"cancel"|place12 place9-->|"cancel"|place12 place10-->|"cancel"|place12 place11-->|"cancel"|place12 place6-->|"finance_reject"|place10 place7-->|"finance_reject"|place10 place8-->|"finance_reject"|place10 place10-->|"finance_resume"|place9 ``` ### Financing Flow The financing states of a quote (a filtered view of the quote lifecycle), from finance review to acceptance. **Transitions** | Transition | From | To | | --- | --- | --- | | request_finance_review | accepted_by_customer | finance_review | | request_finance_review_direct | in_progress | finance_review | | finance_accept | finance_review | finance_accepted | | finance_accept | manual_finance_review | finance_accepted | | finance_accept | finance_questions | finance_accepted | | finance_accept | finance_rejected | finance_accepted | | complete | finance_accepted | completed | | finance_needs_help | finance_review | finance_questions | | finance_needs_help | manual_finance_review | finance_questions | | start_manual_finance_review | accepted_by_customer | manual_finance_review | | start_manual_finance_review | in_progress | manual_finance_review | | finance_reject | finance_review | finance_rejected | | finance_reject | manual_finance_review | finance_rejected | | finance_reject | finance_questions | finance_rejected | | finance_resume | finance_rejected | finance_accepted | ```mermaid graph TB place0(["accepted_by_customer"]) place1(("finance_review")) place2(("in_progress")) place3(("finance_accepted")) place4(("manual_finance_review")) place5(("finance_questions")) place6(("finance_rejected")) place7(("completed")) place0-->|"request_finance_review"|place1 place2-->|"request_finance_review_direct"|place1 place1-->|"finance_accept"|place3 place4-->|"finance_accept"|place3 place5-->|"finance_accept"|place3 place6-->|"finance_accept"|place3 place3-->|"complete"|place7 place1-->|"finance_needs_help"|place5 place4-->|"finance_needs_help"|place5 place0-->|"start_manual_finance_review"|place4 place2-->|"start_manual_finance_review"|place4 place1-->|"finance_reject"|place6 place4-->|"finance_reject"|place6 place5-->|"finance_reject"|place6 place6-->|"finance_resume"|place3 ``` ### Contract Lifecycle The state machine of a signed contract, from signing to completion. **Transitions** | Transition | From | To | | --- | --- | --- | | sign | wait_for_signing | signed | | deliver | signed | delivery_approved | | deliver | post_processing_required | delivery_approved | | invoice_check | delivery_approved | invoice_checked | | complete | invoice_checked | completed | | post_processing | signed | post_processing_required | | cancel | wait_for_signing | canceled | | cancel | signed | canceled | | cancel | post_processing_required | canceled | | cancel | delivery_approved | canceled | | cancel | invoice_checked | canceled | | cancel | completed | canceled | ```mermaid graph TB place0(["wait_for_signing"]) place1(("signed")) place2(("post_processing_required")) place3(("delivery_approved")) place4(("invoice_checked")) place5(("completed")) place6(("canceled")) place0-->|"sign"|place1 place1-->|"deliver"|place3 place2-->|"deliver"|place3 place3-->|"invoice_check"|place4 place4-->|"complete"|place5 place1-->|"post_processing"|place2 place0-->|"cancel"|place6 place1-->|"cancel"|place6 place2-->|"cancel"|place6 place3-->|"cancel"|place6 place4-->|"cancel"|place6 place5-->|"cancel"|place6 ``` ### Quote Request Lifecycle The state machine of a partner quote request. **Transitions** | Transition | From | To | | --- | --- | --- | | convert_to_quote | pending | converted | | reject | pending | rejected | ```mermaid graph TB place0(["pending"]) place1(("converted")) place2(("rejected")) place0-->|"convert_to_quote"|place1 place0-->|"reject"|place2 ``` ## Data-model relationships | From | Property | To | Cardinality | | --- | --- | --- | --- | | Calculation | response | CalculationResponse | one | | Calculation.BulkCalculationResponse | results | BulkCalculationItemResult | many | | Calculation.CalculationResponse | offers | OfferItem | many | | Calculation.CalculationResponse | request | CalculateRentalPriceRequest | one | | CalculationResponse | offers | OfferItem | many | | CalculationResponse | request | CalculateRentalPriceRequest | one | | Cart.CartCheckoutRequest-cart.checkout | customer | CustomerData-cart.checkout | one | | Cart.CartCheckoutRequest.jsonld-cart.checkout | customer | CustomerData.jsonld-cart.checkout | one | | Cart.CartCreateDto-cart.create | items | CartItemCreateDto-cart.create | many | | Cart.CartCreateDto.jsonld-cart.create | items | CartItemCreateDto.jsonld-cart.create | many | | Cart.CartFinancingResponse-cart.financing | financingOptions | CartFinancingOptions-cart.financing | one | | Cart.CartFinancingResponse-cart.financing | items | CartItemFinancingResponse-cart.financing | many | | Cart.CartFinancingResponse-cart.financing_cart.status | financingOptions | CartFinancingOptions-cart.financing_cart.status | one | | Cart.CartFinancingResponse-cart.financing_cart.status | items | CartItemFinancingResponse-cart.financing_cart.status | many | | Cart.CartFinancingResponse.jsonld-cart.financing | financingOptions | CartFinancingOptions.jsonld-cart.financing | one | | Cart.CartFinancingResponse.jsonld-cart.financing | items | CartItemFinancingResponse.jsonld-cart.financing | many | | Cart.CartFinancingResponse.jsonld-cart.financing_cart.status | financingOptions | CartFinancingOptions.jsonld-cart.financing_cart.status | one | | Cart.CartFinancingResponse.jsonld-cart.financing_cart.status | items | CartItemFinancingResponse.jsonld-cart.financing_cart.status | many | | CartItemFinancingResponse-cart.financing | financingOptions | CartFinancingOptions-cart.financing | one | | CartItemFinancingResponse-cart.financing_cart.status | financingOptions | CartFinancingOptions-cart.financing_cart.status | one | | CartItemFinancingResponse.jsonld-cart.financing | financingOptions | CartFinancingOptions.jsonld-cart.financing | one | | CartItemFinancingResponse.jsonld-cart.financing_cart.status | financingOptions | CartFinancingOptions.jsonld-cart.financing_cart.status | one | | Contract | authorizedPersons | AuthorizedPerson | many | | Contract | contactAddress | ContractAddress | one | | Contract | customer | Customer | one | | Contract | items | ContractItem | many | | Contract | shippingAddress | ContractAddress | one | | Customer | addresses | Address | many | | Customer | authorizedPersons | AuthorizedPerson | many | | Customer | contactAddresses | Address | many | | Customer | partner | Partner | one | | Customer | shippingAddresses | Address | many | | FinancingCase-financing_case.read | partner | Partner-financing_case.read | one | | FinancingCase-financing_case.read | quotes | Quote-financing_case.read | many | | FinancingCase-financing_case.read | requestedDocuments | RequestedDocument-financing_case.read | many | | FinancingCase-financing_case.read | requestedFillAndReturns | RequestedFillAndReturn-financing_case.read | many | | FinancingCase-financing_case.read | requestedInformation | RequestedInformation-financing_case.read | many | | FinancingCase-financing_case.read | requestedItems | RequestedItemInterface-financing_case.read | many | | FinancingCase.jsonld-financing_case.read | partner | Partner.jsonld-financing_case.read | one | | FinancingCase.jsonld-financing_case.read | quotes | Quote.jsonld-financing_case.read | many | | FinancingCase.jsonld-financing_case.read | requestedDocuments | RequestedDocument.jsonld-financing_case.read | many | | FinancingCase.jsonld-financing_case.read | requestedFillAndReturns | RequestedFillAndReturn.jsonld-financing_case.read | many | | FinancingCase.jsonld-financing_case.read | requestedInformation | RequestedInformation.jsonld-financing_case.read | many | | FinancingCase.jsonld-financing_case.read | requestedItems | RequestedItemInterface.jsonld-financing_case.read | many | | Profile | addresses | Address | many | | Quote | activeFinancingResponses | Collection | one | | Quote | authorizedPersons | AuthorizedPerson | many | | Quote | items | QuoteItem | many | | Quote | partner | Partner | one | | Quote | quoteFeedbacks | QuoteFeedback | many | | Quote-financing_case.read | authorizedPersons | AuthorizedPerson-financing_case.read | many | | Quote-financing_case.read | items | QuoteItem-financing_case.read | many | | Quote.jsonld-financing_case.read | authorizedPersons | AuthorizedPerson.jsonld-financing_case.read | many | | Quote.jsonld-financing_case.read | items | QuoteItem.jsonld-financing_case.read | many | | RequestedDocument | activeResponseDocuments | FinancingDocument | many | | RequestedDocument | responseDocuments | FinancingDocument | many | | RequestedDocument | transmittableResponseDocuments | FinancingDocument | many | | RequestedDocument | verifiedResponseDocuments | FinancingDocument | many | | RequestedFillAndReturn | activeResponseDocuments | FinancingDocument | many | | RequestedFillAndReturn | responseDocuments | FinancingDocument | many | | RequestedFillAndReturn | transmittableResponseDocuments | FinancingDocument | many | | RequestedFillAndReturn | verifiedResponseDocuments | FinancingDocument | many | | StartESignatureRequest | authorizedPersons | AuthorizedPersonData | many | | User | customers | Customer | many | | User | distributionHubs | DistributionHub | many | | User | dois | DOI | many | | User | quotes | Quote | many | | WebhookEndpoint | partner | Partner | one | ## Schemas Component schemas and their allowed values, from the OpenAPI spec. ### Address | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | partner | mixed | | no | | | isDefault | boolean | | no | | | id | integer | | no | | | street | string | | yes | | | number | string | | yes | | | postalCode | string | | yes | | | city | string | | yes | | | country | string | | yes | | | type | string | | no | | | recipientName | string\|null | | no | Recipient named on the delivery address (PH-1119); null when the address is headed by the customer company and contact person. | | recipientCompany | string\|null | | no | Company line of the delivery address (PH-1119); null for a private delivery target or when the address carries no recipient of its own. | | default | boolean | | no | | | shippingAddress | boolean | | no | | | contactAddress | boolean | | no | | | recipient | boolean | | no | Whether this address carries its own recipient lines (PH-1119). | ### Address-financing_case.read _No documented properties._ ### Address.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | ### AuthorizedPerson | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | firstName | string | | yes | | | lastName | string | | yes | | | email | string | | yes | | | confirmedByExternal | boolean | | no | | | soloSigneePermitted | boolean | | no | | | createdAt | string | | no | | | updatedAt | string | | no | | ### AuthorizedPerson-financing_case.read _No documented properties._ ### AuthorizedPerson.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | ### AuthorizedPersonData | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | firstName | string | | yes | Given name of the authorized signer. | | lastName | string | | yes | Family name of the authorized signer. | | email | string | | yes | Email address the signature invitation is sent to. | | soloSigneePermitted | boolean | | no | If true this person may sign alone (default false). Must be true when this is the only authorized person; otherwise submit at least two persons. | ### BulkCalculationItemResult | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | index | integer | | no | | | success | boolean | | no | | | response | mixed | | no | | | error | array\|null | | no | | ### CalculateRentalPriceRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | sandboxScenario | string | calculation_not_possible | no | Sandbox only (PH-1017). Optional. Value calculation_not_possible forces the same empty-calculation failure (HTTP 500, EmptyCalculationException shape) as a real zero-offer miss. Outside API_ENVIRONMENT=sandbox the field is rejected with 422 and calculation is not suppressed. Omit for normal calculation. | | allowedProductSectors | array | | no | | | serviceCost | number\|null | | no | | | paymentInterval | string | monthly, quarterly | no | Zahlungsweise; Default monthly. monthly schlägt den konfigurierten Aufschlag (PH-577) auf die Monatsrate auf, quarterly nicht. | | durations | array | | yes | Gewünschte Laufzeiten in Monaten. Berechnet werden nur Laufzeiten, für die der Partner Matrix-Konditionen hat (Filter). Je Finanzierungsart zählt deren eigene Mietfaktorenliste bei der vorausgewählten Provisionsstufe (0 %, sonst die niedrigste gepflegte Stufe): Fehlt eine Laufzeit in dieser Liste, enthält die Antwort für diese Finanzierungsart kein Angebot. Ist keine der angefragten Laufzeiten verfügbar, antwortet die API mit 422 (Violation calculation.validation.duration_not_available an durations). | | type | integer\|null | 0, 1, 2, | no | | | calculationTypes | array | | yes | | | acquisitionCost | number\|null | | no | | | productSector | string | IT_AND_OFFICE_EQUIPMENT, TESVOLT_ENERGY_STORAGE, RENEWABLE_ENERGY_AND_ENERGY_STORAGE, FURNITURE_AND_HOME_ACCESSORIES, MEDICAL_DEVICES, KITCHEN_AND_GASTRONOMY_EQUIPMENT, EVENT_TECHNOLOGY, HOME_AND_ENTERTAINMENT_ELECTRONICS, CONSTRUCTION_MACHINERY_AND_TOOLS, TRANSPORT_AND_LOGISTICS_EQUIPMENT, PHOTO_AND_VIDEO_TECHNOLOGY, FITNESS_AND_SPORTS_EQUIPMENT, SECURITY_EQUIPMENT, POINT_OF_SALES, OTHERS | no | API write accessor: accepts the raw JSON string so invalid values surface as Choice violations instead of enum denormalization fatals (PH-984). | | category | mixed | | no | | | categorySlug | string\|null | | no | only for internal use for now | | installationCost | number\|null | | no | | | public | boolean | | no | | | active | boolean | | no | | | distributionHub | string\|null | | no | | | persistedRentalFactor | string\|null | | no | Rental factor (DECIMAL(7,3) string) frozen onto the source quote (PH-486), or null for ad-hoc estimates that must price from the live lookup. | | userType | string | customer, partner | no | | | requestType | integer | 0, 1, 2 | no | | | completeAcquisitionCost | number | | no | | | partnerCalculation | boolean | | no | | | selectedCalculationTypes | array | | no | | | selectedDurations | array | | no | | | distributionHubOverride | string\|null | | no | | | complete | boolean | | no | A request is complete when a ProductSector can be resolved (either set explicitly or derived from a Category). Single source of truth for the boundary validation, the controller pre-form check, and the form-builder defense-in-depth guard. | ### Calculation | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | uri | string\|null | | no | | | requestFormUri | string\|null | | no | | | id | string\|null | | no | | | quote | mixed | | no | | | createdAt | string | | no | | | category | mixed | | no | | | response | CalculationResponse | | no | | ### Calculation.BulkCalculationResponse | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | results | array | | no | | ### Calculation.CalculateRentalPriceRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | sandboxScenario | string | calculation_not_possible | no | Sandbox only (PH-1017). Optional. Value calculation_not_possible forces the same empty-calculation failure (HTTP 500, EmptyCalculationException shape) as a real zero-offer miss. Outside API_ENVIRONMENT=sandbox the field is rejected with 422 and calculation is not suppressed. Omit for normal calculation. | | allowedProductSectors | array | | no | | | serviceCost | number\|null | | no | | | paymentInterval | string | monthly, quarterly | no | Zahlungsweise; Default monthly. monthly schlägt den konfigurierten Aufschlag (PH-577) auf die Monatsrate auf, quarterly nicht. | | durations | array | | yes | Gewünschte Laufzeiten in Monaten. Berechnet werden nur Laufzeiten, für die der Partner Matrix-Konditionen hat (Filter). Je Finanzierungsart zählt deren eigene Mietfaktorenliste bei der vorausgewählten Provisionsstufe (0 %, sonst die niedrigste gepflegte Stufe): Fehlt eine Laufzeit in dieser Liste, enthält die Antwort für diese Finanzierungsart kein Angebot. Ist keine der angefragten Laufzeiten verfügbar, antwortet die API mit 422 (Violation calculation.validation.duration_not_available an durations). | | type | integer\|null | 0, 1, 2, | no | | | calculationTypes | array | | yes | | | acquisitionCost | number\|null | | no | | | productSector | string | IT_AND_OFFICE_EQUIPMENT, TESVOLT_ENERGY_STORAGE, RENEWABLE_ENERGY_AND_ENERGY_STORAGE, FURNITURE_AND_HOME_ACCESSORIES, MEDICAL_DEVICES, KITCHEN_AND_GASTRONOMY_EQUIPMENT, EVENT_TECHNOLOGY, HOME_AND_ENTERTAINMENT_ELECTRONICS, CONSTRUCTION_MACHINERY_AND_TOOLS, TRANSPORT_AND_LOGISTICS_EQUIPMENT, PHOTO_AND_VIDEO_TECHNOLOGY, FITNESS_AND_SPORTS_EQUIPMENT, SECURITY_EQUIPMENT, POINT_OF_SALES, OTHERS | no | API write accessor: accepts the raw JSON string so invalid values surface as Choice violations instead of enum denormalization fatals (PH-984). | | category | mixed | | no | | | categorySlug | string\|null | | no | only for internal use for now | | installationCost | number\|null | | no | | | public | boolean | | no | | | active | boolean | | no | | | distributionHub | string\|null | | no | | | persistedRentalFactor | string\|null | | no | Rental factor (DECIMAL(7,3) string) frozen onto the source quote (PH-486), or null for ad-hoc estimates that must price from the live lookup. | | userType | string | customer, partner | no | | | requestType | integer | 0, 1, 2 | no | | | completeAcquisitionCost | number | | no | | | partnerCalculation | boolean | | no | | | selectedCalculationTypes | array | | no | | | selectedDurations | array | | no | | | distributionHubOverride | string\|null | | no | | | complete | boolean | | no | A request is complete when a ProductSector can be resolved (either set explicitly or derived from a Category). Single source of truth for the boundary validation, the controller pre-form check, and the form-builder defense-in-depth guard. | ### Calculation.CalculationResponse | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | offers | array | | no | | | request | CalculateRentalPriceRequest | | no | | | currency | string | | no | | | selectedOffer | mixed | | no | | ### CalculationResponse | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | offers | array | | no | | | request | CalculateRentalPriceRequest | | no | | | currency | string | | no | | | selectedOffer | mixed | | no | | ### CalculationTypesResource.CalculationTypeResponse | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | value | string | | no | Machine-readable financing type, e.g. "leasing". Use this in calculation requests. | | label | string | | no | Human-readable label in the language negotiated via Accept-Language. | ### Cart.CartCheckoutRequest-cart.checkout | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | duration | integer | | yes | Ausgewählte Laufzeit in Monaten | | financingType | string | rent, rent_to_own, leasing, print_plan, print_plan_3kdg_12verl, print_plan_6kdg_12verl | yes | Financing type. Use "print_plan" (PH-590) to check the cart out as a Print-Plan contract: the cart items per-device click-billing data (CartItemCreateDto.devices) plus the printPlanContractTerms block are turned into a Print-Plan quote. serviceCost and customSlaFileName are not allowed for print_plan. PH-755: "print_plan_3kdg_12verl" and "print_plan_6kdg_12verl" are Print-Plan contract variants that behave identically but send their own producttype to GRENKE. PH-1084: every Print-Plan variant requires each cart item to reference a Print-Plan-capable category (categoryId or categorySlug of a category with hasPrintPlanCapability=true, see GET /api/product-categories); otherwise the checkout is rejected with 422 and nothing is created. | | paymentInterval | string | monthly, quarterly | no | Zahlungsweise; Default monthly. | | commission | integer | | no | Commission tier in percent. If omitted, the preselected tier applies: 0 if a 0 % rental factor list exists for the financing type, otherwise the lowest available tier. Only tiers for which a rental factor list is assigned to the partner are allowed. | | quoteNumber | string\|null | | no | Optional custom quote number. | | submitFinancing | boolean | | no | Whether the checkout starts the financing request. Optional, default true (unchanged behaviour: the quote is accepted by the customer and submitted to GRENKE). false creates the quote only, like "create quote" in the PartnerHub: status in_progress, no financing request, no GRENKE submission, no e-mail to the customer and no customer credit check. The response then reads "Quote created without financing request". The partner completes the quote, sends it to the customer or starts the financing request in the PartnerHub; read the resulting status via GET /api/financing_cases/{id} or the financing_case.status_changed webhook. Applies to every financing type including Print-Plan. | | printPlanContractTerms | mixed | | no | Print-Plan contract terms (PH-590); only applied when financingType=print_plan. Optional — defaults: 5% page coverage, 15% color ratio, full maintenance. | | customer | CustomerData-cart.checkout | | yes | Kundendaten | | deliveryAddress | mixed | | no | Delivery address with its own recipient (PH-1119). Optional: without it the customer address is the delivery address. If that address matches the customer's stored default delivery address, the stored address is used, including a recipient stored for it in the PartnerHub; otherwise it is headed by the customer company and contact person. When present, quote, contract and offer PDF show exactly this recipient — the lessee company from the customer block is not prepended. recipientName and the address fields are mandatory, company is optional. For deliveries to a private address (e.g. an employee's home) always send this block and leave company out — a private address sent in the customer block is headed by the lessee company. Customer master data is never changed. | | serviceCost | number\|null | | no | Monatliche Servicegebühr für die Miete. | | customSlaFileName | string\|null | | no | Kairos "file" identifier of the custom SLA selected for this quote. | ### Cart.CartCheckoutRequest.jsonld-cart.checkout | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | duration | integer | | yes | Ausgewählte Laufzeit in Monaten | | financingType | string | rent, rent_to_own, leasing, print_plan, print_plan_3kdg_12verl, print_plan_6kdg_12verl | yes | Financing type. Use "print_plan" (PH-590) to check the cart out as a Print-Plan contract: the cart items per-device click-billing data (CartItemCreateDto.devices) plus the printPlanContractTerms block are turned into a Print-Plan quote. serviceCost and customSlaFileName are not allowed for print_plan. PH-755: "print_plan_3kdg_12verl" and "print_plan_6kdg_12verl" are Print-Plan contract variants that behave identically but send their own producttype to GRENKE. PH-1084: every Print-Plan variant requires each cart item to reference a Print-Plan-capable category (categoryId or categorySlug of a category with hasPrintPlanCapability=true, see GET /api/product-categories); otherwise the checkout is rejected with 422 and nothing is created. | | paymentInterval | string | monthly, quarterly | no | Zahlungsweise; Default monthly. | | commission | integer | | no | Commission tier in percent. If omitted, the preselected tier applies: 0 if a 0 % rental factor list exists for the financing type, otherwise the lowest available tier. Only tiers for which a rental factor list is assigned to the partner are allowed. | | quoteNumber | string\|null | | no | Optional custom quote number. | | submitFinancing | boolean | | no | Whether the checkout starts the financing request. Optional, default true (unchanged behaviour: the quote is accepted by the customer and submitted to GRENKE). false creates the quote only, like "create quote" in the PartnerHub: status in_progress, no financing request, no GRENKE submission, no e-mail to the customer and no customer credit check. The response then reads "Quote created without financing request". The partner completes the quote, sends it to the customer or starts the financing request in the PartnerHub; read the resulting status via GET /api/financing_cases/{id} or the financing_case.status_changed webhook. Applies to every financing type including Print-Plan. | | printPlanContractTerms | mixed | | no | Print-Plan contract terms (PH-590); only applied when financingType=print_plan. Optional — defaults: 5% page coverage, 15% color ratio, full maintenance. | | customer | CustomerData.jsonld-cart.checkout | | yes | Kundendaten | | deliveryAddress | mixed | | no | Delivery address with its own recipient (PH-1119). Optional: without it the customer address is the delivery address. If that address matches the customer's stored default delivery address, the stored address is used, including a recipient stored for it in the PartnerHub; otherwise it is headed by the customer company and contact person. When present, quote, contract and offer PDF show exactly this recipient — the lessee company from the customer block is not prepended. recipientName and the address fields are mandatory, company is optional. For deliveries to a private address (e.g. an employee's home) always send this block and leave company out — a private address sent in the customer block is headed by the lessee company. Customer master data is never changed. | | serviceCost | number\|null | | no | Monatliche Servicegebühr für die Miete. | | customSlaFileName | string\|null | | no | Kairos "file" identifier of the custom SLA selected for this quote. | ### Cart.CartCreateDto-cart.create | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | items | array | | yes | | ### Cart.CartCreateDto.jsonld-cart.create | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | items | array | | yes | | ### Cart.CartFinancingResponse-cart.financing | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | purchasePrice | number | | no | | | financingOptions | CartFinancingOptions-cart.financing | | no | Finanzierungsoptionen für den gesamten Warenkorb | | items | array | | no | Finanzierungsoptionen für einzelne Positionen | | cartId | string | | no | | | recurringServiceFee | number | | no | Recurring Print-Plan service fee; null for non-Print-Plan carts. | ### Cart.CartFinancingResponse-cart.financing_cart.status | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | purchasePrice | number | | no | | | financingOptions | CartFinancingOptions-cart.financing_cart.status | | no | Finanzierungsoptionen für den gesamten Warenkorb | | items | array | | no | Finanzierungsoptionen für einzelne Positionen | | cartId | string | | no | | | recurringServiceFee | number | | no | Recurring Print-Plan service fee; null for non-Print-Plan carts. | ### Cart.CartFinancingResponse.jsonld-cart.financing | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | purchasePrice | number | | no | | | financingOptions | CartFinancingOptions.jsonld-cart.financing | | no | Finanzierungsoptionen für den gesamten Warenkorb | | items | array | | no | Finanzierungsoptionen für einzelne Positionen | | cartId | string | | no | | | recurringServiceFee | number | | no | Recurring Print-Plan service fee; null for non-Print-Plan carts. | ### Cart.CartFinancingResponse.jsonld-cart.financing_cart.status | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | purchasePrice | number | | no | | | financingOptions | CartFinancingOptions.jsonld-cart.financing_cart.status | | no | Finanzierungsoptionen für den gesamten Warenkorb | | items | array | | no | Finanzierungsoptionen für einzelne Positionen | | cartId | string | | no | | | recurringServiceFee | number | | no | Recurring Print-Plan service fee; null for non-Print-Plan carts. | ### Cart.CheckoutResponseDto-checkout.response | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | financeCaseId | string | | no | The UUID of the financing case | | financeCaseLink | string | | no | Absolute URL to the financing case detail page | | quoteId | string | | no | | | quoteLink | string | | no | | | message | string\|null | | no | Optional message | | recurringServiceFee | number | | no | Server-computed recurring Print-Plan service fee. Present only for financingType=print_plan; null for rent/leasing/rent_to_own. | | idempotencyNotice | string\|null | | no | Transition-period hint (PH-573): set when the request omitted the Idempotency-Key header, pointing callers to the upcoming requirement. | ### Cart.CheckoutResponseDto.jsonld-checkout.response | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | financeCaseId | string | | no | The UUID of the financing case | | financeCaseLink | string | | no | Absolute URL to the financing case detail page | | quoteId | string | | no | | | quoteLink | string | | no | | | message | string\|null | | no | Optional message | | recurringServiceFee | number | | no | Server-computed recurring Print-Plan service fee. Present only for financingType=print_plan; null for rent/leasing/rent_to_own. | | idempotencyNotice | string\|null | | no | Transition-period hint (PH-573): set when the request omitted the Idempotency-Key header, pointing callers to the upcoming requirement. | ### CartFinancingOptions-cart.financing | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | rent | array | | no | Mietoptionen für unterschiedliche Laufzeiten | | rentToOwn | array | | no | Mietkaufoptionen für unterschiedliche Laufzeiten | | leasing | array | | no | Leasingoptionen für unterschiedliche Laufzeiten | | printPlan | array | | no | Print-Plan options for different durations. | | partialAmortisationLeasing | array | | no | Partial-amortisation leasing options for different durations (PH-480). | | printPlan3Kdg12Verl | array | | no | Print-Plan (3-month cancellation / 12-month renewal) options per duration. | | printPlan6Kdg12Verl | array | | no | Print-Plan (6-month cancellation / 12-month renewal) options per duration. | ### CartFinancingOptions-cart.financing_cart.status | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | rent | array | | no | Mietoptionen für unterschiedliche Laufzeiten | | rentToOwn | array | | no | Mietkaufoptionen für unterschiedliche Laufzeiten | | leasing | array | | no | Leasingoptionen für unterschiedliche Laufzeiten | | printPlan | array | | no | Print-Plan options for different durations. | | partialAmortisationLeasing | array | | no | Partial-amortisation leasing options for different durations (PH-480). | | printPlan3Kdg12Verl | array | | no | Print-Plan (3-month cancellation / 12-month renewal) options per duration. | | printPlan6Kdg12Verl | array | | no | Print-Plan (6-month cancellation / 12-month renewal) options per duration. | ### CartFinancingOptions.jsonld-cart.financing | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | rent | array | | no | Mietoptionen für unterschiedliche Laufzeiten | | rentToOwn | array | | no | Mietkaufoptionen für unterschiedliche Laufzeiten | | leasing | array | | no | Leasingoptionen für unterschiedliche Laufzeiten | | printPlan | array | | no | Print-Plan options for different durations. | | partialAmortisationLeasing | array | | no | Partial-amortisation leasing options for different durations (PH-480). | | printPlan3Kdg12Verl | array | | no | Print-Plan (3-month cancellation / 12-month renewal) options per duration. | | printPlan6Kdg12Verl | array | | no | Print-Plan (6-month cancellation / 12-month renewal) options per duration. | ### CartFinancingOptions.jsonld-cart.financing_cart.status | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | rent | array | | no | Mietoptionen für unterschiedliche Laufzeiten | | rentToOwn | array | | no | Mietkaufoptionen für unterschiedliche Laufzeiten | | leasing | array | | no | Leasingoptionen für unterschiedliche Laufzeiten | | printPlan | array | | no | Print-Plan options for different durations. | | partialAmortisationLeasing | array | | no | Partial-amortisation leasing options for different durations (PH-480). | | printPlan3Kdg12Verl | array | | no | Print-Plan (3-month cancellation / 12-month renewal) options per duration. | | printPlan6Kdg12Verl | array | | no | Print-Plan (6-month cancellation / 12-month renewal) options per duration. | ### CartItemCreateDto-cart.create | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | productNumber | string | | no | | | productName | string | | no | | | productSku | string\|null | | no | | | quantity | integer | | no | | | price | number | | no | | | productOptions | array\|null | | no | | | productSector | string\|null | IT_AND_OFFICE_EQUIPMENT, TESVOLT_ENERGY_STORAGE, RENEWABLE_ENERGY_AND_ENERGY_STORAGE, FURNITURE_AND_HOME_ACCESSORIES, MEDICAL_DEVICES, KITCHEN_AND_GASTRONOMY_EQUIPMENT, EVENT_TECHNOLOGY, HOME_AND_ENTERTAINMENT_ELECTRONICS, CONSTRUCTION_MACHINERY_AND_TOOLS, TRANSPORT_AND_LOGISTICS_EQUIPMENT, PHOTO_AND_VIDEO_TECHNOLOGY, FITNESS_AND_SPORTS_EQUIPMENT, SECURITY_EQUIPMENT, POINT_OF_SALES, OTHERS, | no | Product sector classification for financing calculations. If omitted, the sector of the referenced category (categoryId/categorySlug) is used; without a category, IT_AND_OFFICE_EQUIPMENT. When sent together with a category, it must match that category's sector, otherwise the cart is rejected with 422. | | categoryId | integer\|null | | no | Optional category ID for precise AfA duration validation. Takes precedence over categorySlug. If omitted, categorySlug is used as fallback. Also determines productSector when productSector is omitted. Required for Print Plan (PH-1084): only items whose category carries hasPrintPlanCapability=true (see GET /api/product-categories) may carry devices or be checked out with a print_plan financing type. An unknown ID is rejected with 422 on those Print-Plan paths. | | categorySlug | string\|null | | no | Optional category slug for precise AfA duration validation. If categoryId is provided, this field is ignored. Also determines productSector when productSector is omitted. Required for Print Plan (PH-1084): only items whose category carries hasPrintPlanCapability=true (see GET /api/product-categories) may carry devices or be checked out with a print_plan financing type. An unknown slug is rejected with 422 on those Print-Plan paths. | | devices | array | | no | Optional Print-Plan per-device click-billing data (PH-590). One entry per physical unit, so the number of devices must equal the item quantity. Leave empty for regular rent/leasing items. Carried into a Print-Plan quote when the cart is checked out with financingType=print_plan. Only allowed on items whose category is Print-Plan-capable (hasPrintPlanCapability=true, see GET /api/product-categories); otherwise the cart is rejected with 422 (PH-1084). | ### CartItemCreateDto.jsonld-cart.create | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | productNumber | string | | no | | | productName | string | | no | | | productSku | string\|null | | no | | | quantity | integer | | no | | | price | number | | no | | | productOptions | array\|null | | no | | | productSector | string\|null | IT_AND_OFFICE_EQUIPMENT, TESVOLT_ENERGY_STORAGE, RENEWABLE_ENERGY_AND_ENERGY_STORAGE, FURNITURE_AND_HOME_ACCESSORIES, MEDICAL_DEVICES, KITCHEN_AND_GASTRONOMY_EQUIPMENT, EVENT_TECHNOLOGY, HOME_AND_ENTERTAINMENT_ELECTRONICS, CONSTRUCTION_MACHINERY_AND_TOOLS, TRANSPORT_AND_LOGISTICS_EQUIPMENT, PHOTO_AND_VIDEO_TECHNOLOGY, FITNESS_AND_SPORTS_EQUIPMENT, SECURITY_EQUIPMENT, POINT_OF_SALES, OTHERS, | no | Product sector classification for financing calculations. If omitted, the sector of the referenced category (categoryId/categorySlug) is used; without a category, IT_AND_OFFICE_EQUIPMENT. When sent together with a category, it must match that category's sector, otherwise the cart is rejected with 422. | | categoryId | integer\|null | | no | Optional category ID for precise AfA duration validation. Takes precedence over categorySlug. If omitted, categorySlug is used as fallback. Also determines productSector when productSector is omitted. Required for Print Plan (PH-1084): only items whose category carries hasPrintPlanCapability=true (see GET /api/product-categories) may carry devices or be checked out with a print_plan financing type. An unknown ID is rejected with 422 on those Print-Plan paths. | | categorySlug | string\|null | | no | Optional category slug for precise AfA duration validation. If categoryId is provided, this field is ignored. Also determines productSector when productSector is omitted. Required for Print Plan (PH-1084): only items whose category carries hasPrintPlanCapability=true (see GET /api/product-categories) may carry devices or be checked out with a print_plan financing type. An unknown slug is rejected with 422 on those Print-Plan paths. | | devices | array | | no | Optional Print-Plan per-device click-billing data (PH-590). One entry per physical unit, so the number of devices must equal the item quantity. Leave empty for regular rent/leasing items. Carried into a Print-Plan quote when the cart is checked out with financingType=print_plan. Only allowed on items whose category is Print-Plan-capable (hasPrintPlanCapability=true, see GET /api/product-categories); otherwise the cart is rejected with 422 (PH-1084). | ### CartItemFinancingResponse-cart.financing | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | productNumber | string | | no | | | productName | string | | no | | | productSku | string\|null | | no | | | quantity | integer | | no | | | unitPrice | number | | no | | | totalPrice | number | | no | | | financingOptions | CartFinancingOptions-cart.financing | | no | Finanzierungsoptionen für diesen Artikel | | devices | array | | no | Print-Plan per-device click-billing data (PH-590), echoed from the stored cart. Empty for regular rent/leasing items. | ### CartItemFinancingResponse-cart.financing_cart.status | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | productNumber | string | | no | | | productName | string | | no | | | productSku | string\|null | | no | | | quantity | integer | | no | | | unitPrice | number | | no | | | totalPrice | number | | no | | | financingOptions | CartFinancingOptions-cart.financing_cart.status | | no | Finanzierungsoptionen für diesen Artikel | | devices | array | | no | Print-Plan per-device click-billing data (PH-590), echoed from the stored cart. Empty for regular rent/leasing items. | ### CartItemFinancingResponse.jsonld-cart.financing | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | productNumber | string | | no | | | productName | string | | no | | | productSku | string\|null | | no | | | quantity | integer | | no | | | unitPrice | number | | no | | | totalPrice | number | | no | | | financingOptions | CartFinancingOptions.jsonld-cart.financing | | no | Finanzierungsoptionen für diesen Artikel | | devices | array | | no | Print-Plan per-device click-billing data (PH-590), echoed from the stored cart. Empty for regular rent/leasing items. | ### CartItemFinancingResponse.jsonld-cart.financing_cart.status | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | productNumber | string | | no | | | productName | string | | no | | | productSku | string\|null | | no | | | quantity | integer | | no | | | unitPrice | number | | no | | | totalPrice | number | | no | | | financingOptions | CartFinancingOptions.jsonld-cart.financing_cart.status | | no | Finanzierungsoptionen für diesen Artikel | | devices | array | | no | Print-Plan per-device click-billing data (PH-590), echoed from the stored cart. Empty for regular rent/leasing items. | ### Category | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer\|null | | no | | | parentCategory | mixed | | no | | | productSector | string\|null | IT_AND_OFFICE_EQUIPMENT, TESVOLT_ENERGY_STORAGE, RENEWABLE_ENERGY_AND_ENERGY_STORAGE, FURNITURE_AND_HOME_ACCESSORIES, MEDICAL_DEVICES, KITCHEN_AND_GASTRONOMY_EQUIPMENT, EVENT_TECHNOLOGY, HOME_AND_ENTERTAINMENT_ELECTRONICS, CONSTRUCTION_MACHINERY_AND_TOOLS, TRANSPORT_AND_LOGISTICS_EQUIPMENT, PHOTO_AND_VIDEO_TECHNOLOGY, FITNESS_AND_SPORTS_EQUIPMENT, SECURITY_EQUIPMENT, POINT_OF_SALES, OTHERS, | yes | | | articleType | integer\|null | 0, 1, 2, | yes | | | grenkeObjectTypeId | integer\|null | | no | | | slug | string\|null | | no | | | afaMinMonths | integer\|null | | no | | | afaMaxMonths | integer\|null | | no | | | hasPrintPlanCapability | boolean | | no | Marks categories whose products can carry Print-Plan master data (PH-524). Drives Form visibility, validation and Wizard pre-fill for Drucker/Kopierer-style articles; checked instead of slug/name matches so the trigger stays language-independent and extensible. | | updatedAt | string\|null | | no | | | name | string | | no | | | effectiveAfaMinMonths | integer\|null | | no | Resolve effective AfA minimum months with parent category fallback. | | effectiveAfaMaxMonths | integer\|null | | no | Resolve effective AfA maximum months with parent category fallback. | | printPlanCapability | boolean | | no | | ### Category-quote_request.read _No documented properties._ ### Category.jsonld-quote_request.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | ### Collection | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | empty | boolean | | no | Checks whether the collection is empty (contains no elements). | | keys | mixed | | no | Gets all keys/indices of the collection. | | values | array | | no | Gets all values of the collection. | | iterator | mixed | | no | | ### Contract | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | contractNumber | string\|null | | no | Internal contract number. Null when no internal number is stored. | | id | string\|null | | no | | | updatedAt | string | | no | | | authorizedPersons | array | | no | | | createdAt | string | | yes | | | validUntil | string\|null | | no | | | status | string | wait_for_signing, signed, post_processing_required, delivery_approved, invoice_checked, completed, canceled | no | | | customer | Customer | | yes | | | items | array | | no | | | completedAt | string\|null | | no | | | accountedAt | string\|null | | no | Date the contract was billed by grenke. Set by the grenke billing import or when payment is confirmed. Distinct from completedAt, which records when the contract workflow completed. | | externalContractNumber | string\|null | | no | grenke's own contract number, imported from the grenke billing file. Distinct from contractNumber, which is the number issued by this system. | | deletedAt | string\|null | | no | | | quote | string\|null | | no | | | deleted | boolean | | no | | | shippingAddress | ContractAddress | | no | | | contactAddress | ContractAddress | | no | | | monthlyCosts | number | | no | | | salesVolume | number | | no | Contract revenue = Σ acquisition values across all items. Semantic alias for the sum over the historically misleadingly-named monthlyPrice field. Aggregated per partner by ContractRepository::getTotalSalesVolumeMapByPartners (same convention as FinancingCase::getTotalValue in the contract branch). | ### Contract.AddContractNumberRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | contractNumber | string\|null | | no | Reference number assigned to the contract for partner-side tracking. | ### Contract.ContractNumberResponse | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | string | | no | | | contractNumber | string\|null | | no | | ### ContractAddress | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | contract | string | | no | | | id | integer | | no | | | street | string | | yes | | | number | string | | yes | | | postalCode | string | | yes | | | city | string | | yes | | | country | string | | yes | | | type | string | | no | | | recipientName | string\|null | | no | Recipient named on the delivery address (PH-1119); null when the address is headed by the customer company and contact person. | | recipientCompany | string\|null | | no | Company line of the delivery address (PH-1119); null for a private delivery target or when the address carries no recipient of its own. | | shippingAddress | boolean | | no | | | contactAddress | boolean | | no | | | recipient | boolean | | no | Whether this address carries its own recipient lines (PH-1119). | ### ContractItem | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | contract | string\|null | | no | | | serialNumber | string\|null | | no | | | product | string\|null | | no | | | productName | string\|null | | no | Snapshot of Product.name taken at contract creation (PH-510). | | productSubtitle | string\|null | | no | Snapshot of Product.subtitle taken at contract creation (PH-510). | | productSku | string\|null | | no | Snapshot of Product.number (SKU) taken at contract creation (PH-510). | | monthlyPrice | number | | no | | | salesValue | number | | no | Per-item acquisition value. Semantic alias for the historically misleadingly-named monthlyPrice field — ContractItem::create copies QuoteItem.pricePerItem (per-item acquisition value) into this column. New code should use this method; getMonthlyPrice is retained for backwards compatibility (templates, not-yet-migrated callers). | ### Customer | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer\|null | | no | | | customerNumber | string\|null | | no | | | firstName | string\|null | | no | | | lastName | string\|null | | no | | | companyName | string\|null | | no | | | email | string\|null | | no | | | phone | string\|null | | no | | | phoneCountryIso | string\|null | | no | | | phoneExt | string\|null | | no | | | customerType | string | company, freelancer, public_institution | no | | | user | mixed | | no | | | addresses | array
| | no | | | authorizedPersons | array | | no | Customer-side authorized persons only (the customer's own master data). | | crefoNo | string\|null | | no | | | callbackRoutingMode | string | use_default, route_to_partner, route_to_customer | no | | | partner | Partner | | no | | | defaultShippingAddress | mixed | | no | | | shippingAddresses | array
| | no | | | defaultContactAddress | mixed | | no | | | contactAddresses | array
| | no | | | name | string | | no | | | fullName | string | | no | | | revenue | number | | no | | | solvencyCheckCompanyName | string\|null | | no | | | solvencyCheckAddress | mixed | | no | | | currentSolvencyStatus | string | | no | | ### Customer-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer\|null | | no | | | customerNumber | string\|null | | no | | | firstName | string\|null | | no | | | lastName | string\|null | | no | | | companyName | string\|null | | no | | | email | string\|null | | no | | | customerType | string | company, freelancer, public_institution | no | | ### Customer.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | id | integer\|null | | no | | | customerNumber | string\|null | | no | | | firstName | string\|null | | no | | | lastName | string\|null | | no | | | companyName | string\|null | | no | | | email | string\|null | | no | | | customerType | string | company, freelancer, public_institution | no | | ### CustomerData-cart.checkout | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | firstName | string | | yes | Contact person given name of the lessee. | | lastName | string | | yes | Contact person family name of the lessee. | | email | string | | yes | Contact e-mail of the lessee. The customer is identified by e-mail and partner, so a known e-mail reuses the existing customer record. | | street | string | | yes | Street of the contact and billing address of the customer. Without a deliveryAddress block this is also the delivery address. | | houseNumber | string | | yes | House number of the customer address. | | zipCode | string | | yes | Postal code of the customer address. | | city | string | | yes | City of the customer address. | | country | string | | yes | Country of the customer address. | | phone | string\|null | | no | Contact phone number (optional). | | company | string | | yes | Company of the lessee, mandatory for B2B financing (PH-607). It heads the contact/billing address and, without a deliveryAddress block, the delivery address too. | | vatId | string\|null | | no | VAT id of the lessee (optional). | ### CustomerData.jsonld-cart.checkout | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | firstName | string | | yes | Contact person given name of the lessee. | | lastName | string | | yes | Contact person family name of the lessee. | | email | string | | yes | Contact e-mail of the lessee. The customer is identified by e-mail and partner, so a known e-mail reuses the existing customer record. | | street | string | | yes | Street of the contact and billing address of the customer. Without a deliveryAddress block this is also the delivery address. | | houseNumber | string | | yes | House number of the customer address. | | zipCode | string | | yes | Postal code of the customer address. | | city | string | | yes | City of the customer address. | | country | string | | yes | Country of the customer address. | | phone | string\|null | | no | Contact phone number (optional). | | company | string | | yes | Company of the lessee, mandatory for B2B financing (PH-607). It heads the contact/billing address and, without a deliveryAddress block, the delivery address too. | | vatId | string\|null | | no | VAT id of the lessee (optional). | ### DOI | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | hash | string | | no | | | user | mixed | | no | | | validity | string | | no | | | expired | boolean | | no | | ### DeliveryAddressData-cart.checkout | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | recipientName | string | | yes | Person the delivery is addressed to, as it should appear on the parcel label (e.g. "David Bühler" or "Poststelle"). Mandatory as soon as a delivery address is sent. | | company | string\|null | | no | Company line of the delivery address (optional). Leave it out for deliveries to a private address — the lessee company from the customer block is NOT added automatically. | | street | string | | yes | Street name of the delivery address. | | houseNumber | string | | yes | House number of the delivery address. | | zipCode | string | | yes | Postal code of the delivery address. | | city | string | | yes | City of the delivery address. | | country | string | | yes | Country of the delivery address. | ### DeliveryAddressData.jsonld-cart.checkout | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | recipientName | string | | yes | Person the delivery is addressed to, as it should appear on the parcel label (e.g. "David Bühler" or "Poststelle"). Mandatory as soon as a delivery address is sent. | | company | string\|null | | no | Company line of the delivery address (optional). Leave it out for deliveries to a private address — the lessee company from the customer block is NOT added automatically. | | street | string | | yes | Street name of the delivery address. | | houseNumber | string | | yes | House number of the delivery address. | | zipCode | string | | yes | Postal code of the delivery address. | | city | string | | yes | City of the delivery address. | | country | string | | yes | Country of the delivery address. | ### DistributionHub | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer\|null | | no | | | title | string | | yes | | | deliveryProofMethod | string | own_delivery_note, docusign_handover_confirmation | no | Delivery-proof method for this grenke hub (PH-700). | | externalId | string\|null | | no | | | supplierId | string\|null | | no | | | contactEmail | string\|null | | no | | | billingEmail | string\|null | | no | Returns the billing email, falling back to contactEmail if not set or empty. | | supplierEmail | string\|null | | no | Returns the hub's optional supplier email (PH-734). Unlike contactEmail/billingEmail there is NO ENV fallback and no raw variant: there is no shared grenke default to leak, so this already returns only the hub's own configured address (or null). | | kairosEnabled | boolean | | no | | | partnerInvoiceEqualsGrenkeInvoice | boolean | | no | | | allowPartnerSigneeManagement | boolean | | no | | | billingCountersignerType | string\|null | | no | | | billingCountersignerSigningGroupId | string\|null | | no | | | billingCountersignerSigningGroupName | string\|null | | no | | | billingCountersignerUserId | string\|null | | no | | | billingCountersignerUserName | string\|null | | no | | | billingCountersignerUserEmail | string\|null | | no | | | centralBackofficeSigningGroupId | string\|null | | no | | | centralBackofficeSigningGroupName | string\|null | | no | | | typeEnum | string | grenke | no | | | rawContactEmail | string\|null | | no | Returns the hub's own configured contact email WITHOUT the DEFAULT_GRENKE_CANCEL_MAIL_ADDRESS fallback. Use for routing that must only reach a hub's real mailbox (not the shared Grenke default). | | rawBillingEmail | string\|null | | no | | ### DocumentRequestListResource.DocumentRequestItemResponse-document_request.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | Unique identifier of the requested item. | | type | string | document, information, fill_and_return | no | Kind of request: document, information, or fill_and_return. | | label | string | | no | Display label of the requested item. | | status | string | pending, provided, accepted, rejected, not_available, sent | no | Current processing status of the requested item. | | category | string\|null | | no | Document category when applicable; null for free-text items. | | templateDownloadUrl | string\|null | | no | Download URL for the fill-and-return template when applicable; null otherwise. | | callbackRequestId | integer\|null | | no | Linked CallbackRequest id when this item belongs to a document-request submission that created one; null otherwise. | | callbackStatus | string\|null | new, reminded, overdue, completed | no | Urgency status of the linked CallbackRequest when present (new, reminded, overdue, completed). | | initiatedBy | string | financier, partner | no | Who created the item: financier for requests of grenke, the hub or Miete24; partner for a document the partner uploaded unasked (always provided or sent, cannot be marked as not available). Information and fill-and-return items are always financier. | | requestedAt | string | | no | Timestamp when the item was requested. | ### DocumentRequestListResource.DocumentRequestItemResponse.jsonld-document_request.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @id | string | | no | | | @type | string | | no | | | id | integer | | no | Unique identifier of the requested item. | | type | string | document, information, fill_and_return | no | Kind of request: document, information, or fill_and_return. | | label | string | | no | Display label of the requested item. | | status | string | pending, provided, accepted, rejected, not_available, sent | no | Current processing status of the requested item. | | category | string\|null | | no | Document category when applicable; null for free-text items. | | templateDownloadUrl | string\|null | | no | Download URL for the fill-and-return template when applicable; null otherwise. | | callbackRequestId | integer\|null | | no | Linked CallbackRequest id when this item belongs to a document-request submission that created one; null otherwise. | | callbackStatus | string\|null | new, reminded, overdue, completed | no | Urgency status of the linked CallbackRequest when present (new, reminded, overdue, completed). | | initiatedBy | string | financier, partner | no | Who created the item: financier for requests of grenke, the hub or Miete24; partner for a document the partner uploaded unasked (always provided or sent, cannot be marked as not available). Information and fill-and-return items are always financier. | | requestedAt | string | | no | Timestamp when the item was requested. | ### DocumentRequestNotAvailableRequest _No documented properties._ ### DocumentRequestNotAvailableRequest.DocumentRequestItemResponse-document_request.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | Unique identifier of the requested item. | | type | string | document, information, fill_and_return | no | Kind of request: document, information, or fill_and_return. | | label | string | | no | Display label of the requested item. | | status | string | pending, provided, accepted, rejected, not_available, sent | no | Current processing status of the requested item. | | category | string\|null | | no | Document category when applicable; null for free-text items. | | templateDownloadUrl | string\|null | | no | Download URL for the fill-and-return template when applicable; null otherwise. | | callbackRequestId | integer\|null | | no | Linked CallbackRequest id when this item belongs to a document-request submission that created one; null otherwise. | | callbackStatus | string\|null | new, reminded, overdue, completed | no | Urgency status of the linked CallbackRequest when present (new, reminded, overdue, completed). | | initiatedBy | string | financier, partner | no | Who created the item: financier for requests of grenke, the hub or Miete24; partner for a document the partner uploaded unasked (always provided or sent, cannot be marked as not available). Information and fill-and-return items are always financier. | | requestedAt | string | | no | Timestamp when the item was requested. | ### DocumentRequestNotAvailableRequest.DocumentRequestItemResponse.jsonld-document_request.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | id | integer | | no | Unique identifier of the requested item. | | type | string | document, information, fill_and_return | no | Kind of request: document, information, or fill_and_return. | | label | string | | no | Display label of the requested item. | | status | string | pending, provided, accepted, rejected, not_available, sent | no | Current processing status of the requested item. | | category | string\|null | | no | Document category when applicable; null for free-text items. | | templateDownloadUrl | string\|null | | no | Download URL for the fill-and-return template when applicable; null otherwise. | | callbackRequestId | integer\|null | | no | Linked CallbackRequest id when this item belongs to a document-request submission that created one; null otherwise. | | callbackStatus | string\|null | new, reminded, overdue, completed | no | Urgency status of the linked CallbackRequest when present (new, reminded, overdue, completed). | | initiatedBy | string | financier, partner | no | Who created the item: financier for requests of grenke, the hub or Miete24; partner for a document the partner uploaded unasked (always provided or sent, cannot be marked as not available). Information and fill-and-return items are always financier. | | requestedAt | string | | no | Timestamp when the item was requested. | ### FillAndReturnTemplateDownloadResource _No documented properties._ ### FinancingCase-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | string\|null | | no | | | caseNumber | string\|null | | no | | | quoteRequest | string\|null | | no | | | quotes | array | | no | | | contracts | array | | no | | | documents | array | | no | | | requestedDocuments | array | | no | | | requestedInformation | array | | no | | | requestedFillAndReturns | array | | no | | | documentsRequired | boolean | | no | | | status | string\|null | | no | | | createdAt | string | | no | | | updatedAt | string\|null | | no | | | deletedAt | string\|null | | no | | | customer | mixed | | no | | | partner | Partner-financing_case.read | | no | | | requestedItems | array | | no | Returns merged list of all requested items (documents + information + fill-and-return), sorted by requestedAt. | | rejectionReason | string\|null | | no | Partner-facing rejection reason from the active FinancingResponse of the first quote (PH-1013 AE-7). Additive on financing_case:read — null when no active response carries a submitRejectionReason. | | type | string | | no | | | financingRequest | boolean | | no | | | contractNumber | string | | no | | | quoteNumber | string | | no | | | customerType | string\|null | | no | | | customerCompanyName | string\|null | | no | | | customerName | string\|null | | no | | | productSector | string\|null | | no | | | message | string\|null | | no | | | monthlyRate | number\|null | | no | | | totalValue | mixed | | no | | | calculationType | string\|null | rent, leasing, rent_to_own, print_plan, partial_amortisation_leasing, print_plan_3kdg_12verl, print_plan_6kdg_12verl, | no | | | duration | integer\|null | | no | | | financingNumber | string\|null | | no | | | openCallbackRequestCount | integer | | no | | ### FinancingCase.SandboxFinanceDecisionRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | decision | string\|null | accepted, rejected | yes | | ### FinancingCase.SandboxSimulateRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | scenario | string\|null | finance_review, manual_finance_review, finance_accepted, finance_rejected, canceled, information_requested, requested_document, requested_fill_and_return, change_requested, document_rejected, upload_rejected_type, upload_rejected_size, wait_for_signing, signed, post_processing_required, delivery_approved, invoice_checked, completed, signature_sent, signature_signed, signature_declined, reset | yes | Scenario to apply. Supported values: finance_review, manual_finance_review, finance_accepted, finance_rejected, canceled, information_requested, requested_document, requested_fill_and_return, change_requested, document_rejected, upload_rejected_type, upload_rejected_size, wait_for_signing, signed, post_processing_required, delivery_approved, invoice_checked, completed, signature_sent, signature_signed, signature_declined, reset. | | data | object | | no | Optional scenario-specific payload. finance_rejected: rejectionReason (string). information_requested: question (string) or items[{question}]. requested_document: label+category or items[{label,category}]; allowed categories: business_registration, annual_financial_statement, business_assessment, self_disclosure, medical_license, purchase_offer, notarized_transfer_contract, land_register_extract, property_owner_consent, partnership_agreement. requested_fill_and_return: same shape; allowed categories: self_disclosure_template, default_guarantee. change_requested: message (string, required; Quote must be in_review). document_rejected: documentId (int, required) of a PENDING_REVIEW FinancingDocument on this case; optional reason (string). Foreign/missing documentId → 404; already rejected / not rejectable → 422. Re-opens the linked request in GET document-requests for re-upload. Contract-phase scenarios (wait_for_signing, signed, post_processing_required, delivery_approved, invoice_checked, completed) take no data; signed attaches an idempotent SIGNED_CONTRACT FinancingDocument (listable + PDF downloadable, no DocuSign); completed requires a contract number else 422; unreachable transitions return 422 naming current and desired status. upload_rejected_type / upload_rejected_size: data.documentId (int, required) of an open RequestedDocument or RequestedFillAndReturn on this case; returns the same HTTP 400 Bad Request payload as a real MIME-/size-rejected upload (no special sandbox format). Missing / foreign / closed documentId → 422. signature_sent / signature_signed / signature_declined (PH-1048): require Contract at wait_for_signing (created when missing, no DocuSign API); create/update a local DocuSignEnvelope + customer recipient into sent / signed / declined; optional data.reason for signature_declined; unreachable envelope transitions → 422 naming current and desired status; idempotent when already at the target envelope status. reset: data.targetStatus (string, required) rewinds the case to an earlier place with cleanup of open requests and simulated SIGNED_CONTRACT docs; does not delete the case. Allowed targetStatus: accepted_by_customer, finance_review, manual_finance_review, finance_accepted, finance_rejected, wait_for_signing, signed, post_processing_required, delivery_approved, invoice_checked. Missing/invalid targetStatus → 422 listing allowed values. | ### FinancingCase.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | id | string\|null | | no | | | caseNumber | string\|null | | no | | | quoteRequest | string\|null | | no | | | quotes | array | | no | | | contracts | array | | no | | | documents | array | | no | | | requestedDocuments | array | | no | | | requestedInformation | array | | no | | | requestedFillAndReturns | array | | no | | | documentsRequired | boolean | | no | | | status | string\|null | | no | | | createdAt | string | | no | | | updatedAt | string\|null | | no | | | deletedAt | string\|null | | no | | | customer | mixed | | no | | | partner | Partner.jsonld-financing_case.read | | no | | | requestedItems | array | | no | Returns merged list of all requested items (documents + information + fill-and-return), sorted by requestedAt. | | rejectionReason | string\|null | | no | Partner-facing rejection reason from the active FinancingResponse of the first quote (PH-1013 AE-7). Additive on financing_case:read — null when no active response carries a submitRejectionReason. | | type | string | | no | | | financingRequest | boolean | | no | | | contractNumber | string | | no | | | quoteNumber | string | | no | | | customerType | string\|null | | no | | | customerCompanyName | string\|null | | no | | | customerName | string\|null | | no | | | productSector | string\|null | | no | | | message | string\|null | | no | | | monthlyRate | number\|null | | no | | | totalValue | mixed | | no | | | calculationType | string\|null | rent, leasing, rent_to_own, print_plan, partial_amortisation_leasing, print_plan_3kdg_12verl, print_plan_6kdg_12verl, | no | | | duration | integer\|null | | no | | | financingNumber | string\|null | | no | | | openCallbackRequestCount | integer | | no | | ### FinancingDocument | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | financingCase | string | | no | | | file | string\|null | | no | Not mapped to the DB. Vich handles this transient property. | | fileName | string\|null | | no | | | fileSize | integer\|null | | no | | | fileMimeType | string\|null | | no | | | originalName | string\|null | | no | | | uploadedByUserId | string\|null | | no | | | uploadedByName | string\|null | | no | | | uploadSource | string\|null | partner_api, response_partner, response_customer, response_hub, response_m24, portal_m24, portal_partner, system, | no | Provenance channel recorded at creation (PH-784). NULL = legacy row created before the column existed — treated as unknown provenance. | | source | string\|null | partner, customer, internal, system, | no | PH-375: origin of the document, derived server-side at upload time. | | category | string | business_registration, annual_financial_statement, business_assessment, self_disclosure, medical_license, purchase_offer, notarized_transfer_contract, land_register_extract, property_owner_consent, partnership_agreement, birth_date, private_address, founding_date, employee_count, self_disclosure_template, default_guarantee, articles_of_association, sale_leaseback_invoice, power_of_attorney, representative_id_cards, organization_chart, shareholder_list, vehicle_title, rate_adjustment_letter, partner_invoice, grenke_invoice, delivery_proof, delivery_note, handover_confirmation, frame_call_off_order, signed_contract, private_guarantee, corporate_guarantee, supplementary_prepayment, supplementary_free_start, supplementary_vending, revocation_notice, voucher, supplementary_third_party, gwg_form_correction, schufa_guarantee_notice, print_plan_contract_draft, other | no | | | description | string\|null | | no | | | status | string\|null | pending_review, verified, rejected, superseded, | no | | | requestedDocument | mixed | | no | | | requestedFillAndReturn | mixed | | no | | | authorizedPerson | mixed | | no | | | createdAt | string | | no | | | updatedAt | string | | no | | | deletedAt | string\|null | | no | | | partnerProvided | boolean | | no | Whether the partner side supplied this file (see DocumentUploadSource). | | deleted | boolean | | no | | ### FinancingDocument.FinancingDocumentResponse-financing_document.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | financingCaseId | string | | no | | | originalName | string | | no | | | mimeType | string | | no | | | fileSize | integer | | no | File size in bytes | | category | string | business_registration, annual_financial_statement, business_assessment, self_disclosure, medical_license, purchase_offer, notarized_transfer_contract, land_register_extract, property_owner_consent, partnership_agreement, birth_date, private_address, founding_date, employee_count, self_disclosure_template, default_guarantee, articles_of_association, sale_leaseback_invoice, power_of_attorney, representative_id_cards, organization_chart, shareholder_list, vehicle_title, rate_adjustment_letter, partner_invoice, grenke_invoice, delivery_proof, delivery_note, handover_confirmation, frame_call_off_order, signed_contract, private_guarantee, corporate_guarantee, supplementary_prepayment, supplementary_free_start, supplementary_vending, revocation_notice, voucher, supplementary_third_party, gwg_form_correction, schufa_guarantee_notice, print_plan_contract_draft, other | no | Document category | | description | string\|null | | no | | | status | string\|null | pending_review, verified, rejected | no | Review state: pending_review awaits our check, verified was accepted, rejected needs a new upload. Superseded versions are not listed. | | uploadedAt | string | | no | | | downloadUrl | string | | no | | | source | string\|null | partner, customer, internal, system, | no | Origin of the document (partner, customer, internal, system). null for documents uploaded before this field was introduced. | ### FinancingDocument.FinancingDocumentResponse.jsonld-financing_document.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | id | integer | | no | | | financingCaseId | string | | no | | | originalName | string | | no | | | mimeType | string | | no | | | fileSize | integer | | no | File size in bytes | | category | string | business_registration, annual_financial_statement, business_assessment, self_disclosure, medical_license, purchase_offer, notarized_transfer_contract, land_register_extract, property_owner_consent, partnership_agreement, birth_date, private_address, founding_date, employee_count, self_disclosure_template, default_guarantee, articles_of_association, sale_leaseback_invoice, power_of_attorney, representative_id_cards, organization_chart, shareholder_list, vehicle_title, rate_adjustment_letter, partner_invoice, grenke_invoice, delivery_proof, delivery_note, handover_confirmation, frame_call_off_order, signed_contract, private_guarantee, corporate_guarantee, supplementary_prepayment, supplementary_free_start, supplementary_vending, revocation_notice, voucher, supplementary_third_party, gwg_form_correction, schufa_guarantee_notice, print_plan_contract_draft, other | no | Document category | | description | string\|null | | no | | | status | string\|null | pending_review, verified, rejected | no | Review state: pending_review awaits our check, verified was accepted, rejected needs a new upload. Superseded versions are not listed. | | uploadedAt | string | | no | | | downloadUrl | string | | no | | | source | string\|null | partner, customer, internal, system, | no | Origin of the document (partner, customer, internal, system). null for documents uploaded before this field was introduced. | ### FinancingDocument.FinancingDocumentUploadRequest-financing_document.write _No documented properties._ ### InformationResponseRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | response | string\|null | | no | | ### InformationResponseRequest.DocumentRequestItemResponse-document_request.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | Unique identifier of the requested item. | | type | string | document, information, fill_and_return | no | Kind of request: document, information, or fill_and_return. | | label | string | | no | Display label of the requested item. | | status | string | pending, provided, accepted, rejected, not_available, sent | no | Current processing status of the requested item. | | category | string\|null | | no | Document category when applicable; null for free-text items. | | templateDownloadUrl | string\|null | | no | Download URL for the fill-and-return template when applicable; null otherwise. | | callbackRequestId | integer\|null | | no | Linked CallbackRequest id when this item belongs to a document-request submission that created one; null otherwise. | | callbackStatus | string\|null | new, reminded, overdue, completed | no | Urgency status of the linked CallbackRequest when present (new, reminded, overdue, completed). | | initiatedBy | string | financier, partner | no | Who created the item: financier for requests of grenke, the hub or Miete24; partner for a document the partner uploaded unasked (always provided or sent, cannot be marked as not available). Information and fill-and-return items are always financier. | | requestedAt | string | | no | Timestamp when the item was requested. | ### InformationResponseRequest.DocumentRequestItemResponse.jsonld-document_request.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | id | integer | | no | Unique identifier of the requested item. | | type | string | document, information, fill_and_return | no | Kind of request: document, information, or fill_and_return. | | label | string | | no | Display label of the requested item. | | status | string | pending, provided, accepted, rejected, not_available, sent | no | Current processing status of the requested item. | | category | string\|null | | no | Document category when applicable; null for free-text items. | | templateDownloadUrl | string\|null | | no | Download URL for the fill-and-return template when applicable; null otherwise. | | callbackRequestId | integer\|null | | no | Linked CallbackRequest id when this item belongs to a document-request submission that created one; null otherwise. | | callbackStatus | string\|null | new, reminded, overdue, completed | no | Urgency status of the linked CallbackRequest when present (new, reminded, overdue, completed). | | initiatedBy | string | financier, partner | no | Who created the item: financier for requests of grenke, the hub or Miete24; partner for a document the partner uploaded unasked (always provided or sent, cannot be marked as not available). Information and fill-and-return items are always financier. | | requestedAt | string | | no | Timestamp when the item was requested. | ### OfferItem | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | totalCosts | string | | no | | | monthlyCosts | string | | no | | | calculationType | string | rent, leasing, rent_to_own, print_plan, partial_amortisation_leasing, print_plan_3kdg_12verl, print_plan_6kdg_12verl | no | | | duration | integer | | no | | | factor | number\|null | | no | | | appliedSurchargePercent | number | | no | Payment-interval surcharge percent folded into monthlyCosts (0 when none). | | appliedSurchargeAmount | number | | no | Absolute surcharge amount (€) folded into monthlyCosts (0 when none). | ### Partner | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | createdAt | string\|null | | no | | | id | integer\|null | | no | | | name | string | | no | | | status | string | ACTIVE, INACTIVE, IN_REVIEW, PENDING, BLOCKED | no | | | callbackRoutingMode | string | use_default, route_to_partner, route_to_customer | no | | | quoteVisibilityMode | string | all, own_only, own_plus_manager | no | Partner-wide quote/Vorgang visibility mode (PH-543): all = every partner user sees every Vorgang; own_only = each user sees only own Vorgänge (plus API/ownerless); own_plus_manager = like own_only, but partner managers see all. | | initials | string | | no | | | registrationHash | string | | no | | | calculationPage | string | | no | | | taxDataStale | boolean | | no | Whether the tax classification was last confirmed more than {@see TAX_DATA_STALE_AFTER_MONTHS} months ago. Never confirmed counts as not stale (nothing to re-confirm yet); the missing classification is surfaced by the readiness check instead. | | defaultAcquisitionCost | number | | no | | | allowedProductSectors | array | | no | | | currentSolvencyStatus | string | | no | | | active | boolean | | no | | | inReview | boolean | | no | | | blocked | boolean | | no | | | brandingAltText | string | | no | Logo alt-text for branded touchpoints: the explicit brand name when set, otherwise the partner's name (PH-535 AC-6). | ### Partner-financing_case.read _No documented properties._ ### Partner.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | ### PartnerContactListResource.PartnerContactData | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | firstName | string | | no | | | lastName | string | | no | | | company | string | | no | | | location | string | | no | | ### PrintPlanContractTermsDto-cart.checkout | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | pageCoverage | number | | no | Page coverage / Schwaerzungsgrad S/W in percent (ISO/IEC 19752 default 5%). | | colorRatio | number | | no | Color ratio / Farbanteil in percent (default 15%). | | maintenanceTonerColor | boolean | | no | | | maintenanceDrums | boolean | | no | | | maintenanceStaples | boolean | | no | | | maintenancePaper | boolean | | no | | ### PrintPlanContractTermsDto.jsonld-cart.checkout | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | pageCoverage | number | | no | Page coverage / Schwaerzungsgrad S/W in percent (ISO/IEC 19752 default 5%). | | colorRatio | number | | no | Color ratio / Farbanteil in percent (default 15%). | | maintenanceTonerColor | boolean | | no | | | maintenanceDrums | boolean | | no | | | maintenanceStaples | boolean | | no | | | maintenancePaper | boolean | | no | | ### Product | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | string\|null | | no | | | deletedAt | string\|null | | no | | | creationId | string\|null | | no | | | isDummy | boolean | | no | | | printPlanMasterData | mixed | | no | 1:1 inverse side for Print-Plan master data (PH-524). Owner side is {@see ProductPrintPlanMasterData}. Null when the product is not in a category with hasPrintPlanCapability=true; row is removed entirely on category leave (AC-5b reset). | | name | string | | no | | | number | string | | no | Your own product number, unique among your active products. Omitted for products without a number; those cannot be addressed via /products/{number}. | | productSector | string | IT_AND_OFFICE_EQUIPMENT, TESVOLT_ENERGY_STORAGE, RENEWABLE_ENERGY_AND_ENERGY_STORAGE, FURNITURE_AND_HOME_ACCESSORIES, MEDICAL_DEVICES, KITCHEN_AND_GASTRONOMY_EQUIPMENT, EVENT_TECHNOLOGY, HOME_AND_ENTERTAINMENT_ELECTRONICS, CONSTRUCTION_MACHINERY_AND_TOOLS, TRANSPORT_AND_LOGISTICS_EQUIPMENT, PHOTO_AND_VIDEO_TECHNOLOGY, FITNESS_AND_SPORTS_EQUIPMENT, SECURITY_EQUIPMENT, POINT_OF_SALES, OTHERS | no | | | category | mixed | | no | | | partner | mixed | | no | | | defaultPrice | number | | no | | | subtitle | string\|null | | no | | | title | string | | no | | | deleted | boolean | | no | | | dummy | boolean | | no | | | printPlanCapable | boolean | | no | Convenience flag derived from the linked category (PH-524 AC-22). | ### Product.CreateProductRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | name | string | | yes | | | subtitle | string\|null | | no | | | price | number | | yes | | | number | string\|null | | no | | | productSector | string\|null | IT_AND_OFFICE_EQUIPMENT, TESVOLT_ENERGY_STORAGE, RENEWABLE_ENERGY_AND_ENERGY_STORAGE, FURNITURE_AND_HOME_ACCESSORIES, MEDICAL_DEVICES, KITCHEN_AND_GASTRONOMY_EQUIPMENT, EVENT_TECHNOLOGY, HOME_AND_ENTERTAINMENT_ELECTRONICS, CONSTRUCTION_MACHINERY_AND_TOOLS, TRANSPORT_AND_LOGISTICS_EQUIPMENT, PHOTO_AND_VIDEO_TECHNOLOGY, FITNESS_AND_SPORTS_EQUIPMENT, SECURITY_EQUIPMENT, POINT_OF_SALES, OTHERS, | yes | | | category | mixed | | no | | | canPrintColor | boolean\|null | | no | PH-524 print-plan master-data fields. All nullable on the DTO; the Callback constraint below enforces capability-bound presence rules (S/W always required for print-plan categories, color/scan only when their capability flag is true). | | hasScanFunction | boolean\|null | | no | | | bwBaselineCount | integer\|null | | no | | | colorBaselineCount | integer\|null | | no | | | scanBaselineCount | integer\|null | | no | | | bwBaselinePrice | string\|null | | no | | | colorBaselinePrice | string\|null | | no | | | scanBaselinePrice | string\|null | | no | | | bwOveragePrice | string\|null | | no | | | colorOveragePrice | string\|null | | no | | | scanOveragePrice | string\|null | | no | | | categorySlug | string\|null | | no | Slug of an explicit category for API product creation. Resolved to a Category in CreateProductHandler and, when present, takes precedence over the partner's default category and the sector main category (PH-407). Available slugs are exposed via the /product-categories endpoint. | | printPlanInput | boolean | | no | Whether the request carries any meaningful print-plan input — a capability toggle on, or a non-zero click-billing value. Empty/zero defaults mean the user skipped the optional block, so the wizard's productCreate writes no master-data row and the device keeps the downstream fallback (PH-591 AC4). Lives here so the rule stays a domain concern of the request and is unit-testable. | ### Product.UpdateProductRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | name | string\|null | | yes | | | subtitle | string\|null | | no | Optional subtitle. Note: this DTO cannot distinguish an absent field from an explicit JSON null, so a merge-patch {"subtitle": null} does not clear an existing subtitle (it is a no-op). Use PUT to clear the subtitle. | | price | number\|null | | yes | | | productSector | string\|null | IT_AND_OFFICE_EQUIPMENT, TESVOLT_ENERGY_STORAGE, RENEWABLE_ENERGY_AND_ENERGY_STORAGE, FURNITURE_AND_HOME_ACCESSORIES, MEDICAL_DEVICES, KITCHEN_AND_GASTRONOMY_EQUIPMENT, EVENT_TECHNOLOGY, HOME_AND_ENTERTAINMENT_ELECTRONICS, CONSTRUCTION_MACHINERY_AND_TOOLS, TRANSPORT_AND_LOGISTICS_EQUIPMENT, PHOTO_AND_VIDEO_TECHNOLOGY, FITNESS_AND_SPORTS_EQUIPMENT, SECURITY_EQUIPMENT, POINT_OF_SALES, OTHERS, | yes | | | categorySlug | string\|null | | no | Slug of an explicit category. When present it takes precedence and must belong to the target product sector (validated in ProductCategoryResolver, 422 otherwise). When absent, the category is re-resolved from the partner default / sector main category on a PUT, and kept on a PATCH unless the sector change made the current category incompatible. | | canPrintColor | boolean\|null | | no | PH-524 print-plan master-data fields. All nullable; the capability-bound presence rules cannot run as a Callback validator here because the resolved category is unknown at validation time on the API path (same as product creation). Instead {@see \App\Service\PrintPlan\PrintPlanInputValidator} enforces completeness against the resolved category in the API create/update paths (throwing 422), before {@see PrintPlanMasterDataApplier} writes the master-data — the applier itself does not validate. | | hasScanFunction | boolean\|null | | no | | | bwBaselineCount | integer\|null | | no | | | colorBaselineCount | integer\|null | | no | | | scanBaselineCount | integer\|null | | no | | | bwBaselinePrice | string\|null | | no | | | colorBaselinePrice | string\|null | | no | | | scanBaselinePrice | string\|null | | no | | | bwOveragePrice | string\|null | | no | | | colorOveragePrice | string\|null | | no | | | scanOveragePrice | string\|null | | no | | | printPlanInput | boolean | | no | Whether the request carries any meaningful print-plan input — a capability toggle on, or a non-zero click-billing value. Empty/zero defaults mean the caller did not touch the print-plan block, so the processor leaves the existing master-data untouched. Copied verbatim from CreateProductRequest so both API paths share the domain rule. | ### ProductCategoriesResource.ProductCategoryResponse | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | slug | string\|null | | no | | | name | string\|null | | no | | | hasPrintPlanCapability | boolean | | no | Whether this category is Print-Plan-capable (PH-590/PH-524). Items in a cart referencing such a category get Print-Plan financing options. | ### ProductImport | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | string | | no | | | status | string | | no | | | totalRows | integer | | no | | | successfulRows | integer | | no | | | failedRows | integer | | no | | | errorReport | array | | no | Per-row (and file-level) errors of the run. | | createdAt | string\|null | | no | | | finishedAt | string\|null | | no | | | statusUrl | string | | no | Absolute API path to poll this run's status. | ### ProductPrintPlanMasterData | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | product | string | | no | 1:1 owner side. ON DELETE CASCADE so the row vanishes when the Product is deleted; UNIQUE join column enforces 1:1 cardinality. | | canPrintColor | boolean\|null | | no | | | hasScanFunction | boolean\|null | | no | | | bwBaselineCount | integer\|null | | no | | | bwBaselinePrice | string\|null | | no | | | bwOveragePrice | string\|null | | no | | | colorBaselineCount | integer\|null | | no | | | colorBaselinePrice | string\|null | | no | | | colorOveragePrice | string\|null | | no | | | scanBaselineCount | integer\|null | | no | | | scanBaselinePrice | string\|null | | no | | | scanOveragePrice | string\|null | | no | | | deletedAt | string\|null | | no | | | deleted | boolean | | no | | ### ProductSectorsResource.ProductSectorResponse | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | value | string | | no | | | label | string | | no | | ### Profile | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | firstName | string | | no | | | lastName | string | | no | | | phone | string\|null | | no | | | phoneCountryIso | string\|null | | no | | | phoneExt | string\|null | | no | | | company | string\|null | | no | | | addresses | array
| | no | | | user | mixed | | no | | ### Quote | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | quoteNumber | string | | yes | | | calculationType | string | rent, leasing, rent_to_own, print_plan, partial_amortisation_leasing, print_plan_3kdg_12verl, print_plan_6kdg_12verl | yes | | | duration | integer | | yes | | | customer | mixed | | yes | | | distributionHub | string\|null | | no | | | shippingAddress | mixed | | no | | | calculation | string\|null | | no | | | id | string\|null | | no | | | status | string | | no | | | createdAt | string | | no | | | updatedAt | string | | no | | | statusUpdatedAt | string | | no | | | items | array | | no | | | inReviewSince | string\|null | | no | | | hasReceivedReminder | boolean | | no | | | reminderCount | integer | | no | | | lastReminderAt | string\|null | | no | | | finalReminderSentAt | string\|null | | no | When the final document reminder left for the current status episode. | | grenkeSubmissionStatus | string\|null | pending, submitted, failed, | no | Denormalised status of the latest Grenke submission for this quote. | | lastGrenkeSubmissionAt | string\|null | | no | Timestamp of the latest Grenke submission for this quote. | | contract | string\|null | | no | | | cart | string\|null | | no | Source cart for API-driven quote creation (cart checkout). | | financingResponses | array | | no | | | apiCall | boolean | | no | | | financeRejectedOverride | boolean | | no | PH-736: transient (non-persisted) flag set by the dedicated approval-team override action right before applying FINANCE_ACCEPT out of FINANCE_REJECTED. The workflow guard only lets that override transition through when this flag is set, so the generic flow route (and any other apply path) cannot lift a rejected quote without going through the reason + type-to-confirm flow. | | authorizedPersons | array | | no | | | quoteFeedbacks | array | | no | | | quoteRequest | string\|null | | no | | | financingNumber | string\|null | | no | | | processingFee | string\|null | | no | | | recurringService | string\|null | | no | | | rentalFactor | string\|null | | no | Rental factor (percentage) frozen onto the quote at build time (PH-486). | | residualValue | string\|null | | no | Residual value (percentage) frozen onto the quote at build time (PH-884). | | specialAgreements | string\|null | | no | | | paymentInterval | string\|null | monthly, quarterly, | no | | | deletedAt | string\|null | | no | | | partner | Partner | | yes | | | deleted | boolean | | no | | | totalValue | mixed | | no | | | monthlyCosts | number\|null | | no | | | monthlyRateAllIn | number\|null | | no | All-in monthly rate shown to partners (detail view, offer PDF) and summed per quote in FinancingCase::getMonthlyRate(). | | selectedOffer | mixed | | no | | | inReview | boolean | | no | | | activeFinancingResponses | Collection | | no | | | receivedReminder | boolean | | no | | | productSector | string\|null | IT_AND_OFFICE_EQUIPMENT, TESVOLT_ENERGY_STORAGE, RENEWABLE_ENERGY_AND_ENERGY_STORAGE, FURNITURE_AND_HOME_ACCESSORIES, MEDICAL_DEVICES, KITCHEN_AND_GASTRONOMY_EQUIPMENT, EVENT_TECHNOLOGY, HOME_AND_ENTERTAINMENT_ELECTRONICS, CONSTRUCTION_MACHINERY_AND_TOOLS, TRANSPORT_AND_LOGISTICS_EQUIPMENT, PHOTO_AND_VIDEO_TECHNOLOGY, FITNESS_AND_SPORTS_EQUIPMENT, SECURITY_EQUIPMENT, POINT_OF_SALES, OTHERS, | no | | | contactPhone | string\|null | | no | | | contactEmail | string\|null | | no | | | financingCaseId | string\|null | | no | Returns the financing case ID for API serialization. | | effectiveShippingAddress | mixed | | no | Returns the effective shipping address (Quote-specific or Customer default) | | commissionPercentage | integer | | no | The commission tier the quote is currently priced with, in percent. | ### Quote-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | quoteNumber | string | | yes | | | calculationType | string | rent, leasing, rent_to_own, print_plan, partial_amortisation_leasing, print_plan_3kdg_12verl, print_plan_6kdg_12verl | yes | | | duration | integer | | yes | | | customer | mixed | | yes | | | distributionHub | string\|null | | no | | | shippingAddress | mixed | | no | | | id | string\|null | | no | | | status | string | | no | | | createdAt | string | | no | | | updatedAt | string | | no | | | statusUpdatedAt | string | | no | | | items | array | | no | | | financingResponses | array | | no | | | authorizedPersons | array | | no | | | financingNumber | string\|null | | no | | ### Quote.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | quoteNumber | string | | yes | | | calculationType | string | rent, leasing, rent_to_own, print_plan, partial_amortisation_leasing, print_plan_3kdg_12verl, print_plan_6kdg_12verl | yes | | | duration | integer | | yes | | | customer | mixed | | yes | | | distributionHub | string\|null | | no | | | shippingAddress | mixed | | no | | | id | string\|null | | no | | | status | string | | no | | | createdAt | string | | no | | | updatedAt | string | | no | | | statusUpdatedAt | string | | no | | | items | array | | no | | | financingResponses | array | | no | | | authorizedPersons | array | | no | | | financingNumber | string\|null | | no | | ### QuoteFeedback | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | quote | string\|null | | no | | | text | string\|null | | no | | | action | string | request_changes, reject_by_customer | no | | | createdAt | string | | no | | ### QuoteItem | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | position | integer | | no | | | quantity | integer | | no | | | pricePerItem | number | | no | | | total | number | | no | | ### QuoteItem-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | position | integer | | no | | | quantity | integer | | no | | | pricePerItem | number | | no | | | total | number | | no | | ### QuoteItem.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | position | integer | | no | | | quantity | integer | | no | | | pricePerItem | number | | no | | | total | number | | no | | ### QuoteRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | createdAt | string | | no | | | partner | mixed | | no | | | status | string | | no | | | quote | string\|null | | no | | | redirectUrl | string | | no | | | phoneCountryIso | string\|null | | no | | | phoneExt | string\|null | | no | | | category | mixed | | no | | | deletedAt | string\|null | | no | | | calculation | string\|null | | no | | | email | string | | no | | | name | string\|null | | no | | | phone | string\|null | | no | | | company | string\|null | | no | | | message | string\|null | | no | | | firstName | string\|null | | no | | | lastName | string\|null | | no | | | customerType | string | company, freelancer, public_institution | no | | | street | string\|null | | no | | | houseNumber | string\|null | | no | | | postalCode | string\|null | | no | | | city | string\|null | | no | | | country | string\|null | | no | | | crefoNo | string\|null | | no | | | deleted | boolean | | no | | | productSector | string\|null | | no | | | financingCase | string\|null | | no | | | solvencyCheckCompanyName | string\|null | | no | Get the company name for solvency check. | | solvencyCheckAddress | mixed | | no | Get the address for solvency check. | | currentSolvencyStatus | string | | no | | ### QuoteRequest-quote_request.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | createdAt | string | | no | | | status | string | | no | | | category | mixed | | no | | | email | string | | no | | | name | string\|null | | no | | | phone | string\|null | | no | | | company | string\|null | | no | | | message | string\|null | | no | | | firstName | string\|null | | no | | | lastName | string\|null | | no | | | customerType | string | company, freelancer, public_institution | no | | | street | string\|null | | no | | | houseNumber | string\|null | | no | | | postalCode | string\|null | | no | | | city | string\|null | | no | | | country | string\|null | | no | | | crefoNo | string\|null | | no | | | productSector | string\|null | | no | | ### QuoteRequest.QuoteRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | email | string | | yes | Contact email address of the applicant. | | name | string\|null | | no | Contact person full name (optional). | | phone | string\|null | | no | Contact phone number (optional). | | company | string\|null | | no | Company or organization name (optional). | | message | string\|null | | no | Free-text note for the quote request (optional). | | acknowledgedPrivacy | boolean | | no | Confirms the applicant accepts the privacy policy; must be true. | | firstName | string | | yes | Contact person given name. | | lastName | string | | yes | Contact person family name. | | customerType | string | company, freelancer, public_institution | yes | Customer classification: company, sole proprietor, or private person. | | street | string | | yes | Street name of the contact address. | | houseNumber | string\|null | | no | House or building number (optional). | | postalCode | string | | yes | Postal / ZIP code of the address. | | city | string | | yes | City or town of the address. | | country | string | | yes | Country of the address. | | crefoNo | string\|null | | no | Optional Crefo credit-rating number for solvency checks. | | category | mixed | | no | Product category the request relates to (optional). | | calculation | string\|null | | yes | Rental price calculation the request is based on (required). | | duration | integer\|null | | no | Optional: duration in months of the offer the customer picked. Pass it together with calculationType; the pair must match one of the calculation's offers. A calculation with exactly one offer needs no selection. | | calculationType | string\|null | rent, leasing, rent_to_own, print_plan, partial_amortisation_leasing, print_plan_3kdg_12verl, print_plan_6kdg_12verl, | no | Optional: calculation type of the offer the customer picked (e.g. leasing). Pass it together with duration. | ### QuoteRequest.jsonld-quote_request.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | id | integer | | no | | | createdAt | string | | no | | | status | string | | no | | | category | mixed | | no | | | email | string | | no | | | name | string\|null | | no | | | phone | string\|null | | no | | | company | string\|null | | no | | | message | string\|null | | no | | | firstName | string\|null | | no | | | lastName | string\|null | | no | | | customerType | string | company, freelancer, public_institution | no | | | street | string\|null | | no | | | houseNumber | string\|null | | no | | | postalCode | string\|null | | no | | | city | string\|null | | no | | | country | string\|null | | no | | | crefoNo | string\|null | | no | | | productSector | string\|null | | no | | ### RequestedDocument | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | financingCase | string | | no | | | category | string\|null | business_registration, annual_financial_statement, business_assessment, self_disclosure, medical_license, purchase_offer, notarized_transfer_contract, land_register_extract, property_owner_consent, partnership_agreement, birth_date, private_address, founding_date, employee_count, self_disclosure_template, default_guarantee, articles_of_association, sale_leaseback_invoice, power_of_attorney, representative_id_cards, organization_chart, shareholder_list, vehicle_title, rate_adjustment_letter, partner_invoice, grenke_invoice, delivery_proof, delivery_note, handover_confirmation, frame_call_off_order, signed_contract, private_guarantee, corporate_guarantee, supplementary_prepayment, supplementary_free_start, supplementary_vending, revocation_notice, voucher, supplementary_third_party, gwg_form_correction, schufa_guarantee_notice, print_plan_contract_draft, other, | no | | | recipientType | string | service, billing | no | | | initiatedBy | string | financier, partner | no | PH-1126: who initiated the item — the financing side (default) or the partner via "Dokument hochladen" (request + response in one step). | | customName | string\|null | | no | | | responseDocuments | array | | no | | | requestedAt | string | | no | | | status | string | pending, not_available, provided, sent, accepted, rejected | no | | | providedAt | string\|null | | no | | | optional | boolean | | no | | | transmittedToGrenkeAt | string\|null | | no | | | targetAudience | string | customer, partner, miete24 | no | The audience is chosen once, when the request item is created. | | label | string | | no | | | itemType | string | | no | | | fulfilled | boolean | | no | | | editable | boolean | | no | Whether the recipient can still act on this item: nothing has been uploaded yet, or a reviewer sent the submission back for a replacement. | | reviewable | boolean | | no | | | notAvailable | boolean | | no | | | internalOnly | boolean | | no | | | transmittableToGrenke | boolean | | no | | | verifiedResponseDocuments | array | | no | | | activeResponseDocuments | array | | no | Returns every response document that has not been superseded — useful for "currently provided" UI listings that should include PENDING_REVIEW and VERIFIED but hide retired re-uploads. | | transmittableResponseDocuments | array | | no | Returns every response document that may still be forwarded to Grenke — the lifecycle states reviewers have not actively retired. Grenke transmission currently fires when the parent item is PROVIDED/ACCEPTED, so PENDING_REVIEW uploads are valid attachments. REJECTED, SUPERSEDED and NULL-status (legacy/future orphan rows) are excluded — default-deny keeps unknown states out of the outbound envelope. | | latestPendingResponseDocument | string\|null | | no | | ### RequestedDocument-financing_case.read _No documented properties._ ### RequestedDocument.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | ### RequestedFillAndReturn | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | financingCase | string | | no | | | label | string | | no | | | category | string\|null | business_registration, annual_financial_statement, business_assessment, self_disclosure, medical_license, purchase_offer, notarized_transfer_contract, land_register_extract, property_owner_consent, partnership_agreement, birth_date, private_address, founding_date, employee_count, self_disclosure_template, default_guarantee, articles_of_association, sale_leaseback_invoice, power_of_attorney, representative_id_cards, organization_chart, shareholder_list, vehicle_title, rate_adjustment_letter, partner_invoice, grenke_invoice, delivery_proof, delivery_note, handover_confirmation, frame_call_off_order, signed_contract, private_guarantee, corporate_guarantee, supplementary_prepayment, supplementary_free_start, supplementary_vending, revocation_notice, voucher, supplementary_third_party, gwg_form_correction, schufa_guarantee_notice, print_plan_contract_draft, other, | no | | | recipientType | string | service, billing | no | | | templateFile | string\|null | | no | Not mapped to the DB. Vich handles this transient property. | | templateFileName | string\|null | | no | | | templateFileSize | integer\|null | | no | | | templateFileMimeType | string\|null | | no | | | templateOriginalName | string\|null | | no | | | updatedAt | string | | no | | | responseDocuments | array | | no | | | requestedAt | string | | no | | | status | string | pending, not_available, provided, sent, accepted, rejected | no | | | providedAt | string\|null | | no | | | optional | boolean | | no | | | transmittedToGrenkeAt | string\|null | | no | | | targetAudience | string | customer, partner, miete24 | no | The audience is chosen once, when the request item is created. | | itemType | string | | no | | | fulfilled | boolean | | no | | | editable | boolean | | no | Whether the recipient can still act on this item: nothing has been uploaded yet, or a reviewer sent the submission back for a replacement. | | reviewable | boolean | | no | | | notAvailable | boolean | | no | | | internalOnly | boolean | | no | | | transmittableToGrenke | boolean | | no | | | verifiedResponseDocuments | array | | no | | | activeResponseDocuments | array | | no | Returns every response document that has not been superseded — useful for "currently provided" UI listings that should include PENDING_REVIEW and VERIFIED but hide retired re-uploads. | | transmittableResponseDocuments | array | | no | Returns every response document that may still be forwarded to Grenke — the lifecycle states reviewers have not actively retired. Grenke transmission currently fires when the parent item is PROVIDED/ACCEPTED, so PENDING_REVIEW uploads are valid attachments. REJECTED, SUPERSEDED and NULL-status (legacy/future orphan rows) are excluded — default-deny keeps unknown states out of the outbound envelope. | | latestPendingResponseDocument | string\|null | | no | | ### RequestedFillAndReturn-financing_case.read _No documented properties._ ### RequestedFillAndReturn.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | ### RequestedInformation-financing_case.read _No documented properties._ ### RequestedInformation.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | ### RequestedItemInterface-financing_case.read _No documented properties._ ### RequestedItemInterface.jsonld-financing_case.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | ### SlaFileListResource.SlaFileResponse | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | name | string | | no | | | file | string | | no | | ### StartESignatureRequest | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | authorizedPersons | array | | yes | Persons authorized to sign; at least one is required. Generic mailbox addresses (for example info@) are rejected. A single person must be permitted to sign alone (soloSigneePermitted = true); otherwise provide at least two persons. | ### StartESignatureRequest.StartESignatureResponse | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | financingNumber | string | | no | | | quoteStatus | string | | no | | ### User | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | locale | string | | no | | | createdAt | string | | no | | | approvedAt | string\|null | | no | | | lastLoginAt | string\|null | | no | | | registrationReminderFirstSentAt | string\|null | | no | Set when the 24h reminder is handed to the mailer (PH-946). Written at enqueue time, not on delivery — the mailer bus is async, so a marker that waited for the SentMessageEvent would let the hourly cron mail again. | | registrationReminderLastSentAt | string\|null | | no | Same for the 7d reminder; once set, the user leaves the candidate set. | | dois | array | | no | | | profile | mixed | | no | | | customers | array | | no | | | quotes | array | | no | | | googleAuthenticatorEnabled | boolean\|null | | no | | | emailAuthEnabled | boolean\|null | | no | | | roleInCompany | string\|null | | no | | | invitedBy | mixed | | no | | | distributionHubs | array | | no | | | partner | mixed | | no | | | email | string | | no | | | roles | array | | no | | | userIdentifier | string | | no | A visual identifier that represents this user. | | partnerManager | boolean | | no | | | approved | boolean | | no | | | activeRegistrationDoi | boolean | | no | | | blocked | boolean | | no | | | hashValid | boolean | | no | | | googleAuthenticatorUsername | string | | no | | | emailAuthRecipient | string | | no | | | backupCode | array | | no | | | twoFactorAuthEnabled | boolean | | no | | | name | string | | no | | | approvalTeam | boolean | | no | | ### WebhookEndpoint | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | integer | | no | | | ulid | string | | no | Opaque public identifier exposed via the API. Generated in the create processor; never the integer PK, to avoid resource enumeration. | | partner | Partner | | no | | | url | string | | no | | | secretEncrypted | string | | no | The signing secret, encrypted at rest. Never serialized. | | active | boolean | | no | | | createdAt | string | | no | | | updatedAt | string | | no | | ### WebhookEndpoint-webhook_endpoint.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | ulid | string | | no | Opaque public identifier exposed via the API. Generated in the create processor; never the integer PK, to avoid resource enumeration. | | url | string | | no | | | active | boolean | | no | | | createdAt | string | | no | | | updatedAt | string | | no | | ### WebhookEndpoint.WebhookEndpointCreateDto-webhook_endpoint.create | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | url | string\|null | | yes | HTTPS URL that receives event notifications via POST. | | active | boolean | | no | Whether deliveries to this endpoint are enabled. | ### WebhookEndpoint.WebhookEndpointCreateDto.jsonld-webhook_endpoint.create | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | url | string\|null | | yes | HTTPS URL that receives event notifications via POST. | | active | boolean | | no | Whether deliveries to this endpoint are enabled. | ### WebhookEndpoint.WebhookEndpointSecretResponse-webhook_endpoint.secret | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | id | string | | no | | | url | string | | no | | | active | boolean | | no | | | secret | string | | no | | | createdAt | string | | no | | ### WebhookEndpoint.WebhookEndpointSecretResponse.jsonld-webhook_endpoint.secret | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | id | string | | no | | | url | string | | no | | | active | boolean | | no | | | secret | string | | no | | | createdAt | string | | no | | ### WebhookEndpoint.WebhookEndpointUpdateDto-webhook_endpoint.update | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | url | string\|null | | no | Updated HTTPS delivery URL; omit to leave unchanged. | | active | boolean\|null | | no | Updated activation flag; omit to leave unchanged. | ### WebhookEndpoint.jsonld-webhook_endpoint.read | Property | Type | Allowed values | Required | Description | | --- | --- | --- | --- | --- | | @context | mixed | | no | | | @id | string | | no | | | @type | string | | no | | | ulid | string | | no | Opaque public identifier exposed via the API. Generated in the create processor; never the integer PK, to avoid resource enumeration. | | url | string | | no | | | active | boolean | | no | | | createdAt | string | | no | | | updatedAt | string | | no | |