← 返回 Skills 市场
byungkyu

CompanyCam

作者 byungkyu · GitHub ↗ · v1.0.0
cross-platform ✓ 安全检测通过
1260
总下载
0
收藏
0
当前安装
1
版本数
在 OpenClaw 中安装
/install companycam
功能描述
CompanyCam API integration with managed OAuth. Photo documentation platform for contractors. Use this skill when users want to manage projects, photos, users, tags, groups, or documents in CompanyCam. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
使用说明 (SKILL.md)

CompanyCam

Access the CompanyCam API with managed OAuth authentication. Manage projects, photos, users, tags, groups, documents, and webhooks for contractor photo documentation.

Quick Start

# List projects
python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/companycam/v2/projects')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Base URL

https://gateway.maton.ai/companycam/v2/{resource}

Replace {resource} with the actual CompanyCam API endpoint path. The gateway proxies requests to api.companycam.com/v2 and automatically injects your OAuth token.

Authentication

All requests require the Maton API key in the Authorization header:

Authorization: Bearer $MATON_API_KEY

Environment Variable: Set your API key as MATON_API_KEY:

export MATON_API_KEY="YOUR_API_KEY"

Getting Your API Key

  1. Sign in or create an account at maton.ai
  2. Go to maton.ai/settings
  3. Copy your API key

Connection Management

Manage your CompanyCam OAuth connections at https://ctrl.maton.ai.

List Connections

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=companycam&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Connection

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'companycam'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Connection

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "connection": {
    "connection_id": "d274cf68-9e76-464c-92e3-ff274c44526e",
    "status": "ACTIVE",
    "creation_time": "2026-02-12T01:56:32.259046Z",
    "last_updated_time": "2026-02-12T01:57:38.944271Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "companycam",
    "metadata": {}
  }
}

Open the returned url in a browser to complete OAuth authorization.

Delete Connection

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Specifying Connection

If you have multiple CompanyCam connections, specify which one to use with the Maton-Connection header:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/companycam/v2/projects')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', 'd274cf68-9e76-464c-92e3-ff274c44526e')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

If omitted, the gateway uses the default (oldest) active connection.

API Reference

Company

Get Company

GET /companycam/v2/company

Returns the current company information.

Users

Get Current User

GET /companycam/v2/users/current

List Users

GET /companycam/v2/users

Query parameters:

  • page - Page number
  • per_page - Results per page (default: 25)
  • status - Filter by status (active, inactive)

Create User

POST /companycam/v2/users
Content-Type: application/json

{
  "first_name": "John",
  "last_name": "Doe",
  "email_address": "[email protected]",
  "user_role": "standard"
}

User roles: admin, standard, limited

Get User

GET /companycam/v2/users/{id}

Update User

PUT /companycam/v2/users/{id}
Content-Type: application/json

{
  "first_name": "John",
  "last_name": "Smith"
}

Delete User

DELETE /companycam/v2/users/{id}

Projects

List Projects

GET /companycam/v2/projects

Query parameters:

  • page - Page number
  • per_page - Results per page (default: 25)
  • query - Search query
  • status - Filter by status
  • modified_since - Unix timestamp for filtering

Create Project

POST /companycam/v2/projects
Content-Type: application/json

{
  "name": "New Construction Project",
  "address": {
    "street_address_1": "123 Main St",
    "city": "Los Angeles",
    "state": "CA",
    "postal_code": "90210",
    "country": "US"
  }
}

Get Project

GET /companycam/v2/projects/{id}

Update Project

PUT /companycam/v2/projects/{id}
Content-Type: application/json

{
  "name": "Updated Project Name"
}

Delete Project

DELETE /companycam/v2/projects/{id}

Archive Project

PATCH /companycam/v2/projects/{id}/archive

Restore Project

PUT /companycam/v2/projects/{id}/restore

Project Photos

List Project Photos

GET /companycam/v2/projects/{project_id}/photos

Query parameters:

  • page - Page number
  • per_page - Results per page
  • start_date - Filter by start date (Unix timestamp)
  • end_date - Filter by end date (Unix timestamp)
  • user_ids - Filter by user IDs
  • group_ids - Filter by group IDs
  • tag_ids - Filter by tag IDs

Add Photo to Project

POST /companycam/v2/projects/{project_id}/photos
Content-Type: application/json

{
  "uri": "https://example.com/photo.jpg",
  "captured_at": 1609459200,
  "coordinates": {
    "lat": 34.0522,
    "lon": -118.2437
  },
  "tags": ["exterior", "front"]
}

Project Comments

List Project Comments

GET /companycam/v2/projects/{project_id}/comments

Add Project Comment

POST /companycam/v2/projects/{project_id}/comments
Content-Type: application/json

{
  "comment": {
    "content": "Work completed successfully"
  }
}

Project Labels

List Project Labels

GET /companycam/v2/projects/{project_id}/labels

Add Labels to Project

POST /companycam/v2/projects/{project_id}/labels
Content-Type: application/json

{
  "labels": ["priority", "urgent"]
}

Delete Project Label

DELETE /companycam/v2/projects/{project_id}/labels/{label_id}

Project Documents

List Project Documents

GET /companycam/v2/projects/{project_id}/documents

Upload Document

POST /companycam/v2/projects/{project_id}/documents
Content-Type: application/json

{
  "uri": "https://example.com/document.pdf",
  "name": "Contract.pdf"
}

Project Checklists

List Project Checklists

GET /companycam/v2/projects/{project_id}/checklists

Create Checklist from Template

POST /companycam/v2/projects/{project_id}/checklists
Content-Type: application/json

{
  "checklist_template_id": "template_id"
}

Get Project Checklist

GET /companycam/v2/projects/{project_id}/checklists/{checklist_id}

Project Users

List Assigned Users

GET /companycam/v2/projects/{project_id}/assigned_users

Assign User to Project

PUT /companycam/v2/projects/{project_id}/assigned_users/{user_id}

Project Collaborators

List Collaborators

GET /companycam/v2/projects/{project_id}/collaborators

Photos

List All Photos

GET /companycam/v2/photos

Query parameters:

  • page - Page number
  • per_page - Results per page

Get Photo

GET /companycam/v2/photos/{id}

Update Photo

PUT /companycam/v2/photos/{id}
Content-Type: application/json

{
  "photo": {
    "captured_at": 1609459200
  }
}

Delete Photo

DELETE /companycam/v2/photos/{id}

List Photo Tags

GET /companycam/v2/photos/{id}/tags

Add Tags to Photo

POST /companycam/v2/photos/{id}/tags
Content-Type: application/json

{
  "tags": ["exterior", "completed"]
}

List Photo Comments

GET /companycam/v2/photos/{id}/comments

Add Photo Comment

POST /companycam/v2/photos/{id}/comments
Content-Type: application/json

{
  "comment": {
    "content": "Great progress!"
  }
}

Tags

List Tags

GET /companycam/v2/tags

Create Tag

POST /companycam/v2/tags
Content-Type: application/json

{
  "display_value": "Exterior",
  "color": "#FF5733"
}

Get Tag

GET /companycam/v2/tags/{id}

Update Tag

PUT /companycam/v2/tags/{id}
Content-Type: application/json

{
  "display_value": "Interior",
  "color": "#3498DB"
}

Delete Tag

DELETE /companycam/v2/tags/{id}

Groups

List Groups

GET /companycam/v2/groups

Create Group

POST /companycam/v2/groups
Content-Type: application/json

{
  "name": "Roofing Team"
}

Get Group

GET /companycam/v2/groups/{id}

Update Group

PUT /companycam/v2/groups/{id}
Content-Type: application/json

{
  "name": "Updated Team Name"
}

Delete Group

DELETE /companycam/v2/groups/{id}

Checklists

List All Checklists

GET /companycam/v2/checklists

Query parameters:

  • page - Page number
  • per_page - Results per page
  • completed - Filter by completion status (true/false)

Webhooks

List Webhooks

GET /companycam/v2/webhooks

Create Webhook

POST /companycam/v2/webhooks
Content-Type: application/json

{
  "url": "https://example.com/webhook",
  "scopes": ["project.created", "photo.created"]
}

Available scopes:

  • project.created
  • project.updated
  • project.deleted
  • photo.created
  • photo.updated
  • photo.deleted
  • document.created
  • label.created
  • label.deleted

Get Webhook

GET /companycam/v2/webhooks/{id}

Update Webhook

PUT /companycam/v2/webhooks/{id}
Content-Type: application/json

{
  "url": "https://example.com/new-webhook",
  "enabled": true
}

Delete Webhook

DELETE /companycam/v2/webhooks/{id}

Pagination

CompanyCam uses page-based pagination:

GET /companycam/v2/projects?page=2&per_page=25

Query parameters:

  • page - Page number (default: 1)
  • per_page - Results per page (default: 25)

Code Examples

JavaScript - List Projects

const response = await fetch(
  'https://gateway.maton.ai/companycam/v2/projects?per_page=10',
  {
    headers: {
      'Authorization': `Bearer ${process.env.MATON_API_KEY}`
    }
  }
);
const projects = await response.json();
console.log(projects);

Python - List Projects

import os
import requests

response = requests.get(
    'https://gateway.maton.ai/companycam/v2/projects',
    headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
    params={'per_page': 10}
)
projects = response.json()
for project in projects:
    print(f"{project['name']}: {project['id']}")

Python - Create Project with Photo

import os
import requests

headers = {'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
base_url = 'https://gateway.maton.ai/companycam/v2'

# Create project
project_response = requests.post(
    f'{base_url}/projects',
    headers=headers,
    json={
        'name': 'Kitchen Renovation',
        'address': {
            'street_address_1': '456 Oak Ave',
            'city': 'Denver',
            'state': 'CO',
            'postal_code': '80202',
            'country': 'US'
        }
    }
)
project = project_response.json()
print(f"Created project: {project['id']}")

# Add photo to project
photo_response = requests.post(
    f'{base_url}/projects/{project["id"]}/photos',
    headers=headers,
    json={
        'uri': 'https://example.com/kitchen-before.jpg',
        'tags': ['before', 'kitchen']
    }
)
photo = photo_response.json()
print(f"Added photo: {photo['id']}")

Notes

  • Project IDs and other IDs are returned as strings
  • Timestamps are Unix timestamps (seconds since epoch)
  • Photos can be added via URL (uri parameter)
  • Comments must be wrapped in a comment object
  • Webhooks use scopes parameter (not events)
  • User roles: admin, standard, limited
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing
  • IMPORTANT: When piping curl output to jq, environment variables may not expand correctly. Use Python examples instead.

Rate Limits

Operation Limit
GET requests 240 per minute
POST/PUT/DELETE 100 per minute

When rate limited, the API returns a 429 status code. Implement exponential backoff for retries.

Error Handling

Status Meaning
400 Bad request or missing CompanyCam connection
401 Invalid or missing Maton API key
404 Resource not found
422 Validation error (check error messages)
429 Rate limited
4xx/5xx Passthrough error from CompanyCam API

Troubleshooting: API Key Issues

  1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
  1. Verify the API key is valid by listing connections:
python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Troubleshooting: Invalid App Name

  1. Ensure your URL path starts with companycam. For example:
  • Correct: https://gateway.maton.ai/companycam/v2/projects
  • Incorrect: https://gateway.maton.ai/v2/projects

Resources

安全使用建议
This skill is coherent: it implements CompanyCam access by proxying requests through Maton and requires a MATON_API_KEY. Before installing, confirm you trust Maton (maton.ai) to handle your CompanyCam data and OAuth sessions, since photos/documents and API calls will transit Maton servers. Store MATON_API_KEY securely (do not paste it publicly). If you prefer not to route data through a third party, use a skill that calls CompanyCam's API directly or verify Maton’s privacy/security policies and the exact permissions granted to the API key. Finally, because the skill source is listed as unknown in the registry, consider verifying the author (Maton) and the published integration URL before use.
功能分析
Type: OpenClaw Skill Name: companycam Version: 1.0.0 The skill bundle provides an OpenClaw integration for the CompanyCam API via a Maton API gateway. All code examples and instructions in SKILL.md consistently direct network requests to `maton.ai` domains (gateway.maton.ai, ctrl.maton.ai, connect.maton.ai) and utilize the `MATON_API_KEY` environment variable for authentication, which aligns with the stated purpose of the skill. There is no evidence of data exfiltration to unauthorized endpoints, arbitrary code execution, persistence mechanisms, obfuscation, or prompt injection attempts designed to make the agent perform actions outside the skill's legitimate scope.
能力评估
Purpose & Capability
Name/description (CompanyCam via managed OAuth) aligns with the runtime instructions: all example requests target Maton domains (gateway.maton.ai and ctrl.maton.ai) which the README explains are a gateway for CompanyCam. The single required env var (MATON_API_KEY) matches the declared managed-OAuth gateway design.
Instruction Scope
Instructions only perform network requests to Maton-controlled endpoints and require the MATON_API_KEY; they do not instruct reading local files or unrelated environment variables. Important: API calls (including photos/documents) are proxied through Maton — the SKILL.md explicitly tells the agent to call gateway.maton.ai and ctrl.maton.ai and to open returned URLs in a browser to finish OAuth, which means sensitive data will transit Maton.
Install Mechanism
Instruction-only skill with no install spec and no code files; nothing is written to disk or downloaded during install. This is the lowest-risk install model.
Credentials
Only one env var (MATON_API_KEY) is required, which is proportionate to a managed gateway design. However, this is a Maton API key (not a CompanyCam API key) and grants the gateway access to act on your behalf — users must trust Maton with proxied CompanyCam data and OAuth sessions.
Persistence & Privilege
always is false and the skill does not request persistent/privileged presence or modification of other skills or system config. Autonomous invocation is allowed (platform default) but is not combined with elevated privileges.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install companycam
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /companycam 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v1.0.0
Initial release of the CompanyCam skill: - Integrates CompanyCam API via managed OAuth, enabling management of projects, photos, users, tags, groups, documents, and webhooks for contractors. - Provides Maton-based OAuth connection management, including list, create, retrieve, and delete connection endpoints. - Supports specifying connections for multiple CompanyCam accounts. - Offers comprehensive API documentation and code samples for project, photo, user, comment, label, document, and checklist management. - Requires a valid Maton API key for authentication.
元数据
Slug companycam
版本 1.0.0
许可证
累计安装 0
当前安装数 0
历史版本数 1
常见问题

CompanyCam 是什么?

CompanyCam API integration with managed OAuth. Photo documentation platform for contractors. Use this skill when users want to manage projects, photos, users, tags, groups, or documents in CompanyCam. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 1260 次。

如何安装 CompanyCam?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install companycam」即可一键安装,无需额外配置。

CompanyCam 是免费的吗?

是的,CompanyCam 完全免费(开源免费),可自由下载、安装和使用。

CompanyCam 支持哪些平台?

CompanyCam 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 CompanyCam?

由 byungkyu(@byungkyu)开发并维护,当前版本 v1.0.0。

💬 留言讨论