API reference
What is in a project's Data Management: pages, files, datasets, images and links. Read any item's details and a page's text, and create pages. Files can be listed and described but not uploaded or downloaded in v1.
/v1/projects/{id}/itemscontent:readThe items in a project's Data Management, newest first, in every folder unless folder_id is given. Deleted items are left out. A list item carries no body: read a page with Get an item.
| Name | Type | Description |
|---|---|---|
idpath, required | string (uuid) | The project's id. |
limitquery | integer | How many to return. 1 to 100. Default 25. |
cursorquery | string | The next_cursor from the previous page. Leave it out for the first page. |
kindquery | string | Only items of this kind. One of page, file, dataset, image, link. |
folder_idquery | string (uuid) | Only the items directly in this folder (not in its subfolders). Items carry their folder_id. |
qquery | string | Only items whose name contains this text, ignoring case (1 to 120 characters). |
| Field | Type | Description |
|---|---|---|
data | array of object | |
data[].id | string (uuid) | |
data[].project_id | string (uuid) | |
data[].folder_id | string or null (uuid) | The folder it is in, or null at the top of the project. |
data[].name | string | |
data[].kind | string | page, file, dataset, image or link. |
data[].ext | string or null | The file extension, such as pdf or csv; html or md for a page. |
data[].size_bytes | integer | |
data[].status | string | ready, queued or processing while a file is being read, or failed. |
data[].grounding | boolean | Whether Chat & Research and Odin use it when answering. |
data[].created_at | string (date-time) | |
data[].updated_at | string (date-time) | |
has_more | boolean | |
next_cursor | string or null |
The codes are listed under Errors.
curl "https://api.veragen.ai/v1/projects/{id}/items?limit=25" \
-H "Authorization: Bearer $VERAGEN_API_KEY"const res = await fetch("https://api.veragen.ai/v1/projects/{id}/items?limit=25", {
headers: { Authorization: `Bearer ${process.env.VERAGEN_API_KEY}` },
});
const data = await res.json();import os, requests
res = requests.get(
"https://api.veragen.ai/v1/projects/{id}/items",
params={"limit": 25},
headers={"Authorization": f"Bearer {os.environ['VERAGEN_API_KEY']}"},
)
data = res.json(){
"data": [
{
"id": "5d4c3b2a-1f0e-4d9c-8b7a-6e5f4d3c2b1a",
"project_id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"folder_id": null,
"name": "Competitor digest",
"kind": "page",
"ext": "html",
"size_bytes": 1834,
"status": "ready",
"grounding": true,
"created_at": "2026-10-03T06:01:12.000Z",
"updated_at": "2026-10-03T06:01:12.000Z"
},
{
"id": "2a3b4c5d-6e7f-4a8b-9c0d-1e2f3a4b5c6d",
"project_id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"folder_id": "8f7e6d5c-4b3a-4c2d-9e1f-0a9b8c7d6e5f",
"name": "Pricing survey.pdf",
"kind": "file",
"ext": "pdf",
"size_bytes": 482113,
"status": "ready",
"grounding": true,
"created_at": "2026-09-20T11:00:00.000Z",
"updated_at": "2026-09-20T11:02:40.000Z"
}
],
"has_more": false,
"next_cursor": null
}/v1/projects/{id}/itemscontent:writeCreates a page in the project's Data Management, at the top of the project or in folder_id, and answers 201 with it. Send the text as Markdown or HTML. It is cleaned exactly as a page saved in the hub is: scripts, event handlers, styles and anything else a page cannot hold are removed, so what you read back can differ from what you sent. Markdown is stored as HTML, so the page reads back with format: "html". The page has a first version in its history, and is searched by Chat & Research and Odin like any other page once it has been indexed, which is billed as indexing any page is.
Idempotency-Key is optional here and recommended: a retry with the same key and the same request returns the first answer, with Idempotent-Replay: true, and never makes a second page. Files cannot be uploaded in v1.
| Name | Type | Description |
|---|---|---|
idpath, required | string (uuid) | The project's id. |
Idempotency-Keyheader | string | Optional: a unique value for this request, 8 to 64 printable characters (a UUID is ideal). Send the same value again to retry without creating a second one. |
| Field | Type | Description |
|---|---|---|
id | string (uuid) | |
project_id | string (uuid) | |
folder_id | string or null (uuid) | The folder it is in, or null at the top of the project. |
name | string | |
kind | string | page, file, dataset, image or link. |
ext | string or null | The file extension, such as pdf or csv; html or md for a page. |
size_bytes | integer | |
status | string | ready, queued or processing while a file is being read, or failed. |
grounding | boolean | Whether Chat & Research and Odin use it when answering. |
created_at | string (date-time) | |
updated_at | string (date-time) | |
body | object or null | A page's text; null for anything that is not a page. |
body.format | string | |
body.content | string |
The codes are listed under Errors.
curl -X POST "https://api.veragen.ai/v1/projects/{id}/items" \
-H "Authorization: Bearer $VERAGEN_API_KEY" \
-H "Idempotency-Key: 6f1d2c3b-page-2026-10-03-1420" \
-H "Content-Type: application/json" \
-d '{"name": "Q3 board summary", "format": "markdown", "content": "# Q3 board summary\n\nRevenue grew **12%** on Q2.", "folder_id": null}'const res = await fetch("https://api.veragen.ai/v1/projects/{id}/items", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.VERAGEN_API_KEY}`, "Idempotency-Key": "6f1d2c3b-page-2026-10-03-1420", "Content-Type": "application/json" },
body: JSON.stringify({
"name": "Q3 board summary",
"format": "markdown",
"content": "# Q3 board summary\n\nRevenue grew **12%** on Q2.",
"folder_id": null
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.veragen.ai/v1/projects/{id}/items",
headers={"Authorization": f"Bearer {os.environ['VERAGEN_API_KEY']}", "Idempotency-Key": "6f1d2c3b-page-2026-10-03-1420"},
json={
"name": "Q3 board summary",
"format": "markdown",
"content": "# Q3 board summary\n\nRevenue grew **12%** on Q2.",
"folder_id": None
},
)
data = res.json(){
"id": "5d4c3b2a-1f0e-4d9c-8b7a-6e5f4d3c2b1a",
"project_id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"folder_id": null,
"name": "Q3 board summary",
"kind": "page",
"ext": "html",
"size_bytes": 72,
"status": "ready",
"grounding": true,
"created_at": "2026-10-03T06:01:12.000Z",
"updated_at": "2026-10-03T06:01:12.000Z",
"body": {
"format": "html",
"content": "<h1>Q3 board summary</h1>\n<p>Revenue grew <strong>12%</strong> on Q2.</p>\n"
}
}/v1/items/{id}content:readOne item. For a page, body holds its text, as HTML (or Markdown, for a page that was stored as Markdown); images in a page are references (<img data-vg-item="…">), not links. For a file, dataset, image or link, body is null in v1.
| Name | Type | Description |
|---|---|---|
idpath, required | string (uuid) | The item's id. |
| Field | Type | Description |
|---|---|---|
id | string (uuid) | |
project_id | string (uuid) | |
folder_id | string or null (uuid) | The folder it is in, or null at the top of the project. |
name | string | |
kind | string | page, file, dataset, image or link. |
ext | string or null | The file extension, such as pdf or csv; html or md for a page. |
size_bytes | integer | |
status | string | ready, queued or processing while a file is being read, or failed. |
grounding | boolean | Whether Chat & Research and Odin use it when answering. |
created_at | string (date-time) | |
updated_at | string (date-time) | |
body | object or null | A page's text; null for anything that is not a page. |
body.format | string | |
body.content | string |
The codes are listed under Errors.
curl "https://api.veragen.ai/v1/items/{id}" \
-H "Authorization: Bearer $VERAGEN_API_KEY"const res = await fetch("https://api.veragen.ai/v1/items/{id}", {
headers: { Authorization: `Bearer ${process.env.VERAGEN_API_KEY}` },
});
const data = await res.json();import os, requests
res = requests.get(
"https://api.veragen.ai/v1/items/{id}",
headers={"Authorization": f"Bearer {os.environ['VERAGEN_API_KEY']}"},
)
data = res.json(){
"id": "5d4c3b2a-1f0e-4d9c-8b7a-6e5f4d3c2b1a",
"project_id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"folder_id": null,
"name": "Competitor digest",
"kind": "page",
"ext": "html",
"size_bytes": 1834,
"status": "ready",
"grounding": true,
"created_at": "2026-10-03T06:01:12.000Z",
"updated_at": "2026-10-03T06:01:12.000Z",
"body": {
"format": "html",
"content": "<h1>Competitor digest</h1>\n<p>Three launches this week.</p>\n"
}
}