Pipedrive

Pipedrive API integration with managed OAuth. Manage deals, persons, organizations, activities, and pipelines. Use this skill when users want to interact with Pipedrive CRM. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).

MIT-0 · Free to use, modify, and redistribute. No attribution required.
6 · 15.1k · 7 current installs · 9 all-time installs
MIT-0
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description: Pipedrive API integration. Declared requirement: MATON_API_KEY. SKILL.md instructs use of gateway.maton.ai / ctrl.maton.ai and Maton-managed OAuth. The requested environment variable and endpoints match the stated purpose; there are no unrelated credentials or binaries required.
Instruction Scope
Instructions are limited to calling Maton endpoints (gateway.maton.ai, ctrl.maton.ai, connect.maton.ai) to list/create/delete connections and proxy Pipedrive API calls. The skill does not instruct the agent to read local files, other env vars, or system paths. Note: because the gateway proxies to api.pipedrive.com and injects OAuth tokens, using this skill routes your CRM data through Maton — this is expected but a trust decision for the user.
Install Mechanism
No install spec and no code files (instruction-only). This is low-risk from a disk/installation perspective — nothing is downloaded or written by the skill itself.
Credentials
Only one env var is required: MATON_API_KEY, which is proportional to a proxy/OAuth-managed integration. However, that single key likely grants Maton control over all linked Pipedrive connections and ability to act on behalf of those accounts, so the key is high-value and should be treated accordingly.
Persistence & Privilege
The skill does not request persistent 'always' inclusion and has no install-time persistence. It does not modify other skills or system-wide configs per the provided instructions.
Assessment
This skill is coherent: it proxies Pipedrive calls through Maton and only asks for a Maton API key. Before installing, confirm you trust maton.ai (gateway.maton.ai, ctrl.maton.ai, connect.maton.ai) because your Pipedrive OAuth tokens and operations will be routed through their service. Treat MATON_API_KEY as a high-value secret: use an account with least privilege if possible, rotate the key regularly, and review what connections exist in your Maton dashboard. If you prefer direct integration without a third-party proxy, set up direct Pipedrive credentials or use a different integration path. Because the skill is instruction-only, it does not install code on disk — the main risk is data exposure to the Maton service, not local persistence or hidden binaries.

Like a lobster shell, security has layers — review code before you run it.

Current versionv1.0.3
Download zip
latestvk976100mhynjzj83d7g76behvd80w12s

License

MIT-0
Free to use, modify, and redistribute. No attribution required.

Runtime requirements

🧠 Clawdis
EnvMATON_API_KEY

SKILL.md

Pipedrive

Access the Pipedrive API with managed OAuth authentication. Manage deals, persons, organizations, activities, pipelines, and more for sales CRM workflows.

Quick Start

# List deals
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/pipedrive/api/v1/deals')
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/pipedrive/{native-api-path}

Replace {native-api-path} with the actual Pipedrive API endpoint path. The gateway proxies requests to api.pipedrive.com 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 Pipedrive OAuth connections at https://ctrl.maton.ai.

List Connections

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=pipedrive&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 <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'pipedrive'}).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 <<'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": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
    "status": "ACTIVE",
    "creation_time": "2025-12-08T07:20:53.488460Z",
    "last_updated_time": "2026-01-31T20:03:32.593153Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "pipedrive",
    "metadata": {}
  }
}

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

Delete Connection

python <<'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 Pipedrive connections, specify which one to use with the Maton-Connection header:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/pipedrive/api/v1/deals')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

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

API Reference

Deals

List Deals

GET /pipedrive/api/v1/deals

Query parameters:

  • status - Filter by status: open, won, lost, deleted, all_not_deleted
  • filter_id - Filter ID to use
  • stage_id - Filter by stage
  • user_id - Filter by user
  • start - Pagination start (default 0)
  • limit - Items per page (default 100)
  • sort - Sort field and order (e.g., add_time DESC)

Example:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/pipedrive/api/v1/deals?status=open&limit=50')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Deal

GET /pipedrive/api/v1/deals/{id}

Create Deal

POST /pipedrive/api/v1/deals
Content-Type: application/json

{
  "title": "New Enterprise Deal",
  "value": 50000,
  "currency": "USD",
  "person_id": 123,
  "org_id": 456,
  "stage_id": 1,
  "expected_close_date": "2025-06-30"
}

Update Deal

PUT /pipedrive/api/v1/deals/{id}
Content-Type: application/json

{
  "title": "Updated Deal Title",
  "value": 75000,
  "status": "won"
}

Delete Deal

DELETE /pipedrive/api/v1/deals/{id}

Search Deals

GET /pipedrive/api/v1/deals/search?term=enterprise

Persons (Contacts)

List Persons

GET /pipedrive/api/v1/persons

Query parameters:

  • filter_id - Filter ID
  • start - Pagination start
  • limit - Items per page
  • sort - Sort field and order

Get Person

GET /pipedrive/api/v1/persons/{id}

Create Person

POST /pipedrive/api/v1/persons
Content-Type: application/json

{
  "name": "John Doe",
  "email": ["john@example.com"],
  "phone": ["+1234567890"],
  "org_id": 456,
  "visible_to": 3
}

Update Person

PUT /pipedrive/api/v1/persons/{id}
Content-Type: application/json

{
  "name": "John Smith",
  "email": ["john.smith@example.com"]
}

Delete Person

DELETE /pipedrive/api/v1/persons/{id}

Search Persons

GET /pipedrive/api/v1/persons/search?term=john

Organizations

List Organizations

GET /pipedrive/api/v1/organizations

Get Organization

GET /pipedrive/api/v1/organizations/{id}

Create Organization

POST /pipedrive/api/v1/organizations
Content-Type: application/json

{
  "name": "Acme Corporation",
  "address": "123 Main St, City, Country",
  "visible_to": 3
}

Update Organization

PUT /pipedrive/api/v1/organizations/{id}
Content-Type: application/json

{
  "name": "Acme Corp International"
}

Delete Organization

DELETE /pipedrive/api/v1/organizations/{id}

Activities

List Activities

GET /pipedrive/api/v1/activities

Query parameters:

  • type - Activity type (e.g., call, meeting, task, email)
  • done - Filter by completion (0 or 1)
  • user_id - Filter by user
  • start_date - Filter by start date
  • end_date - Filter by end date

Get Activity

GET /pipedrive/api/v1/activities/{id}

Create Activity

POST /pipedrive/api/v1/activities
Content-Type: application/json

{
  "subject": "Follow-up call",
  "type": "call",
  "due_date": "2025-03-15",
  "due_time": "14:00",
  "duration": "00:30",
  "deal_id": 789,
  "person_id": 123,
  "note": "Discuss contract terms"
}

Update Activity

PUT /pipedrive/api/v1/activities/{id}
Content-Type: application/json

{
  "done": 1,
  "note": "Completed - customer agreed to terms"
}

Delete Activity

DELETE /pipedrive/api/v1/activities/{id}

Pipelines

List Pipelines

GET /pipedrive/api/v1/pipelines

Get Pipeline

GET /pipedrive/api/v1/pipelines/{id}

Stages

List Stages

GET /pipedrive/api/v1/stages

Query parameters:

  • pipeline_id - Filter by pipeline

Get Stage

GET /pipedrive/api/v1/stages/{id}

Notes

List Notes

GET /pipedrive/api/v1/notes

Query parameters:

  • deal_id - Filter by deal
  • person_id - Filter by person
  • org_id - Filter by organization

Create Note

POST /pipedrive/api/v1/notes
Content-Type: application/json

{
  "content": "Meeting notes: Discussed pricing and timeline",
  "deal_id": 789,
  "pinned_to_deal_flag": 1
}

Users

List Users

GET /pipedrive/api/v1/users

Get Current User

GET /pipedrive/api/v1/users/me

Code Examples

JavaScript

const headers = {
  'Authorization': `Bearer ${process.env.MATON_API_KEY}`
};

// List open deals
const deals = await fetch(
  'https://gateway.maton.ai/pipedrive/api/v1/deals?status=open',
  { headers }
).then(r => r.json());

// Create a deal
await fetch(
  'https://gateway.maton.ai/pipedrive/api/v1/deals',
  {
    method: 'POST',
    headers: { ...headers, 'Content-Type': 'application/json' },
    body: JSON.stringify({
      title: 'New Deal',
      value: 10000,
      currency: 'USD'
    })
  }
);

Python

import os
import requests

headers = {'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}

# List open deals
deals = requests.get(
    'https://gateway.maton.ai/pipedrive/api/v1/deals',
    headers=headers,
    params={'status': 'open'}
).json()

# Create a deal
response = requests.post(
    'https://gateway.maton.ai/pipedrive/api/v1/deals',
    headers=headers,
    json={
        'title': 'New Deal',
        'value': 10000,
        'currency': 'USD'
    }
)

Notes

  • IDs are integers
  • Email and phone fields accept arrays for multiple values
  • visible_to values: 1 (owner only), 3 (entire company), 5 (owner's visibility group), 7 (entire company and visibility group)
  • Deal status: open, won, lost, deleted
  • Use start and limit for pagination
  • Custom fields are supported via their API key (e.g., abc123_custom_field)
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsing
  • IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.

Error Handling

StatusMeaning
400Missing Pipedrive connection
401Invalid or missing Maton API key
404Resource not found
429Rate limited (10 req/sec per account)
4xx/5xxPassthrough error from Pipedrive 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 <<'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 pipedrive. For example:
  • Correct: https://gateway.maton.ai/pipedrive/api/v1/deals
  • Incorrect: https://gateway.maton.ai/api/v1/deals

Resources

Files

2 total
Select a file
Select a file to preview.

Comments

Loading comments…