API
Create quotes from any system. Keys are created in the app: Settings → API. Each key only gives access to its own HubSpot account.
Authentication
Authorization: Bearer qbk_…
POST /api/v1/quotes
Creates a quote on deal dealId from a template (templateId + inputs) or from content (content, url, base64 + filename, or a multipart file).
curl -X POST https://quotes.vexcosolutions.com/api/v1/quotes \
-H "Authorization: Bearer qbk_…" -H "Content-Type: application/json" \
-d '{"dealId": "123456", "templateId": "…", "inputs": {"users": "25", "plan": "pro"}}'
curl -X POST https://quotes.vexcosolutions.com/api/v1/quotes \
-H "Authorization: Bearer qbk_…" \
-F dealId=123456 -F file=@quote.xlsx -F publish=false
Response (201):
{ "quoteId": "…", "url": "https://app.hubspot.com/…", "publicUrl": "…", "title": "…", "total": 1311, "currency": "EUR",
"lineCount": 3, "mode": "cpq", "status": "DRAFT", "needsApproval": false, "warnings": [] }
POST /api/v1/preview
Same as /quotes but only calculates: returns lines, totals, buyer, company and blocking issues without creating anything.
POST /api/v1/parse
Reads content and returns how it was understood (no deal needed).
GET /api/v1/templates
The account's active templates.
Errors
{ "error": { "code": "missing_price", "title": "…", "hint": "…" } }
401 invalid key · 403 plan without API · 404 not found · 422 data or content to fix · 503 HubSpot unavailable (retry).