Projects
A project is the ownership and URL boundary for datasets, jobs, hosted aliases, and inference. Project routes are authenticated and owner-only; public or shared hosted-model access is granted at the alias, not by making a project public.
Endpoints
GET /api/v1/projects
POST /api/v1/projects
GET /api/v1/projects/{owner_slug}/{project_slug}
PUT /api/v1/projects/{owner_slug}/{project_slug}
GET /api/v1/projects/{owner_slug}/{project_slug}/tags
POST /api/v1/projects/{owner_slug}/{project_slug}/archive
POST /api/v1/projects/{owner_slug}/{project_slug}/unarchive
Create a text project with:
{
"name": "Support",
"description": "Support conversations and models",
"type": "text",
"inference_save_percent": 0.0
}
Despite its historical name, inference_save_percent is a probability
fraction from 0 through 1: 0.25 samples roughly one quarter of eligible
owner-originated inference requests. Shared and public callers' prompts are
never auto-saved into the owner's dataset.
Project types
A project's type is chosen when it is created and never changes:
text: chat datasets, fine-tuned text-generation models, chat and text completions.embedding: datasets of Training pairs, fine-tuned embedding models,/embeddings, the embedding Playground, Search and Search feedback. Start with the Quickstart for embeddings.
Both types share the same routes for projects, datasets, training jobs, hosted
models and billing; a route that only one type supports answers the other with
409 project_capability_mismatch. GET /api/v1/projects/capabilities lists the
types you can create and what each supports. inference_save_percent applies to
text projects only: embedding calls are never saved.
Listing and summaries
GET /api/v1/projects always returns {projects,next_cursor,total_count}.
Use limit (default 25, maximum 100) and cursor directly. Cursors belong to
your account and archive filter. Archived projects are excluded unless
include_archived=true. Project cards include bounded counts for chats, jobs,
and hosted models.
Account-wide reads are separate:
GET /api/v1/dashboardreturns a fixed-size global summary.GET /api/v1/modelsreturns accessible hosted aliases across projects with cursor pagination.GET /api/v1/activityreturns the owner's cursor-paginated job and alias creation history.
Archive instead of delete
Archiving is idempotent and reversible. It retains chats, immutable training
records, aliases, artifacts, and billing history, while making the project
read-only. Archive is refused with 409 and
detail.code = "project_has_nonterminal_work" while training is pending,
running, or awaiting cancellation. Cancel and settle that work first.
Archived projects do not consume an active-project slot. Unarchive can still
return 409 if restoring the project would exceed the account quota. Inference
against an archived project's OpenAI surface returns 404 with
error.code = "project_archived" and no Retry-After.
Project creation accepts only text (the default) or embedding. Historical
multimodal projects can remain readable, but that type is not offered for creation.