Folders & Folder Contents

Added CRUD for project folders.

  • GET /projects/{project_id}/folders — list root-level folders (not nested in another folder), plus workflow phase rows. Pass include_archived=true to include archived folders (default false).
  • GET /opportunities/{opportunity_id}/folders — same functionality as list project folders.
  • POST /projects/{project_id}/folders - create folder.
  • POST /opportunities/{opportunity_id}/folders - create folder.
  • GET /folders/{folder_id} — get by id.
  • PATCH /folders/{folder_id} — rename, archive/unarchive (isActive), or move (set parentId/phaseInstanceId) — moving isn’t a separate operation.
  • DELETE /folders/{folder_id} — delete (also removes any subfolders and their files).
  • GET /folders/{folder_id}/contents — list a folder’s direct children (subfolders, files, forms).
  • GET /phases/{phase_instance_id}/contents — list a phase’s direct children, same shape as folder contents.

name is required on create. parentId and phaseInstanceId are mutually exclusive — a folder sits either at the root of a phase or nested under another folder, not both — and folders nest at most 2 levels deep. Folders use isActive for their archived state.

A project’s or opportunity’s Docs tab groups everything under workflow phases, but phases aren’t real Folder rows — they’re synthesized from PhaseInstances. So the two list endpoints above return those phase rows (type: "phase") alongside root-level real folders (type: "folder"), matching what the UI shows.

Every item from a /contents endpoint carries a type field (folder, file, or form) — forms are ordinary files under the hood (isForm: true), inheriting their folder/phase placement, so they surface here rather than as a separate concept. On these /contents endpoints only, a file’s MIME/category label is named fileType instead of type, to avoid colliding with the folder/file/form discriminator; this does not affect GET /projects/{project_id}/files.

Also added:

  • GET/PATCH/DELETE /files/{file_id} - replace the entity-scoped get/update/delete endpoints, which will still work until fully deprecated.

Create Form PDF

You can now use the API to create the form PDF similar to what an automation email would send.

  • POST /forms/{form_id}/pdf to export a form to PDF.
  • Optional body fields: imagesOnly, imagesInRow (0-6), includeImageMetadata.
  • Returns { pdfBase64, contentType, name }.

Technical Details page, and documenting how to archive records

Added a Technical Details page (between Quick Start and Webhooks in the sidebar). Rate limits moved there from the Authentication page — same content, new home. Also added a new Archiving records section: most records can be archived instead of permanently deleted — use that object’s PATCH endpoint and set isActive to false (some resources still use isArchived; check the endpoint reference).