API: Projects
Base URL: /projects
Endpoints
List Projects
GET /projects
Returns all projects the authenticated user has access to.
Headers:
Authorization: Bearer <JWT>(required)
Response (200):
[
{
"id": "uuid",
"name": "Climate Resilience Service",
"slug": "climate-resilience",
"description": "...",
"author": "user-001",
"status": "active",
"currentPhaseId": "1",
"memberCount": 3,
"createdAt": "2026-01-15T10:30:00Z"
}
]
Create Project
POST /projects
Request Body:
{
"userId": "user-001",
"name": "Climate Resilience EO Service",
"slug": "climate-resilience",
"description": "EO-based climate adaptation service",
"objectives": "monitor,predict,alert",
"domain": "climate",
"organization": "Eurobios",
"expertise": "Remote sensing, Climate science",
"serviceIdea": "Real-time climate risk assessment"
}
Response (201):
{
"id": "uuid",
"author": "user-001",
"name": "Climate Resilience EO Service",
"inviteCode": "AB12CD34",
"status": "draft",
"currentPhaseId": "1",
"members": [{"userId": "user-001", "role": "ADMIN", "status": "ACCEPTED"}],
"templateInstances": [],
"threads": []
}
Update Project
PUT /projects/{projectId}
Request Body: Partial project fields to update.
Response (200): Updated project object.
Delete Project
DELETE /projects/{projectId}
Permission: Admin only.
Response (204): No content.
Get Project Members
GET /projects/{projectId}/project_user
Response (200):
[
{
"projectId": "uuid",
"userId": "user-001",
"role": "ADMIN",
"status": "ACCEPTED",
"userName": "Alice"
},
{
"projectId": "uuid",
"userId": "user-002",
"role": "MEMBER",
"status": "PENDING",
"userName": "Bob"
}
]
Get Invite Code
GET /projects/{projectId}/invite
Permission: Admin only.
Response (200):
{
"code": "AB12CD34",
"projectId": "uuid"
}
Verify Invite Code
POST /projects/verify-code
Request Body:
{"code": "AB12CD34"}
Response (200): Project preview (name, description, member count).
Join Project
POST /projects/join
Request Body:
{"code": "AB12CD34"}
Response (201): Membership created with status PENDING.