{
  "openapi": "3.0.1",
  "info": {
    "title": "Promob Budgets Integration API",
    "description": "API for searching budget metadata sent from Promob integrations and generating temporary URIs for downloading budget JSON files.\r\n\r\nAuthentication:\r\n- Budget endpoints require the X-Integration-ApiKey header.\r\n- Health endpoints do not require X-Integration-ApiKey.\r\n\r\nSearchBudgets filters:\r\n- createdAfter and createdBefore are required ISO 8601 date-time query parameters. Example: 2026-06-08T00:00:00Z.\r\n- The date range is inclusive.\r\n- serialNumber, systemId and accountId are optional exact-match filters.\r\n- All filters are combined with AND.\r\n- Empty optional string filters are ignored.\r\n- Pagination is not implemented; prefer small date ranges.\r\n\r\nDownload URI:\r\n- GET /Budgets/{budgetId} returns a temporary URI for downloading the budget JSON.\r\n- The URI is valid for 5 minutes.\r\n\r\nCommon status codes:\r\n- 200: data returned.\r\n- 204: valid request, but no data was found.\r\n- 400: invalid request, missing required parameters or invalid date range.\r\n- 401: the API key is valid, but the requested budget is not available for that integration.\r\n- 403: missing, invalid or disabled API key.",
    "termsOfService": "https://www.cyncly.com/terms",
    "contact": {
      "name": "Cyncly Support",
      "url": "https://www.cyncly.com/support"
    },
    "license": {
      "name": "Proprietary",
      "url": "https://www.cyncly.com/"
    },
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://api-pr-connect-budgets-integrations.promob.com/api"
    }
  ],
  "paths": {
    "/Budgets/SearchBudgets": {
      "get": {
        "tags": [
          "Budgets"
        ],
        "summary": "Search budget metadata",
        "description": "Searches budget metadata by creation date and optional exact-match filters. Results are restricted to budgets available for the API key sent in the request.",
        "operationId": "SearchBudgets",
        "parameters": [
          {
            "name": "X-Integration-ApiKey",
            "in": "header",
            "description": "Integration API key issued for this consumer.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "createdAfter",
            "in": "query",
            "description": "Inclusive start of the budget creation date range. Use ISO 8601 format, for example 2026-06-01T00:00:00Z.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "createdBefore",
            "in": "query",
            "description": "Inclusive end of the budget creation date range. Use ISO 8601 format, for example 2026-06-08T23:59:59Z.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "serialNumber",
            "in": "query",
            "description": "Optional exact-match filter for the Promob serial number. Empty values are ignored.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "systemId",
            "in": "query",
            "description": "Optional exact-match filter for the source system identifier. Empty values are ignored.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "accountId",
            "in": "query",
            "description": "Optional exact-match filter for the source account identifier. Empty values are ignored.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Budget metadata matching the requested filters.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/budgetInfo"
                  }
                }
              }
            }
          },
          "204": {
            "description": "The request was valid, but no budget metadata matched the filters."
          },
          "400": {
            "description": "Missing required date parameters, invalid date range or invalid query value."
          },
          "401": {
            "description": "The API key is valid, but the requested data is not available for this integration."
          },
          "403": {
            "description": "Missing, invalid or disabled integration API key."
          }
        }
      }
    },
    "/Budgets/GetBudgetInfoId/{id}": {
      "get": {
        "tags": [
          "Budgets"
        ],
        "summary": "Get budget metadata by ID",
        "description": "Returns metadata for a single budget. The budget must be available for the API key sent in the request.",
        "operationId": "GetBudgetInfoId",
        "parameters": [
          {
            "name": "X-Integration-ApiKey",
            "in": "header",
            "description": "Integration API key issued for this consumer.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "description": "Budget metadata identifier returned by SearchBudgets.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Budget metadata found for the requested identifier.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/budgetInfo"
                }
              }
            }
          },
          "204": {
            "description": "No budget metadata was found for the requested identifier."
          },
          "400": {
            "description": "Invalid request or budget metadata identifier."
          },
          "401": {
            "description": "The budget exists, but is not available for this integration."
          },
          "403": {
            "description": "Missing, invalid or disabled integration API key."
          }
        }
      }
    },
    "/Budgets/{budgetId}": {
      "get": {
        "tags": [
          "Budgets"
        ],
        "summary": "Get budget JSON download URI",
        "description": "Generates a temporary URI for downloading the budget JSON. The URI is valid for 5 minutes and the budget must be available for the API key sent in the request.",
        "operationId": "GetBudgetURI",
        "parameters": [
          {
            "name": "X-Integration-ApiKey",
            "in": "header",
            "description": "Integration API key issued for this consumer.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "budgetId",
            "in": "path",
            "description": "Budget identifier returned in the budget metadata.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Temporary URI generated for downloading the budget JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/budgetInfoURI"
                }
              }
            }
          },
          "204": {
            "description": "Budget was not found or a download URI could not be generated."
          },
          "400": {
            "description": "Invalid request or budget source file is unavailable."
          },
          "401": {
            "description": "The budget exists, but is not available for this integration."
          },
          "403": {
            "description": "Missing, invalid or disabled integration API key."
          }
        }
      }
    },
    "/Health/Online": {
      "get": {
        "tags": [
          "Health"
        ],
        "summary": "Check API availability",
        "description": "Returns 200 OK when the integration API is online. This endpoint does not require X-Integration-ApiKey.",
        "operationId": "runOnlineCheck",
        "responses": {
          "200": {
            "description": "The API is online."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "additionalEntry": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "operationType": {
            "type": "string"
          },
          "value": {
            "type": "string"
          },
          "deleted": {
            "type": "boolean"
          },
          "systemMd5": {
            "type": "string"
          }
        }
      },
      "budgetInfo": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "lang": {
            "type": "string"
          },
          "createOn": {
            "type": "string",
            "format": "date-time"
          },
          "currencySymbol": {
            "type": "string"
          },
          "connectInfo": {
            "$ref": "#/components/schemas/connectInfo"
          },
          "systemId": {
            "type": "string"
          },
          "accountId": {
            "type": "string"
          },
          "distribution": {
            "type": "string"
          },
          "serialnumber": {
            "type": "string"
          },
          "systemRevision": {
            "type": "string"
          },
          "promobVersion": {
            "type": "string"
          },
          "connectVersion": {
            "type": "string"
          },
          "metadatas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/metadata"
            }
          },
          "paymentTerms": {
            "$ref": "#/components/schemas/paymentTerms"
          },
          "pluginId": {
            "type": "string"
          }
        }
      },
      "budgetInfoURI": {
        "type": "object",
        "properties": {
          "budgetId": {
            "type": "string",
            "format": "uuid"
          },
          "uri": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "connectInfo": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string",
            "format": "uuid"
          },
          "designOptionId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "designVersionId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "metadata": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        }
      },
      "paymentTerm": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "hasDownPayment": {
            "type": "boolean"
          },
          "selected": {
            "type": "boolean"
          },
          "parcelQuantity": {
            "type": "number",
            "format": "double"
          },
          "percentualDiscount": {
            "type": "number",
            "format": "double"
          },
          "parcelValue": {
            "type": "number",
            "format": "double"
          },
          "initialValue": {
            "type": "number",
            "format": "double"
          },
          "parceledTotal": {
            "type": "number",
            "format": "double"
          },
          "generalTotal": {
            "type": "number",
            "format": "double"
          },
          "calculusValue": {
            "type": "number",
            "format": "double"
          },
          "deleted": {
            "type": "boolean"
          },
          "hasCustomParcels": {
            "type": "boolean"
          }
        }
      },
      "paymentTerms": {
        "type": "object",
        "properties": {
          "additionalEntries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/additionalEntry"
            }
          },
          "terms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/paymentTerm"
            }
          }
        }
      },
      "BudgetInfoXMLJsonModel": {
        "type": "object",
        "properties": {
          "BudgetInfoID": {
            "type": "string",
            "description": "Budget metadata identifier."
          },
          "SystemID": {
            "type": "string",
            "description": "Source system identifier."
          },
          "SerialNumber": {
            "type": "string",
            "description": "Promob serial number."
          },
          "PromobVersion": {
            "type": "string",
            "description": "Promob version used to generate the budget."
          },
          "SystemRevision": {
            "type": "string",
            "description": "Source system revision."
          },
          "Distribution": {
            "type": "string",
            "description": "Promob distribution."
          },
          "Lang": {
            "type": "string",
            "description": "Budget language."
          },
          "Metadatas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Metadata"
            },
            "description": "Additional metadata extracted from the budget XML."
          },
          "PaymentTerms": {
            "$ref": "#/components/schemas/PaymentTerms"
          },
          "JsonContent": {
            "$ref": "#/components/schemas/BudgetIntegration"
          }
        },
        "description": "Layout of the budget data. It describes the full conversion envelope; the downloaded JSON file uses the JsonContent property as its payload.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "Metadata": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "string",
            "description": "Metadata identifier."
          },
          "Value": {
            "type": "string",
            "description": "Metadata value."
          }
        },
        "description": "Metadata entry.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "PaymentTerms": {
        "type": "object",
        "properties": {
          "AdditionalEntries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AdditionalEntry"
            },
            "description": "Additional payment entries available for the budget."
          },
          "Terms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentTerm"
            },
            "description": "Payment terms available for the budget."
          }
        },
        "description": "Payment terms layout.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "AdditionalEntry": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "string",
            "description": "Additional entry identifier."
          },
          "Description": {
            "type": "string",
            "description": "Additional entry description."
          },
          "OperationType": {
            "type": "string",
            "description": "Operation type applied to the additional entry."
          },
          "Value": {
            "type": "string",
            "description": "Additional entry value."
          },
          "Deleted": {
            "type": "boolean",
            "description": "Indicates whether the additional entry was deleted in the source data."
          },
          "SystemMd5": {
            "type": "string",
            "description": "Source system MD5 hash."
          }
        },
        "description": "Additional payment entry.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "PaymentTerm": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "string",
            "description": "Payment term identifier."
          },
          "Description": {
            "type": "string",
            "description": "Payment term description."
          },
          "HasDownPayment": {
            "type": "boolean",
            "description": "Indicates whether the payment term has a down payment."
          },
          "Selected": {
            "type": "boolean",
            "description": "Indicates whether the payment term is selected."
          },
          "ParcelQuantity": {
            "type": "number",
            "description": "Number of parcels for the payment term.",
            "format": "double"
          },
          "PercentualDiscount": {
            "type": "number",
            "description": "Discount percentage applied to the payment term.",
            "format": "double"
          },
          "ParcelValue": {
            "type": "number",
            "description": "Value of each parcel.",
            "format": "double"
          },
          "InitialValue": {
            "type": "number",
            "description": "Initial payment value.",
            "format": "double"
          },
          "ParceledTotal": {
            "type": "number",
            "description": "Total parceled value.",
            "format": "double"
          },
          "GeneralTotal": {
            "type": "number",
            "description": "General total value.",
            "format": "double"
          },
          "CalculusValue": {
            "type": "number",
            "description": "Calculation base value.",
            "format": "double"
          },
          "Deleted": {
            "type": "boolean",
            "description": "Indicates whether the payment term was deleted in the source data."
          },
          "HasCustomParcels": {
            "type": "boolean",
            "description": "Indicates whether the payment term uses custom parcels."
          }
        },
        "description": "Payment term option.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "BudgetIntegration": {
        "type": "object",
        "properties": {
          "BudgetId": {
            "type": "string",
            "description": "Budget identifier."
          },
          "Project": {
            "$ref": "#/components/schemas/Project"
          },
          "Customer": {
            "$ref": "#/components/schemas/Customer"
          },
          "Details": {
            "$ref": "#/components/schemas/Details"
          },
          "Items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Item"
            },
            "description": "Budget items."
          },
          "PricesDetails": {
            "$ref": "#/components/schemas/PricesDetails"
          },
          "TotalPrices": {
            "$ref": "#/components/schemas/TotalPrices"
          },
          "Categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Category"
            },
            "description": "Budget categories and their total prices."
          }
        },
        "description": "Budget JSON payload persisted and downloaded from the temporary budget URI.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "Project": {
        "type": "object",
        "properties": {
          "ProjectId": {
            "type": "string",
            "description": "Project identifier."
          },
          "DesignOptionId": {
            "type": "string",
            "description": "Design option identifier, when available.",
            "format": "uuid",
            "nullable": true
          },
          "DesignVersionId": {
            "type": "string",
            "description": "Design version identifier, when available.",
            "format": "uuid",
            "nullable": true
          }
        },
        "description": "Project identifiers included in the budget JSON.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "Customer": {
        "type": "object",
        "properties": {
          "CustomerId": {
            "type": "string",
            "description": "Customer identifier."
          },
          "Name": {
            "type": "string",
            "description": "Customer name."
          }
        },
        "description": "Customer information included in the budget JSON.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "Details": {
        "type": "object",
        "properties": {
          "ProjectName": {
            "type": "string",
            "description": "Project name."
          },
          "SentToAt": {
            "type": "string",
            "description": "Date/time when the budget was sent to integration."
          }
        },
        "description": "Budget details included in the budget JSON.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "Item": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "string",
            "description": "Item identifier."
          },
          "Description": {
            "type": "string",
            "description": "Item description."
          },
          "Unit": {
            "type": "string",
            "description": "Item unit."
          },
          "Repetition": {
            "type": "integer",
            "description": "Item repetition.",
            "format": "int32"
          },
          "Quantity": {
            "type": "number",
            "description": "Item quantity.",
            "format": "double"
          },
          "Width": {
            "type": "number",
            "description": "Item width.",
            "format": "double"
          },
          "Height": {
            "type": "number",
            "description": "Item height.",
            "format": "double"
          },
          "Depth": {
            "type": "number",
            "description": "Item depth.",
            "format": "double"
          },
          "Family": {
            "type": "string",
            "description": "Item family."
          },
          "Group": {
            "type": "string",
            "description": "Item group."
          },
          "IsGeometry": {
            "type": "string",
            "description": "Indicates whether the item is geometry."
          },
          "ShowPrice": {
            "type": "string",
            "description": "Indicates whether price should be shown."
          },
          "IdPriceProvider": {
            "type": "string",
            "description": "Price provider identifier."
          },
          "IdPriceSource": {
            "type": "string",
            "description": "Price source identifier."
          },
          "IdPriceTable": {
            "type": "string",
            "description": "Price table identifier."
          },
          "PriceCanModify": {
            "type": "string",
            "description": "Indicates whether price can be modified."
          },
          "UniqueId": {
            "type": "string",
            "description": "Unique item identifier."
          },
          "UniqueParentId": {
            "type": "string",
            "description": "Unique parent item identifier."
          },
          "GuidId": {
            "type": "string",
            "description": "Item GUID as string."
          },
          "Inverted": {
            "type": "string",
            "description": "Indicates whether the item is inverted."
          },
          "PlateCuttingRotate": {
            "type": "string",
            "description": "Indicates whether plate cutting rotation is enabled."
          },
          "Rule": {
            "type": "string",
            "description": "Item rule."
          },
          "Reference": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Dynamic reference key/value data."
          }
        },
        "description": "Budget item included in the downloaded budget JSON.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "PricesDetails": {
        "type": "object",
        "properties": {
          "Currency": {
            "type": "string",
            "description": "Currency symbol."
          },
          "ExchangeRate": {
            "type": "integer",
            "description": "Exchange rate.",
            "format": "int32"
          },
          "PurchaseValue": {
            "$ref": "#/components/schemas/Object"
          },
          "SaleValue": {
            "type": "number",
            "description": "Sale value.",
            "format": "double"
          }
        },
        "description": "Pricing information included in the budget JSON.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "TotalPrices": {
        "type": "object",
        "properties": {
          "Value": {
            "type": "string",
            "description": "Total value."
          },
          "Order": {
            "$ref": "#/components/schemas/PriceInfo"
          },
          "Budget": {
            "$ref": "#/components/schemas/PriceInfo"
          }
        },
        "description": "Total prices grouped by order and budget.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "PriceInfo": {
        "type": "object",
        "properties": {
          "Value": {
            "type": "string",
            "description": "Price value."
          },
          "Items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PriceItem"
            },
            "description": "Detailed price items."
          }
        },
        "description": "Price values and detailed price items.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "PriceItem": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "string",
            "description": "Price item identifier."
          },
          "Description": {
            "type": "string",
            "description": "Price item description."
          },
          "Value": {
            "type": "string",
            "description": "Price item value."
          }
        },
        "description": "Detailed price item.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "Category": {
        "type": "object",
        "properties": {
          "Description": {
            "type": "string",
            "description": "Category description."
          },
          "TotalPrices": {
            "$ref": "#/components/schemas/TotalPrices"
          }
        },
        "description": "Budget category included in the budget JSON.",
        "x-tags": [
          "Downloaded JSON"
        ]
      },
      "Object": {
        "type": "object"
      }
    }
  },
  "tags": [
    {
      "name": "Downloaded JSON",
      "description": "Schemas for the budget JSON file downloaded from the temporary URI returned by GET /Budgets/{budgetId}.\r\n\r\n### Contracts\r\n\r\n- `BudgetInfoXMLJsonModel`: Layout of the budget data. It describes the full conversion envelope; the downloaded JSON file uses the JsonContent property as its payload.\r\n- `Metadata`: Metadata entry.\r\n- `PaymentTerms`: Payment terms layout.\r\n- `AdditionalEntry`: Additional payment entry.\r\n- `PaymentTerm`: Payment term option.\r\n- `BudgetIntegration`: Budget JSON payload persisted and downloaded from the temporary budget URI.\r\n- `Project`: Project identifiers included in the budget JSON.\r\n- `Customer`: Customer information included in the budget JSON.\r\n- `Details`: Budget details included in the budget JSON.\r\n- `Item`: Budget item included in the downloaded budget JSON.\r\n- `PricesDetails`: Pricing information included in the budget JSON.\r\n- `TotalPrices`: Total prices grouped by order and budget.\r\n- `PriceInfo`: Price values and detailed price items.\r\n- `PriceItem`: Detailed price item.\r\n- `Category`: Budget category included in the budget JSON.",
      "x-displayName": "Downloaded JSON"
    }
  ],
  "x-tagGroups": [
    {
      "name": "Endpoints",
      "tags": [
        "Budgets",
        "Health"
      ]
    },
    {
      "name": "Contracts",
      "tags": [
        "Downloaded JSON"
      ]
    }
  ]
}