---
title: "Attach a document to one of the hub's notes"
method: POST
path: "/business/knowledge-hubs/{hubId}/attachments"
tags: ["Knowledge hubs"]
---

# Attach a document to one of the hub's notes

`POST /business/knowledge-hubs/{hubId}/attachments`

## Request

- Base URL: `https://api.tryfuse.ai/api/v1`
- URL: `https://api.tryfuse.ai/api/v1/business/knowledge-hubs/{hubId}/attachments`
- Auth: HTTP basic

Attaches a document to one of the hub's notes; note ids come from `notes[].id` in the hub detail. Send the file as padded base64 in `fileBase64`, up to 10,485,760 characters (about 7.5 MB of file data); allowed types are PDF, plain text, CSV, Word (.doc and .docx) and RTF. The file is stored for download only — it is not parsed into the hub's knowledge, so put the text you want the hub to learn in the note's own `text`. A note holds one attachment: a second upload answers 409 `ATTACHMENT_ALREADY_EXISTS`, and there is no replace endpoint. The response does not include a download URL; fetch one with `GET /business/knowledge-hubs/{hubId}/attachments/{noteId}`. The hub's owner can upload, and so can anyone on the team when it is the team's shared hub, but not while the hub is `processing`.

Errors:
- `404` `KNOWLEDGE_HUB_NOT_FOUND` — No hub with that id, it was deleted, or it belongs to another team.
- `404` `NOTE_NOT_FOUND` — No note with that id on this hub.
- `409` `ATTACHMENT_ALREADY_EXISTS` — The note already holds a document; delete the note's attachment first.
- `409` `KNOWLEDGE_HUB_NOT_READY` — The hub is processing a build, update or refresh.
- `403` `KNOWLEDGE_HUB_OWNER_ONLY` — You can read this teammate's hub, but it is not your team's shared hub, so only its owner can upload attachments.
- `422` `VALIDATION_FAILED` — Malformed base64, a file over the size cap, an unsupported contentType, or a missing field.
- `500` `UNEXPECTED_ERROR` — The file could not be stored; retry.
- `429` `RATE_LIMITED` — More than 30 knowledge-hub/campaign requests in a minute (or 1000 in a day). Knowledge hubs share the campaigns bucket.

Requires one of the following token scopes: campaigns.

## Path parameters

- `hubId` string, required: 24-character hex id of the knowledge hub (from GET /business/knowledge-hubs).

## Request body

- object
  - `noteId` string, required: 24-character hex id of the note to attach the document to; a note holds at most one attachment.
  - `fileBase64` string, required: Accepted values: standard base64 with padding — alphabet A-Z a-z 0-9 + / and a length that is a multiple of 4. A URL-safe (-_) string, an unpadded one, or one that still carries a data:...;base64, prefix answers 422 VALIDATION_FAILED. The whole JSON request body is capped at 10 MB, which puts the real ceiling at roughly 7.5 MB of file data (base64 is a third larger than the file it encodes). The bytes are stored and handed back by the download endpoint unchanged: nothing reads, extracts or indexes them, so an attachment on its own adds no knowledge to the hub — only the note's text does.
  - `filename` string, required: File name stored with the attachment and returned by the download endpoint (1-255 characters). Free text: it is stored verbatim, never parsed, and never checked against contentType or against the note's own filename label — an extension that contradicts contentType is accepted and changes nothing. Give it the real extension anyway, since it is the name whoever opens the download sees.
  - `contentType` 'application/pdf' | 'text/plain' | 'text/csv' | 'application/msword' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'application/rtf', required: MIME type of the file: PDF, plain text, CSV, Word (.doc or .docx) or RTF.

## Response `201`

Success

- object
  - `attachment` object, required
    - `noteId` string, required: The note the document is attached to.
    - `filename` string, nullable, required: The file name as stored.
    - `contentType` 'application/pdf' | 'text/plain' | 'text/csv' | 'application/msword' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'application/rtf' | 'null', nullable, required
    - `byteSize` integer, nullable, required: Size of the stored file in bytes.

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `403`: Error
- `404`: Error
- `409`: Error
- `422`: Error
- `429`: Error
- `500`: Error

---

[API](https://skmtc.dev/fuseai/apis/fuse-business-api.md) · [All operations](https://skmtc.dev/fuseai/apis/fuse-business-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fuseai/apis/fuse-business-api/revisions/50d95e0536f4?raw)
