Skip to content
Docs / Project APICreate a backend →

Project API

Projects group datasets by topic, client, workflow, or any other label that helps agents and users find the right table. A dataset can belong to one project, or no project. Inside a project, optional sections group related datasets for a goal such as Blog, Sales, or Support.

Projects do not replace authentication. REST and MCP access still uses the authenticated profile boundary.

Create a project

POST https://rowset.lvtd.dev/api/projects
Content-Type: application/json
{
  "name": "Launch",
  "description": "Datasets used for launch operations",
  "metadata": {
    "github_repo": "https://github.com/acme/launch",
    "source_thread": "https://acme.slack.com/archives/C123/p456"
  }
}

The response includes project.key. Use that key when creating a dataset or assigning an existing dataset.

List projects

GET https://rowset.lvtd.dev/api/projects

Returns project description, JSON metadata, and dataset_count.

Search projects by name, description, or JSON metadata with query:

GET https://rowset.lvtd.dev/api/projects?query=launch

Get a project

GET https://rowset.lvtd.dev/api/projects/{project_key}

Returns the project, active sections, grouped datasets, and a flat page of datasets currently assigned to it.

Update a project

PATCH https://rowset.lvtd.dev/api/projects/{project_key}
Content-Type: application/json
{
  "name": "Launch operations",
  "description": "Datasets used by the launch agent"
}

Send only the fields you want to change. Use an empty string to clear description.

Update project metadata

PATCH https://rowset.lvtd.dev/api/projects/{project_key}/metadata
Content-Type: application/json
{
  "metadata": {
    "notion_doc": "https://notion.so/acme/launch-plan",
    "slack_thread": "https://acme.slack.com/archives/C123/p456"
  }
}

Send an empty object to clear project metadata.

Create a section

POST https://rowset.lvtd.dev/api/projects/{project_key}/sections
Content-Type: application/json
{
  "name": "Blog",
  "description": "Content operations datasets",
  "metadata": {
    "goal": "content-led growth"
  }
}

The response includes section.key. Use that key with project_key when creating or moving datasets into the section.

List sections

GET https://rowset.lvtd.dev/api/projects/{project_key}/sections

Returns active sections for one project with dataset_count.

Update a section

PATCH https://rowset.lvtd.dev/api/projects/{project_key}/sections/{section_key}
Content-Type: application/json
{
  "name": "Editorial",
  "description": "Blog planning and publishing datasets"
}

Archive a section

DELETE https://rowset.lvtd.dev/api/projects/{project_key}/sections/{section_key}

Archiving a section does not delete datasets. Datasets stay in the parent project and become unsectioned.

Archive a project

DELETE https://rowset.lvtd.dev/api/projects/{project_key}

Archives a project so it no longer appears in normal project lists, search results, or project detail lookups. Archiving a project does not delete or archive its datasets; dataset responses treat the archived project as ungrouped.

Assign a dataset

PATCH https://rowset.lvtd.dev/api/datasets/{dataset_key}/project
Content-Type: application/json
{
  "project_key": "{project_key}"
}

Attach a dataset to a section inside the project:

{
  "project_key": "{project_key}",
  "section_key": "{section_key}"
}

To leave the dataset ungrouped, send:

{
  "project_key": null
}

Related docs