Learn how to manage quotes and change quotes statuses.

Update a quote

All newly created quotes start in the draft status. You can edit draft quotes before issuing them to a counterpart.

To edit a draft quote, call PATCH /receivables/{receivable_id} with the updated fields in the request body. You can update counterpart data, quote memo, existing line items data, and other details.

1curl -X PATCH 'https://api.sandbox.monite.com/v1/receivables/411dc6eb...6289b3' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN' \
5 -H 'Content-Type: application/json' \
6 -d '{
7 "quote": {
8 "currency": "USD",
9 "counterpart_id": "782b6f0f-0177-475c-b1e4-98dc160a656f",
10 "counterpart_billing_address_id": "796d1f1d-f345-4888-849c-6cbcfbd39982",
11 "entity_bank_account_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
12 }
13 }'

When updating a quote’s counterpart, you must also provide the new counterpart’s counterpart_billing_address_id in the request body to update the counterpart_billing_address object.

Update quote line items

You can modify a quote’s line items to add, remove, or update the products and product details on the quote. To update a quote’s line item, send a PUT request to the /receivables/{receivable_id}/line_items endpoint. In the request body, use the data field to specify an array of the quote’s new line items.

1curl -X PUT 'https://api.sandbox.monite.com/v1/receivables/411dc6eb...6289b3/line_items' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN' \
5 -H 'Content-Type: application/json' \
6 -d '{
7 "data": [
8 {
9 "quantity": 2,
10 "product_id": "fb2cc78f-3396-42e1-a69f-04b1931e4a84",
11 "vat_rate_id": "8d4c2c10-f7d7-4d7c-a1f5-5f3a9d56371e",
12 "discount": {
13 "type": "amount",
14 "amount": 0
15 }
16 },
17 {
18 "quantity": 4,
19 "product_id": "d1bc6df0-1571-457c-8407-7cf42aceb5dd",
20 "vat_rate_id":"8d4c2c10-f7d7-4d7c-a1f5-5f3a9d56371e",
21 "discount": {
22 "type":"amount",
23 "amount":0
24 }
25 }
26 ]
27 }'

A successful request overwrites the quote’s existing line items and replaces them with the newly defined array of line item objects.

Preview a quote’s email

After creating a quote, you can preview a quote’s email before issuing it. This step can be used when troubleshooting email template layouts for a quote to ensure that the final presentation aligns with your template design.

To preview a quote’s template, make a POST request to the /receivables/{receivable_id}/preview endpoint. The language field determines the language of the email template used to preview the quote. If a value is not provided, it defaults to en.

1curl -X POST 'https://api.sandbox.monite.com/v1/receivables/411dc6eb...6289b3/preview' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN' \
5 -H 'Content-Type: application/json' \
6 -d '{
7 "subject_text": "New quote #{quote_number}",
8 "body_text": "Dear {contact_name},\n\nThank you for requesting a quote for your project. We are happy to provide you with our quote #{quote_number}!\n\nIf you have any questions, please dont hesitate to contact us at {entity_email}.",
9 "language": "en"
10 }'

The values of the subject_text and body_text fields will replace the subject_text and body_template variables if they were used when creating your custom templates. For more information, see Create and manage email templates and Variables list.

Only quotes in the draft and issued statuses can be previewed. Attempting to preview an invoice in any other status will return a 409 Conflict error.

Accept or decline a quote

If the customer accepts the quote, call POST /receivables/{quote_id}/accept to mark the quote as accepted:

1curl -X POST 'https://api.sandbox.monite.com/v1/receivables/e9a25c...8c47/accept' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN'

When a quote is accepted, Monite automatically creates a new invoice based on the information on the quote. To get the newly created invoice you can call GET /receivables?based_on=QUOTE_ID, where QUOTE_ID represents the ID of the accepted quote.

If the customer declined the quote, call POST /receivables/{quote_id}/decline to mark the quote as declined. As a best practice, customers should provide a reason why they declined the quote. This reason can be specified in the comment field in the request body. If no comment is available, you can omit the request body.

1curl -X POST 'https://api.sandbox.monite.com/v1/receivables/e9a25c...8c47/decline' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN' \
5 -H 'Content-Type: application/json' \
6 -d '{"comment": "Thanks for the quote, but we decided to go with another vendor."}'

Accept quote with signature

Entities can require that their customers provide a signature when accepting quotes. To do this, the signature_required field in the quote object must be true. When this value is true, the request body of the POST /receivables/{receivable_id}/accept endpoint must include the signature object:

1curl -X POST 'https://api.sandbox.monite.com/v1/receivables/e9a25c...8c47/accept' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN' \
5 -H 'Content-Type: application/json' \
6 -d '{
7 "signature": {
8 "email": "theo@example.com",
9 "full_name": "Theo Quinn",
10 "signature_image": "... base64-encoded PNG image ..."
11 }
12 }'

The signature object must consist of the quote signee’s email, name, and signature. The signature_image field must be a Base64-encoded PNG image of the signee’s signature.

Entity setting quote_signature_required defines the default value of the signature_required field for all newly created quotes.

Accept quotes using QR codes

The field quote_accept_page_url defines a link to a page that can be accessed to accept the quote. When quote_accept_page_url is specified, the quote will include a QR code representing the provided URL. Monite’s partners must implement and host this page on their side.

The default value of quote_accept_page_url is https://monite.com.

Customize quote numbering

Quote numbers are customized in the entity settings. Customizing a quote number will affect all quotes subsequently issued by the entity. The document_id on previously issued quotes will not be affected by this change. To customize quote numbering, make a PATCH request to the /entities/{entity_id}/settings endpoint as shown:

1curl -X PATCH 'https://api.sandbox.monite.com/v1/entities/5b031d0c...44df31ebf0db/settings' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'Authorization: Bearer YOUR_PARTNER_TOKEN' \
4 -H 'Content-Type: application/json' \
5 -d '{
6 "document_ids": {
7 "include_date": true,
8 "min_digits": 3,
9 "document_type_prefix": {
10 "quote": "QU",
11 },
12 "next_number": {
13 "quote": "10",
14 }
15 }
16 }'

For more information on customizing quote numbering, see Document number customization.

Create an invoice based on the quote

If the customer accepts the quote, you can create an invoice based on this quote after the goods or services have been delivered.

To create an invoice from a quote, call POST /receivables and provide the quote ID in the based_on field in the request body:

1curl -X POST 'https://api.sandbox.monite.com/v1/receivables' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN' \
5 -H 'Content-Type: application/json' \
6 -d '{
7 "type": "invoice",
8 "based_on": "e9a25ceb-003d-4c82-9e90-5d568ccd8c47"
9 }'

Invoices can be created not only from accepted quotes, but also from any other quote states, even declined.

The request above creates a new draft invoice with a copy of the quote data (that is, with the same line items and counterpart). The ID and document number of the original quote are saved in the based_on and based_on_document_id properties, respectively:

1{
2 "type": "invoice",
3 "id": "b21c80f9-18c0-40ce-be6b-89ddcc4d8ad9",
4 "created_at": "2022-05-19T06:04:29.499753+00:00",
5 "updated_at": "2022-05-19T06:04:30.976539+00:00",
6 "currency": "EUR",
7 "subtotal": 5000,
8 "total_amount": 5900,
9 "line_items": [ ... ],
10 ...
11 "status": "draft",
12 "based_on": "e9a25ceb-003d-4c82-9e90-5d568ccd8c47",
13 "based_on_document_id": "Q-00015",
14 "payment_terms": null
15}

Next, update the created draft invoice and add other necessary information, such as:

  • payment_terms_id - payment terms that define the invoice due date and, optionally, early payment discounts;
  • entity_vat_id_id - entity VAT ID to be displayed on the invoice;
  • payment_reminder_id - payment reminder configuration for this invoice. Required if entity setting reminder.enabled is true.

For a complete list of fields that can be updated in draft invoices, refer to the description of the PATCH /receivables/{receivable_id} endpoint.

1curl -X PATCH 'https://api.sandbox.monite.com/v1/receivables/b21c80...8ad9' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN' \
5 -H 'Content-Type: application/json' \
6 -d '{
7 "invoice": {
8 "payment_terms_id": "411d9079-02af-476d-8723-4789882e01c3",
9 "entity_vat_id_id": "cb6c1c38-fdae-48f8-8e51-2d50d116b882"
10 }
11 }'

The invoice due date is calculated automatically based on the creation date and payment terms and is returned in the due_date field on the invoice response object.

1{
2 "type": "invoice",
3 "id": "b21c80f9-18c0-40ce-be6b-89ddcc4d8ad9",
4 "created_at": "2022-05-19T06:04:29.499753+00:00",
5 ...
6 "due_date": "2024-06-18",
7 "payment_terms": {
8 "id": "411d9079-02af-476d-8723-4789882e01c3",
9 "name": "Net 30",
10 "description": "The payment is due within 30 days after the invoice issue date.",
11 "term_final": {
12 "number_of_days": 30,
13 "end_date": "2022-06-18"
14 }
15 }
16}

Finally, you can download the quote as PDF and send it to the customer via email.

Clone a quote

You can clone a quote of any status by sending a POST request to the /receivables/{receivable_id}/clone endpoint. Cloning a quote copies the updated entity and counterpart information associated with the quote.

1curl -X POST 'https://api.sandbox.monite.com/v1/receivables/411dc6eb...6289b3/clone' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN'

A successful request returns an object with the newly cloned quote details.

All newly cloned quotes will have a draft status regardless of the status of the original quote they were cloned from. Therefore, all previously updated values related to issuing the original quote will be reset.

Quote expiration

After a quote’s expiry_date has passed, the quote status automatically becomes expired. Expired quotes cannot be accepted or declined. If needed, you can create a fresh quote for the same counterpart.

Delete a quote

Draft quotes can be deleted by calling DELETE /receivables/{receivable_id}. It’s important to note that this action is irreversible, and once deleted, the quotes can no longer be accessed.

1curl -X DELETE 'https://api.sandbox.monite.com/v1/receivables/411dc6eb...6289b3' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN'

Only quotes in the draft status can be deleted successfully. Attempting to delete a quote with any other status will throw an error.

List all quotes

To get a list of all quotes generated by an entity, call GET /receivables?type=quote:

1curl -X GET 'https://api.sandbox.monite.com/v1/receivables?type=quote' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN'

You can sort and filter the results by the amount, counterpart name, and other fields. For the full list of available sort and filter parameters, see the description of the GET /receivables endpoint.

Some examples:

  • GET /receivables?type=quote&counterpart_name=Acme%20Inc. - get all quotes issued to Acme Inc.
  • GET /receivables?type=quote&amount__gte=15000 - get all quotes where the total amount is €150 or more.
  • GET /receivables?type=quote&status__in=draft&status__in=issued - get all draft and issued quotes.
  • GET /receivables?type=quote&created_at__gte=2022-01-01T00%3A00%3A00 - get all quotes created on or after January 1, 2022.

Retrieve a quote

To get information about a specific quote, call GET /receivables/{receivable_id} and provide the quote ID.

Find invoices created from a quote

To check if there are invoices created from a specific quote, call GET /receivables?based_on=QUOTE_ID:

1curl -X GET 'https://api.sandbox.monite.com/v1/receivables?based_on=e9a25ceb-003d-4c82-9e90-5d568ccd8c47' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-Id: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN'

The data array in the response contains a list of related invoices, if any:

1{
2 "data": [
3 {
4 "type": "invoice",
5 "id": "b21c80f9-18c0-40ce-be6b-89ddcc4d8ad9",
6 ...
7 }
8 ],
9 "prev_pagination_token": null,
10 "next_pagination_token": null
11}