Skip to content

Invoices

List invoices

invoices:read
ParameterInTypeRequiredDescription
statusquerystringNodraft | issued | paid | overdue | collections
customerIdquerystringNoFilter by customer
externalReferencequerystringNoExact match on your own reference
limitqueryintegerNoPage size, 1-200 (default 50)
cursorquerystringNoOpaque cursor from meta.nextCursor
Request exampleNo request body
curl https://api.rieckflow.com/v1/invoices \
-H "Authorization: Bearer $RIECK_API_KEY"
200 Success envelopeapplication/json
Response fields 9
FieldTypeDescription
data[].iduuidStable invoice id.
data[].invoiceNumberinteger | nullSequential number. Null while the invoice is a draft.
data[].statusdraft | issued | paid | overdue | collectionsStored lifecycle status.
data[].grossOereintegerInvoice total including VAT.
data[].paidOereintegerTotal registered payments.
data[].balanceOereintegerAmount still owed now.
data[].collectionsCaseIduuid | nullCollection case created from this invoice.
data[].externalReferencestring | nullYour reconciliation reference.
meta.nextCursor`stringnull`
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 invoice (one-call shortcut)

invoices:write

Creates a draft — or with ?issue=true / ?send=true the whole chain (inline customer does find-or-create and requires customers:write). Issue = number + hash-locked PDF, atomically.

ParameterInTypeRequiredDescription
issuequerystringNotrue = issue in the same transaction
sendquerystringNotrue = issue and send (send outcome in meta.send — never rolls back the invoice)
Request body fields 41
FieldTypeRequiredDescription
customerIdstringNoThe customer this resource belongs to.
customerobjectNoCreate or find the customer inline instead of sending customerId.
customer.typestringYesResource-specific type.
customer.namestringYesHuman-readable name.
customer.cvrstringNoDanish CVR number for a company.
customer.vatNumberstringNoForeign VAT number for a non-Danish company.
customer.addressobjectNoPostal address used on documents.
customer.address.streetstringNoStreet and house number.
customer.address.postalCodestringNoPostal code.
customer.address.citystringNoCity.
customer.address.countrystringNoISO country code or country name.
customer.emailstringNoE-mail used for delivery and contact.
customer.phonestringNoCustomer or contact phone number.
customer.contactPersonstringNoNamed contact at the customer.
customer.languagestringNoLanguage used for customer-facing documents.
customer.externalReferencestringNoYour stable reference for reconciliation and idempotent imports.
customer.metadataobjectNoYour own string key/value data. Never used for Rieck business logic.
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.
currencystringNoField in the request payload.
dueDatestringNoDue date in YYYY-MM-DD format.
paymentTermsDaysintegerNoNumber of days from issue date until payment is due.
customerReferencestringNoThe customer’s reference printed on the invoice.
requisitionNumberstringNoField in the request payload.
accountingCoststringNoField in the request payload.
senderReferencestringNoYour reference printed on the invoice.
messagestringNoFree-text message printed in the document footer.
headingstringNoCustom document heading.
externalReferencestringNoYour stable reference for reconciliation and idempotent imports.
metadataobjectNoYour own string key/value data. Never used for Rieck business logic.
Request exampleapplication/json
curl -X POST https://api.rieckflow.com/v1/invoices \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041" \
-H "Content-Type: application/json" \
-d '{
"lines": [
{
"description": "Consulting",
"quantity": 1,
"unitPriceOere": 125000,
"vatRateBps": 2500
}
],
"customer": {
"type": "company",
"name": "Acme ApS",
"cvr": "12345678",
"email": "ap@acme.example"
},
"dueDate": "2026-08-15"
}'
201 Success envelopeapplication/json
Response fields 8
FieldTypeDescription
data.iduuidStable invoice id.
data.invoiceNumberinteger | nullSequential number. Null while the invoice is a draft.
data.statusdraft | issued | paid | overdue | collectionsStored lifecycle status.
data.grossOereintegerInvoice total including VAT.
data.paidOereintegerTotal registered payments.
data.balanceOereintegerAmount still owed now.
data.collectionsCaseIduuid | nullCollection case created from this invoice.
data.externalReferencestring | nullYour reconciliation reference.
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)$"
},
"customer": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"person",
"company"
]
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"cvr": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{8}$"
},
{
"type": "null"
}
]
},
"vatNumber": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
]
},
"address": {
"anyOf": [
{
"type": "object",
"properties": {
"street": {
"type": "string",
"maxLength": 200
},
"postalCode": {
"type": "string",
"maxLength": 10
},
"city": {
"type": "string",
"maxLength": 100
},
"country": {
"type": "string",
"maxLength": 100
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"email": {
"anyOf": [
{
"type": "string",
"maxLength": 254
},
{
"type": "null"
}
]
},
"phone": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
]
},
"contactPerson": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"language": {
"anyOf": [
{
"type": "string",
"enum": [
"da",
"en"
]
},
{
"type": "null"
}
]
},
"externalReference": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200
},
{
"type": "null"
}
]
},
"metadata": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"additionalProperties": {
"type": "string",
"maxLength": 500
}
},
{
"type": "null"
}
]
}
},
"required": [
"type",
"name"
],
"additionalProperties": false
},
"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
}
},
"currency": {
"default": "DKK",
"type": "string",
"const": "DKK"
},
"dueDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"paymentTermsDays": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 365
},
{
"type": "null"
}
]
},
"customerReference": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"requisitionNumber": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"accountingCost": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"senderReference": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"message": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"heading": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"externalReference": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200
},
{
"type": "null"
}
]
},
"metadata": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"additionalProperties": {
"type": "string",
"maxLength": 500
}
},
{
"type": "null"
}
]
}
},
"required": [
"lines"
],
"additionalProperties": false
}

Get invoice with lines

invoices:read
ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/invoices/9b2f1c1e-… \
-H "Authorization: Bearer $RIECK_API_KEY"
200 Success envelopeapplication/json
Response fields 8
FieldTypeDescription
data.iduuidStable invoice id.
data.invoiceNumberinteger | nullSequential number. Null while the invoice is a draft.
data.statusdraft | issued | paid | overdue | collectionsStored lifecycle status.
data.grossOereintegerInvoice total including VAT.
data.paidOereintegerTotal registered payments.
data.balanceOereintegerAmount still owed now.
data.collectionsCaseIduuid | nullCollection case created from this invoice.
data.externalReferencestring | nullYour reconciliation reference.
Possible errors 5
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
429rate_limitedThe organisation’s rate budget is exhausted.

Replace draft

invoices:write

Full replacement of a DRAFT (issued invoices are immutable).

ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request body fields 25
FieldTypeRequiredDescription
customerIdstringYesThe customer this resource belongs to.
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.
currencystringNoField in the request payload.
dueDatestringNoDue date in YYYY-MM-DD format.
paymentTermsDaysintegerNoNumber of days from issue date until payment is due.
customerReferencestringNoThe customer’s reference printed on the invoice.
requisitionNumberstringNoField in the request payload.
accountingCoststringNoField in the request payload.
senderReferencestringNoYour reference printed on the invoice.
messagestringNoFree-text message printed in the document footer.
headingstringNoCustom document heading.
externalReferencestringNoYour stable reference for reconciliation and idempotent imports.
metadataobjectNoYour own string key/value data. Never used for Rieck business logic.
Request exampleapplication/json
curl -X PUT https://api.rieckflow.com/v1/invoices/9b2f1c1e-… \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041" \
-H "Content-Type: application/json" \
-d '{
"customerId": "9b2f1c1e-…",
"lines": [
{
"description": "Consulting",
"quantity": 1,
"unitPriceOere": 125000,
"vatRateBps": 2500
}
],
"dueDate": "2026-08-15",
"customerReference": "crm-9001"
}'
200 Success envelopeapplication/json
Response fields 8
FieldTypeDescription
data.iduuidStable invoice id.
data.invoiceNumberinteger | nullSequential number. Null while the invoice is a draft.
data.statusdraft | issued | paid | overdue | collectionsStored lifecycle status.
data.grossOereintegerInvoice total including VAT.
data.paidOereintegerTotal registered payments.
data.balanceOereintegerAmount still owed now.
data.collectionsCaseIduuid | nullCollection case created from this invoice.
data.externalReferencestring | nullYour reconciliation reference.
Possible errors 11
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
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.
422invoice_not_editableThe invoice can no longer be edited.
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)$"
},
"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
}
},
"currency": {
"default": "DKK",
"type": "string",
"const": "DKK"
},
"dueDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"paymentTermsDays": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 365
},
{
"type": "null"
}
]
},
"customerReference": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"requisitionNumber": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"accountingCost": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"senderReference": {
"anyOf": [
{
"type": "string",
"maxLength": 140
},
{
"type": "null"
}
]
},
"message": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
]
},
"heading": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"externalReference": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200
},
{
"type": "null"
}
]
},
"metadata": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"additionalProperties": {
"type": "string",
"maxLength": 500
}
},
{
"type": "null"
}
]
}
},
"required": [
"customerId",
"lines"
],
"additionalProperties": false
}

Delete draft

invoices:write
ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request exampleNo request body
curl -X DELETE https://api.rieckflow.com/v1/invoices/9b2f1c1e-… \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041"
204 No contentNo response body
Possible errors 9
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
409idempotency_conflictThe same key was used with a different request.
409idempotency_in_progressThe same operation is currently being processed. Retry later.
422invoice_not_editableThe invoice can no longer be edited.
429rate_limitedThe organisation’s rate budget is exhausted.

Issue invoice

invoices:write

Assigns the next number in the unbroken series and locks the PDF.

ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request exampleNo request body
curl -X POST https://api.rieckflow.com/v1/invoices/9b2f1c1e-…/issue \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041"
200 Success envelopeapplication/json
Response fields 8
FieldTypeDescription
data.iduuidStable invoice id.
data.invoiceNumberinteger | nullSequential number. Null while the invoice is a draft.
data.statusdraft | issued | paid | overdue | collectionsStored lifecycle status.
data.grossOereintegerInvoice total including VAT.
data.paidOereintegerTotal registered payments.
data.balanceOereintegerAmount still owed now.
data.collectionsCaseIduuid | nullCollection case created from this invoice.
data.externalReferencestring | nullYour reconciliation reference.
Possible errors 10
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
409idempotency_conflictThe same key was used with a different request.
409idempotency_in_progressThe same operation is currently being processed. Retry later.
422invoice_already_issuedThe invoice has already been issued.
422invoice_not_editableThe invoice can no longer be edited.
429rate_limitedThe organisation’s rate budget is exhausted.

Send invoice to customer

invoices:write
ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request exampleNo request body
curl -X POST https://api.rieckflow.com/v1/invoices/9b2f1c1e-…/send \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041"
200 Success envelopeapplication/json
Possible errors 10
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
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.
422invoice_not_editableThe invoice can no longer be edited.
429rate_limitedThe organisation’s rate budget is exhausted.

Invoice PDF (WORM)

invoices:read
ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/invoices/9b2f1c1e-…/pdf \
-H "Authorization: Bearer $RIECK_API_KEY"
200 Success envelopeapplication/pdf
Possible errors 5
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
429rate_limitedThe organisation’s rate budget is exhausted.

List attachments

invoices:read
ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/invoices/9b2f1c1e-…/attachments \
-H "Authorization: Bearer $RIECK_API_KEY"
200 Metadata only, including the database-computed sha256.application/json
Response fields 4
FieldTypeDescription
data.iduuidStable attachment id.
data.filenamestringOriginal file name.
data.sendWithInvoicebooleanWhether the file is included when the invoice is sent.
data.sha256stringSHA-256 digest of the immutable stored bytes.
Possible errors 5
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
429rate_limitedThe organisation’s rate budget is exhausted.

Attach a document

invoices:write

Base64 in JSON, max 10 MB. Every byte is malware-scanned before storage; a rejected file returns 422 malware_detected. Attachments are INSERT-ONLY — they cannot be edited or removed, because documentation that can be changed afterwards is not documentation. Allowed before and after issuing; only sendWithInvoice attachments present at send time go out with the e-mail.

ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request body fields 4
FieldTypeRequiredDescription
filenamestringYesField in the request payload.
datastringYesField in the request payload.
mimestringYesField in the request payload.
sendWithInvoicebooleanNoField in the request payload.
Request exampleapplication/json
curl -X POST https://api.rieckflow.com/v1/invoices/9b2f1c1e-…/attachments \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041" \
-H "Content-Type: application/json" \
-d '{
"filename": "…",
"data": "…",
"mime": "application/pdf",
"sendWithInvoice": true
}'
201 Success envelopeapplication/json
Response fields 4
FieldTypeDescription
data.iduuidStable attachment id.
data.filenamestringOriginal file name.
data.sendWithInvoicebooleanWhether the file is included when the invoice is sent.
data.sha256stringSHA-256 digest of the immutable stored bytes.
Possible errors 10
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
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"
]
},
"sendWithInvoice": {
"default": true,
"type": "boolean"
}
},
"required": [
"filename",
"data",
"mime"
],
"additionalProperties": false
}

GET /v1/invoices/{invoiceId}/attachments/{attachmentId}

Section titled “GET /v1/invoices/{invoiceId}/attachments/{attachmentId}”

Download an attachment

invoices:read
ParameterInTypeRequiredDescription
invoiceIdpathstringYes
attachmentIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/invoices/9b2f1c1e-…/attachments/9b2f1c1e-… \
-H "Authorization: Bearer $RIECK_API_KEY"
200 The raw file. Always Content-Disposition: attachment.application/octet-stream
Possible errors 5
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
429rate_limitedThe organisation’s rate budget is exhausted.

Invoice timeline

invoices:read
ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/invoices/9b2f1c1e-…/timeline \
-H "Authorization: Bearer $RIECK_API_KEY"
200 Issued/sent/opened/paid/reminded events, oldest first.application/json
Possible errors 5
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
429rate_limitedThe organisation’s rate budget is exhausted.

E-invoice delivery outcome

invoices:read
ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request exampleNo request body
curl https://api.rieckflow.com/v1/invoices/9b2f1c1e-…/einvoicing \
-H "Authorization: Bearer $RIECK_API_KEY"
200 One row per transmission, newest first (a credit note and a resend each get their own): status queued | sent | failed | rejected, recipientEndpoint, transportReference, failureReason, and the receiving system’s own responseCode/responseMessage/respondedAt. ⚠️ rejected arrives AFTER sent, sometimes hours later — GET /v1/dispatches only tells you we handed the document to the access point, so an invoice the recipient’s system threw out reads “sent” there forever. Subscribe to einvoice.failed rather than polling. ⚠️ The document itself is never returned: the access point signs it with its own certificate. documentHash is the sha256 of exactly the UBL we sent, so you can prove the content without holding it.application/json
Response fields 8
FieldTypeDescription
data.iduuidStable invoice id.
data.invoiceNumberinteger | nullSequential number. Null while the invoice is a draft.
data.statusdraft | issued | paid | overdue | collectionsStored lifecycle status.
data.grossOereintegerInvoice total including VAT.
data.paidOereintegerTotal registered payments.
data.balanceOereintegerAmount still owed now.
data.collectionsCaseIduuid | nullCollection case created from this invoice.
data.externalReferencestring | nullYour reconciliation reference.
Possible errors 5
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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
429rate_limitedThe organisation’s rate budget is exhausted.

Hand over to debt collection

cases:write

The bridge: creates a collection case from the invoice. §9b prerequisites are enforced.

ParameterInTypeRequiredDescription
invoiceIdpathstringYes
Request exampleNo request body
curl -X POST https://api.rieckflow.com/v1/invoices/9b2f1c1e-…/collect \
-H "Authorization: Bearer $RIECK_API_KEY" \
-H "Idempotency-Key: order-2041"
200 Success envelopeapplication/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.
404invoice_not_foundThe invoice does not exist or belongs to another organisation.
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.