Skip to main content

Projects

A Project is the primary organizational unit in the Backoffice. It represents a personalized video campaign (e.g. "Credit Card Pre-Approval Q2 2026"). Each project contains templates, distribution channels, and optionally public landing pages.

Fields

FieldTypeNotes
idUUIDImmutable
organizationIdUUIDOwning organization
namestringRequired
slugstringURL-safe, unique within the organization
descriptionstringOptional
statusenumDraft, Active, Archived
createdAtISO 8601UTC
createdByUUIDUser who created the project
archivedAtISO 8601Set when status moves to Archived

Status lifecycle

Draft ──► Active
│ │
└────────►└──► Archived
  • Draft — newly created project. Templates can be uploaded and tested.
  • Active — project is live. Templates can be published to PROD.
  • Archived — project is closed. All distribution channels are unpublished automatically. A project cannot be deleted if it has templates in Production status.

API endpoints

MethodPathRole requiredDescription
GET/api/Projects?organizationId={id}Viewer+List projects (paginated)
GET/api/Projects/{id}Viewer+Get project with templates and channels
POST/api/ProjectsOrgAdmin / OwnerCreate project
PUT/api/Projects/{id}OrgAdmin / OwnerUpdate name or description
POST/api/Projects/{id}/archiveOrgAdmin / OwnerArchive project

Creating a project

POST /api/Projects
Authorization: Bearer {token}
X-Percus-Forwarded-Active-Org: {orgId}
X-Percus-Forwarded-Org-Role: OrganizationAdmin

{
"name": "Credit Card Pre-Approval Q2",
"description": "Campaign for pre-approved credit card offers"
}

The slug is derived automatically from the name and is unique within the organization.

Project detail response

A GET /api/Projects/{id} response includes:

{
"id": "uuid",
"name": "Credit Card Pre-Approval Q2",
"slug": "credit-card-pre-approval-q2",
"description": "...",
"status": "Draft",
"createdAt": "2026-01-15T10:00:00Z",
"templates": [ ... ],
"distributionChannels": [
{ "channel": "DEV", "activeTemplateId": null, "publishedAt": null },
{ "channel": "STAGING", "activeTemplateId": null, "publishedAt": null },
{ "channel": "PROD", "activeTemplateId": null, "publishedAt": null }
],
"publicVideoShares": [ ... ]
}