API reference
Early access. The VeraGen API is not open yet: this reference shows what it will do, and keys cannot be created until it opens. Request early access.

API reference

Skunk Works

Skunk Works is the hub's project management: each project's work items (stories, tasks, bugs and epics), its backlog and its sprints. With the skunkworks:read scope a key reads them in every project of the account that has opened Skunk Works: the projects and their key prefixes, the items with their status, sprint, epic, labels, assignee and dates, one item with its description, its linked Data Management documents and its whole history (comments included), and the sprints with their totals and, once finished, their review. An item is named by its key, such as WR-12; a key with a project's old prefix still finds the item. The API is read-only for Skunk Works: items are created and changed in the hub, and reading never opens Skunk Works in a project that has not used it.

List Skunk Works projects

GET/v1/skunkworks/projectsskunkworks:read

The account's projects that have opened Skunk Works, the most recently opened first, each with its key prefix (and any prefixes it had before), how many items and epics it holds, how many are still open, and its running sprint. A project that has never opened Skunk Works is not listed, and listing does not open it. Deleted projects are left out.

Parameters

NameTypeDescription
limit
query
integerHow many to return. 1 to 100. Default 25.
cursor
query
stringThe next_cursor from the previous page. Leave it out for the first page.

Response 200

FieldTypeDescription
dataarray of object
data[].project_idstring (uuid)The project's id (the same id as in List projects).
data[].namestringThe project's name.
data[].key_prefixstringThe prefix of its item keys, such as WR in WR-12.
data[].old_prefixesarray of stringPrefixes it had before. Keys with them still find its items.
data[].itemsintegerIts work items, epics not counted.
data[].open_itemsintegerThose not yet done.
data[].epicsinteger
data[].open_sprintsintegerSprints planned or running.
data[].active_sprint_idstring or null (uuid)The running sprint, or null.
data[].opened_atstring (date-time)When Skunk Works was first opened in the project.
has_moreboolean
next_cursorstring or null

Errors

  • 400 The request is not valid.
  • 401 No valid API key.
  • 403 The key may not do this.
  • 404 Not found in this account.
  • 429 Too many requests.
  • 500 Something went wrong on our side.

The codes are listed under Errors.

cURL
curl "https://api.veragen.ai/v1/skunkworks/projects?limit=25" \
  -H "Authorization: Bearer $VERAGEN_API_KEY"
JavaScript
const res = await fetch("https://api.veragen.ai/v1/skunkworks/projects?limit=25", {
  headers: { Authorization: `Bearer ${process.env.VERAGEN_API_KEY}` },
});
const data = await res.json();
Python
import os, requests

res = requests.get(
    "https://api.veragen.ai/v1/skunkworks/projects",
    params={"limit": 25},
    headers={"Authorization": f"Bearer {os.environ['VERAGEN_API_KEY']}"},
)
data = res.json()
Response 200
{
  "data": [
    {
      "project_id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
      "name": "Website Redesign",
      "key_prefix": "WR",
      "old_prefixes": [],
      "items": 42,
      "open_items": 17,
      "epics": 3,
      "open_sprints": 2,
      "active_sprint_id": "2b3c4d5e-6f70-4812-93a4-b5c6d7e8f901",
      "opened_at": "2026-09-14T10:02:33.120Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

List items

GET/v1/skunkworks/projects/{project_id}/itemsskunkworks:read

A project's work items, epics included, most recently changed first. Filters combine: status, type, sprint_id (one sprint, from List sprints), assignee_email (the person's sign-in email, any case), epic_key (the items in one epic), label, q (an item key, or words in the title or description) and changed_since (only items changed at or after a time, for keeping another system in step). A value that is not one of the listed ones is refused with 400 invalid_parameter, never ignored.

Parameters

NameTypeDescription
project_id
path, required
string (uuid)The project's id, from List Skunk Works projects.
limit
query
integerHow many to return. 1 to 100. Default 25.
cursor
query
stringThe next_cursor from the previous page. Leave it out for the first page.
status
query
stringOnly items with this status. One of todo, in_progress, in_review, done.
type
query
stringOnly items of this type. One of story, task, bug, epic.
sprint_id
query
string (uuid)Only the items in this sprint.
assignee_email
query
string (email)Only the items assigned to the person with this sign-in email.
epic_key
query
stringOnly the items in this epic, by its key.
label
query
stringOnly the items with this label.
q
query
stringAn item key, or words in the title or description.
changed_since
query
stringOnly items changed at or after this time: a date (YYYY-MM-DD, UTC) or an ISO-8601 date and time with a zone.

Response 200

FieldTypeDescription
dataarray of object
data[].keystringThe item's key, such as WR-12. It does not change unless the project's prefix is renamed (and the old key still finds it).
data[].titlestring
data[].typestring
data[].statusstringTo Do, In Progress, In Review or Done.
data[].prioritystring
data[].pointsinteger or nullIts estimate in points, or null.
data[].due_datestring or null (date)
data[].labelsarray of string
data[].epic_keystring or nullThe epic it belongs to, by key.
data[].sprint_idstring or null (uuid)The sprint it is in, or null in the backlog.
data[].sprint_namestring or null
data[].assignee_emailstring or nullThe sign-in email of the person it is assigned to.
data[].assignee_namestring or null
data[].linked_documentsintegerHow many Data Management documents are linked to it, from its description, its comments or by hand.
data[].created_atstring (date-time)
data[].updated_atstring (date-time)When anything about it last changed. Lists are ordered by it, newest first.
data[].closed_atstring or null (date-time)When it was done, or null.
has_moreboolean
next_cursorstring or null

Errors

  • 400 The request is not valid.
  • 401 No valid API key.
  • 403 The key may not do this.
  • 404 Not found in this account.
  • 429 Too many requests.
  • 500 Something went wrong on our side.

The codes are listed under Errors.

cURL
curl "https://api.veragen.ai/v1/skunkworks/projects/{project_id}/items?limit=25" \
  -H "Authorization: Bearer $VERAGEN_API_KEY"
JavaScript
const res = await fetch("https://api.veragen.ai/v1/skunkworks/projects/{project_id}/items?limit=25", {
  headers: { Authorization: `Bearer ${process.env.VERAGEN_API_KEY}` },
});
const data = await res.json();
Python
import os, requests

res = requests.get(
    "https://api.veragen.ai/v1/skunkworks/projects/{project_id}/items",
    params={"limit": 25},
    headers={"Authorization": f"Bearer {os.environ['VERAGEN_API_KEY']}"},
)
data = res.json()
Response 200
{
  "data": [
    {
      "key": "WR-12",
      "title": "Pricing page: annual toggle",
      "type": "story",
      "status": "in_progress",
      "priority": "high",
      "points": 5,
      "due_date": "2026-10-16",
      "labels": [
        "frontend"
      ],
      "epic_key": "WR-3",
      "sprint_id": "2b3c4d5e-6f70-4812-93a4-b5c6d7e8f901",
      "sprint_name": "Sprint 4",
      "assignee_email": "sam@acme.example",
      "assignee_name": "Sam Ortiz",
      "linked_documents": 1,
      "created_at": "2026-10-01T09:12:40.512Z",
      "updated_at": "2026-10-06T15:30:02.004Z",
      "closed_at": null
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Get an item

GET/v1/skunkworks/projects/{project_id}/items/{key}skunkworks:read

One work item by its key: everything in the list, its description as plain text and as the HTML the hub shows, the Data Management documents linked to it (by their current names, and whether each is archived), and its whole history, oldest first: created, every change of status, sprint, assignee and the other fields, documents linked, and every comment with its text. Images in the description are references to the item's own images; the API hands out no image files.

Parameters

NameTypeDescription
project_id
path, required
string (uuid)The project's id, from List Skunk Works projects.
key
path, required
stringThe item's key, such as WR-12. A key with one of the project's old prefixes, or the number alone, finds it too.

Response 200

FieldTypeDescription
keystringThe item's key, such as WR-12. It does not change unless the project's prefix is renamed (and the old key still finds it).
titlestring
typestring
statusstringTo Do, In Progress, In Review or Done.
prioritystring
pointsinteger or nullIts estimate in points, or null.
due_datestring or null (date)
labelsarray of string
epic_keystring or nullThe epic it belongs to, by key.
sprint_idstring or null (uuid)The sprint it is in, or null in the backlog.
sprint_namestring or null
assignee_emailstring or nullThe sign-in email of the person it is assigned to.
assignee_namestring or null
linked_documentsintegerHow many Data Management documents are linked to it, from its description, its comments or by hand.
created_atstring (date-time)
updated_atstring (date-time)When anything about it last changed. Lists are ordered by it, newest first.
closed_atstring or null (date-time)When it was done, or null.
description_textstringThe description as plain text.
description_htmlstringThe description as the hub shows it: formatting, links, document and item chips, and references to the item's images.
documentsarray of objectThe Data Management documents linked to it.
documents[].idstring (uuid)The document's id in Data Management (Get an item, with content:read).
documents[].namestringIts name now.
documents[].archivedbooleantrue when it has been archived in Data Management.
historyarray of objectEverything that happened to it, oldest first, comments included.
history[].idstring (uuid)
history[].atstring (date-time)
history[].kindstringWhat happened, such as created, status, sprint, assignee, priority, points, due, epic, labels, title, description, comment, mention, doclink, docunlink, attachment, resolution or reopened. More kinds may be added.
history[].actor_emailstring or nullWho did it: their sign-in email. null when the hub did it itself.
history[].fromstring or nullFor a change, the value before, as the hub shows it (a status, a sprint's name or Backlog, an email or Unassigned).
history[].tostring or nullFor a change, the value after; for a mention, the email of the person mentioned; for a document, its name.
history[].textstring or nullFor a comment, its text.

Errors

  • 400 The request is not valid.
  • 401 No valid API key.
  • 403 The key may not do this.
  • 404 Not found in this account.
  • 429 Too many requests.
  • 500 Something went wrong on our side.

The codes are listed under Errors.

cURL
curl "https://api.veragen.ai/v1/skunkworks/projects/{project_id}/items/{key}" \
  -H "Authorization: Bearer $VERAGEN_API_KEY"
JavaScript
const res = await fetch("https://api.veragen.ai/v1/skunkworks/projects/{project_id}/items/{key}", {
  headers: { Authorization: `Bearer ${process.env.VERAGEN_API_KEY}` },
});
const data = await res.json();
Python
import os, requests

res = requests.get(
    "https://api.veragen.ai/v1/skunkworks/projects/{project_id}/items/{key}",
    headers={"Authorization": f"Bearer {os.environ['VERAGEN_API_KEY']}"},
)
data = res.json()
Response 200
{
  "key": "WR-12",
  "title": "Pricing page: annual toggle",
  "type": "story",
  "status": "in_progress",
  "priority": "high",
  "points": 5,
  "due_date": "2026-10-16",
  "labels": [
    "frontend"
  ],
  "epic_key": "WR-3",
  "sprint_id": "2b3c4d5e-6f70-4812-93a4-b5c6d7e8f901",
  "sprint_name": "Sprint 4",
  "assignee_email": "sam@acme.example",
  "assignee_name": "Sam Ortiz",
  "linked_documents": 1,
  "created_at": "2026-10-01T09:12:40.512Z",
  "updated_at": "2026-10-06T15:30:02.004Z",
  "closed_at": null,
  "description_text": "Add a monthly / annual toggle above the plan cards. Annual shows the yearly price and the saving.",
  "description_html": "<p>Add a monthly / annual toggle above the plan cards. Annual shows the yearly price and the saving.</p>",
  "documents": [
    {
      "id": "5d4c3b2a-1f0e-4d9c-8b7a-6e5f4d3c2b1a",
      "name": "Pricing research",
      "archived": false
    }
  ],
  "history": [
    {
      "id": "a1b2c3d4-e5f6-4071-8293-a4b5c6d7e8f9",
      "at": "2026-10-01T09:12:40.512Z",
      "kind": "created",
      "actor_email": "lee@acme.example",
      "from": null,
      "to": "todo",
      "text": null
    },
    {
      "id": "b2c3d4e5-f607-4182-93a4-b5c6d7e8f9a0",
      "at": "2026-10-02T08:00:11.300Z",
      "kind": "sprint",
      "actor_email": "lee@acme.example",
      "from": "Backlog",
      "to": "Sprint 4",
      "text": null
    },
    {
      "id": "c3d4e5f6-0718-4293-a4b5-c6d7e8f9a0b1",
      "at": "2026-10-06T15:30:02.004Z",
      "kind": "comment",
      "actor_email": "sam@acme.example",
      "from": null,
      "to": null,
      "text": "Toggle is in; the saving badge is next."
    }
  ]
}

List sprints

GET/v1/skunkworks/projects/{project_id}/sprintsskunkworks:read

A project's sprints, newest first: planned, running (active) and finished (completed). A sprint that was removed before it started is left out. Each carries its dates, its goal, and what is in it now: the number of items and points, and how many of them are done. When a sprint is completed its unfinished items move on, so a completed sprint's totals are the work it finished. A completed sprint also carries its review, as the team saved it.

Parameters

NameTypeDescription
project_id
path, required
string (uuid)The project's id, from List Skunk Works projects.
limit
query
integerHow many to return. 1 to 100. Default 25.
cursor
query
stringThe next_cursor from the previous page. Leave it out for the first page.
state
query
stringOnly sprints in this state. One of planned, active, completed.

Response 200

FieldTypeDescription
dataarray of object
data[].idstring (uuid)
data[].namestring
data[].goalstring
data[].statestringplanned, active (running) or completed.
data[].starts_onstring or null (date)
data[].ends_onstring or null (date)
data[].itemsintegerThe items in it now.
data[].items_doneinteger
data[].pointsintegerTheir points added up.
data[].points_doneintegerThe points of the items that are done.
data[].reviewstring or nullA completed sprint's review, as the team saved it; null otherwise.
data[].started_atstring or null (date-time)
data[].completed_atstring or null (date-time)
data[].created_atstring (date-time)
has_moreboolean
next_cursorstring or null

Errors

  • 400 The request is not valid.
  • 401 No valid API key.
  • 403 The key may not do this.
  • 404 Not found in this account.
  • 429 Too many requests.
  • 500 Something went wrong on our side.

The codes are listed under Errors.

cURL
curl "https://api.veragen.ai/v1/skunkworks/projects/{project_id}/sprints?limit=25" \
  -H "Authorization: Bearer $VERAGEN_API_KEY"
JavaScript
const res = await fetch("https://api.veragen.ai/v1/skunkworks/projects/{project_id}/sprints?limit=25", {
  headers: { Authorization: `Bearer ${process.env.VERAGEN_API_KEY}` },
});
const data = await res.json();
Python
import os, requests

res = requests.get(
    "https://api.veragen.ai/v1/skunkworks/projects/{project_id}/sprints",
    params={"limit": 25},
    headers={"Authorization": f"Bearer {os.environ['VERAGEN_API_KEY']}"},
)
data = res.json()
Response 200
{
  "data": [
    {
      "id": "2b3c4d5e-6f70-4812-93a4-b5c6d7e8f901",
      "name": "Sprint 4",
      "goal": "Ship the new pricing page.",
      "state": "active",
      "starts_on": "2026-10-05",
      "ends_on": "2026-10-16",
      "items": 9,
      "items_done": 3,
      "points": 31,
      "points_done": 11,
      "review": null,
      "started_at": "2026-10-05T08:30:00.000Z",
      "completed_at": null,
      "created_at": "2026-09-29T14:00:00.000Z"
    },
    {
      "id": "3c4d5e6f-7081-4923-a4b5-c6d7e8f9a012",
      "name": "Sprint 3",
      "goal": "Navigation and footer.",
      "state": "completed",
      "starts_on": "2026-09-21",
      "ends_on": "2026-10-02",
      "items": 8,
      "items_done": 8,
      "points": 26,
      "points_done": 26,
      "review": "Finished the navigation and the footer; the search box moved to Sprint 4.",
      "started_at": "2026-09-21T08:30:00.000Z",
      "completed_at": "2026-10-02T16:45:10.000Z",
      "created_at": "2026-09-15T11:20:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}