---
title: "Update a hub's name, websites, or notes"
method: PATCH
path: "/business/knowledge-hubs/{hubId}"
tags: ["Knowledge hubs"]
---

# Update a hub's name, websites, or notes

`PATCH /business/knowledge-hubs/{hubId}`

## Request

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

Renames the hub and/or 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, a new one is added — and notes merge by `filename`, so sending a known filename edits that note in place and keeps its attachment. Nothing is ever removed: there is no public way to drop a website or a note. The hub flips to `status` `processing` immediately; the `websites` and `notes` in this response are still the PRE-merge values, so poll `GET /business/knowledge-hubs/{hubId}` until `status` is `complete` to see the merged hub. A hub that is already processing a build, update or refresh answers 409 `KNOWLEDGE_HUB_NOT_READY`.

Errors:
- `404` `KNOWLEDGE_HUB_NOT_FOUND` — No hub with that id, it was deleted, or it belongs to another team.
- `409` `KNOWLEDGE_HUB_NOT_READY` — The hub is already processing a build, update or refresh — wait for status complete.
- `422` `VALIDATION_FAILED` — Nothing to update, a value outside its limits, or a website URL the crawler cannot parse.
- `500` `UNEXPECTED_ERROR` — The update workflow could not be enqueued; the hub may be left processing — 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: At least one of name, websites or notes is required.
  - `name` string: New hub name (1-100 characters).
  - `websites` object[]: Websites to add or re-crawl: at least 1, at most 20 per call, and the 20 caps the call, not the hub. Accepted values for each entry's url: any http(s) web address, with or without the scheme. Merged into the hub's existing websites — on a hub built through this API a known URL is matched ignoring scheme, www., a trailing slash and case — and a match is re-crawled while an unknown URL is added; nothing is ever removed. A matched entry is REPLACED by what you send, so omitting includeSubPages or isCompetitor resets that flag to false. Re-crawling runs in the background after the 202, so a site that cannot be fetched is not reported as an error: its entry simply keeps the lastCrawledAt it already had.
    - `url` string, required: Website to crawl (4-2048 characters), with or without the scheme, e.g. brightpay.com or https://brightpay.com/pricing; an unparseable URL answers 422 VALIDATION_FAILED.
    - `includeSubPages` boolean: Also crawl the site's subpages (up to 100 per crawl; a re-crawl skips subpages the hub already stores and keeps only the newly found ones); default false.
    - `isCompetitor` boolean: Treat the site as a competitor: its content feeds competitor pages instead of the company's own profile; default false.
  - `notes` object[]: Notes to add or update: at least 1, at most 50 per call. Each note's text carries the free-text knowledge itself; filename is only its label. Merged into the hub's existing notes by exact filename: a match keeps its id and its attachment but has its text and isCompetitor overwritten by exactly what you send, so omitting isCompetitor resets that flag to false and a competitor note silently becomes company material; an unknown filename adds a note, and nothing is removed. Two entries with the same filename in one call collapse into one — the last wins, with no error.
    - `text` string, required: Free-text knowledge to include (1-60,000 characters), e.g. positioning, objection handling, internal docs.
    - `isCompetitor` boolean: Treat the note as competitor material rather than the company's own; default false.
    - `filename` string, required: Label the note is cited by, and the key it is merged on (1-255 characters). Required here because notes are merged by filename: a matching note is updated in place (its attachment is kept), an unknown filename adds a note. Free text, but to update an existing note it must equal one of the values from GET /business/knowledge-hubs/{hubId} (notes[].filename) exactly — the match is case-sensitive and literal, so a near-miss silently adds a second note instead of updating the one you meant. It is a label only: no file extension is needed, and it is unrelated to an attachment's own filename.

## Response `202`

Success

- object
  - `knowledgeHub` object, required
    - `id` string, nullable, required
    - `name` string, nullable, required: The new name if one was sent, otherwise the hub's current name.
    - `companyName` string, nullable, required: Company name from the last completed build; null until a build has finished.
    - `status` 'processing' | 'complete' | 'draft' | 'null', nullable, required: processing = the crawl and page synthesis are running, complete = the hub is usable, draft = the hub is not built — either it was saved as a draft in the web app and never built, or its last build exhausted its retries.
    - `isDefault` boolean, required
    - `websites` object[], required: The websites you added plus the subpages the crawler discovered from them (subpages carry parentUrl).
      - `url` string, nullable, required
      - `includeSubPages` boolean, required: Whether the site's subpages were expanded when it was added.
      - `isCompetitor` boolean, required
      - `parentUrl` string, nullable, required: Set on subpages the crawler discovered: the website they were collected from. null on a website you added yourself.
      - `lastCrawledAt` string, date-time, nullable, required: When this URL was last successfully crawled; null if it has never been crawled.
    - `notes` object[], required
      - `id` string, nullable, required: Note id; the attachment endpoints address notes by it.
      - `text` string, nullable, required
      - `filename` string, nullable, required: Label the note is cited by, and the key notes are merged on when the hub is updated.
      - `isCompetitor` boolean, required
      - `hasAttachment` boolean, required: Whether the note carries a downloadable document.
    - `createdAt` string, date-time, nullable, required
    - `updatedAt` string, date-time, nullable, required

## 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)
