Install
openclaw skills install make-apiMake (formerly Integromat) API integration with managed authentication. Manage scenarios, organizations, teams, connections, data stores, hooks, and templates. Use this skill when users want to automate workflows, manage scenarios, or integrate apps using Make. All write operations (create, update, start, stop, delete) require explicit user approval before executing. Starting or creating scenarios, hooks, and data stores creates persistent resources that continue operating after the conversation ends. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
openclaw skills install make-apiAccess the Make API with managed authentication. Manage scenarios, organizations, teams, connections, data stores, hooks, and templates.
# List organizations
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/make/api/v2/organizations')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/make/api/v2/
Only the endpoints listed in the API Reference section below are supported. The gateway proxies requests to your Make zone (e.g., us2.make.com) and automatically injects your API token.
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"
The following endpoints are Maton platform operations for managing the OAuth connection to Make — they are not part of the Make API itself. Only the endpoints listed in the API Reference section below are proxied to Make.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=make&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
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'make'}).encode()
req = urllib.request.Request('https://api.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
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-04-07T19:37:17.340922Z",
"last_updated_time": "2026-04-07T19:40:00.806379Z",
"url": "https://connect.maton.ai/?session_token=REDACTED",
"app": "make",
"metadata": {}
}
}
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
If you have multiple Make connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/make/api/v2/organizations')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
GET /make/api/v2/users/me
Response:
{
"authUser": {
"id": 2958000,
"name": "John Doe",
"email": "john@example.com",
"language": "en",
"timezoneId": 301,
"timezone": "America/New_York",
"avatar": "https://..."
}
}
GET /make/api/v2/users?organizationId={organizationId}
GET /make/api/v2/users?teamId={teamId}
PATCH /make/api/v2/users/{userId}
Content-Type: application/json
{
"name": "Updated Name",
"language": "en",
"timezoneId": 301
}
GET /make/api/v2/organizations
Response:
{
"organizations": [
{
"id": 2767268,
"name": "My Organization",
"timezoneId": 301,
"zone": "us2.make.com"
}
],
"pg": {"sortBy": "name", "limit": 10000, "sortDir": "asc", "offset": 0}
}
GET /make/api/v2/organizations/{organizationId}
POST /make/api/v2/organizations
Content-Type: application/json
{
"name": "New Organization",
"regionId": 2,
"timezoneId": 301,
"countryId": 202
}
PATCH /make/api/v2/organizations/{organizationId}
Content-Type: application/json
{
"name": "Updated Name",
"timezoneId": 301
}
DELETE /make/api/v2/organizations/{organizationId}
GET /make/api/v2/organizations/{organizationId}/usage
GET /make/api/v2/teams?organizationId={organizationId}
Response:
{
"teams": [
{
"id": 388889,
"name": "My Team",
"organizationId": 2767268
}
],
"pg": {"sortBy": "name", "limit": 10000, "sortDir": "asc", "offset": 0}
}
GET /make/api/v2/teams/{teamId}
POST /make/api/v2/teams
Content-Type: application/json
{
"name": "New Team",
"organizationId": 2767268
}
DELETE /make/api/v2/teams/{teamId}
GET /make/api/v2/teams/{teamId}/usage
GET /make/api/v2/scenarios?organizationId={organizationId}
GET /make/api/v2/scenarios?teamId={teamId}
Response:
{
"scenarios": [
{
"id": 4667499,
"name": "My Scenario",
"teamId": 388889,
"isActive": false,
"isPaused": false,
"scheduling": {"type": "indefinitely", "interval": 900},
"lastEdit": "2026-04-07T19:41:51.801Z"
}
],
"pg": {"sortBy": "proprietal", "limit": 500, "sortDir": "desc", "offset": 0}
}
GET /make/api/v2/scenarios/{scenarioId}
POST /make/api/v2/scenarios
Content-Type: application/json
{
"teamId": 388889,
"name": "New Scenario",
"blueprint": "{...}"
}
PATCH /make/api/v2/scenarios/{scenarioId}
Content-Type: application/json
{
"name": "Updated Scenario Name"
}
DELETE /make/api/v2/scenarios/{scenarioId}
POST /make/api/v2/scenarios/{scenarioId}/start
POST /make/api/v2/scenarios/{scenarioId}/stop
POST /make/api/v2/scenarios/{scenarioId}/run
Content-Type: application/json
{
"data": {"key": "value"}
}
GET /make/api/v2/scenarios/{scenarioId}/logs
GET /make/api/v2/scenarios/{scenarioId}/logs?status=3&pg[limit]=10
Query parameters:
from / to - Timestamp range in millisecondsstatus - 1=success, 2=warning, 3=errorpg[offset], pg[limit] - PaginationGET /make/api/v2/connections?teamId={teamId}
Response:
{
"connections": [
{
"id": 1353452,
"name": "My HubSpot CRM connection",
"accountName": "hubspotcrm",
"accountLabel": "HubSpot CRM",
"teamId": 388889,
"accountType": "oauth",
"editable": true
}
]
}
GET /make/api/v2/connections/{connectionId}
POST /make/api/v2/connections
Content-Type: application/json
{
"accountName": "slack2",
"accountType": "oauth",
"teamId": 388889
}
PATCH /make/api/v2/connections/{connectionId}
Content-Type: application/json
{
"name": "Updated Connection Name"
}
DELETE /make/api/v2/connections/{connectionId}
POST /make/api/v2/connections/{connectionId}/test
GET /make/api/v2/data-stores?teamId={teamId}
Response:
{
"dataStores": [],
"pg": {"sortBy": "name", "limit": 10000, "sortDir": "asc", "offset": 0}
}
GET /make/api/v2/data-stores/{dataStoreId}
POST /make/api/v2/data-stores
Content-Type: application/json
{
"name": "My Data Store",
"teamId": 388889,
"datastructureId": 12345,
"maxSizeMB": 10
}
PATCH /make/api/v2/data-stores/{dataStoreId}
Content-Type: application/json
{
"name": "Updated Name",
"maxSizeMB": 20
}
DELETE /make/api/v2/data-stores?teamId={teamId}
Content-Type: application/json
{
"ids": [12345, 67890]
}
GET /make/api/v2/hooks?teamId={teamId}
Response:
{
"hooks": [],
"pg": {"sortBy": "name", "limit": 50, "sortDir": "asc", "offset": 0}
}
GET /make/api/v2/hooks/{hookId}
POST /make/api/v2/hooks
Content-Type: application/json
{
"name": "My Webhook",
"teamId": 388889,
"typeName": "web",
"method": "POST",
"headers": {},
"stringify": false
}
PATCH /make/api/v2/hooks/{hookId}
Content-Type: application/json
{
"name": "Updated Hook Name"
}
DELETE /make/api/v2/hooks/{hookId}
POST /make/api/v2/hooks/{hookId}/enable
POST /make/api/v2/hooks/{hookId}/disable
GET /make/api/v2/hooks/{hookId}/ping
GET /make/api/v2/templates?teamId={teamId}
Response:
{
"templates": [],
"pg": {"sortBy": "id", "limit": 10, "sortDir": "asc", "offset": 0}
}
GET /make/api/v2/templates/{templateId}
GET /make/api/v2/templates/{templateId}/blueprint
DELETE /make/api/v2/templates/{templateId}
GET /make/api/v2/dlqs?scenarioId={scenarioId}
Response:
{
"dlqs": [],
"pg": {"sortBy": "", "limit": 50, "sortDir": "asc", "offset": 0}
}
GET /make/api/v2/dlqs/{dlqId}
POST /make/api/v2/dlqs/{dlqId}/retry
DELETE /make/api/v2/dlqs?scenarioId={scenarioId}
Content-Type: application/json
{
"ids": [12345, 67890]
}
Make uses offset-based pagination with pg parameters:
GET /make/api/v2/scenarios?organizationId=123&pg[offset]=0&pg[limit]=50&pg[sortBy]=name&pg[sortDir]=asc
Parameters:
pg[offset] - Number of items to skip (default: 0)pg[limit] - Max items per page (varies by endpoint)pg[sortBy] - Field to sort bypg[sortDir] - Sort direction: asc or descResponse includes pagination metadata:
{
"scenarios": [...],
"pg": {
"sortBy": "name",
"limit": 500,
"sortDir": "asc",
"offset": 0,
"returnTotalCount": false
}
}
const response = await fetch(
'https://api.maton.ai/make/api/v2/organizations',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
console.log(data.organizations);
import os
import requests
response = requests.get(
'https://api.maton.ai/make/api/v2/scenarios',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'organizationId': 2767268}
)
scenarios = response.json()['scenarios']
import os
import requests
headers = {
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json'
}
# List scenarios
response = requests.get(
'https://api.maton.ai/make/api/v2/scenarios',
headers=headers,
params={'organizationId': 2767268}
)
scenarios = response.json()['scenarios']
# Display inactive scenarios for user selection
inactive = [s for s in scenarios if not s['isActive']]
for i, s in enumerate(inactive):
print(f"{i+1}. {s['name']} (ID: {s['id']})")
# Start a specific scenario after user confirms
scenario_id = inactive[0]['id'] # Replace with user-selected ID
requests.post(
f'https://api.maton.ai/make/api/v2/scenarios/{scenario_id}/start',
headers=headers
)
print(f"Started scenario: {inactive[0]['name']}")
us1.make.com, eu1.make.com) - Maton handles routing automaticallyorganizationId or teamId parametercurl -g when URLs contain brackets to disable glob parsingjq, environment variables may not expand correctly in some shells| Status | Meaning |
|---|---|
| 400 | Missing Make connection or invalid request |
| 401 | Invalid or missing Maton API key |
| 403 | Permission denied or forbidden operation |
| 404 | Resource not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Make API |