What does a source look like?

GET /api/manage/sources/{id} returns the whole source, including its text. The workspace response lists the same fields without workspace_id and content, adding characters, the length of the text.

  • kind is document for text you added, and github for an imported file, which also has a repo and path.
  • approved is 1 when calls can use the source, and 0 when they can’t.
  • updated_at records the last change to the text, from adding, importing or re-syncing it. Approving doesn’t change it.
GET /api/manage/sources/SOURCE_ID, response 200
{
  "id": "SOURCE_ID",
  "workspace_id": "YOUR_WORKSPACE_ID",
  "channel": "support",
  "title": "Invite a teammate",
  "kind": "document",
  "content": "To invite a teammate, open Settings, choose Team and select Invite. The invitation link expires after seven days.",
  "repo": null,
  "path": null,
  "approved": 0,
  "updated_at": "2026-10-08T09:30:00.000Z"
}

How do you add a source?

Send POST /api/manage/sources with a title, the content and, for the sales agent, "channel": "sales". The response is 201 with the new id. Each request creates a new source, even when the title already exists, so if a request times out, check the list before you send it again.

  • title: required, 1 to 140 characters, trimmed. Otherwise you get “Give your source a title, up to 140 characters.”
  • content: required, 1 to 50,000 characters of plain text or Markdown. There are no file uploads, so convert PDFs and documents to text first.
  • channel: support, the default, or sales.
  • approved: ignored. New sources are always unapproved.
  • A workspace holds up to 100 sources, and adding one more returns 400 with “This pilot supports up to 100 knowledge sources.”
Add a Markdown source
curl -X POST 'https://app.kawlnow.com/api/manage/sources' \
  -H 'Authorization: Bearer YOUR_WORKSPACE_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"title": "Invite a teammate", "content": "## Invite a teammate\n\nOpen Settings, choose Team and select Invite. The invitation link expires after seven days."}'

# Response 201: {"id": "SOURCE_ID"}, saved unapproved

How do you review and approve a source?

Read the full text with GET, have a person check it, then send PATCH with {"approved": true}. The response is {"ok": true}. Send {"approved": false} to take a source out of answers without deleting it. Approval changes reach the next call.

approved must be a JSON boolean: a string such as "true", or 1, returns 400 with “Set approved to true or false.” An id that isn’t in your workspace returns 404 with “Source not found.” for GET, PATCH and DELETE.

Approval decides what the agent can search, not exactly what it says, so read transcripts after launch too. Any workspace token can approve, so if a coding agent holds one, decide whether approval stays with a person.

Find unreviewed sources, then unapprove one
# Sources waiting for review, filtered from the workspace response with jq.
curl -s 'https://app.kawlnow.com/api/manage/workspace' \
  -H 'Authorization: Bearer YOUR_WORKSPACE_TOKEN' \
  | jq '.sources[] | select(.approved == 0) | {id, channel, title}'

# Take a source out of answers without deleting it.
curl -X PATCH 'https://app.kawlnow.com/api/manage/sources/SOURCE_ID' \
  -H 'Authorization: Bearer YOUR_WORKSPACE_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"approved": false}'

# Response 200: {"ok": true}

How do you delete a source?

DELETE /api/manage/sources/{id} removes the source and its text for good and returns {"ok": true}. There’s no undo, so unapprove a source instead if you might want it back. A deleted GitHub source can be imported again, and comes back unapproved with a new id.