Project Folder
The Project Folder API lets you search, create, update, and delete project folders in your Egnyte domain. Use this API to programmatically manage project metadata, create projects from templates, and perform cleanup operations.
Note: This API is only available to customers with project folder functionality enabled on their plan. Project folder templates require an additional feature flag.
Custom Fields & Custom Status: Projects support custom fields and custom status values. Before applying custom fields or a custom status to a project, they must first be defined via the Custom Field Definition API. See Custom Field Definition API for details.
Base URL
https://{domain}.egnyte.com/pubapi/v2/project-folders
Some endpoints use /pubapi/v1/project-folders. Version is specified per endpoint below.
Authentication
All requests require an OAuth 2.0 Bearer token in the Authorization header:
Authorization: Bearer {access_token}
See Authentication for details on obtaining a token.
List All Projects
Retrieve all project folders in the domain.
Request
GET /pubapi/v2/project-folders
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v2/project-folders" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Response
200 OK
Returns an array of project objects.
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier for the project |
rootFolderId | string | Folder ID of the project's root folder |
name | string | Project name |
projectId | string | Custom project identifier |
customerName | string | Customer associated with the project |
description | string | Project description |
location | object | Physical location details |
status | string | Project status. Built-in values: pending, in-progress, completed, on-hold, canceled. Returns a custom status string if one has been set. |
startDate | string | Project start date (ISO 8601 format) |
completionDate | string | Project completion date (ISO 8601 format) |
createdBy | integer | User ID of the creator |
lastUpdatedBy | integer | User ID of the last modifier |
creationTime | string | Timestamp of creation (ISO 8601 format) |
lastModifiedTime | string | Timestamp of last modification (ISO 8601 format) |
customFieldsWithValues | object | Map of custom field key-value pairs (e.g. {"priority": "high"}). Only present when the custom fields feature is enabled. |
Example Response
[
{
"id": "a69bd625-1dc3-4dcf-98f5-8e3e3fbb0b29",
"rootFolderId": "b133ce0d-2e79-4cf8-bf3a-8758f7b117b3",
"name": "Acme Widgets HQ Redesign",
"projectId": "ABC-123",
"customerName": "Acme Widgets Co",
"description": "Redesigned HQ for Acme Widgets",
"location": {
"streetAddress1": "123 Main St.",
"streetAddress2": null,
"city": "Anytown",
"state": "CA",
"country": "USA",
"postalCode": "99999"
},
"status": "in-progress",
"startDate": "2022-11-01T00:00:00.000+0000",
"completionDate": null,
"createdBy": 4,
"lastUpdatedBy": 4,
"creationTime": "2022-11-02T19:02:31.000+0000",
"lastModifiedTime": "2022-11-02T12:09:50.000+0000",
"customFieldsWithValues": {
"priority": "high",
"region": "EMEA"
}
}
]
Mark Folder as Project
Convert an existing folder into a project folder by adding project metadata.
Request
POST /pubapi/v1/project-folders
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
rootFolderId | string | Yes | Folder ID of the folder to mark as a project |
name | string | Yes | Project name |
description | string | No | Project description |
status | string | Yes | Project status. Built-in values: pending, in-progress, completed, on-hold, canceled. A custom status string may also be provided (must be defined first — see Custom Field Definition API). |
startDate | string | No | Project start date (ISO 8601 format) |
completionDate | string | No | Project completion date (ISO 8601 format) |
customFieldsWithValues | object | No | Map of custom field key-value pairs to set on the project (e.g. {"priority": "high"}). Keys are case-insensitive. Custom fields must be defined first — see Custom Field Definition API. |
Note: The status completed is equivalent to done.
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v1/project-folders" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "rootFolderId": "5bd7337c-b303-46a0-938d-0365352a5c74", "name": "Egnyte Mountain View Office", "description": "New office project in Mountain View, CA", "status": "pending", "startDate": "2022-05-01T12:37:56.000+0000", "completionDate": "2022-11-05T12:37:56.000+0000", "customFieldsWithValues": { "priority": "high", "region": "EMEA" } }'
Response
200 OK
Returns the created project object.
Create Project from Template
Create a new project folder from a template, including folder structure, permissions, and optionally dynamic groups.
Note: This endpoint requires the project folder templates feature to be enabled on your plan.
Request
POST /pubapi/v2/project-folders
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
parentFolderId | string | Yes | Folder ID where the new project will be created |
templateFolderId | string | Yes | Folder ID of the project template |
folderName | string | Yes | Name of the new folder to create |
name | string | Yes | Project name |
description | string | No | Project description |
projectId | string | Conditional | Custom project identifier (required if used in dynamic group names) |
customerName | string | No | Customer associated with the project |
location.streetAddress1 | string | No | First line of street address |
location.streetAddress2 | string | No | Second line of street address |
location.city | string | No | City |
location.state | string | No | State or province |
location.postalCode | string | No | Zip or postal code |
location.country | string | No | 3-character country code (ISO 3166 GENC profile, e.g., USA, GBR, POL) |
status | string | Yes | Project status. Built-in values: pending, in-progress, completed, on-hold, canceled. A custom status string may also be provided (must be defined first — see Custom Field Definition API). |
startDate | string | No | Project start date (ISO 8601 format) |
completionDate | string | No | Project completion date (ISO 8601 format) |
customFieldsWithValues | object | No | Map of custom field key-value pairs to set on the project (e.g. {"priority": "high"}). Keys are case-insensitive. Custom fields must be defined first — see Custom Field Definition API. |
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v2/project-folders" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "parentFolderId": "{parentFolderId}", "templateFolderId": "{templateFolderId}", "folderName": "ABC123 - 123 Main St", "name": "Acme Widgets HQ", "description": "New HQ for Acme Widgets", "projectId": "ABC123", "customerName": "Acme Widgets", "status": "pending", "startDate": "2022-11-20", "completionDate": null, "location": { "streetAddress1": "123 Main St", "streetAddress2": null, "city": "Anytown", "state": "CA", "postalCode": "99999", "country": "USA" }, "customFieldsWithValues": { "priority": "high", "region": "EMEA" } }'
Response
200 OK
If the template creates dynamic groups, they are included in the response.
| Field | Type | Description |
|---|---|---|
groupsCreated | array | List of groups created from the template |
groupsCreated[].id | string | Group ID |
groupsCreated[].name | string | Group name |
Example Response
{
"groupsCreated": [
{
"id": "8b149a9e-cafc-4c86-bc0c-a6fbacd5e16f",
"name": "ABC123 - Project Team"
},
{
"id": "a183d648-dce7-4aa6-a946-993890c5a4d8",
"name": "ABC123 - Project Managers"
},
{
"id": "f42c20f1-1205-4083-b8db-04df9c8706bf",
"name": "ABC123 - BIM"
},
{
"id": "c988438b-e5f0-4ed9-b788-0f4265115926",
"name": "ABC123 - External"
}
]
}
Get Project by ID
Retrieve a specific project by its unique identifier.
Request
GET /pubapi/v2/project-folders/{project_id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique project identifier |
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v2/project-folders/{projectId}" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Response
200 OK
Returns a single project object. See List All Projects for field descriptions.
Example Response
{
"id": "a69bd625-1dc3-4dcf-98f5-8e3e3fbb0b29",
"rootFolderId": "b133ce0d-2e79-4cf8-bf3a-8758f7b117b3",
"name": "Acme Widgets HQ Redesign",
"projectId": "ABC-123",
"customerName": "Acme Widgets Co",
"description": "Redesigned HQ for Acme Widgets",
"location": {
"streetAddress1": "123 Main St.",
"streetAddress2": null,
"city": "Anytown",
"state": "CA",
"country": "USA",
"postalCode": "99999"
},
"status": "in-progress",
"startDate": "2022-11-01T00:00:00.000+0000",
"completionDate": null,
"createdBy": 4,
"lastUpdatedBy": 4,
"creationTime": "2022-11-02T19:02:31.000+0000",
"lastModifiedTime": "2022-11-02T12:09:50.000+0000",
"customFieldsWithValues": {
"priority": "high",
"region": "EMEA"
}
}
Find Project by Root Folder
Search for a project using its root folder ID.
Request
POST /pubapi/v2/project-folders/search
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
rootFolderId | string | Yes | Folder ID of the project's root folder |
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v2/project-folders/search" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "rootFolderId": "{parentFolderId}" }'
Response
200 OK
Returns an array of matching project objects (typically one).
Example Response
[
{
"id": "a69bd625-1dc3-4dcf-98f5-8e3e3fbb0b29",
"rootFolderId": "b133ce0d-2e79-4cf8-bf3a-8758f7b117b3",
"name": "Acme Widgets HQ Redesign",
"projectId": "ABC-123",
"customerName": "Acme Widgets Co",
"description": "Redesigned HQ for Acme Widgets",
"location": {
"streetAddress1": "123 Main St.",
"streetAddress2": null,
"city": "Anytown",
"state": "CA",
"country": "USA",
"postalCode": "99999"
},
"status": "in-progress",
"startDate": "2022-11-01T00:00:00.000+0000",
"completionDate": null,
"createdBy": 4,
"lastUpdatedBy": 4,
"creationTime": "2022-11-02T19:02:31.000+0000",
"lastModifiedTime": "2022-11-02T12:09:50.000+0000",
"customFieldsWithValues": {
"priority": "high",
"region": "EMEA"
}
}
]
Update Project
Update metadata for an existing project. At least one field must be specified.
Request
PATCH /pubapi/v2/project-folders/{project_id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique project identifier |
Request Body
All fields are optional, but at least one must be provided.
| Field | Type | Description |
|---|---|---|
name | string | Project name |
description | string | Project description |
projectId | string | Custom project identifier |
customerName | string | Customer associated with the project |
location.streetAddress1 | string | First line of street address |
location.streetAddress2 | string | Second line of street address |
location.city | string | City |
location.state | string | State or province |
location.postalCode | string | Zip or postal code |
location.country | string | 3-character country code (ISO 3166 GENC profile) |
status | string | Project status. Built-in values: pending, in-progress, completed, on-hold, canceled. A custom status string may also be provided (must be defined first — see Custom Field Definition API). |
startDate | string | Project start date (ISO 8601 format) |
completionDate | string | Project completion date (ISO 8601 format) |
customFieldsWithValues | object | Map of custom field key-value pairs to add or update. Only the provided keys are affected; omitted keys remain unchanged. Keys are case-insensitive. Custom fields must be defined first — see Custom Field Definition API. |
deleteCustomFields | array | List of custom field keys to remove from the project. Processed after customFieldsWithValues. Keys are case-insensitive. |
Example Request
curl -i -X PATCH "https://{domain}.egnyte.com/pubapi/v2/project-folders/{projectId}" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "name": "Acme Widgets HQ Redesign", "description": "Redesigned HQ for Acme Widgets", "projectId": "ABC-123", "customerName": "Acme Widgets Co", "status": "in-progress", "startDate": "2022-11-01", "completionDate": null, "location": { "streetAddress1": "123 Main St.", "streetAddress2": null, "city": "Anytown", "state": "CA", "postalCode": "99999", "country": "USA" }, "customFieldsWithValues": { "priority": "high" }, "deleteCustomFields": [ "region" ] }'
Response
200 OK
Returns the updated project object.
Delete Project
Remove project metadata from a folder. The folder itself is not deleted.
Request
DELETE /pubapi/v2/project-folders/{project_id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique project identifier |
Example Request
curl -i -X DELETE "https://{domain}.egnyte.com/pubapi/v2/project-folders/{projectId}" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Response
200 OK
Project metadata removed successfully.
Clean Up Project
Perform cleanup operations on a completed or canceled project, including deleting links and managing user access.
Request
POST /pubapi/v1/project-folders/{project_id}/cleanup
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique project identifier |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
deleteLinks | boolean | Yes | If true, delete all active links in the project |
usersToDelete | array | No | List of user IDs to delete |
usersToDisable | array | No | List of user IDs to disable |
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v1/project-folders/{projectId}/cleanup" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "deleteLinks": true, "usersToDelete": [ 12345 ], "usersToDisable": [ 67890 ] }'
Response
202 Accepted
Cleanup procedure started. The operation runs asynchronously.
Error Codes
| Status | Error | Description | Resolution |
|---|---|---|---|
| 400 | Bad Request | Invalid request body or parameters | Verify all required fields are present and correctly formatted |
| 400 | Reserved Field | A reserved key was provided in customFieldsWithValues or deleteCustomFields | Use the status field to set or clear project status |
| 400 | Duplicate Field Key | Two or more keys in customFieldsWithValues (or deleteCustomFields) resolve to the same field after case-folding | Ensure all custom field keys are unique regardless of casing (e.g. "Priority" and "priority" are treated as the same key) |
| 401 | Unauthorized | Invalid or expired OAuth token | Refresh your OAuth token |
| 403 | Forbidden | User lacks permission to access project folders | Ensure the user has appropriate permissions for project management |
| 404 | Not Found | Project or folder does not exist | Verify the project ID or folder ID is correct |
| 409 | Conflict | Previous cleanup operation still in progress | Wait for the current cleanup to complete before starting a new one |
| 429 | Rate Limited | Too many requests | Implement exponential backoff; check Retry-After header |
| 503 | Service Unavailable | Too many cleanup operations running | Retry the request after a delay |
Related Resources
- Authentication — How to obtain and refresh OAuth tokens
- File System API — Manage folders and files
- Group Management API — Manage groups created by project templates
- User Management API — Manage user access and permissions
- Project Custom Fields API — Define and manage custom fields for projects
