# Create documents — POST /v1/dataroom/datarooms/{id}/documents

URL: https://docs.hanzo.ai/docs/openapi/dataroom/post-dataroom-datarooms-by-id-documents

> Puts an already-uploaded document into one of the caller org's data rooms and answers with the new membership id.

`POST /v1/dataroom/datarooms/{id}/documents`

> [Dataroom →](https://docs.hanzo.ai/docs/openapi/dataroom) · [All API references →](https://docs.hanzo.ai/docs/openapi) · [Get started →](https://docs.hanzo.ai/docs/guides)

|               |                                                             |
| ------------- | ----------------------------------------------------------- |
| **Address**   | `https://api.hanzo.ai/v1/dataroom/datarooms/{id}/documents` |
| **Method**    | `POST`                                                      |
| **Operation** | `post_dataroom_datarooms_by_id_documents`                   |
| **Auth**      | `Authorization: Bearer $HANZO_API_KEY`                      |

Puts an already-uploaded document into one of the caller
org's data rooms and answers with the new membership id.

It ATTACHES, it never uploads: the bytes must already be stored, so the usual
order is upload the document, then add it to the room. Both the room and the
document must exist in the caller's own store — either missing is not found —
and a document already in the room is refused as a conflict rather than
duplicated.

## Request

4 fields, body `application/json` (required).

| Field        | In   | Type   | Required | Description                                                 |
| ------------ | ---- | ------ | -------- | ----------------------------------------------------------- |
| `id`         | path | string | yes      | ID is the room to add to.                                   |
| `documentId` | body | any    | —        | DocumentId is the document to attach.                       |
| `id`         | body | string | —        | ID is the room to add to.                                   |
| `orderIndex` | body | any    | —        | OrderIndex fixes the document's place in the viewer's list. |

## Response

| Status    | Body                        | Meaning |
| --------- | --------------------------- | ------- |
| `200`     | dataroom.dataroomMembership | ok      |
| `default` | problem-details             | refused |

`200` body — 3 fields.

| Field                | In   | Type   | Always | Description                                       |
| -------------------- | ---- | ------ | ------ | ------------------------------------------------- |
| `dataroomDocumentId` | body | string | —      | DataroomDocumentId is the new membership id.      |
| `dataroomId`         | body | string | —      | DataroomId is the room the document was added to. |
| `documentId`         | body | string | —      | DocumentId is the document that was added.        |

Failure carries the platform error shape — see [Errors](https://docs.hanzo.ai/docs/errors).

## Examples

**CLI**

```bash
hanzo dataroom datarooms documents <id>
```

**SDK**

**.ts**

```ts
import { Configuration, DataroomApi } from 'hanzoai';

const api = new DataroomApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postDataroomDataroomsByIdDocuments({ id: 'id', documentId: "<documentId>", id: "<id>" });
```

**.py**

```python
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import DataroomApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = DataroomApi(client).post_dataroom_datarooms_by_id_documents(id='id', document_id="<documentId>", id="<id>")
```

**.go**

```go
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.DataroomAPI.PostDataroomDataroomsByIdDocuments(context.Background()).Execute()
if err != nil {
	return err
}
```

**.rs**

```rust
use hanzo_client::apis::{configuration::Configuration, dataroom_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = dataroom_api::post_dataroom_datarooms_by_id_documents(&cfg, Default::default()).await?;
```

**.java**

```java
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.DataroomApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new DataroomApi(client).postDataroomDataroomsByIdDocuments();
```

**HTTP**

```bash
curl -X POST https://api.hanzo.ai/v1/dataroom/datarooms/<id>/documents \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "documentId": "<documentId>",
       "id": "<id>"
     }'
```

**MCP**

MCP reaches **dataroom** through the `dataroom` tool, which names its 19 operations with its own verbs — this one among them, under a name only MCP declares. `describe` explains any of them:

```bash
curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "get_dataroom_analytic_dataroom"
         }
       }
     }'
```

---

[Dataroom API](https://docs.hanzo.ai/docs/openapi/dataroom) · [All Hanzo APIs](https://docs.hanzo.ai/docs/openapi) · [Interactive reference](https://docs.hanzo.ai/docs/openapi/reference)
