---
title: "Check an Excel import"
method: POST
path: "/api/v1/rest/crm/imports/analysis"
tags: ["CRM"]
---

# Check an Excel import

`POST /api/v1/rest/crm/imports/analysis`

## Request

- Base URL: `https://api.custodo.ai`
- URL: `https://api.custodo.ai/api/v1/rest/crm/imports/analysis`
- Auth: HTTP bearer

Reads a filled-in copy of the CRM’s own Excel template and returns the row-by-row report of what crm_import_spreadsheet would create from it: deals and activities, NEVER customers or contacts — those live only in Anagrafiche (a list is loaded with anagrafiche_analyse_spreadsheet and anagrafiche_import_spreadsheet, one with anagrafiche_create_party). Every customer a row names must ALREADY be an anagrafica, matched by partita IVA, else by exact name. It creates no deal or activity, but it is not a pure read: on an organisation that has no pipeline yet it seeds the default sales process, because a deal row cannot be checked against stages that do not exist. Show the person the report; when it is committable and they agree, pass the SAME bytes to crm_import_spreadsheet. At most 2 000 rows per sheet and 8 MB decoded. Get the empty template from the CRM’s own Importa screen.

## Headers

- `X-Tenant-Id` string, uuid

## Request body

- object
  - `content_base64` string, required: The filled-in .xlsx, base64-encoded. Only the workbook the CRM’s own import template produces is readable: the sheet names and the column headers are matched, not guessed.

## Response `200`

Done. `data` is the tool’s own answer.

- RestResult
  - `ok` true, required
  - `data` unknown, required

## Other responses

- `400`: The arguments did not validate: `error.message` names the field, what it expects and what arrived.
- `401`: No API key, or one that is malformed, unknown, revoked or expired.
- `403`: The call never ran: the module is off for this organisation, the credential lacks the permission or the module, the tier does not cover it, or the tool is destructive and the key was not minted for that.
- `409`: The record is in a state that does not allow it — under legal hold, already sent, already closed. `error.code` says which.
- `422`: The tool ran and refused, in a sentence of its own (`TOOL_REFUSED`): the message says what to change. Retrying the same call will not help.
- `429`: The API key has spent its minute, or its day. Every request a key makes counts. See `Retry-After`.

---

[API](https://skmtc.dev/custodo/apis/custodo-integrazioni.md) · [All operations](https://skmtc.dev/custodo/apis/custodo-integrazioni/llms.txt) · [OpenAPI document](https://skmtc.dev/custodo/apis/custodo-integrazioni/revisions/16d336d3ec2a?raw)
