*MCP › Reference › Finance › Credit notes*

# Validate a credit note

> Closes a draft credit note: checks compliance, assigns it a number against its series, signs it and locks it as immutable.

> **Fiscal document:** This tool numbers the document against the fiscal series, signs it and locks it. Voiding keeps the number.

> **Not reversible:** This tool cannot be undone.

> **Requires human confirmation:** Put this tool on your client's “ask before running” list. The annotations are hints that the server declares, not guarantees: do not decide the approval from `destructiveHint` alone. The server flags this tool with `_meta["anthropic/requiresUserInteraction"]`, which clients that honor it use to ask a person before every call.

> **Server annotation:** It validates a document that is then locked. Today the validation does not send the document to the tax agency, but it cannot be undone.

Only from `draft`; from any other status it rejects the request without touching anything. A validated credit note is no longer edited: it is voided. It takes no body. It shares scope with invoices, just like its read. Returns the full credit note, the same projection as its GET.

TOOL `filmo_credit_notes_validate` · `invoices:write` · 120/min · Server annotation: Destructive · Requires human confirmation · Not reversible · Fiscal document

## Arguments

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `creditNoteId` | string | Yes | Credit note identifier. |
| `idempotencyKey` | string | No | Idempotency key chosen by the client (a UUID is recommended). Repeating the same key with the same arguments within 24 h returns the stored response without executing again; with different arguments it responds 422. It is the safe way to retry after a network failure. |
| `ifMatch` | string | No | Optimistic locking: the meta.etag you got from the detail read of this resource (or "*"). If the resource changed since, the call fails with 412 precondition_failed before writing anything; read it again and retry. Omit it to write unconditionally. |

## Result

On success the result carries `structuredContent` with `data` and `meta`. These are the attributes of `data`.

| Name | Type | Description |
| --- | --- | --- |
| `id` | string | Credit note identifier. |
| `creditNoteNumber` | string | Credit note number; null while it is a draft. |
| `status` | string | Document lifecycle status: draft, validated or voided (the same values the `status` filter takes). `draft`, `validated`, `voided` |
| `issueDate` | string<date-time> | Issue date in ISO 8601 UTC; null if not recorded. |
| `currency` | string | Currency, as an ISO 4217 code. |
| `contactId` | string | Contact the credit note is issued to; null if not recorded. |
| `invoiceId` | string | Invoice this credit note rectifies; null if it is not attached to any. |
| `subTotal` | string | Subtotal before discounts and taxes, as a decimal string. |
| `taxesPrice` | string | Tax total, as a decimal string. |
| `netPrice` | string | Taxable base, as a decimal string. |
| `grossPrice` | string | Total including taxes, as a decimal string. |
| `createdAt` | string<date-time> | Creation date in ISO 8601 UTC. |
| `updatedAt` | string<date-time> | Last modification date in ISO 8601 UTC. |

*Call · filmo_credit_notes_validate*

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "filmo_credit_notes_validate",
    "arguments": {
      "creditNoteId": "cred_8f2a1c"
    }
  }
}
```

*Result (generated from the schema)*

```json
{
  "structuredContent": {
    "data": {
      "id": "id_8f2a1c",
      "creditNoteNumber": "<creditNoteNumber>",
      "status": "draft",
      "issueDate": "2026-09-01T08:00:00Z",
      "currency": "EUR",
      "contactId": "cont_8f2a1c",
      "invoiceId": "invo_8f2a1c",
      "subTotal": "1234.50",
      "taxesPrice": "1234.50",
      "netPrice": "1234.50",
      "grossPrice": "1234.50",
      "createdAt": "2026-09-01T08:00:00Z",
      "updatedAt": "2026-09-01T08:00:00Z"
    },
    "meta": {
      "idempotencyKey": "<the key you sent, or the one the server generated>",
      "rateLimit": {
        "limit": 120,
        "remaining": 119,
        "reset": 42
      }
    }
  }
}
```

## The same operation by REST

This tool runs [`POST /api/v1/credit-notes/{creditNoteId}/validate`](https://docs.filmo.io/rest-api/endpoint-reference/credit-notes/validate-a-credit-note).

---

Canonical URL: https://docs.filmo.io/mcp/tools/credit-notes/filmo-credit-notes-validate  
Last updated: 2026-10-25