get
https://api.duodeal.app/api/quotations/
Retrieves a single quotation by its ID.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Quotation ID |
Response Fields (signature-related)
| Field | Type | Description |
|---|---|---|
| signed | boolean | Whether the quotation is signed |
| signDate | datetime | Date and time of signature (null if not signed) |
| signerFirstName | string | First name of the signer |
| signerLastName | string | Last name of the signer |
| signerEmail | string | Email of the signer |
| signedPdfUrl | string | Public URL of the signed PDF (null if not signed) |
Response Fields (quotation-v2 builder)
| Field | Type | Description |
|---|---|---|
| blocks | array|null | Ordered list of content blocks (dynamic zone). Order = display order, top to bottom. See "Blocks" below. |
| shareLinks | array|null | Per-quotation filtered views of the block list. See "Share links" below. |
Blocks
Each entry of blocks is a block envelope:
| Field | Type | Description |
|---|---|---|
id | string | Stable unique block id (kept stable across edits) |
type | string | Block type key (see catalog) |
version | integer | Schema version of the block |
visible | boolean | Shown on the client/front side when true |
title | string | Block title (card header) |
layout | object | { columns, rows } (effective only on blocks that support columns) |
data | object | Block-specific payload (shape depends on type) |
Some blocks store their displayed content on the quotation/deal entity (lines,
custom field values, title, number…) rather than in data — do not duplicate it.
Block type catalog (type ⇒ purpose):
type | Purpose | layout.columns |
|---|---|---|
header | Cover image + logo, quotation title/number | — |
contacts | Sales rep + client (company, billing address) | — |
wysiwyg | Rich text (TipTap), multi-column | 1–3 |
html | Raw HTML/CSS/JS embed (DuoDeal micro-app) | — |
pricing | Price table; lines scoped by line.blockId | — |
customfields | Quotation-scope custom fields (label + value) | 1–3 |
attachments | Downloadable files from the media library | 1–3 |
legalnotice | Company info + legal text | — |
paymentschedule | Deposit + installments plan | — |
pdfviewer | Embed a single PDF | — |
youtube | One or more YouTube videos | 1–3 |
faq | Question/answer accordion | — |
pptx | Embed a PowerPoint/Office doc (Office Online viewer) | — |
googleslides | Embed Google Slides | — |
canva | Embed a Canva design | — |
gallery | Image grid + lightbox | 1–6 |
accept | Client "Accept & Sign" button | — |
signstamp | Signature stamp (shown once signed) | — |
pagebreak | Force a new page in the PDF export | — |
A brand-new quotation is pre-loaded with the default blocks ["header", "contacts"].
Share links
Each entry of shareLinks records only the deviations from the full block view:
| Field | Type | Description |
|---|---|---|
id | string | Stable unique share-link id |
name | string | Display name of the link |
hiddenBlocks | array | Block ids hidden for this link |
options | object | Per-block share options keyed by block id (e.g. { "<blockId>": { "hidePrices": true } }) |
Response
200 OK: Returns the quotation401 Unauthorized: Invalid or missing API key404 Not Found: Quotation not found
Recent Requests
Log in to see full request history
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Loading…
200Successful response
401Unauthorized
