Credit notes

Void a credit note

Voids a VALIDATED credit note with a reason, which is required and is kept.

POST
/api/v1/credit-notes/{creditNoteId}/void

Request examples

curl https://app.filmo.io/api/v1/credit-notes/cred_8f2a1c/void \
  --request POST \
  --header "Authorization: Bearer $FILMO_API_KEY" \
  --header "Idempotency-Key: $(uuidgen 2>/dev/null || cat /proc/sys/kernel/random/uuid)" \
  --header 'Content-Type: application/json' \
  --data '{
  "reason": "Importe rectificado incorrecto; se emite una nueva"
}'
{
  "data": {
    "id": "credit_note_9f3a2b",
    "creditNoteNumber": "2026-0001",
    "status": "draft",
    "issueDate": "2026-09-01T08:00:00.000Z",
    "currency": "EUR",
    "contactId": "contact_9f3a2b",
    "invoiceId": "invoice_9f3a2b",
    "subTotal": "120.00",
    "taxesPrice": "120.00",
    "netPrice": "120.00",
    "grossPrice": "120.00",
    "createdAt": "2026-09-01T08:00:00.000Z",
    "updatedAt": "2026-09-01T08:00:00.000Z"
  }
}

Generated from the schema

Not reversible

Voiding takes the document to voided, and no operation undoes it.

It keeps its number and moves to voided. Only from validated: a draft is deleted from the application, not voided. It does not touch the invoice it was correcting. Returns the full credit note, the same projection as its GET.

Authorizations

Bearer API key with the scope below. invoices:write

Headers

Idempotency-Keystring

Unique identifier of the request, chosen by the client (a UUID works). Between 1 and 255 characters: an empty header is rejected with 400 validation_error, because the client would believe itself protected. Repeating the same key with the SAME body within 24 h returns the stored response without executing again, with the Idempotent-Replay: true header. With a DIFFERENT body it returns 422. It is the safe way to retry after a network timeout.

Limits: min length 1, max length 255

Example:"9f1c2f4e-3a5b-4f6d-8e7a-0b1c2d3e4f5a"

If-Matchstring

Optimistic locking: the ETag you read from the resource (or *). If the resource changed since, the write is rejected with 412 precondition_failed before doing anything; read it again and retry. Without the header the write always proceeds.

Example:"\"3sT3d9pBvZq4h2N0w8x1YkLmQ7c\""

Path parameters

creditNoteIdstringRequired

Credit note identifier.

Limits: min length 1

Body

application/json

Body schema: CreditNoteVoidBody

reasonstringRequired

Reason for voiding. It is stored on the credit note and in its history.

Limits: min length 1, max length 500

Response

application/json

Successful response.

Response schema: CreditNoteDto

Envelope: CreditNoteResponse. meta.warnings is present only when the operation is deprecated.

Headers: X-Request-Id · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · ETag · Idempotent-Replay

dataobject

Credit note: what is refunded to the customer. The signed fiscal document, the tax breakdown and the lines are not published.

Show child attributes
data.idstring

Credit note identifier.

data.creditNoteNumberstring | null

Credit note number; null while it is a draft.

data.statusstring

Document lifecycle status: draft, validated or voided (the same values the status filter takes).

Available options: draft, validated, voided

data.issueDatestring<date-time> | null

Issue date in ISO 8601 UTC; null if not recorded.

data.currencystring

Currency, as an ISO 4217 code.

data.contactIdstring | null

Contact the credit note is issued to; null if not recorded.

data.invoiceIdstring | null

Invoice this credit note rectifies; null if it is not attached to any.

data.subTotalstring

Subtotal before discounts and taxes, as a decimal string.

Limits: pattern ^-?\d+\.\d{2}$

data.taxesPricestring

Tax total, as a decimal string.

Limits: pattern ^-?\d+\.\d{2}$

data.netPricestring

Taxable base, as a decimal string.

Limits: pattern ^-?\d+\.\d{2}$

data.grossPricestring

Total including taxes, as a decimal string.

Limits: pattern ^-?\d+\.\d{2}$

data.createdAtstring<date-time>

Creation date in ISO 8601 UTC.

data.updatedAtstring<date-time>

Last modification date in ISO 8601 UTC.

metaobject

Additional information about the response.

Show child attributes
meta.warningsobject[]

Lifecycle warnings; present only when the operation is deprecated.

Show child attributes
meta.warnings.codestring

Stable warning code.

Available options: deprecated

meta.warnings.messagestring

For people: what is deprecated, until when, and what to use.

meta.warnings.sunsetstring

Day (YYYY-MM-DD) the operation stops being served.

meta.warnings.replacementstring | null

operationId of the operation to use instead, or null if there is none.

Errors

StatusCodesMeaning
400validation_errorMalformed query or body. errors[] lists every offending field with its stable code.
404not_foundIt does not exist or is outside the scope of the API key.
409conflictThe current state of the resource prevents the operation, a request with that Idempotency-Key is already in progress, or another conditional write (If-Match) held the resource for more than five seconds. errors[0].code says which: in_progress and lock_timeout are solved by retrying; invalid_state is not, because the state of the resource forbids the operation.
412precondition_failedThe If-Match entity tag does not match the current representation. Read the resource again and retry.
422idempotency_key_reusedThe same key was used before with a different body. Change the key.

401, 403, 429, 500 can be returned by any operation. Errors

Deprecation

This operation is not deprecated. Deprecations are announced with a Deprecation header and a sunset date. Versioning policy

  • Finance

    Credit note

    Credit note: what is refunded to the customer.