# Import a spreadsheet onto a board, mapping it for you

The custom-board twin of `post_definitions_key_import_auto`: send a file as `headers` plus `rows` and the service works out the mapping itself. In Neo chat, when the person attached a spreadsheet, send `attachment` with the file's name INSTEAD of headers and rows — the rows are supplied at the door, never retyped. Pass `boardId` to import onto a board that exists, or `name` with no `boardId` to MAKE a board from the file — which is the call to reach for when somebody wants a spreadsheet turned into a board, because the columns and their kinds are read off the file's own values. The answer carries the `plan` it used — what each header became, why, and how sure it was — beside the ordinary import result. Send `dryRun: true` first on anything unfamiliar: nothing is written and the plan still comes back. At most 5000 rows, refused whole with `too_many_rows`, and `post_boards_id_imports_runId_undo` takes the run back.

Access class: `workspace`.

## Endpoint

`POST /v1/boards/import/auto`

## Request body

Content type: `application/json`.

```json
{
  "body": {
    "boardId": "",
    "dryRun": true,
    "duplicates": "string",
    "fileName": "string",
    "headers": [
      "string"
    ],
    "name": "string",
    "purpose": "string",
    "rows": [
      [
        "string"
      ]
    ],
    "unknownChoice": "string",
    "useModel": true
  },
  "params": {},
  "query": {}
}
```

## Responses

### 201

the action's answer

Content type: `application/json`.

```json
{
  "data": {
    "import": {
      "board": {
        "access": "string",
        "columns": [
          "string"
        ],
        "createdAt": "string",
        "definitionKey": "string",
        "id": "",
        "name": "string",
        "purpose": "string",
        "rows": [
          "string"
        ],
        "updatedAt": "string",
        "view": "string"
      },
      "columnsCreated": [
        {
          "id": "",
          "kind": "string",
          "label": "string"
        }
      ],
      "counts": {
        "created": 1,
        "failed": 1,
        "skipped": 1,
        "updated": 1
      },
      "optionsAdded": [
        {
          "columnId": "",
          "label": "string",
          "values": "string"
        }
      ],
      "results": [
        {
          "error": "string",
          "id": "",
          "outcome": "string",
          "row": "string"
        }
      ],
      "runId": ""
    },
    "plan": {
      "columns": [
        {
          "decidedBy": "string",
          "decision": "string",
          "profile": "string",
          "proposed": "string"
        }
      ],
      "identity": [
        "string"
      ],
      "modelProblem": "string",
      "notes": "string",
      "source": "string",
      "statusFolds": [
        {
          "from": "string",
          "header": "string",
          "into": "string",
          "reason": "string"
        }
      ],
      "surface": "string"
    }
  }
}
```

### default

a refusal: `{"error": "<what a person needs to read>"}`. 401 no credential, 402 the plan does not include this, 403 the seat does not, 404 the thing does not exist or is not yours to see.

Content type: `application/json`.

```json
{
  "error": "string"
}
```
