Send invoice by email
/v1/invoices/{id}/sendEmails a booked invoice or credit note to the customer with its PDF. Offers and drafts return 409. A sandbox company cannot send email and gets 403 forbidden. With no email and no address on the invoice or contact, the response is 400.
A 200 means the email provider accepted the message for at least one recipient. It does not mean the email was delivered, and another recipient may have been refused. Check delivery_status and email_delivery_status. If no recipient is accepted, the response is 500.
Every successful call sends an email, so send an Idempotency-Key header to retry safely after a timeout. A failed request frees its key, so a retry after a 5xx runs again and can email again: the failure can come after the provider accepted the message.
Send an Idempotency-Key header (for example a UUID generated per request) to retry safely after a timeout or network error. A retry with the same key and the same body returns the original response with the header Idempotent-Replayed: true. Keys are scoped to the company and kept for 24 hours after a successful request. A failed request (4xx/5xx) frees the key, so a retry with that key runs again. Reusing a key with a different body returns 422; retrying while the first request is still processing returns 409.
Requires one ofinvoices:bookwrite:ledger
Path parameters
- Invoice ID
Headers
- Unique key for this request (max 255 characters). Retrying with the same key and body returns the original response instead of doing the work again.
Body
application/json
- Recipients instead of the invoice's or contact's address, up to 5, separated by commas. Once a send is accepted, they replace the address saved on the invoice. The contact does not change.
Errors
400Invalid input or validation failed401Invalid or missing authentication403Missing scope, the company is archived, or it is a sandbox company404The resource does not exist in this company409The invoice is a draft or an offer, or a request with the same Idempotency-Key is still being processed422The Idempotency-Key was already used with a different request429Rate limit exceeded500Internal Server Error
Every error has the same shape. See Errors.
curl -X POST https://api.numina.app/v1/invoices/550e8400-e29b-41d4-a716-446655440000/send \
-H "Authorization: Bearer numi_YOUR_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"email": "faktura@kunde.dk"
}'const response = await fetch("https://api.numina.app/v1/invoices/550e8400-e29b-41d4-a716-446655440000/send", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NUMINA_API_KEY}`,
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
"email": "faktura@kunde.dk"
}),
});
const data = await response.json();import uuid
import os
import requests
response = requests.post(
"https://api.numina.app/v1/invoices/550e8400-e29b-41d4-a716-446655440000/send",
headers={
"Authorization": f"Bearer {os.environ['NUMINA_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"email": "faktura@kunde.dk"
},
)
data = response.json(){
"id": "550e8400-e29b-41d4-a716-446655440000",
"invoice_number": 1001,
"type": "invoice",
"credited_invoice_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "sent",
"issue_date": "2026-01-15",
"due_date": "2026-02-15",
"contact_id": "550e8400-e29b-41d4-a716-446655440001",
"contact_name": "Acme ApS",
"currency": "DKK",
"subtotal": 10000,
"vat": 2500,
"vat_rate": 25,
"total": 12500,
"has_mixed_vat": false,
"outstanding_balance": 12500,
"outstanding_balance_currency": "DKK",
"currency_rate": 0,
"delivery_status": "sent",
"email_delivery_status": "string",
"email_sent_at": "string",
"e_invoice_sent_at": "string",
"is_overdue": false,
"payment_state": "open",
"unmatched_payments_note": "string",
"items": [
{
"unit": "string",
"vat_account_id": "string",
"vat_code": "string",
"sales_account_number": 0,
"vat_rate": 0,
"id": "550e8400-e29b-41d4-a716-446655440002",
"description": "Consulting services",
"quantity": 10,
"unit_price": 1000
}
],
"memo": "Project Q1 delivery",
"payment_details": {
"bank_name": "Danske Bank",
"scheme": "dk-registration-number",
"clearing_code": "3409",
"account_number": "0012345678",
"iban": "DK5030000012345678",
"swift_bic": "DABADKKK"
},
"created_at": "2026-01-15T10:30:00Z"
}