Documentation Index
Fetch the complete documentation index at: https://docs.emergence.ai/llms.txt
Use this file to discover all available pages before exploring further.
Projects
Projects are the second level of resource scoping in CRAFT. Every resource (agents, data connections, artifacts, files) belongs to a project, and every project belongs to an organization. Projects provide:- Logical separation of resources within a single organization
- Permission inheritance from the parent organization via OpenFGA
- Access control through project-level roles (
owner,admin,developer,operator,viewer)
The
project_id is never embedded in the JWT token. It is supplied via the X-Project-ID request header, allowing users to switch project context without re-authenticating.How Projects Work
When a project is created, the platform performs several coordinated actions:Database Record
A project record is created in the Governance database, linked to the parent organization by
organization_id.OpenFGA Parent Link
A relationship tuple is written to OpenFGA linking the project to its organization:
project:{project_id}#organization@organization:{org_id}. This establishes permission inheritance — organization-level roles automatically grant access to the project.The X-Project-ID Header
All resource APIs (Assets, Utils) require theX-Project-ID header to scope requests:
Why not put project_id in the JWT?
Why not put project_id in the JWT?
Users often work across multiple projects in the same session. Embedding
project_id in the JWT would require re-authentication to switch projects. The header-based approach allows instant project switching with the same token.How is the header validated?
How is the header validated?
The
require_permission() dependency reads the X-Project-ID header and checks OpenFGA to verify the authenticated user has the required permission on that project. If the user lacks access, a 403 is returned.What about list operations?
What about list operations?
List queries always filter by both
auth.org_id (from JWT) and project_id (from header). This dual filter ensures data isolation even if a permission check has a gap.API Reference
The Projects API is part of the Governance service (port 8001).GET /governance/projects
GET /governance/projects
Lists all projects in the user’s organization with pagination. Results are filtered to only include projects the user has
can_read permission on.Query Parameters:page(default: 1) — Page numberlimit(default: 20, max: 100) — Items per page
Response (200 OK)
POST /governance/projects
POST /governance/projects
Creates a new project within the user’s organization (determined from JWT). The project is automatically linked to the organization and default groups receive permissions.Access: Users with If
can_manage_projects on the organization (owners or admins).Request Body
external_id is omitted, a UUID is generated for the project ID.Response (201 Created)
GET /governance/projects/{project_id}
GET /governance/projects/{project_id}
Retrieves detailed information about a specific project.Access: Users with
can_read permission on the project.Response (200 OK)
Project Permissions
Projects define a richer role set than organizations, supporting fine-grained access control for resource management:| Permission | Owner | Admin | Developer | Operator | Viewer |
|---|---|---|---|---|---|
can_read | Yes | Yes | Yes | Yes | Yes |
can_write | Yes | Yes | Yes | Yes | — |
can_delete | Yes | Yes | — | — | — |
can_create_resources | Yes | Yes | Yes | — | — |
can_read_secrets | Yes | Yes | Yes | Yes | — |
can_manage_secrets | Yes | Yes | Yes | — | — |
can_read_metadata | Yes | Yes | Yes | Yes | — |
can_manage_metadata | Yes | Yes | Yes | — | — |
Service Accounts
Projects support service relations for background workers and automated processes:| Service Relation | Grants |
|---|---|
service_reader | can_read, can_read_secrets, can_read_metadata |
service_writer | can_read, can_write, can_read_secrets, can_manage_secrets, can_read_metadata, can_manage_metadata |
service_deleter | can_read, can_delete |
service_executor | can_execute (for MCP servers, API servers, data connections) |
svc- client ID prefix and are granted contextual tuples scoped to specific projects. See Service Accounts for setup instructions and token management.
Next Steps
Organizations
Understand how organizations provide the top-level tenant boundary.
Authorization
Explore the OpenFGA permission model and permission inheritance.
Data Connections
Manage database and storage connections within projects.
Agent Registry
Register and discover agents scoped to projects.

