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.