---
title: "Read a SAFE's terms with AI"
method: POST
path: "/safes/terms/extract"
tags: ["safe"]
---

# Read a SAFE's terms with AI

`POST /safes/terms/extract`

## Request

- Base URL: `https://localhost:4410/api/v1`
- URL: `https://localhost:4410/api/v1/safes/terms/extract`
- Auth: HTTP bearer

The workspace's own language model reads a stored SAFE PDF that isn't YC's form, such as one signed elsewhere or counsel's file: the investor, their email, the amount, cap, discount and the date of the SAFE. Each value comes with the exact words it came from and their page; a value whose words aren't in the file is dropped, and the amount, cap, discount and date are taken from those words, never from the model. A value its words don't settle comes back as null, for a person to fill in. Words written to steer a model are flagged. Nothing is saved. Needs an owner's language model key; YC's forms are read without one by safe.import.read.

## Request body

- object
  - `document_id` string, required

## Response `200`

The result.

- object
  - `read_by` string, required
  - `model` string, required
  - `steering` boolean, required
  - `form` 'cap' | 'discount' | 'mfn', nullable, required
  - `terms` object[], required
    - `field` 'investor' | 'email' | 'amount' | 'cap' | 'discount_percent' | 'date_of_safe', required
    - `value` string, nullable, required
    - `quote` string, required
    - `page` integer, nullable, required
    - `boxes` object[], required
      - `page` integer, required
      - `x` number, required
      - `y` number, required
      - `width` number, required
      - `height` number, required
  - `dropped` integer, 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)
