---
title: "Import SAFE rows from a spreadsheet"
method: POST
path: "/safes/imports/table"
tags: ["safe"]
---

# Import SAFE rows from a spreadsheet

`POST /safes/imports/table`

## Request

- Base URL: `https://localhost:4410/api/v1`
- URL: `https://localhost:4410/api/v1/safes/imports/table`
- Auth: HTTP bearer

Reads a spreadsheet kept in the archive (CSV or XLSX) with mapping, each register field's column counting from 0, or a guess from its headers. dry_run, the default, shows each row as it would import: a SAFE with its values and its PDF in the archive when the names match, a row missing something (emails can be given by row), a row imported before, or another security, kept in the archive and not imported. Without dry_run, the complete SAFE rows become Executed SAFEs with Unconfirmed register entries in round_id, or Before Binderwork.

## Request body

- object
  - `archive_file_id` string, required
  - `mapping` object
    - `investor` integer
    - `email` integer
    - `security` integer
    - `amount` integer
    - `form` integer
    - `cap` integer
    - `discount` integer
    - `date_of_safe` integer
    - `signed_on` integer
    - `country` integer
    - `file` integer
  - `emails` object[]
    - `row` integer, required
    - `email` string, email, required
  - `round_id` string, nullable
  - `dry_run` boolean

## Response `200`

The result.

- object
  - `file` object, required
    - `id` string, required
    - `name` string, required
    - `sha256` string, required
  - `columns` string[], required
  - `mapping` object, required
    - `investor` integer
    - `email` integer
    - `security` integer
    - `amount` integer
    - `form` integer
    - `cap` integer
    - `discount` integer
    - `date_of_safe` integer
    - `signed_on` integer
    - `country` integer
    - `file` integer
  - `rows` object[], required
    - `row` integer, required
    - `kind` 'safe' | 'incomplete' | 'other' | 'imported', required
    - `investor` string, nullable, required
    - `email` string, nullable, required
    - `amount` string, nullable, required
    - `form` 'cap' | 'discount' | 'mfn', nullable, required
    - `cap` string, nullable, required
    - `discount_percent` number, nullable, required
    - `date_of_safe` string, date, nullable, required
    - `signed_on` string, date, nullable, required
    - `country` string, required
    - `security` string, nullable, required
    - `pdf` object, nullable, required
      - `archive_file_id` string, required
      - `name` string, required
    - `problems` string[], required
    - `note` string, nullable, required
    - `safe_id` string, nullable, required
  - `counts` object, required
    - `safes` integer, required
    - `incomplete` integer, required
    - `other` integer, required
    - `imported` integer, required
  - `dry_run` boolean, required
  - `round_id` string, nullable, required

## Other responses

- `default`: An RFC 9457 problem.

---

[API](https://skmtc.dev/binderwork/apis/binderwork-api.md) · [All operations](https://skmtc.dev/binderwork/apis/binderwork-api/llms.txt) · [OpenAPI document](https://skmtc.dev/binderwork/apis/binderwork-api/revisions/f8fab0ebee53?raw)
