PATCH /v1/projects/:id
Partially update a project's user-editable fields.
PATCH
/v1/projects/:idPhase 1stable
- Auth
- Bearer
- Scope
- projects:write
Patch one or more user-editable fields. Omitted fields stay unchanged. System-managed fields — id, organizationId, createdAt, ingestState, brandContext.* populated by ingestion — are read-only; passing them returns 400 VALIDATION.
To modify approval behavior, use PATCH /v1/projects/:id/approval-policy — approval lives on a separate resource so it has its own scope and audit trail.
Path
idstringrequiredProject ID.
Body
namestringoptional1–128 chars.statusstringoptionalArchiving stops scheduled posts and new content generation; it does not delete data.One of:active,archivedownerEmailstringoptionalNotification email.timezonestringoptionalIANA timezone. Takes effect on the next scheduler tick.primaryLanguagestringoptionalBCP-47 tag.customerExternalIdstringoptionalMust remain unique within the organization.metadataobjectoptionalReplaces the existing object in full — not a deep merge.
Example request
curl -X PATCH https://api.layers.com/v1/projects/prj_01HX9Y7K8M2P4RSTUV56789AB \
-H "Authorization: Bearer lp_live_01HX9Y6K7EJ4T2_4QZpN..." \
-H "Content-Type: application/json" \
-d '{
"timezone": "America/New_York",
"ownerEmail": "ops@gicgrowth.com"
}'const project = await layers.projects.update(
"prj_01HX9Y7K8M2P4RSTUV56789AB",
{ timezone: "America/New_York", ownerEmail: "ops@gicgrowth.com" }
);project = layers.projects.update(
"prj_01HX9Y7K8M2P4RSTUV56789AB",
timezone="America/New_York",
owner_email="ops@gicgrowth.com",
)Response
200OK
{
"id": "9cb958b5-11b5-4e30-8675-5d075d52da7c",
"organizationId": "2481fa5c-a404-44ed-a561-565392499abc",
"name": "Acme Coffee iOS",
"status": "active",
"customerExternalId": "acme-coffee",
"timezone": "America/New_York",
"primaryLanguage": "en",
"ownerEmail": "ops@gicgrowth.com",
"brand": null,
"brandContext": null,
"ingestState": { "github": null, "website": null, "appstore": null },
"requiresApproval": false,
"firstNPostsBlocked": 3,
"currentBlockedCount": 0,
"metadata": null,
"createdAt": "2026-04-18T19:02:11.959888+00:00",
"updatedAt": "2026-04-18T19:08:44.317953+00:00"
}The full project record is returned, identical in shape to GET /v1/projects/:id — not a slim diff.
Errors
| Status | Code | When |
|---|---|---|
| 422 | VALIDATION | :id is not a UUID, body has unknown/read-only fields, or timezone is invalid. |
| 401 | UNAUTHENTICATED | Missing or invalid key. |
| 403 | FORBIDDEN_SCOPE | Key lacks projects:write. |
| 404 | NOT_FOUND | Project does not exist in the key's organization. |
| 409 | CONFLICT | customerExternalId collides with another project in the organization. |
| 429 | RATE_LIMITED | Write budget exhausted. |
See also
GET /v1/projects/:id— read current stateDELETE /v1/projects/:id— soft-archivePATCH /v1/projects/:id/approval-policy