/project/createCreate projectCreate a project. The authenticated user becomes its owner (only owner/admin members can mint API keys). Optionally seeds additional members by email and always auto-issues a full-access API key named after the project (raw key in apiKey.value — also persisted, so it stays retrievable later by owners/admins via GET /project/:projectId/api-key). Unknown/duplicate member emails never fail the request — they are reported in warnings instead.
Authentication: Bearer JWT (client session)
Input — request body
namestring required- Project name
membersarray- Optional seed members (max 20). Each item: { email: string, role?: "admin"|"member"|"viewer" (default "member") }
Input — example request
{
"name": "My App",
"members": [
{
"email": "teammate@example.com",
"role": "admin"
}
]
}Output — example response (201)
{
"id": "ugtp_project_a1b2c3d4e5f6",
"name": "My App",
"apiKey": {
"id": "ugtp_project_api_key_a1b2c3d4e5f6",
"name": "My App",
"keyPrefix": "ugtp2_0123",
"value": "ugtp2_0123456789abcdef0123456789abcdef"
},
"warnings": []
}Output — every status this endpoint answers with
| Status | When |
|---|---|
201 | Project, auto-issued API key, invited emails, and any skip warnings |
400 | Invalid request body or query parameters |
401 | Missing or invalid credentials |
500 | Internal server error |