Quotes let you send a priced proposal to a client before committing to an invoice. Once a client accepts a quote, you can convert it to an invoice in one step.
Quote statuses: draft · sent · accepted · declined · expired · converted
List quotes
GET /quote
Returns active quotes (draft and sent) by default.
| Query parameter | Type | Description |
|---|---|---|
| include_accepted | boolean | Include accepted quotes (default: false) |
| include_declined | boolean | Include declined quotes (default: false) |
| include_expired | boolean | Include expired quotes (default: false) |
| include_converted | boolean | Include converted quotes (default: false) |
Response:
{
"quotes": [
{
"id": "q001",
"number": "Q0001",
"status": "sent",
"client_id": "xyz789",
"currency": "ZAR",
"quote_date": "2026-03-01T00:00:00Z",
"expiry_date": "2026-03-31T00:00:00Z",
"amount": 150000,
"items": [...]
}
]
}Get a quote
GET /quote/:id
Returns a single quote by ID.
Quote object
| Field | Type | Description |
|---|---|---|
| id | string | Unique identifier |
| public_id | string | Short ID used in public-facing quote links |
| created | timestamp | When the quote was created |
| number | string | Human-readable quote number (e.g. Q0001) |
| currency | string | ISO 4217 currency code |
| status | string | draft · sent · accepted · declined · expired · converted |
| client_id | string | ID of the client this quote belongs to |
| quote_date | timestamp | Quote issue date |
| expiry_date | timestamp | Date after which the quote expires |
| accepted_at | timestamp | When the client accepted (if applicable) |
| declined_at | timestamp | When the client declined (if applicable) |
| amount | integer | Total quote amount in cents |
| items | array | Line items (same structure as invoice items) |
| notes | string | Notes printed on the quote |
| bank_details | string | Bank details (optional) |
| deposit_type | string | fixed or percentage (if applicable) |
| deposit_value | integer | Cents (fixed) or basis points (percentage) |
| deposit_amount | integer | Calculated deposit amount in cents |
| converted_to_invoice_id | string | ID of the resulting invoice if converted |
| custom_fields | object | Key-value pairs of custom fields |
| vat_enabled | boolean | Whether VAT is shown on the quote |
Create a quote
POST /quote
| Field | Required | Type | Description |
|---|---|---|---|
| client_id | Yes | string | ID of an existing client |
| quote_date | Yes | date | Quote issue date |
| expiry_date | Yes | date | Quote expiry date |
| items | Yes | array | At least one line item |
| currency | No | string | ISO 4217 code; defaults to your account currency |
| notes | No | string | Notes to print on the quote |
| bank_details | No | string | Bank account details |
| deposit_type | No | string | fixed or percentage |
| deposit_value | No | integer | Cents (fixed) or basis points (percentage) |
| custom_fields | No | object | Additional key-value fields to display |
curl -X POST https://rebill-api-896466068278.africa-south1.run.app/quote \
-H "Authorization: Bearer sk_your_secret_key" \
-H "Content-Type: application/json" \
-d '{
"client_id": "xyz789",
"quote_date": "2026-03-15",
"expiry_date": "2026-04-15",
"items": [
{
"type": "service",
"name": "Consulting",
"description": "Strategy session (2 hours)",
"quantity": 2,
"unit_price": 75000,
"vat_type": "exclusive",
"vat_rate": 1500
}
]
}'Response (201 Created):
{
"id": "q001"
}Update a quote
PUT /quote/:id
Updates an existing quote. Only draft quotes can be edited.
Delete a quote
DELETE /quote/:id
Permanently deletes a quote. Returns 200 OK on success.
Send a quote
POST /quote/:id/send
Sends the quote to the client by email and marks it as sent. Add ?whatsapp=true to send via WhatsApp instead.
# Send via email curl -X POST https://rebill-api-896466068278.africa-south1.run.app/quote/q001/send \ -H "Authorization: Bearer sk_your_secret_key" # Send via WhatsApp curl -X POST "https://rebill-api-896466068278.africa-south1.run.app/quote/q001/send?whatsapp=true" \ -H "Authorization: Bearer sk_your_secret_key"
Mark a quote as sent
POST /quote/:id/mark_as_sent
Marks a draft quote as sent without sending any notification. Use this when you've shared the quote through another channel.
Convert a quote to an invoice
POST /quote/:id/convert
Converts an accepted quote into a draft invoice. The quote status changes to converted and the response contains the new invoice ID.
curl -X POST https://rebill-api-896466068278.africa-south1.run.app/quote/q001/convert \ -H "Authorization: Bearer sk_your_secret_key"
Response:
{
"id": "inv001"
}Reinstate a quote
POST /quote/:id/reinstate
Reinstates a declined or expired quote back to sent status, allowing the client to reconsider.