Skip to content

Quotes

List quotes

quotes:read
ParameterInTypeRequiredDescription
statusquerystringNodraft | sent | accepted | declined | expired | converted
customerIdquerystringNoFilter by customer
limitqueryintegerNoPage size, 1-200 (default 50)
cursorquerystringNoOpaque cursor from meta.nextCursor
Request exampleNo request body
curl https://api.rieckflow.com/v1/quotes \
-H "Authorization: Bearer $RIECK_API_KEY"
200 expired is derived: a sent quote whose validUntil has passed lists as expired even before the database has recorded it.application/json
Possible errors 5
HTTPCodeMeaning
400invalid_cursorThe cursor is malformed, expired or belongs to another list shape.
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
429rate_limitedThe organisation’s rate budget is exhausted.

Create quote (draft)

quotes:write

Creates a DRAFT in the quote numbering series. signatureMethod decides how the customer accepts: none (one click), simple (drawn signature) or mitid. With a signature method, acceptance can only come from the customer — never from an API call.

Request body fields 21
FieldTypeRequiredDescription
customerIdstringYesThe customer this resource belongs to.
validUntilstringYesField in the request payload.
headingstringNoCustom document heading.
customerReferencestringNoThe customer’s reference printed on the invoice.
senderReferencestringNoYour reference printed on the invoice.
messagestringNoFree-text message printed in the document footer.
signatureMethodstringNoField in the request payload.
departmentCodestringNoField in the request payload.
linesobject[]YesInvoice or subscription line items.
lines[].itemNumberstringNoYour own item number printed on the invoice.
lines[].descriptionstringYesHuman-readable description.
lines[].descriptionDetailsstringNoOptional detail printed below the line description.
lines[].quantitynumberYesPositive quantity for this line.
lines[].unitPriceOereintegerYesUnit price in integer øre.
lines[].vatRateBpsintegerNoVAT rate in basis points. 2500 means 25%.
lines[].vatExemptionReasonstringNoRequired legal reason when the VAT rate is zero.
lines[].discountobjectNoOptional line-level percentage or amount discount.
lines[].discount.typestringYesResource-specific type.
lines[].discount.valueintegerYesField in the request payload.
lines[].accountIdstringNoField in the request payload.
lines[].unitstringNoField in the request payload.
Request exampleapplication/json
curl -X POST https://api.rieckflow.com/v1/quotes \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041" \
-H "Content-Type: application/json" \
-d '{
"customerId": "9b2f1c1e-…",
"validUntil": "…",
"lines": [
{
"description": "Consulting",
"quantity": 1,
"unitPriceOere": 125000,
"vatRateBps": 2500
}
],
"customerReference": "crm-9001",
"senderReference": "crm-9001"
}'
201 Success envelopeapplication/json
Possible errors 9
HTTPCodeMeaning
400invalid_idempotency_keyIdempotency-Key is missing or malformed.
400invalid_requestThe request body or parameter failed validation.
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
409idempotency_conflictThe same key was used with a different request.
409idempotency_in_progressThe same operation is currently being processed. Retry later.
413payload_too_largeThe JSON or uploaded file exceeds this endpoint’s size limit.
429rate_limitedThe organisation’s rate budget is exhausted.
Request body — fuldt JSON Schema
{
"type": "object",
"properties": {
"customerId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"validUntil": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"heading": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 60
},
{
"type": "null"
}
]
},
"customerReference": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"senderReference": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"message": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"signatureMethod": {
"default": "none",
"type": "string",
"enum": [
"none",
"simple",
"mitid"
]
},
"departmentCode": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{1,2}$"
},
{
"type": "null"
}
]
},
"lines": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"itemNumber": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": {
"type": "string",
"minLength": 1,
"maxLength": 500
},
"descriptionDetails": {
"type": "string",
"maxLength": 500
},
"quantity": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 999999
},
"unitPriceOere": {
"type": "integer",
"minimum": 0,
"maximum": 100000000000
},
"vatRateBps": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"vatExemptionReason": {
"anyOf": [
{
"type": "string",
"enum": [
"ML13",
"OMVENDT",
"EU_VARE",
"EKSPORT"
]
},
{
"type": "null"
}
]
},
"discount": {
"anyOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"percent",
"amount"
]
},
"value": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"type",
"value"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"accountId": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"unit": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
]
}
},
"required": [
"description",
"quantity",
"unitPriceOere"
],
"additionalProperties": false
}
}
},
"required": [
"customerId",
"validUntil",
"lines"
],
"additionalProperties": false
}

Get quote with lines

quotes:read
ParameterInTypeRequiredDescription
quoteIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/quotes/9b2f1c1e-… \
-H "Authorization: Bearer $RIECK_API_KEY"
200 acceptedBy is customer (through the quote link, with evidence) or creditor (recorded by you, with a note) — the two are not the same evidence. The signing code is never returned.application/json
Possible errors 4
HTTPCodeMeaning
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
429rate_limitedThe organisation’s rate budget is exhausted.

Delete draft

quotes:write

Drafts only (422 quote_not_deletable otherwise). A sent quote is a frozen record and cannot be deleted.

ParameterInTypeRequiredDescription
quoteIdpathstringYes
Request exampleNo request body
curl -X DELETE https://api.rieckflow.com/v1/quotes/9b2f1c1e-… \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041"
204 No contentNo response body
Possible errors 7
HTTPCodeMeaning
400invalid_idempotency_keyIdempotency-Key is missing or malformed.
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
409idempotency_conflictThe same key was used with a different request.
409idempotency_in_progressThe same operation is currently being processed. Retry later.
429rate_limitedThe organisation’s rate budget is exhausted.

Send (or resend) the quote

quotes:write

Freezes the content, seals the quote PDF (write-once) and sends the customer their link by e-mail when an address is on file. Calling it again RESENDS with a new link; the old link stops working.

ParameterInTypeRequiredDescription
quoteIdpathstringYes
Request exampleNo request body
curl -X POST https://api.rieckflow.com/v1/quotes/9b2f1c1e-…/send \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041"
200 meta.delivery.channel is email or null; meta.delivery.url is the customer’s link — treat it as a secret, it IS the access — so you can deliver it through your own channel.application/json
Possible errors 8
HTTPCodeMeaning
400invalid_idempotency_keyIdempotency-Key is missing or malformed.
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
409idempotency_conflictThe same key was used with a different request.
409idempotency_in_progressThe same operation is currently being processed. Retry later.
422customer_email_missingThe invoice cannot be sent because the customer has no e-mail.
429rate_limitedThe organisation’s rate budget is exhausted.

Turn the accepted quote into an order

quotes:write

Same operation as POST /v1/orders/from-quote, reached from the quote. The quote must be accepted; lines are copied. Idempotent per quote: an already converted quote returns its order with 200.

ParameterInTypeRequiredDescription
quoteIdpathstringYes
Request exampleNo request body
curl -X POST https://api.rieckflow.com/v1/quotes/9b2f1c1e-…/order \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041"
200 The order (see Orders).application/json
Possible errors 7
HTTPCodeMeaning
400invalid_idempotency_keyIdempotency-Key is missing or malformed.
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
409idempotency_conflictThe same key was used with a different request.
409idempotency_in_progressThe same operation is currently being processed. Retry later.
429rate_limitedThe organisation’s rate budget is exhausted.

Turn the accepted quote directly into an invoice draft

quotes:write

The short path without an order. The quote PDF (signed, when signed) and its attachments are attached to the invoice as documentation. Replay returns the same invoice with 200. A quote that became an order cannot also become an invoice (422 quote_not_accepted) — the same work only ever goes one way.

ParameterInTypeRequiredDescription
quoteIdpathstringYes
Request exampleNo request body
curl -X POST https://api.rieckflow.com/v1/quotes/9b2f1c1e-…/invoice \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041"
201 data.invoiceId (also in Location) and data.quote.application/json
Possible errors 7
HTTPCodeMeaning
400invalid_idempotency_keyIdempotency-Key is missing or malformed.
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
409idempotency_conflictThe same key was used with a different request.
409idempotency_in_progressThe same operation is currently being processed. Retry later.
429rate_limitedThe organisation’s rate budget is exhausted.

Quote PDF (write-once)

quotes:read

Exists only after sending (404 quote_pdf_not_found for a draft).

ParameterInTypeRequiredDescription
quoteIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/quotes/9b2f1c1e-…/pdf \
-H "Authorization: Bearer $RIECK_API_KEY"
200 Success envelopeapplication/pdf
Possible errors 4
HTTPCodeMeaning
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
429rate_limitedThe organisation’s rate budget is exhausted.

List attachments

quotes:read
ParameterInTypeRequiredDescription
quoteIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/quotes/9b2f1c1e-…/attachments \
-H "Authorization: Bearer $RIECK_API_KEY"
200 Metadata only, including the database-computed sha256 and the document type.application/json
Possible errors 4
HTTPCodeMeaning
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
429rate_limitedThe organisation’s rate budget is exhausted.

Attach a document

quotes:write

The contract, terms or correspondence the customer must see BEFORE signing. Base64 in JSON, max 10 MB, malware-scanned (422 malware_detected). Insert-only. Only sendWithQuote attachments present at send time go out with the e-mail; ALL of them follow the quote onto the invoice.

ParameterInTypeRequiredDescription
quoteIdpathstringYes
Request body fields 5
FieldTypeRequiredDescription
filenamestringYesField in the request payload.
datastringYesField in the request payload.
mimestringYesField in the request payload.
sendWithQuotebooleanNoField in the request payload.
typestringNoResource-specific type.
Request exampleapplication/json
curl -X POST https://api.rieckflow.com/v1/quotes/9b2f1c1e-…/attachments \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041" \
-H "Content-Type: application/json" \
-d '{
"filename": "…",
"data": "…",
"mime": "application/pdf",
"sendWithQuote": true,
"type": "contract"
}'
201 Success envelopeapplication/json
Possible errors 9
HTTPCodeMeaning
400invalid_idempotency_keyIdempotency-Key is missing or malformed.
400invalid_requestThe request body or parameter failed validation.
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
409idempotency_conflictThe same key was used with a different request.
409idempotency_in_progressThe same operation is currently being processed. Retry later.
413payload_too_largeThe JSON or uploaded file exceeds this endpoint’s size limit.
429rate_limitedThe organisation’s rate budget is exhausted.
Request body — fuldt JSON Schema
{
"type": "object",
"properties": {
"filename": {
"type": "string",
"minLength": 1,
"maxLength": 255
},
"data": {
"type": "string",
"minLength": 1
},
"mime": {
"type": "string",
"enum": [
"application/pdf",
"image/png",
"image/jpeg",
"image/webp"
]
},
"sendWithQuote": {
"default": true,
"type": "boolean"
},
"type": {
"default": "other",
"type": "string",
"enum": [
"contract",
"terms",
"correspondence",
"other"
]
}
},
"required": [
"filename",
"data",
"mime"
],
"additionalProperties": false
}

GET /v1/quotes/{quoteId}/attachments/{attachmentId}

Section titled “GET /v1/quotes/{quoteId}/attachments/{attachmentId}”

Download an attachment

quotes:read
ParameterInTypeRequiredDescription
quoteIdpathstringYes
attachmentIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/quotes/9b2f1c1e-…/attachments/9b2f1c1e-… \
-H "Authorization: Bearer $RIECK_API_KEY"
200 The raw file. Always Content-Disposition: attachment.application/octet-stream
Possible errors 4
HTTPCodeMeaning
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
429rate_limitedThe organisation’s rate budget is exhausted.

Quote timeline

quotes:read
ParameterInTypeRequiredDescription
quoteIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/quotes/9b2f1c1e-…/timeline \
-H "Authorization: Bearer $RIECK_API_KEY"
200 Newest first. kind: created, sent, resent, viewed, signed, accepted, declined, expired, converted; actor: customer | user | system.application/json
Possible errors 4
HTTPCodeMeaning
401invalid_api_keyThe API key is missing, invalid, expired or revoked.
403api_not_includedThe organisation’s plan does not include API access.
403insufficient_scopeThe key does not have the required scope.
429rate_limitedThe organisation’s rate budget is exhausted.