> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fuseai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Knowledge hubs

> Ground AI campaign generation in your company's own content.

A knowledge hub is your company's ingested content — site pages, docs, product material — that grounds AI campaign generation. When an [AI campaign](/guides/campaigns) is generated against a hub, the emails reflect your actual product and voice instead of generic copy inferred from a prompt.

Your team has one knowledge hub, shared by everyone on it. You can build it from your websites over the API or in the Fuse app, keep its content current, and every AI campaign your team creates grounds on it unless you name another.

<Info>
  Every knowledge hub endpoint requires a key with the `campaigns` scope and shares the campaigns rate limit of 30 requests a minute. See [scopes](/concepts/scopes).
</Info>

## Create a knowledge hub

`POST /business/knowledge-hubs` creates your team's hub from 1 to 20 `websites` and up to 50 free-text `notes`. It answers `202` straight away and builds the hub in the background: every site is crawled, its subpages too when `includeSubPages` is `true`, and the text is synthesized into knowledge pages.

```bash theme={null}
curl -X POST https://api.tryfuse.ai/api/v1/business/knowledge-hubs \
  -u "$FUSE_API_KEY:" -H "Content-Type: application/json" \
  -d '{
    "name": "Brightpay KB",
    "websites": [{ "url": "https://brightpay.com", "includeSubPages": true }],
    "notes": [{ "filename": "Positioning", "text": "Brightpay runs payroll for teams in 40 countries from one dashboard." }]
  }'
```

```json theme={null}
{
  "knowledgeHub": {
    "id": "68a1f8509c41d20014b3ee41",
    "name": "Brightpay KB",
    "companyName": null,
    "status": "processing",
    "isDefault": true
  }
}
```

Poll `GET /business/knowledge-hubs/{hubId}` until `status` is `complete`. Building a hub costs no credits. A site that cannot be fetched is not reported as an error: its entry stays on the hub with `lastCrawledAt: null` and contributes nothing, so read the hub back to check.

Mark a competitor's site with `isCompetitor: true` and its content feeds the hub's competitor pages instead of your own profile.

A team holds one hub, so creating another answers `409 KNOWLEDGE_HUB_ALREADY_EXISTS` while your team's hub is built or building. Add sites and notes to the existing hub with `PATCH /business/knowledge-hubs/{hubId}` instead, as described [below](#add-websites-and-notes). A hub that never finished building (`draft`) does not count, and a new hub replaces it.

## List your knowledge hubs

```bash theme={null}
curl https://api.tryfuse.ai/api/v1/business/knowledge-hubs \
  -u "af_YOUR_KEY:"
```

```json theme={null}
{
  "knowledgeHubs": [
    {
      "id": "68a1f8509c41d20014b3ee41",
      "name": "Brightpay KB",
      "companyName": "Brightpay",
      "status": "complete",
      "isDefault": true,
      "createdAt": "2026-06-01T12:00:00.000Z"
    }
  ]
}
```

| Field | Meaning |
| - | - |
| `id` | The value to pass as `knowledgeHubId` when creating an AI campaign. |
| `name` | The hub's name as set in the app. |
| `companyName` | The company whose content the hub holds. |
| `status` | `processing`, `complete` or `draft`, or `null` for older hubs the platform created for a campaign. See below. |
| `isDefault` | Whether this is the hub your AI campaigns use when they do not name one. |
| `createdAt` | When the hub was created. |

A hub with status `processing` is still ingesting content. You can ground a campaign on it, but generation only draws on what has been ingested so far, so the result is thinner than waiting for `complete`. If you control the timing, poll until the hub reports `complete` before creating the campaign. A `draft` hub was never built, or its build did not finish, and cannot ground a campaign.

## Use a hub in a campaign

An AI campaign created without `knowledgeHubId` grounds on your team's hub: the team owner's hub when it is built or building, otherwise the oldest built hub among the team's members. Pass `knowledgeHubId` only to name a hub explicitly. It only applies to AI-generated campaigns — manual campaigns bring their own copy, so there is nothing for a hub to ground.

```bash theme={null}
curl -X POST https://api.tryfuse.ai/api/v1/business/campaigns \
  -u "af_YOUR_KEY:" \
  -H "Content-Type: application/json" \
  -d '{
    "campaignName": "Q3 outbound - finance leaders",
    "campaignType": "ai-generated",
    "listId": "68a1f20b9c41d20014b3e901",
    "knowledgeHubId": "68a1f8509c41d20014b3ee41",
    "ctaLink": "https://brightpay.com/demo"
  }'
```

An explicit `knowledgeHubId` must be one of your own hubs. If you name a hub that doesn't exist or isn't yours, including a teammate's, the request fails with `404 KNOWLEDGE_HUB_NOT_FOUND` in the standard [error envelope](/concepts/errors). Leave the field out to use the team's hub.

```json theme={null}
{
  "error": {
    "code": "KNOWLEDGE_HUB_NOT_FOUND",
    "message": "The requested knowledge hub was not found.",
    "param": null,
    "doc_url": "https://docs.fuseai.com/concepts/errors#knowledge_hub_not_found",
    "request_id": "req_8fK2mQ4x"
  }
}
```

The API never falls back silently to the team's hub when you name a hub explicitly. A campaign grounded on the wrong company's content is worse than an error, so a bad `knowledgeHubId` fails loudly instead of quietly producing emails about someone else's product.

## Keep a hub current

A hub is not frozen once it is built. Six things can change after the crawl.

### Add websites and notes

`PATCH /business/knowledge-hubs/{hubId}` renames the hub and merges websites and notes into it, then rebuilds it in the background (`202`). Websites merge by URL: a URL the hub already has is re-crawled, and a new one is added. Notes merge by `filename`, so sending a known filename edits that note in place and keeps its attachment. Nothing is ever removed this way.

```bash theme={null}
curl -X PATCH https://api.tryfuse.ai/api/v1/business/knowledge-hubs/$HUB_ID \
  -u "$FUSE_API_KEY:" -H "Content-Type: application/json" \
  -d '{ "websites": [{ "url": "https://brightpay.com/pricing" }], "notes": [{ "filename": "Objections", "text": "Buyers ask about SOC 2 first." }] }'
```

The hub goes back to `processing`; poll `GET /business/knowledge-hubs/{hubId}` until it is `complete`. A hub that is already building answers `409 KNOWLEDGE_HUB_NOT_READY`.

### Re-crawl one website

`POST /business/knowledge-hubs/{hubId}/refresh` takes the `url` of a site already on the hub and crawls it again. It answers `202`; the hub returns to `processing` while it works.

```bash theme={null}
curl -X POST https://api.tryfuse.ai/api/v1/business/knowledge-hubs/$HUB_ID/refresh \
  -u "$FUSE_API_KEY:" -H "Content-Type: application/json" \
  -d '{ "url": "https://example.com/pricing" }'
```

The URL must already be one of the hub's sites — refresh re-reads a source, it does not add one. Only that URL is re-crawled: subpages found from it earlier keep their existing text.

### Edit a page

Pages are the readable summaries the crawl produced. Edit one with `PATCH /business/knowledge-hubs/{hubId}/pages/{pageId}` (title, content, or both), remove one with `DELETE`, or rebuild one from its sources:

```bash theme={null}
curl -X POST https://api.tryfuse.ai/api/v1/business/knowledge-hubs/$HUB_ID/pages/$PAGE_ID/regenerate \
  -u "$FUSE_API_KEY:"
```

Regenerating discards your edits and rewrites the page from what the hub crawled, so use it when the source changed rather than when the wording is wrong.

<Note>
  A page carries an `origin`: `generated` if the crawl wrote it, `edited` once you have changed it, `user` if you added it yourself. An edited page is still rebuilt when you regenerate it, or when its source is re-crawled. Pages you added have no sources, so regenerating one answers `409 KNOWLEDGE_PAGE_NOT_REGENERABLE`.
</Note>

### Add your own page

`POST /business/knowledge-hubs/{hubId}/pages` adds a page you write yourself, in Markdown, with a `title` and an optional `category` (`overview`, `products`, `pricing`, `icp-use-cases`, `differentiators`, `competitors`, `faq`, `source-digest` or `custom`, the default).

```bash theme={null}
curl -X POST https://api.tryfuse.ai/api/v1/business/knowledge-hubs/$HUB_ID/pages \
  -u "$FUSE_API_KEY:" -H "Content-Type: application/json" \
  -d '{ "title": "Why teams switch from spreadsheets", "category": "differentiators", "content": "## Month-end close\n\nCustomers cut close from ten days to three..." }'
```

The page is indexed before the call answers, so the next campaign you generate can use it. Rebuilds never overwrite or remove a page you added. The hub must have finished its first build: one still `processing`, or a `draft`, answers `409 KNOWLEDGE_HUB_NOT_READY`.

### Attach a document to a note

Notes hold context the crawl could not reach. A note can carry one file — a deck, a one-pager, a price list — sent as base64. The file is stored for download only and is not read into the hub, so put what the hub should learn in the note's `text`.

```bash theme={null}
curl -X POST https://api.tryfuse.ai/api/v1/business/knowledge-hubs/$HUB_ID/attachments \
  -u "$FUSE_API_KEY:" -H "Content-Type: application/json" \
  -d '{
    "noteId": "68a1f8509c41d20014b3ee55",
    "filename": "positioning.pdf",
    "contentType": "application/pdf",
    "fileBase64": "JVBERi0xLjQK..."
  }'
```

`GET /business/knowledge-hubs/{hubId}/attachments/{noteId}` returns a short-lived `downloadUrl` for it.

<Warning>
  `DELETE /business/knowledge-hubs/{hubId}/attachments/{noteId}` removes the **whole note**, not just its file — the note's text goes with it. If you only meant to drop the document, re-add the note with `PATCH /business/knowledge-hubs/{hubId}`, using the same `filename` and `text`.
</Warning>

A note already holding a file answers `409 ATTACHMENT_ALREADY_EXISTS`; there is no replace, so delete and re-add.

### Correct what Fuse learned

Fuse also learns facts from your team's own conversations — questions prospects keep asking, objections that keep landing. `GET /business/knowledge-hubs/learned-facts` lists them across the team:

```json theme={null}
{
  "facts": [
    {
      "id": "68a1fb0a9c41d20014b3f201",
      "claim": "Prospects frequently ask whether a SOC 2 report is available before a trial.",
      "category": "faq-insight"
    }
  ]
}
```

A wrong or stale one can be corrected with `PATCH /business/knowledge-hubs/learned-facts/{factId}` or dropped with `DELETE`. Corrections must stay anonymised: a claim with an email address, a phone number, a deal amount or contract terms is refused with `422 LEARNED_FACT_NOT_ANONYMIZED`. Names are not checked, so keep them out yourself. A correction reaches the hub's pages on the next daily learning run.

## Where to next

<CardGroup cols={2}>
  <Card title="Campaigns" icon="paper-plane" href="/guides/campaigns">
    The full campaign creation flow, including the rest of the AI generation options.
  </Card>

  <Card title="API reference" icon="book" href="/api-reference">
    Complete request and response schemas for every endpoint.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.