> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to CompanyCam

The CompanyCam connector lets your AI agent act in each user's CompanyCam account. Each user connects their own CompanyCam access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 119 tools.

**Authentication:** Bearer Token
**Categories:** Project Management, Productivity, Files & Documents
**Tools:** 119: 64 read, 42 write, 13 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=COMPANYCAM)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the CompanyCam connection

   In **AgentKit > Connections**, create a CompanyCam connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'companycam'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize CompanyCam:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'companycam_current_user_get',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "companycam"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize CompanyCam:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="companycam_current_user_get",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their CompanyCam credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'companycam_board_get',
  toolInput: {
    board_id: '<board_id>',
  },
  connector: 'companycam',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="companycam_board_get",
    tool_input={
        "board_id": "<board_id>",
    },
    connection_name="companycam",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `companycam_board_get`

Get Board · Read-only

Get a CompanyCam project board with its phases.
Returns the board's id, name, position and phases.
Use companycam_boards_list to find the board ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `board_id` (`string`, required): ID of the board. Get it from companycam_boards_list. Example: 12345678

Example input: `{"board_id":"<board_id>"}`

### `companycam_board_phase_projects_list`

List Projects in Board Phase · Read-only

List the projects sitting in one phase of a CompanyCam board.
Returns each project's id, name, display_title, display_subtitle, address and customer_name.
Use companycam_board_get to find phase IDs. Use companycam_board_project_move to move a project to another phase.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `board_id` (`string`, required): ID of the board. Get it from companycam_boards_list. Example: 12345678
- `phase_id` (`string`, required): ID of the board phase. Get it from companycam_board_get. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"board_id":"<board_id>","phase_id":"<phase_id>"}`

### `companycam_boards_list`

List Boards · Read-only

List the project boards (pipelines of phases) in the CompanyCam company.
Returns each board's id, name, position and phases.
Use this to find board and phase IDs. Use companycam_board_phase_projects_list for the projects in a phase.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{}`

### `companycam_checklist_template_get`

Get Checklist Template · Read-only

Get a CompanyCam checklist template with its fields.
Returns the template's id, name, description, fields_count and fields.
Use companycam_checklist_templates_list to find the template ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `template_id` (`string`, required): ID of the checklist template, from companycam_checklist_templates_list. Example: 3a9d1e

Example input: `{"template_id":"<template_id>"}`

### `companycam_checklist_templates_list`

List Checklist Templates · Read-only

List the checklist templates available in the CompanyCam company.
Returns each template's id, name and description.
Use this to find a template ID for companycam_project_checklist_create.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{}`

### `companycam_checklists_list`

List Checklists · Read-only

List checklists across all CompanyCam projects.
Returns each checklist's id, title, description, project_name, assigned_users, fields_count, fields_completed_count, outstanding_fields_count and completed_at.
Use this for a company-wide view. Use companycam_project_checklists_list for one project.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.
- `updated_since` (`string`, optional): Only return checklists updated on or after this time, as an ISO 8601 timestamp. Results are then ordered oldest first. Example: 2026-01-01T00:00:00Z

Example input: `{}`

### `companycam_current_company_get`

Get Current Company · Read-only

Get the CompanyCam company that the access token belongs to.
Returns the company's id, name, status, address and logo URLs.
Use this to identify the connected company account.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `companycam_current_user_get`

Get Current User · Read-only

Get the CompanyCam user that owns the access token.
Returns the user's id, first_name, last_name, email_address, phone_number, user_role, status and profile_image.
Use this to check who the connection acts as. Use companycam_user_get for another user.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `companycam_custom_field_definitions_list`

List Custom Field Definitions · Read-only

List the custom field definitions in the CompanyCam company, ordered by name.
Returns each definition's id, key, name, type, options, currency and applies_to.
Use this to learn the keys and types before calling companycam_project_custom_field_set.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.

Example input: `{}`

### `companycam_customer_contacts_list`

List Customer Contacts · Read-only

List the contacts for a CompanyCam customer.
Returns each contact's id, name, first_name, last_name, email, phone_number, role and notes.
Use this to find a contact ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `customer_id` (`string`, required): ID of the customer. Get it from companycam_customers_list. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"customer_id":"<customer_id>"}`

### `companycam_customer_get`

Get Customer · Read-only

Get a single CompanyCam customer by ID.
Returns the customer's id, name, is_company, email, phone_number, notes, source, address and contacts.
Use companycam_customers_list to find the customer ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `customer_id` (`string`, required): ID of the customer. Get it from companycam_customers_list. Example: 12345678

Example input: `{"customer_id":"<customer_id>"}`

### `companycam_customers_list`

List Customers · Read-only

List customers in the CompanyCam company, optionally matching a search query.
Returns each customer's id, name, is_company, email, phone_number, address and contacts.
Use this to find a customer ID. Use companycam_customer_get for one customer.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `q` (`string`, optional): Search text matched against customers. Example: Smith

Example input: `{}`

### `companycam_document_folder_get`

Get Document Folder · Read-only

Get a single CompanyCam document folder.
Returns the folder's id, name, project_id, items_count and creator_name.
Use companycam_document_folders_list to find the folder ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `folder_id` (`string`, required): ID of the document folder. Get it from companycam_document_folders_list. Example: 12345678

Example input: `{"folder_id":"<folder_id>"}`

### `companycam_document_folders_list`

List Document Folders · Read-only

List document folders, optionally only those in one CompanyCam project.
Returns each folder's id, name, project_id, items_count and creator_name.
Use this to find a folder ID before uploading or moving documents.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `project_id` (`string`, optional): Only return folders in this project (from companycam_projects_list). Example: 12345678

Example input: `{}`

### `companycam_document_get`

Get Document · Read-only

Get a single CompanyCam document by ID, including its download URL.
Returns the document's id, name, content_type, byte_size, url, folder_id, project_id and creator_name.
Use companycam_project_documents_list to find the document ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `document_id` (`string`, required): ID of the document. Get it from companycam_project_documents_list. Example: 12345678

Example input: `{"document_id":"<document_id>"}`

### `companycam_documents_list`

List Documents · Read-only

List documents across all CompanyCam projects.
Returns each document's id, name, content_type, byte_size, url, folder_id, project_id and creator_name.
Use this to browse every document. Use companycam_project_documents_list for one project.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{}`

### `companycam_group_get`

Get User Group · Read-only

Get a single CompanyCam user group with its members.
Returns the group's id, name, status, users and group_url.
Use companycam_groups_list to find the group ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `group_id` (`string`, required): ID of the user group. Get it from companycam_groups_list. Example: 12345678

Example input: `{"group_id":"<group_id>"}`

### `companycam_groups_list`

List User Groups · Read-only

List the user groups (crews or teams) in the CompanyCam company.
Returns each group's id, name, status, users and group_url.
Use this to find group IDs for photo filters. Use companycam_project_groups_list for groups of projects.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.

Example input: `{}`

### `companycam_invoice_get`

Get Invoice · Read-only

Get a single CompanyCam invoice with its line items.
Returns the invoice's id, identifier, status, displayable_status, invoice_type, contact details, subtotal_in_cents, tax_amount_in_cents, amount_due_in_cents, issue_date, due_date and line_items.
Use companycam_invoices_list to find the invoice ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `invoice_id` (`string`, required): ID of the invoice. Get it from companycam_invoices_list. Example: 12345678

Example input: `{"invoice_id":"<invoice_id>"}`

### `companycam_invoice_line_items_list`

List Invoice Line Items · Read-only

List the line items on a CompanyCam invoice.
Returns each line item's id, name, description, quantity, unit_type, unit_cost_in_cents, customer_unit_price_in_cents, markup and subtotal_in_cents.
Use companycam_invoice_get for the invoice totals.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `invoice_id` (`string`, required): ID of the invoice. Get it from companycam_invoices_list. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"invoice_id":"<invoice_id>"}`

### `companycam_invoices_list`

List Invoices · Read-only

List CompanyCam Sales Suite invoices, newest first, optionally for one project or changed since a time.
Returns each invoice's id, identifier, status, displayable_status, contact details, amount_due_in_cents, issue_date, due_date and line_items.
Use companycam_invoice_get for one invoice.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.
- `project_id` (`string`, optional): Only return invoices for this project. Example: 12345678
- `updated_since` (`string`, optional): Only return invoices updated on or after this time, as an ISO 8601 timestamp. Results are then ordered oldest first. Example: 2026-01-01T00:00:00Z

Example input: `{}`

### `companycam_labels_list`

List Labels · Read-only

List every project label defined in the CompanyCam company.
Returns each label's id, display_value, value and tag_type.
Use this to see available labels. Use companycam_project_labels_list for one project's labels.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{}`

### `companycam_page_get`

Get Page · Read-only

Get a single CompanyCam page with its content.
Returns the page's id, project_id, type, title, draft, shared, share_url, raw_content and tiptap_content.
Use companycam_project_pages_list to find the page ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page_id` (`string`, required): ID of the page. Get it from companycam_project_pages_list. Example: 12345678

Example input: `{"page_id":"<page_id>"}`

### `companycam_pages_list`

List Pages · Read-only

List pages (reports and notes built in CompanyCam) across projects, optionally for one project.
Returns each page's id, project_id, type, title, draft, shared, share_url, creator and content.
Use this to browse pages company-wide. Use companycam_project_pages_list for one project.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.
- `project_id` (`string`, optional): Only return pages in this project (from companycam_projects_list). Example: 12345678

Example input: `{}`

### `companycam_photo_comments_list`

List Photo Comments · Read-only

List the comments on a CompanyCam photo.
Returns each comment's id, content, creator_name, status and created_at.
Use this for photo comments. Use companycam_project_comments_list for comments on the project itself.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `photo_id` (`string`, required): ID of the photo. Get it from companycam_photos_list or companycam_project_photos_list. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"photo_id":"<photo_id>"}`

### `companycam_photo_get`

Get Photo · Read-only

Get a single CompanyCam photo by ID.
Returns the photo's id, project_id, creator_name, captured_at, coordinates, uris (image sizes), photo_url, description, internal flag, comments, tags and annotations.
Use this when you already have a photo ID. Use companycam_project_photos_list to find photos in a project.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `photo_id` (`string`, required): ID of the photo. Get it from companycam_photos_list or companycam_project_photos_list. Example: 12345678

Example input: `{"photo_id":"<photo_id>"}`

### `companycam_photo_tags_list`

List Photo Tags · Read-only

List the tags applied to a CompanyCam photo.
Returns each tag's id, display_value, value and tag_type.
Use this for one photo. Use companycam_tags_list for every tag in the company.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `photo_id` (`string`, required): ID of the photo. Get it from companycam_photos_list or companycam_project_photos_list. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"photo_id":"<photo_id>"}`

### `companycam_photos_list`

List Photos · Read-only

List photos across all CompanyCam projects, newest captured first, filtered by date range, project, user, group or tag.
Returns each photo's id, project_id, creator_name, captured_at, coordinates, uris (image sizes), photo_url, description, internal flag, comment_count and processing_status. Includes meta.next_cursor for paging.
Use this to search photos company-wide. Use companycam_project_photos_list for one project's photos.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `before` (`string`, optional): Pagination cursor for the previous page. Pass meta.prev_cursor from a response; do not combine with after.
- `end_date` (`string`, optional): Only return media captured on or before this time, as a Unix timestamp in seconds. Example: 1735689600 (2025-01-01T00:00:00Z)
- `group_ids` (`array`, optional): Only return records matching one of these user group IDs (from companycam_groups_list). Sent as repeated query parameters. Example: ["123", "456"]
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.
- `project_ids` (`array`, optional): Only return records matching one of these project IDs (from companycam_projects_list). Sent as repeated query parameters. Example: ["123", "456"]
- `start_date` (`string`, optional): Only return media captured on or after this time, as a Unix timestamp in seconds. Example: 1735689600 (2025-01-01T00:00:00Z)
- `tag_ids` (`array`, optional): Only return records matching one of these tag IDs (from companycam_tags_list). Sent as repeated query parameters. Example: ["123", "456"]
- `user_ids` (`array`, optional): Only return records matching one of these user (photographer) IDs (from companycam_users_list). Sent as repeated query parameters. Example: ["123", "456"]

Example input: `{}`

### `companycam_price_book_item_get`

Get Price Book Item · Read-only

Get a single CompanyCam price book item.
Returns the item's id, name, description, unit_type, tax_exempt, unit_cost_in_cents, customer_unit_price_in_cents and markup.
Use companycam_price_book_items_list to find the item ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `price_book_item_id` (`string`, required): ID of the price book item. Get it from companycam_price_book_items_list. Example: 12345678

Example input: `{"price_book_item_id":"<price_book_item_id>"}`

### `companycam_price_book_items_list`

List Price Book Items · Read-only

List items in the CompanyCam Sales Suite price book, optionally matching a search query.
Returns each item's id, name, description, unit_type, tax_exempt, unit_cost_in_cents, customer_unit_price_in_cents and markup.
Use this to find a price_book_item_id for proposal line items.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `q` (`string`, optional): Search text matched against price book items. Example: shingle

Example input: `{}`

### `companycam_project_assigned_users_list`

List Project Assigned Users · Read-only

List the users assigned to a CompanyCam project.
Returns each user's id, first_name, last_name, email_address, phone_number, user_role and status.
Use this to see who is on a job. Use companycam_project_user_assign to add someone.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_checklist_get`

Get Project Checklist · Read-only

Get a checklist on a CompanyCam project with its currently visible questions and answers.
Returns the checklist's id, title, description, assigned_users, completion counts and fields (each with id, title, field_type, field_response and completed).
Use this before companycam_project_checklist_fields_update to get field IDs.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `checklist_id` (`string`, required): ID of the project checklist, from companycam_project_checklists_list. Example: 8f3c2a
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"checklist_id":"<checklist_id>","project_id":"<project_id>"}`

### `companycam_project_checklists_list`

List Project Checklists · Read-only

List the checklists on a CompanyCam project.
Returns each checklist's id, title, description, project_name, assigned_users, fields_count, fields_completed_count, outstanding_fields_count and completed_at.
Use companycam_project_checklist_get to read a checklist's questions and answers.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_collaborators_list`

List Project Collaborators · Read-only

List outside collaborators (people from other companies) who have access to a CompanyCam project.
Returns each collaborator's id, project_invitation_id, permissions and accepted_at.
Use this to audit outside access. Use companycam_project_assigned_users_list for your own users.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_comments_list`

List Project Comments · Read-only

List the comments posted on a CompanyCam project.
Returns each comment's id, content, creator_name, status and created_at.
Use this for project-level comments. Use companycam_photo_comments_list for comments on a photo.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_custom_fields_list`

List Project Custom Fields · Read-only

List every custom field defined for projects together with this project's value for each (unset fields read as null).
Returns each field's key, name, type, value and currency.
Use companycam_project_custom_field_set to set a value by its key.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_customer_get`

Get Project Customer · Read-only

Get the customer linked to a CompanyCam project.
Returns the customer's id, name, is_company, email, phone_number, notes, source, address and contacts.
Use companycam_project_customer_set to link a different customer.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_documents_list`

List Project Documents · Read-only

List the documents (files) attached to a CompanyCam project.
Returns each document's id, name, content_type, byte_size, url, folder_id, project_id and creator_name.
Use this for one project. Use companycam_documents_list to list documents across projects.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_get`

Get Project · Read-only

Get a single CompanyCam project by ID.
Returns the project's id, name, status, archived flag, address, coordinates, primary_contact, photo_count, document_count, customer_id, description, project_url and created_at/updated_at. With include set to custom_fields, also returns the project's custom field values.
Use this when you already have a project ID. Use companycam_projects_search to find one by name.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `include` (`string`, optional): Set to custom_fields to embed the project's custom field values in the response. Needs the custom_fields:read permission on the token; without it the key is left out rather than the call failing. One of: `custom_fields`.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_group_get`

Get Project Group · Read-only

Get a single CompanyCam project group.
Returns the group's id, name, description, status and project_count.
Use companycam_project_group_projects_list to see its projects.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_group_id` (`string`, required): ID of the project group. Get it from companycam_project_groups_list. Example: 12345678

Example input: `{"project_group_id":"<project_group_id>"}`

### `companycam_project_group_projects_list`

List Projects in Group · Read-only

List the projects in a CompanyCam project group.
Returns each project's id, name, status, address, photo_count and project_url, plus pagination cursors.
Use companycam_project_group_project_add to add a project to the group.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_group_id` (`string`, required): ID of the project group. Get it from companycam_project_groups_list. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_group_id":"<project_group_id>"}`

### `companycam_project_groups_list`

List Project Groups · Read-only

List project groups (collections of related projects) in the CompanyCam company.
Returns each group's id, name, description, status and project_count.
Use this for groups of projects. Use companycam_groups_list for groups of users.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.

Example input: `{}`

### `companycam_project_invitations_list`

List Project Invitations · Read-only

List collaboration invitations created for a CompanyCam project.
Returns each invitation's id, status, creator_name, accepted_at, accepted_by_id and expires_at.
Use companycam_project_invitation_create to create a new invitation link.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_labels_list`

List Project Labels · Read-only

List the labels applied to a CompanyCam project.
Returns each label's id, display_value, value and tag_type.
Use this for one project's labels. Use companycam_labels_list for every label in the company.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_pages_list`

List Project Pages · Read-only

List the pages in a CompanyCam project.
Returns each page's id, type, title, draft, shared, share_url, creator and last_edited_by.
Use companycam_page_get for a page's full content.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_photo_tags_list`

List Project Photo Tags · Read-only

List the distinct tags used on photos within a CompanyCam project.
Returns each tag's id, display_value, value and tag_type.
Use this to see how a project's photos are tagged. Use companycam_photo_tags_list for one photo.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_photos_list`

List Project Photos · Read-only

List the photos in one CompanyCam project, filtered by date range, user, group or tag.
Returns each photo's id, project_id, creator_name, captured_at, coordinates, uris (image sizes), photo_url, description, internal flag, comment_count and processing_status. Includes meta.next_cursor for paging.
Use this for a single project. Use companycam_photos_list to search across projects.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `before` (`string`, optional): Pagination cursor for the previous page. Pass meta.prev_cursor from a response; do not combine with after.
- `end_date` (`string`, optional): Only return media captured on or before this time, as a Unix timestamp in seconds. Example: 1735689600 (2025-01-01T00:00:00Z)
- `group_ids` (`array`, optional): Only return records matching one of these user group IDs (from companycam_groups_list). Sent as repeated query parameters. Example: ["123", "456"]
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.
- `start_date` (`string`, optional): Only return media captured on or after this time, as a Unix timestamp in seconds. Example: 1735689600 (2025-01-01T00:00:00Z)
- `tag_ids` (`array`, optional): Only return records matching one of these tag IDs (from companycam_tags_list). Sent as repeated query parameters. Example: ["123", "456"]
- `user_ids` (`array`, optional): Only return records matching one of these user (photographer) IDs (from companycam_users_list). Sent as repeated query parameters. Example: ["123", "456"]

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_task_get`

Get Project Task · Read-only

Get a single task on a CompanyCam project.
Returns the task's id, details, status, completed flag, position, assigned_users, photos, videos and completed_at.
Use companycam_project_tasks_list to find the task ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `task_id` (`string`, required): ID of the project task. Get it from companycam_project_tasks_list. Example: 12345678

Example input: `{"project_id":"<project_id>","task_id":"<task_id>"}`

### `companycam_project_tasks_list`

List Project Tasks · Read-only

List the tasks (to-dos) on a CompanyCam project.
Returns each task's id, details, status, completed flag, position, assigned_users, photos, videos and completed_at.
Use this to review a project's to-do list. Use companycam_project_task_get for one task.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_videos_list`

List Project Videos · Read-only

List the videos captured in one CompanyCam project.
Returns each video's id, project_id, creator_name, status, playback_url, format, thumbnail_urls, duration and captured_at.
Use this for a single project. Use companycam_videos_list to search across projects.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"project_id":"<project_id>"}`

### `companycam_projects_list`

List Projects · Read-only

List projects in the CompanyCam company, most recently active first, with cursor pagination.
Returns each project's id, name, status, archived flag, address, coordinates, primary_contact, photo_count, labels, customer_id and project_url, plus meta.next_cursor.
Use this to browse or filter projects by assigned user or customer. Use companycam_projects_search to find projects by name or address text.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `assigned_user_ids` (`array`, optional): Only return records matching one of these assigned user IDs (from companycam_users_list). Sent as repeated query parameters. Example: ["123", "456"]
- `customer_id` (`string`, optional): Only return projects linked to this customer ID (from companycam_customers_list). Example: 9876543
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.

Example input: `{}`

### `companycam_projects_search`

Search Projects · Read-only

Search CompanyCam projects by a text query that matches project names and addresses.
Returns matching projects with id, name, status, address, primary_contact, photo_count and project_url, plus pagination cursors in meta.
Use this when you know part of a project's name or address. Use companycam_projects_list to browse or filter by user or customer.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Text to search for in project names and addresses. Example: Maple Street
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"query":"<query>"}`

### `companycam_proposal_get`

Get Proposal · Read-only

Get a single CompanyCam proposal with its line items.
Returns the proposal's id, title, identifier, current_status, contact details, tax and deposit amounts, total_price_in_cents, scope_original and line_items.
Use companycam_proposals_list to find the proposal ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `proposal_id` (`string`, required): ID of the proposal. Get it from companycam_proposals_list. Example: 12345678

Example input: `{"proposal_id":"<proposal_id>"}`

### `companycam_proposal_line_items_list`

List Proposal Line Items · Read-only

List the line items on a CompanyCam proposal.
Returns each line item's id, name, description, quantity, unit_type, unit_cost_in_cents, customer_unit_price_in_cents, markup and subtotal_in_cents.
Use companycam_proposal_line_item_create to add one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `proposal_id` (`string`, required): ID of the proposal. Get it from companycam_proposals_list. Example: 12345678
- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.

Example input: `{"proposal_id":"<proposal_id>"}`

### `companycam_proposals_list`

List Proposals · Read-only

List CompanyCam Sales Suite proposals, newest first, optionally for one project or changed since a time.
Returns each proposal's id, title, identifier, current_status, contact details, total_price_in_cents, accepted_at and line_items.
Use companycam_proposal_get for one proposal.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.
- `project_id` (`string`, optional): Only return proposals for this project. Example: 12345678
- `updated_since` (`string`, optional): Only return proposals updated on or after this time, as an ISO 8601 timestamp. Results are then ordered oldest first. Example: 2026-01-01T00:00:00Z

Example input: `{}`

### `companycam_tag_get`

Get Tag · Read-only

Get a single CompanyCam photo tag by ID.
Returns the tag's id, display_value, value, tag_type and timestamps.
Use companycam_tags_list to find a tag ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag_id` (`string`, required): ID of the tag. Get it from companycam_tags_list. Example: 12345678

Example input: `{"tag_id":"<tag_id>"}`

### `companycam_tags_list`

List Tags · Read-only

List the photo tags defined in the CompanyCam company.
Returns each tag's id, display_value, value and tag_type.
Use this to find tag IDs for photo filters. Use companycam_photo_tags_list for one photo's tags.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.

Example input: `{}`

### `companycam_time_entries_list`

List Time Entries · Read-only

List clock-in/clock-out time entries from CompanyCam Time Tracking, filtered by date range, project or user.
Returns each entry's id, user_name, project_name, clock_in_at, clock_out_at, duration_hours, note, entry_type, flagged and active.
Use this for individual entries. Use companycam_time_entries_summary for totals.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `end_date` (`string`, optional): Only include time entries on or before this date, formatted YYYY-MM-DD. Example: 2026-10-01
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.
- `project_ids` (`array`, optional): Only return records matching one of these project IDs (from companycam_projects_list). Sent as repeated query parameters. Example: ["123", "456"]
- `start_date` (`string`, optional): Only include time entries on or after this date, formatted YYYY-MM-DD. Example: 2026-10-01
- `time_zone` (`string`, optional): IANA time zone used to interpret the dates. Example: America/Chicago
- `user_ids` (`array`, optional): Only return records matching one of these user IDs (from companycam_users_list). Sent as repeated query parameters. Example: ["123", "456"]

Example input: `{}`

### `companycam_time_entries_summary`

Summarize Time Entries · Read-only

Total completed CompanyCam time entries by user, date or project over a date range. Open (still clocked-in) entries are counted separately, not in totals.
Returns rows with user, project or date and total_hours, plus meta totals, open_entry_count and a truncated flag (rows cap at 5,000).
Use this for payroll or job-costing totals. Use companycam_time_entries_list for individual entries.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `end_date` (`string`, optional): Only include time entries on or before this date, formatted YYYY-MM-DD. Example: 2026-10-01
- `group_by` (`string`, optional): Dimension to total by: user, date or project. Example: user. One of: `user`, `date`, `project`.
- `project_ids` (`array`, optional): Only return records matching one of these project IDs (from companycam_projects_list). Sent as repeated query parameters. Example: ["123", "456"]
- `start_date` (`string`, optional): Only include time entries on or after this date, formatted YYYY-MM-DD. Example: 2026-10-01
- `time_zone` (`string`, optional): IANA time zone used to interpret the dates. Example: America/Chicago
- `user_ids` (`array`, optional): Only return records matching one of these user IDs (from companycam_users_list). Sent as repeated query parameters. Example: ["123", "456"]

Example input: `{}`

### `companycam_time_entry_get`

Get Time Entry · Read-only

Get a single CompanyCam time entry.
Returns the entry's id, user_name, project_name, clock_in_at, clock_out_at, duration_seconds, duration_hours, note, source, entry_type and flagged.
Use companycam_time_entries_list to find the entry ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `time_entry_id` (`string`, required): ID of the time entry. Get it from companycam_time_entries_list. Example: 12345678

Example input: `{"time_entry_id":"<time_entry_id>"}`

### `companycam_user_get`

Get User · Read-only

Get a single CompanyCam user by ID.
Returns the user's id, first_name, last_name, email_address, phone_number, user_role, status and profile_image.
Use companycam_users_list to find the user ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `user_id` (`string`, required): ID of the user. Get it from companycam_users_list. Example: 12345678

Example input: `{"user_id":"<user_id>"}`

### `companycam_users_list`

List Users · Read-only

List the users in the CompanyCam company.
Returns each user's id, first_name, last_name, email_address, phone_number, user_role and status.
Use this to find user IDs for assignments and filters. Use companycam_user_get for one user.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.

Example input: `{}`

### `companycam_video_get`

Get Video · Read-only

Get a single CompanyCam video by ID.
Returns the video's id, project_id, status, playback_url, format, thumbnail_urls, duration, captured_at and transcript.
Use companycam_project_videos_list to find the video ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `video_id` (`string`, required): ID of the video. Get it from companycam_project_videos_list. Example: 12345678

Example input: `{"video_id":"<video_id>"}`

### `companycam_videos_list`

List Videos · Read-only

List videos across all CompanyCam projects, newest captured first, filtered by date range, project, user, group or tag.
Returns each video's id, project_id, creator_name, status, playback_url, format, thumbnail_urls, duration and captured_at. Until a video's status is processed, playback_url is the raw upload URL.
Use this to search videos company-wide. Use companycam_project_videos_list for one project.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Pagination cursor. Pass meta.next_cursor from the previous response to fetch the next page; omit for the first page.
- `before` (`string`, optional): Pagination cursor for the previous page. Pass meta.prev_cursor from a response; do not combine with after.
- `end_date` (`string`, optional): Only return media captured on or before this time, as a Unix timestamp in seconds. Example: 1735689600 (2025-01-01T00:00:00Z)
- `group_ids` (`array`, optional): Only return records matching one of these user group IDs (from companycam_groups_list). Sent as repeated query parameters. Example: ["123", "456"]
- `limit` (`integer`, optional): Maximum number of records per page, 1 to 100. Defaults to 50; values above 100 are clamped to 100. Default: `50`.
- `project_ids` (`array`, optional): Only return records matching one of these project IDs (from companycam_projects_list). Sent as repeated query parameters. Example: ["123", "456"]
- `start_date` (`string`, optional): Only return media captured on or after this time, as a Unix timestamp in seconds. Example: 1735689600 (2025-01-01T00:00:00Z)
- `tag_ids` (`array`, optional): Only return records matching one of these tag IDs (from companycam_tags_list). Sent as repeated query parameters. Example: ["123", "456"]
- `user_ids` (`array`, optional): Only return records matching one of these user (photographer) IDs (from companycam_users_list). Sent as repeated query parameters. Example: ["123", "456"]

Example input: `{}`

### `companycam_board_project_move`

Move Project to Board Phase · Write

Move a project to a phase on a CompanyCam board.
Returns the project_id, board_id, phase_id and tag_id after the move.
Use companycam_board_get to find phase IDs.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `board_id` (`string`, required): ID of the board. Get it from companycam_boards_list. Example: 12345678
- `phase_id` (`string`, required): ID of the destination phase, from companycam_board_get. Example: 4455
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"board_id":"<board_id>","phase_id":"<phase_id>","project_id":"<project_id>"}`

### `companycam_customer_contact_create`

Add Customer Contact · Write

Add a contact to a CompanyCam customer.
Returns the contact's id, name, first_name, last_name, email, phone_number, role and notes.
Use companycam_customer_contact_update to edit an existing contact.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `customer_id` (`string`, required): ID of the customer. Get it from companycam_customers_list. Example: 12345678
- `email` (`string`, optional): Contact email. Example: bob@example.com
- `first_name` (`string`, optional): Contact first name. Example: Bob
- `last_name` (`string`, optional): Contact last name. Example: Smith
- `name` (`string`, optional): Full name, if you are not sending first and last name. Example: Bob Smith
- `notes` (`string`, optional): Notes about the contact. Example: Available after 5pm
- `phone_number` (`string`, optional): Contact phone number. Example: 402-555-0101
- `role` (`string`, optional): Contact's role, for example Spouse or Property Manager. Example: Property Manager

Example input: `{"customer_id":"<customer_id>"}`

### `companycam_customer_contact_update`

Update Customer Contact · Write

Update a CompanyCam customer contact's first and last name.
Returns the contact's id, name, first_name, last_name, email, phone_number, role and notes.
Use companycam_customer_contacts_list to find the contact ID.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, required): ID of the contact. Get it from companycam_customer_contacts_list. Example: 12345678
- `customer_id` (`string`, required): ID of the customer. Get it from companycam_customers_list. Example: 12345678
- `first_name` (`string`, required): Contact first name. Example: Robert
- `last_name` (`string`, required): Contact last name. Example: Smith

Example input: `{"contact_id":"<contact_id>","customer_id":"<customer_id>","first_name":"<first_name>","last_name":"<last_name>"}`

### `companycam_customer_create`

Create Customer · Write

Create a customer (a person or company) in CompanyCam, with optional contact details, address and contacts.
Returns the customer's id, name, is_company, email, phone_number, notes, source, address and contacts.
Use companycam_project_customer_set to link the customer to a project afterwards.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Customer name. Example: Jane Smith
- `address` (`object`, optional): Customer mailing address; when sent it needs street_address_1, city and state. Example: {"street_address_1": "4132 Pleasant St", "city": "Lincoln", "state": "NE"}
- `contacts` (`array`, optional): Contacts to create with the customer; each needs a name and may have an email. Example: [{"name": "Bob Smith", "email": "bob@example.com"}]
- `email` (`string`, optional): Customer email. Example: jane@example.com
- `is_company` (`boolean`, optional): true if the customer is a business rather than a person. Example: false
- `notes` (`string`, optional): Free-text notes about the customer. Example: Prefers text messages
- `phone_number` (`string`, optional): Customer phone number. Example: 402-555-0100

Example input: `{"name":"<name>"}`

### `companycam_customer_update`

Update Customer · Write

Update a CompanyCam customer's name, notes or address. Only the fields you send change.
Returns the customer's id, name, is_company, email, phone_number, notes, source, address and contacts.
Use companycam_customer_contact_update to edit one of the customer's contacts.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `customer_id` (`string`, required): ID of the customer. Get it from companycam_customers_list. Example: 12345678
- `address` (`object`, optional): Address fields to change, such as city and postal_code; fields you leave out are kept. Example: {"city": "Omaha", "postal_code": "68102"}
- `name` (`string`, optional): New customer name. Example: Jane Smith-Jones
- `notes` (`string`, optional): New notes. Example: Gate code 1234

Example input: `{"customer_id":"<customer_id>"}`

### `companycam_document_folder_update`

Rename Document Folder · Write

Rename a CompanyCam document folder.
Returns the folder's id, name, project_id, items_count and creator_name.
Use companycam_document_folders_list to find the folder ID.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `folder_id` (`string`, required): ID of the document folder. Get it from companycam_document_folders_list. Example: 12345678
- `name` (`string`, required): New folder name. Example: Permits and Inspections

Example input: `{"folder_id":"<folder_id>","name":"<name>"}`

### `companycam_invoice_create`

Create Invoice · Write

Create a draft CompanyCam Sales Suite invoice for a project, optionally linked to a proposal.
Returns the invoice's id, identifier, status, displayable_status, invoice_type, contact details, subtotal_in_cents, tax_amount_in_cents, amount_due_in_cents, issue_date, due_date and line_items.
Use companycam_invoice_update to change it while it is still editable.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `project_id` (`string`, required): ID of the project to invoice. Example: 12345678
- `contact_address_line_1` (`string`, optional): Billing address line 1. Example: 4132 Pleasant St
- `contact_address_line_2` (`string`, optional): Billing address line 2. Example: Suite 200
- `contact_city` (`string`, optional): Billing city. Example: Lincoln
- `contact_email` (`string`, optional): Billing contact email. Example: jane@example.com
- `contact_name` (`string`, optional): Billing contact name. Example: Jane Smith
- `contact_phone_number` (`string`, optional): Billing contact phone. Example: 402-555-0100
- `contact_postal_code` (`string`, optional): Billing postal code. Example: 68508
- `contact_state` (`string`, optional): Billing state. Example: NE
- `customer_message` (`string`, optional): Message shown to the customer. Example: Thank you for your business!
- `due_date` (`string`, optional): Due date, YYYY-MM-DD. Example: 2026-11-14
- `identifier` (`string`, optional): Invoice number shown to the customer. Example: INV-1042
- `is_payment_ach_enabled` (`boolean`, optional): true to allow ACH bank payment. Example: true
- `is_payment_card_enabled` (`boolean`, optional): true to allow card payment. Example: true
- `is_payment_offline_enabled` (`boolean`, optional): true to allow offline payment (cash or check). Example: false
- `issue_date` (`string`, optional): Issue date, YYYY-MM-DD. Example: 2026-10-15
- `memo` (`string`, optional): Internal memo. Example: Net 30 per contract
- `proposal_id` (`string`, optional): ID of an accepted proposal to invoice against, from companycam_proposals_list. Example: 334455
- `tax_percentage` (`number`, optional): Tax rate as a percentage. Example: 7.25

Example input: `{"project_id":"<project_id>"}`

### `companycam_invoice_update`

Update Invoice · Write

Update an editable CompanyCam invoice's contact, dates, tax, messages or payment options. Only the fields you send change.
Returns the invoice's id, identifier, status, displayable_status, invoice_type, contact details, subtotal_in_cents, tax_amount_in_cents, amount_due_in_cents, issue_date, due_date and line_items.
Use companycam_invoice_get to read the current values first.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `invoice_id` (`string`, required): ID of the invoice. Get it from companycam_invoices_list. Example: 12345678
- `contact_address_line_1` (`string`, optional): Billing address line 1. Example: 4132 Pleasant St
- `contact_address_line_2` (`string`, optional): Billing address line 2. Example: Suite 200
- `contact_city` (`string`, optional): Billing city. Example: Lincoln
- `contact_email` (`string`, optional): Billing contact email. Example: jane@example.com
- `contact_name` (`string`, optional): Billing contact name. Example: Jane Smith
- `contact_phone_number` (`string`, optional): Billing contact phone. Example: 402-555-0100
- `contact_postal_code` (`string`, optional): Billing postal code. Example: 68508
- `contact_state` (`string`, optional): Billing state. Example: NE
- `customer_message` (`string`, optional): Message shown to the customer. Example: Thank you for your business!
- `due_date` (`string`, optional): Due date, YYYY-MM-DD. Example: 2026-11-14
- `identifier` (`string`, optional): Invoice number shown to the customer. Example: INV-1042
- `is_payment_ach_enabled` (`boolean`, optional): true to allow ACH bank payment. Example: true
- `is_payment_card_enabled` (`boolean`, optional): true to allow card payment. Example: true
- `is_payment_offline_enabled` (`boolean`, optional): true to allow offline payment (cash or check). Example: false
- `issue_date` (`string`, optional): Issue date, YYYY-MM-DD. Example: 2026-10-15
- `memo` (`string`, optional): Internal memo. Example: Net 30 per contract
- `tax_percentage` (`number`, optional): Tax rate as a percentage. Example: 7.25

Example input: `{"invoice_id":"<invoice_id>"}`

### `companycam_page_update`

Update Page · Write

Update a CompanyCam page's title, draft flag or TipTap content.
Returns the page's id, project_id, type, title, draft, shared, share_url, creator, last_edited_by and folder_id.
Use companycam_page_get to read the current content first.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page_id` (`string`, required): ID of the page. Get it from companycam_project_pages_list. Example: 12345678
- `draft` (`boolean`, optional): true to keep the page a draft, false to publish it. Example: false
- `tiptap_content` (`object`, optional): Replacement page body as a TipTap document object. Example: {"type": "doc", "content": [{"type": "section", "attrs": {"sectionType": "text"}, "content": [{"type": "paragraph", "content": [{"type": "text", "text": "Roof inspection summary"}]}]}]}
- `title` (`string`, optional): New page title. Example: Final Roof Inspection Report

Example input: `{"page_id":"<page_id>"}`

### `companycam_photo_comment_create`

Add Photo Comment · Write

Add a comment to a CompanyCam photo as the token's user.
Returns the new comment's id, content, creator_name and created_at.
Use this to comment on a photo. Use companycam_project_comment_create to comment on a project.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `content` (`string`, required): Comment text. Example: Please re-shoot this from the ladder.
- `photo_id` (`string`, required): ID of the photo. Get it from companycam_photos_list or companycam_project_photos_list. Example: 12345678

Example input: `{"content":"<content>","photo_id":"<photo_id>"}`

### `companycam_photo_description_set`

Set Photo Description · Write

Set or replace the description (caption) on a CompanyCam photo. HTML is sanitized before saving.
Returns the updated photo's id, description, uris, captured_at and project_id.
Use this to caption a photo. Use companycam_photo_comment_create to add a discussion comment instead.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `content` (`string`, required): Description text for the photo. Example: Water damage under the north valley
- `photo_id` (`string`, required): ID of the photo. Get it from companycam_photos_list or companycam_project_photos_list. Example: 12345678

Example input: `{"content":"<content>","photo_id":"<photo_id>"}`

### `companycam_photo_tags_add`

Add Photo Tags · Write

Add one or more tags to a CompanyCam photo by tag name; names that don't exist yet are created.
Returns the photo's resulting tags with id, display_value and value.
Use this to tag a photo. Use companycam_tag_create to create a tag without applying it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `photo_id` (`string`, required): ID of the photo. Get it from companycam_photos_list or companycam_project_photos_list. Example: 12345678
- `tags` (`array`, required): Tag names to add to the photo. Example: ["before", "roof"]

Example input: `{"photo_id":"<photo_id>","tags":["before","roof"]}`

### `companycam_photo_update`

Update Photo Visibility · Write

Mark a CompanyCam photo as internal (hidden from shared and public views) or not.
Returns the updated photo's id, internal flag, description, uris and captured_at.
Use this to change a photo's internal flag. Use companycam_photo_description_set to change its description.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `internal` (`boolean`, required): true to mark the photo internal-only, false to make it visible in shared views. Example: true
- `photo_id` (`string`, required): ID of the photo. Get it from companycam_photos_list or companycam_project_photos_list. Example: 12345678

Example input: `{"internal":true,"photo_id":"<photo_id>"}`

### `companycam_project_archive`

Archive Project · Write

Archive a CompanyCam project so it drops out of active project lists. The project and its photos are kept.
Returns the project's id, name, status, archived flag, address, coordinates, primary_contact, photo_count, document_count, customer_id, description, project_url and created_at/updated_at.
Use companycam_project_unarchive to bring it back. Use companycam_project_delete to remove a project instead.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_checklist_create`

Create Checklist from Template · Write

Add a checklist to a CompanyCam project from a checklist template, optionally assigning users.
Returns a job_id and the new checklist with its id, title and fields.
Use companycam_checklist_templates_list to find the template ID.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `checklist_template_id` (`string`, required): ID of the checklist template, from companycam_checklist_templates_list. Example: 3a9d1e
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `assignee_ids` (`array`, optional): User IDs to assign to the new checklist; IDs outside the company are ignored. Example: ["1234567"]

Example input: `{"checklist_template_id":"<checklist_template_id>","project_id":"<project_id>"}`

### `companycam_project_checklist_details_update`

Update Checklist Details · Write

Change the title or description of a checklist on a CompanyCam project.
Returns the checklist's id, title, description and completion counts.
Use companycam_project_checklist_fields_update to answer questions instead.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `checklist_id` (`string`, required): ID of the project checklist, from companycam_project_checklists_list. Example: 8f3c2a
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `description` (`string`, optional): New checklist description. Example: Complete before releasing the crew
- `title` (`string`, optional): New checklist title, up to 255 characters; cannot be blank. Example: Final Walkthrough

Example input: `{"checklist_id":"<checklist_id>","project_id":"<project_id>"}`

### `companycam_project_checklist_fields_update`

Answer Checklist Fields · Write

Answer or complete fields on a CompanyCam project checklist in one batch. Last write wins, so read the checklist first to avoid overwriting someone's answer.
Returns the checklist with its updated fields and completion counts.
Use companycam_project_checklist_get to get field IDs. Use companycam_project_checklist_details_update to change the title or description.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `checklist_id` (`string`, required): ID of the project checklist, from companycam_project_checklists_list. Example: 8f3c2a
- `fields` (`array`, required): Fields to update. Each entry needs the field id plus field_response (an object with value) and/or completed (true/false). Example: [{"id": "f1", "field_response": {"value": "Yes"}, "completed": true}]
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"checklist_id":"<checklist_id>","fields":[{"id":"f1","field_response":{"value":"Yes"},"completed":true}],"project_id":"<project_id>"}`

### `companycam_project_comment_create`

Add Project Comment · Write

Add a comment to a CompanyCam project as the token's user.
Returns the new comment's id, content, creator_name and created_at.
Use this for project-level notes to the crew. Use companycam_photo_comment_create to comment on a photo.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `content` (`string`, required): Comment text. Example: Dumpster arrives Tuesday at 8am.
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"content":"<content>","project_id":"<project_id>"}`

### `companycam_project_create`

Create Project · Write

Create a CompanyCam project at a street address. If a project with the same name and address already exists, CompanyCam returns that project instead (and does not apply a template).
Returns the project's id, name, status, archived flag, address, coordinates, primary_contact, photo_count, document_count, customer_id, description, project_url and created_at/updated_at.
Use this to start a new job. Use companycam_project_update to change an existing project.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `city` (`string`, required): City of the job site. Example: Lincoln
- `country` (`string`, required): Country code of the job site. Example: US
- `name` (`string`, required): Project name, usually the job or customer name. Example: Smith Roof Replacement
- `postal_code` (`string`, required): Postal or ZIP code of the job site. Example: 68508
- `state` (`string`, required): State or region of the job site. Example: NE
- `street_address_1` (`string`, required): First line of the job site street address. Example: 4132 Pleasant St
- `coordinates` (`object`, optional): Map position of the job site as an object with lat and lon. Example: {"lat": "40.8136", "lon": "-96.7026"}
- `customer_id` (`string`, optional): ID of a customer to link to the project, from companycam_customers_list. Example: 9876543
- `geofence` (`array`, optional): Polygon around the job site as a list of points, each with lat and lon. Example: [{"lat": "40.81", "lon": "-96.70"}, {"lat": "40.82", "lon": "-96.70"}, {"lat": "40.82", "lon": "-96.71"}]
- `primary_contact` (`object`, optional): Main on-site contact for the project, with name, email and phone_number. Example: {"name": "Jane Smith", "email": "jane@example.com", "phone_number": "402-555-0100"}
- `project_template_id` (`string`, optional): ID of a project template to apply to the new project. Example: 55501

Example input: `{"city":"<city>","country":"<country>","name":"<name>","postal_code":"<postal_code>","state":"<state>","street_address_1":"<street_address_1>"}`

### `companycam_project_custom_field_set`

Set Project Custom Field · Write

Set a project's value for one CompanyCam custom field, replacing any existing value.
Returns the field's key, name, type, value (cast to the field type) and currency.
Use companycam_project_custom_field_clear to unset a value.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `key` (`string`, required): Key of the custom field (not its ID), from companycam_project_custom_fields_list or companycam_custom_field_definitions_list. Example: permit_number
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `value` (`string`, required): New value, matching the field's type: text; a number; true/false; a date like 2026-08-04; a timestamp with UTC offset like 2026-08-04T19:30:00Z; one of an enum field's options; a URL; or for currency a whole number of minor units (125050 = $1,250.50). Max 1000 characters. Example: P-2026-0042

Example input: `{"key":"<key>","project_id":"<project_id>","value":"<value>"}`

### `companycam_project_customer_set`

Set Project Customer · Write

Link a customer to a CompanyCam project, replacing any customer already linked.
Returns the customer's id, name, is_company, email, phone_number, notes, source, address and contacts.
Use companycam_customers_list or companycam_customer_create to get the customer ID first.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `customer_id` (`string`, required): ID of the customer to link, from companycam_customers_list. Example: 9876543
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"customer_id":"<customer_id>","project_id":"<project_id>"}`

### `companycam_project_description_update`

Update Project Description · Write

Replace a CompanyCam project's description (the project notepad). Accepts plain text or basic HTML; unsupported tags are stripped and bare URLs become links.
Returns the saved description.
Use this for the description only. Use companycam_project_update for the name, address or contact.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `description` (`string`, required): New project description as text or basic HTML. Example: Tear-off and replace 30 squares. Gate code 1234.

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"description":"<description>","project_id":"<project_id>"}`

### `companycam_project_document_create`

Upload Project Document · Write

Upload a document to a CompanyCam project from base64-encoded file contents (30 MB limit), optionally into a folder.
Returns the new document's id, name, content_type, byte_size, url and folder_id.
Use this for PDFs and other files. Use companycam_project_photo_create for photos.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `attachment` (`string`, required): File contents encoded as base64 (30 MB limit). Example: JVBERi0xLjQK
- `name` (`string`, required): File name including extension. Example: estimate.pdf
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `folder_id` (`string`, optional): ID of a document folder in the project to put the file in, from companycam_document_folders_list. Example: 445566

Example input: `{"attachment":"<attachment>","name":"<name>","project_id":"<project_id>"}`

### `companycam_project_document_folder_create`

Create Document Folder · Write

Create a document folder in a CompanyCam project.
Returns the folder's id, name, project_id, items_count and creator_name.
Use this to organize a project's documents. Use companycam_document_folder_update to rename a folder.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Folder name. Example: Permits
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"name":"<name>","project_id":"<project_id>"}`

### `companycam_project_group_create`

Create Project Group · Write

Create a project group in CompanyCam.
Returns the group's id, name, description, status and project_count.
Use companycam_project_group_project_add to put projects in it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Group name. Example: Oak Ridge Subdivision
- `description` (`string`, optional): Group description. Example: All lots in phase 1

Example input: `{"name":"<name>"}`

### `companycam_project_group_project_add`

Add Project to Group · Write

Add a project to a CompanyCam project group. Adding a project that is already in the group changes nothing.
Returns the project's id, name, status, address and project_url.
Use companycam_project_group_project_remove to take it out.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `project_group_id` (`string`, required): ID of the project group. Get it from companycam_project_groups_list. Example: 12345678
- `project_id` (`string`, required): ID of the project to add, from companycam_projects_list. Example: 12345678

Example input: `{"project_group_id":"<project_group_id>","project_id":"<project_id>"}`

### `companycam_project_group_update`

Update Project Group · Write

Update a CompanyCam project group's name or description.
Returns the group's id, name, description, status and project_count.
Use companycam_project_groups_list to find the group ID.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_group_id` (`string`, required): ID of the project group. Get it from companycam_project_groups_list. Example: 12345678
- `description` (`string`, optional): New description. Example: Lots 1-24
- `name` (`string`, optional): New group name. Example: Oak Ridge Phase 1

Example input: `{"project_group_id":"<project_group_id>"}`

### `companycam_project_invitation_create`

Create Project Invitation · Write

Create a collaboration invitation link for a CompanyCam project, choosing whether the collaborator can view and add content.
Returns the invitation's id, invite_url, status and expires_at.
Share the invite_url with the outside collaborator. Use companycam_project_invitations_list to review existing invitations.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `can_add_content` (`boolean`, required): Whether the collaborator can add photos and content to the project. Example: false
- `can_view_content` (`boolean`, required): Whether the collaborator can view the project's photos and content. Example: true
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"can_add_content":true,"can_view_content":true,"project_id":"<project_id>"}`

### `companycam_project_labels_add`

Add Project Labels · Write

Add one or more labels to a CompanyCam project by name; labels that don't exist yet are created.
Returns the labels now on the project with id, display_value and value.
Use this to label a project. Use companycam_project_label_remove to take one off.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `labels` (`array`, required): Label names to add to the project. Example: ["Insurance", "Roofing"]
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"labels":["Insurance","Roofing"],"project_id":"<project_id>"}`

### `companycam_project_page_create`

Create Project Page · Write

Create a page (report or note) in a CompanyCam project, optionally with TipTap content and as a draft.
Returns the page's id, project_id, type, title, draft, shared, share_url, creator, last_edited_by and folder_id.
Use companycam_page_update to edit an existing page.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `title` (`string`, required): Page title. Example: Roof Inspection Report
- `draft` (`boolean`, optional): true to save the page as a draft. Example: true
- `tiptap_content` (`object`, optional): Page body as a TipTap document object: type doc with a content array of sections. Example: {"type": "doc", "content": [{"type": "section", "attrs": {"sectionType": "text"}, "content": [{"type": "paragraph", "content": [{"type": "text", "text": "Roof inspection summary"}]}]}]}

Example input: `{"project_id":"<project_id>","title":"<title>"}`

### `companycam_project_photo_create`

Add Photo to Project · Write

Add a photo to a CompanyCam project from a publicly reachable image URL, with optional capture time, location, description and tags.
Returns the new photo's id, project_id, uris, photo_url, captured_at, description and processing_status.
Use this to attach an existing image to a job. Use companycam_project_document_create for files that are not photos.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `uri` (`string`, required): Publicly reachable URL of the image file to import. Example: https://example.com/images/roof-north.jpg
- `captured_at` (`integer`, optional): When the photo was taken, as a Unix timestamp in seconds. Example: 1735689600
- `coordinates` (`object`, optional): Where the photo was taken, as an object with lat and lon. Example: {"lat": "40.8136", "lon": "-96.7026"}
- `description` (`string`, optional): Caption or description for the photo. Example: North slope before tear-off
- `tags` (`array`, optional): Tag names to apply to the photo; tags that don't exist yet are created. Example: ["before", "roof"]

Example input: `{"project_id":"<project_id>","uri":"<uri>"}`

### `companycam_project_restore`

Restore Project · Write

Restore a soft-deleted CompanyCam project.
Returns the project's id, name, status, archived flag, address, coordinates, primary_contact, photo_count, document_count, customer_id, description, project_url and created_at/updated_at.
Use this to undo companycam_project_delete. Use companycam_project_unarchive for an archived project.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_task_create`

Create Project Task · Write

Create a task (to-do) on a CompanyCam project, optionally assigned to users or created already completed.
Returns the task's id, details, status, completed flag, position, assigned_users, photos, videos and completed_at.
Use this to add a to-do. Use companycam_project_task_update to change or complete an existing task.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `details` (`string`, required): What needs to be done. Example: Photograph all four roof slopes
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `assignee_ids` (`array`, optional): User IDs to assign to the task, from companycam_users_list. Example: ["1234567"]
- `status` (`string`, optional): Set to completed to create the task already completed; omit to create an open task. Example: completed

Example input: `{"details":"<details>","project_id":"<project_id>"}`

### `companycam_project_task_update`

Update Project Task · Write

Update a task on a CompanyCam project: change its text or status, and add or remove assignees.
Returns the task's id, details, status, completed flag, position, assigned_users, photos, videos and completed_at.
Use this to edit or complete a task. Use companycam_project_task_create for a new task.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `task_id` (`string`, required): ID of the project task. Get it from companycam_project_tasks_list. Example: 12345678
- `add_assignee_ids` (`array`, optional): User IDs to add as assignees, from companycam_users_list. Example: ["1234567"]
- `details` (`string`, optional): New task text. Example: Photograph all four roof slopes and gutters
- `remove_assignee_ids` (`array`, optional): User IDs to remove from the task's assignees. Example: ["7654321"]
- `status` (`string`, optional): New task status, for example completed to mark it done. Example: completed

Example input: `{"project_id":"<project_id>","task_id":"<task_id>"}`

### `companycam_project_unarchive`

Unarchive Project · Write

Unarchive a previously archived CompanyCam project so it is active again.
Returns the project's id, name, status, archived flag, address, coordinates, primary_contact, photo_count, document_count, customer_id, description, project_url and created_at/updated_at.
Use this to undo companycam_project_archive. Use companycam_project_restore for a deleted project.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_update`

Update Project · Write

Update a CompanyCam project's name, street address, city, state or primary contact. Only the fields you send are changed.
Returns the project's id, name, status, archived flag, address, coordinates, primary_contact, photo_count, document_count, customer_id, description, project_url and created_at/updated_at.
Use this to edit project details. Use companycam_project_description_update for the description, and companycam_project_archive or companycam_project_delete to close it out.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `city` (`string`, optional): New city. Example: Omaha
- `name` (`string`, optional): New project name. Example: Smith Roof Replacement - Phase 2
- `primary_contact` (`object`, optional): Replacement primary contact with name (required in the object), email and phone_number. Example: {"name": "Jane Smith", "email": "jane@example.com", "phone_number": "402-555-0100"}
- `state` (`string`, optional): New state or region. Example: NE
- `street_address_1` (`string`, optional): New first line of the street address. Example: 4140 Pleasant St

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_user_assign`

Assign User to Project · Write

Assign a CompanyCam user to a project.
Returns the assigned user's id, first_name, last_name, email_address and user_role.
Use companycam_users_list to find the user ID. Use companycam_project_user_unassign to remove the assignment.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `user_id` (`string`, required): ID of the user. Get it from companycam_users_list. Example: 12345678

Example input: `{"project_id":"<project_id>","user_id":"<user_id>"}`

### `companycam_proposal_create`

Create Proposal · Write

Create a CompanyCam Sales Suite proposal for a project.
Returns the proposal's id, title, identifier, current_status, contact details, tax and deposit amounts, total_price_in_cents, scope_original and line_items.
Use companycam_proposal_line_item_create to add line items afterwards.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `project_id` (`string`, required): ID of the project the proposal is for. Example: 12345678
- `contact_email` (`string`, optional): Customer contact email. Example: jane@example.com
- `contact_name` (`string`, optional): Customer contact name shown on the proposal. Example: Jane Smith
- `deposit_amount_in_cents` (`integer`, optional): Required deposit in cents. Example: 50000 ($500.00)
- `hide_line_item_prices` (`boolean`, optional): true to hide individual line item prices from the customer. Example: false
- `scope_original` (`string`, optional): Scope of work text. Example: Tear off and replace 30 squares of shingles.
- `tax_percentage` (`number`, optional): Tax rate as a percentage. Example: 7.25
- `terms_and_conditions` (`string`, optional): Terms and conditions text. Example: 50% due at signing.
- `title` (`string`, optional): Proposal title. Example: Roof Replacement Proposal

Example input: `{"project_id":"<project_id>"}`

### `companycam_proposal_line_item_create`

Add Proposal Line Item · Write

Add a line item to a CompanyCam proposal, either one-off or from a price book item.
Returns the line item's id, name, quantity, unit_type, unit_cost_in_cents, customer_unit_price_in_cents, markup and subtotal_in_cents.
Use companycam_price_book_items_list to find a price_book_item_id.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `proposal_id` (`string`, required): ID of the proposal. Get it from companycam_proposals_list. Example: 12345678
- `quantity` (`number`, required): Quantity of the item. Example: 30
- `description` (`string`, optional): Line item description. Example: GAF Timberline HDZ
- `name` (`string`, optional): Line item name. Example: Architectural shingles (per square)
- `position` (`integer`, optional): Position of the line in the proposal (1 = first). Example: 1
- `price_book_item_id` (`string`, optional): ID of a price book item to base the line on, from companycam_price_book_items_list. Example: 778899
- `unit_cost_in_cents` (`integer`, optional): Your cost per unit in cents. Example: 9500 ($95.00)
- `unit_type` (`string`, optional): Unit of measure. Example: square

Example input: `{"proposal_id":"<proposal_id>","quantity":30}`

### `companycam_proposal_update`

Update Proposal · Write

Update a CompanyCam proposal's title, contact, tax, deposit, scope or terms. Only the fields you send change.
Returns the proposal's id, title, identifier, current_status, contact details, tax and deposit amounts, total_price_in_cents, scope_original and line_items.
Use companycam_proposal_get to read the current values first.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `proposal_id` (`string`, required): ID of the proposal. Get it from companycam_proposals_list. Example: 12345678
- `contact_email` (`string`, optional): Customer contact email. Example: jane@example.com
- `contact_name` (`string`, optional): Customer contact name shown on the proposal. Example: Jane Smith
- `deposit_amount_in_cents` (`integer`, optional): Required deposit in cents. Example: 50000 ($500.00)
- `deposit_percentage` (`number`, optional): Deposit as a percentage of the total. Example: 25
- `identifier` (`string`, optional): Proposal number shown to the customer. Example: P-1042
- `scope_original` (`string`, optional): Scope of work text. Example: Tear off and replace 30 squares of shingles.
- `tax_percentage` (`number`, optional): Tax rate as a percentage. Example: 7.25
- `terms_and_conditions` (`string`, optional): Terms and conditions text. Example: 50% due at signing.
- `title` (`string`, optional): Proposal title. Example: Roof Replacement Proposal

Example input: `{"proposal_id":"<proposal_id>"}`

### `companycam_tag_create`

Create Tag · Write

Create a photo tag in the CompanyCam company. If a tag with the same display value exists, that tag is returned.
Returns the tag's id, display_value, value and tag_type.
Use this to set up a tag. Use companycam_photo_tags_add to tag a photo directly.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `display_value` (`string`, required): Tag name as shown in CompanyCam. Example: Before

Example input: `{"display_value":"<display_value>"}`

### `companycam_tag_update`

Rename Tag · Write

Rename a CompanyCam photo tag.
Returns the tag's id, display_value, value and tag_type.
Use companycam_tags_list to find the tag ID.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `display_value` (`string`, required): New tag name. Example: Before Work
- `tag_id` (`string`, required): ID of the tag. Get it from companycam_tags_list. Example: 12345678

Example input: `{"display_value":"<display_value>","tag_id":"<tag_id>"}`

### `companycam_customer_contact_delete`

Delete Customer Contact · Destructive

Remove a contact from a CompanyCam customer.
Returns no content on success (HTTP 204).
Use companycam_customer_contacts_list to find the contact ID.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `contact_id` (`string`, required): ID of the contact. Get it from companycam_customer_contacts_list. Example: 12345678
- `customer_id` (`string`, required): ID of the customer. Get it from companycam_customers_list. Example: 12345678

Example input: `{"contact_id":"<contact_id>","customer_id":"<customer_id>"}`

### `companycam_customer_delete`

Delete Customer · Destructive

Delete (soft-delete) a CompanyCam customer.
Returns no content on success (HTTP 204).
Use companycam_project_customer_remove to unlink a customer from one project without deleting it.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `customer_id` (`string`, required): ID of the customer. Get it from companycam_customers_list. Example: 12345678

Example input: `{"customer_id":"<customer_id>"}`

### `companycam_document_folder_delete`

Delete Document Folder · Destructive

Delete a CompanyCam document folder. The documents and pages inside it are deleted too.
Returns no content on success (HTTP 204).
Use companycam_document_folders_list to find the folder ID, and check items_count first.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `folder_id` (`string`, required): ID of the document folder. Get it from companycam_document_folders_list. Example: 12345678

Example input: `{"folder_id":"<folder_id>"}`

### `companycam_photo_delete`

Delete Photo · Destructive

Delete (soft-delete) a CompanyCam photo.
Returns no content on success (HTTP 204).
Use companycam_photo_update with internal=true to hide a photo from shared views without deleting it.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `photo_id` (`string`, required): ID of the photo. Get it from companycam_photos_list or companycam_project_photos_list. Example: 12345678

Example input: `{"photo_id":"<photo_id>"}`

### `companycam_project_custom_field_clear`

Clear Project Custom Field · Destructive

Clear a project's value for one CompanyCam custom field. The field definition is kept and reads back as null.
Returns no content on success (HTTP 204).
Use companycam_project_custom_field_set to set a new value.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `key` (`string`, required): Key of the custom field (not its ID), from companycam_project_custom_fields_list or companycam_custom_field_definitions_list. Example: permit_number
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"key":"<key>","project_id":"<project_id>"}`

### `companycam_project_customer_remove`

Remove Project Customer · Destructive

Unlink the customer from a CompanyCam project. The customer record is kept.
Returns no content on success (HTTP 204).
Use companycam_customer_delete to delete the customer itself.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_delete`

Delete Project · Destructive

Delete (soft-delete) a CompanyCam project.
Returns no content on success (HTTP 204).
Use companycam_project_restore to undo. Use companycam_project_archive to hide a finished project without deleting it.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"project_id":"<project_id>"}`

### `companycam_project_group_delete`

Delete Project Group · Destructive

Delete (soft-delete) a CompanyCam project group. The projects in it are not deleted.
Returns no content on success (HTTP 204).
Use companycam_project_group_project_remove to take one project out instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `project_group_id` (`string`, required): ID of the project group. Get it from companycam_project_groups_list. Example: 12345678

Example input: `{"project_group_id":"<project_group_id>"}`

### `companycam_project_group_project_remove`

Remove Project from Group · Destructive

Remove a project from a CompanyCam project group. The project itself is untouched.
Returns no content on success (HTTP 204).
Use companycam_project_group_projects_list to find the project ID.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `project_group_id` (`string`, required): ID of the project group. Get it from companycam_project_groups_list. Example: 12345678
- `project_id` (`string`, required): ID of the project. Get it from companycam_project_group_projects_list. Example: 12345678

Example input: `{"project_group_id":"<project_group_id>","project_id":"<project_id>"}`

### `companycam_project_label_remove`

Remove Project Label · Destructive

Remove a label from a CompanyCam project. The label itself still exists for other projects.
Returns no content on success (HTTP 204).
Use companycam_project_labels_list to find the label ID first.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `label_id` (`string`, required): ID of the label. Get it from companycam_project_labels_list. Example: 12345678
- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678

Example input: `{"label_id":"<label_id>","project_id":"<project_id>"}`

### `companycam_project_task_delete`

Delete Project Task · Destructive

Delete (soft-delete) a task from a CompanyCam project.
Returns no content on success (HTTP 204).
Use companycam_project_task_update with status completed to close a task without deleting it.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `task_id` (`string`, required): ID of the project task. Get it from companycam_project_tasks_list. Example: 12345678

Example input: `{"project_id":"<project_id>","task_id":"<task_id>"}`

### `companycam_project_user_unassign`

Unassign User from Project · Destructive

Remove a user's assignment from a CompanyCam project. The user keeps their account.
Returns no content on success (HTTP 204).
Use companycam_project_assigned_users_list to find assigned user IDs.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`string`, required): ID of the project. Get it from companycam_projects_list or companycam_projects_search. Example: 12345678
- `user_id` (`string`, required): ID of the user. Get it from companycam_project_assigned_users_list. Example: 12345678

Example input: `{"project_id":"<project_id>","user_id":"<user_id>"}`

### `companycam_tag_delete`

Delete Tag · Destructive

Delete a photo tag from the CompanyCam company.
Returns no content on success (HTTP 204).
Use companycam_tags_list to find the tag ID.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `tag_id` (`string`, required): ID of the tag. Get it from companycam_tags_list. Example: 12345678

Example input: `{"tag_id":"<tag_id>"}`

## Related

Other Project Management connectors ([all 40](/agentkit/connectors/?category=project-management)):

- [Notion](/agentkit/connectors/notion/): Scalekit connector, OAuth, 51 tools
- [Linear](/agentkit/connectors/linear/): Scalekit connector, OAuth, 62 tools
- [Airtable](/agentkit/connectors/airtable/): Scalekit connector, OAuth, 26 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
