Capabilities

Projects & Engagements

List, create, update, archive, and manage canonical project/engagement identity, members, and settings without exposing raw GUI-shaped project JSON.

Interfaces

RESTAvailable

REST exposes the Customer → Engagement → Project hierarchy read-only from the top, plus bounded project identity, lifecycle, member, and settings commands with explicit confirmation and idempotency.

MCPAvailable

MCP can use the same public project API for lifecycle/member/settings operations; the legacy list_projects resolver remains available for lightweight discovery.

GraphQLAvailable

GraphQL exposes project reads plus explicit project, status, archive, member, and settings command mutations.

WebhooksAvailable

Project lifecycle, membership, and settings command facts emit through the durable webhook outbox.

Required scopes

projects:readAPI key scoperequired
Read project and engagement identity, lifecycle state, membership, and settings without financial details.
projects:writeAPI key scoperequired
Create, update, archive, and manage project/engagement identity, membership, and settings through confirmed commands.
agent:readAPI key scoperequired
Read agent-optimized project delivery, sprint, and risk read models via the Agent API (/api/agent/v1). Directional signals only — no rates, invoice data, or personal metadata.

Examples

List customers view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/customers" \
  -H "Authorization: Bearer $DS_API_KEY"

Retrieve a customer view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/customers/cust_abc123" \
  -H "Authorization: Bearer $DS_API_KEY"

List engagements view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/engagements" \
  -H "Authorization: Bearer $DS_API_KEY"

Retrieve an engagement view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/engagements/eng_abc123" \
  -H "Authorization: Bearer $DS_API_KEY"

List engagement projects view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/engagements/eng_abc123/projects" \
  -H "Authorization: Bearer $DS_API_KEY"

List projects view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/projects" \
  -H "Authorization: Bearer $DS_API_KEY"

Create a project view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/projects" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: project-create-acme-v1" \
  -H "Content-Type: application/json" \
  -d '{"name":"Acme replatform","client_name":"Acme","workflow_mode":"guided","confirm":true}'

Retrieve a project view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/projects/proj_abc123" \
  -H "Authorization: Bearer $DS_API_KEY"

Update project identity view in REST API reference

curl -X PATCH "https://www.digitalstack360.com/api/v1/projects/proj_abc123" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: project-update-acme-v1" \
  -H "Content-Type: application/json" \
  -d '{"client_name":"Acme Inc.","confirm":true}'

Update project status view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/projects/proj_abc123/status" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: project-status-acme-v1" \
  -H "Content-Type: application/json" \
  -d '{"status":"active","confirm":true}'

Archive a project view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/projects/proj_abc123/archive" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: project-archive-acme-v1" \
  -H "Content-Type: application/json" \
  -d '{"confirm":true}'

List project members view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/projects/proj_abc123/members" \
  -H "Authorization: Bearer $DS_API_KEY"

Add project member view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/projects/proj_abc123/members" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: project-member-add-v1" \
  -H "Content-Type: application/json" \
  -d '{"user_id":"user_123","role":"viewer","confirm":true}'

Update project member view in REST API reference

curl -X PATCH "https://www.digitalstack360.com/api/v1/projects/proj_abc123/members/pmem_123" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: project-member-update-v1" \
  -H "Content-Type: application/json" \
  -d '{"role":"editor","confirm":true}'

Remove project member view in REST API reference

curl -X DELETE "https://www.digitalstack360.com/api/v1/projects/proj_abc123/members/pmem_123" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: project-member-remove-v1"

Get project settings view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/projects/proj_abc123/settings" \
  -H "Authorization: Bearer $DS_API_KEY"

Update project settings view in REST API reference

curl -X PATCH "https://www.digitalstack360.com/api/v1/projects/proj_abc123/settings" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: project-settings-update-v1" \
  -H "Content-Type: application/json" \
  -d '{"ticket_prefix":"ACME","confirm":true}'
Show my active projects from the public Projects API.
Get project {project_id}.
After I confirm, create a project named Acme replatform.
After I confirm, update project {project_id} client name to Acme Inc.
After I confirm, mark project {project_id} active.
After I confirm, archive project {project_id}.
List members for project {project_id}.
After I confirm, add user {user_id} to project {project_id} as viewer.
After I confirm, change project member {member_id} to editor.
After I confirm, remove project member {member_id}.
Show settings for project {project_id}.
After I confirm, set project {project_id} ticket prefix to ACME.
List my active projects and their current status.

GraphQL examples

List projectsAvailableprojects:read

Read visible projects and engagement identity fields.

query Projects($first: Int, $status: String) {
  projects(first: $first, status: $status) {
    nodes {
      id
      name
      clientName
      status
      commercialEngagementId
      updatedAt
    }
    truncated
  }
}
Create projectAvailableprojects:write

Create one canonical project/engagement identity.

mutation CreateProject($input: CreateProjectInput!) {
  createProject(input: $input) {
    ok
    project { id name status createdAt }
    eventType
    idempotencyReplayed
    errors { code message path }
  }
}
Manage project memberAvailableprojects:write

Add or update membership through confirmed project commands.

mutation AddProjectMember($input: AddProjectMemberInput!) {
  addProjectMember(input: $input) {
    ok
    project { id name }
    member { id userId role }
    eventType
    errors { code message path }
  }
}

Webhook emits

project.createdAvailable

A canonical project/engagement was created.

Resource: project

project_idstatuscreated_at
project.updatedAvailable

Canonical project identity or relationship fields changed.

Resource: project

project_idchanged_fieldsupdated_at
project.status_changedAvailable

A project lifecycle status changed without archiving.

Resource: project

project_idfrom_statusto_statusoccurred_at
project.archivedAvailable

A project was archived through a confirmed command.

Resource: project

project_idfrom_statusto_statusoccurred_at
project.member_addedAvailable

A project member was added or upserted.

Resource: project

project_idmember_iduser_idroleoccurred_at
project.member_updatedAvailable

A project member role changed.

Resource: project

project_idmember_iduser_idroleoccurred_at
project.member_removedAvailable

A project member was removed.

Resource: project

project_idmember_iduser_idoccurred_at
project.settings_updatedAvailable

Project settings changed.

Resource: project

project_idchanged_fieldsupdated_at

All webhook events use the shared v1 envelope, signed delivery, and minimal payload rule. Fetch by resource id for expanded data.

System boundaries

Systems commonly integrated with this capability. Each row states the boundary and its native status; it does not transfer canonical authority to the connected system.

DigitalStack owns

  • Canonical project/engagement identity, lifecycle status, visibility, members, and bounded settings
  • Project-to-commercial engagement/opportunity relationships as explicit references
  • Confirmed project command audit and webhook facts

Source systems own

  • CRM/PSA opportunity lifecycle before promotion
  • Provider-native delivery boards and schedules unless explicitly imported into DigitalStack authority
  • GUI quick-start scaffolding, blueprint initialization, and email notifications

Typical integration patterns

CRM / PSA
Promote approved commercial context into one canonical DigitalStack project/engagement identity.DigitalStack has a native connection and ingestion foundation for this system already — public developer-platform exposure for this capability is still limited or planned.
DigitalStack
Authoritative project identity, membership, and public lifecycle command path.

Related guides