Podio
name: podio
by byungkyu · published 2026-03-22
$ claw add gh:byungkyu/byungkyu-podio---
name: podio
description: |
Podio API integration with managed OAuth. Manage workspaces, apps, items, tasks, and comments.
Use this skill when users want to read, create, update, or delete Podio items, manage tasks, or interact with Podio apps and workspaces.
For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
compatibility: Requires network access and valid Maton API key
metadata:
author: maton
version: "1.0"
clawdbot:
emoji: 🧠
homepage: "https://maton.ai"
requires:
env:
- MATON_API_KEY
---
# Podio
Access the Podio API with managed OAuth authentication. Manage organizations, workspaces (spaces), apps, items, tasks, comments, and files.
Quick Start
# List organizations
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/podio/org/')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFBase URL
https://gateway.maton.ai/podio/{native-api-path}Replace `{native-api-path}` with the actual Podio API endpoint path. The gateway proxies requests to `api.podio.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](https://maton.ai)
2. Go to [maton.ai/settings](https://maton.ai/settings)
3. Copy your API key
Connection Management
Manage your Podio 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=podio&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFCreate Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'podio'}).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))
EOFGet 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": "podio",
"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))
EOFSpecifying Connection
If you have multiple Podio 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/podio/org/')
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))
EOFIf omitted, the gateway uses the default (oldest) active connection.
API Reference
Organization Operations
#### List Organizations
Returns all organizations and spaces the user is a member of.
GET /podio/org/**Response:**
[
{
"org_id": 123456,
"name": "My Organization",
"url": "https://podio.com/myorg",
"url_label": "myorg",
"type": "premium",
"role": "admin",
"status": "active",
"spaces": [
{
"space_id": 789,
"name": "Project Space",
"url": "https://podio.com/myorg/project-space",
"role": "admin"
}
]
}
]#### Get Organization
GET /podio/org/{org_id}Space (Workspace) Operations
#### Get Space
GET /podio/space/{space_id}**Response:**
{
"space_id": 789,
"name": "Project Space",
"privacy": "closed",
"auto_join": false,
"url": "https://podio.com/myorg/project-space",
"url_label": "project-space",
"role": "admin",
"created_on": "2025-01-15T10:30:00Z",
"created_by": {
"user_id": 12345,
"name": "John Doe"
}
}#### Create Space
POST /podio/space/
Content-Type: application/json
{
"org_id": 123456,
"name": "New Project Space",
"privacy": "closed",
"auto_join": false,
"post_on_new_app": true,
"post_on_new_member": true
}**Response:**
{
"space_id": 790,
"url": "https://podio.com/myorg/new-project-space"
}Application Operations
#### Get Apps by Space
GET /podio/app/space/{space_id}/Optional query parameters:
#### Get App
GET /podio/app/{app_id}**Response:**
{
"app_id": 456,
"status": "active",
"space_id": 789,
"config": {
"name": "Tasks",
"item_name": "Task",
"description": "Track project tasks",
"icon": "list"
},
"fields": [...]
}Item Operations
#### Get Item
GET /podio/item/{item_id}Optional query parameters:
**Response:**
{
"item_id": 123,
"title": "Complete project plan",
"app": {
"app_id": 456,
"name": "Tasks"
},
"fields": [
{
"field_id": 1,
"external_id": "status",
"type": "category",
"values": [{"value": {"text": "In Progress"}}]
}
],
"created_on": "2025-01-20T14:00:00Z",
"created_by": {
"user_id": 12345,
"name": "John Doe"
}
}#### Filter Items
POST /podio/item/app/{app_id}/filter/
Content-Type: application/json
{
"sort_by": "created_on",
"sort_desc": true,
"filters": {
"status": [1, 2]
},
"limit": 30,
"offset": 0
}**Response:**
{
"total": 150,
"filtered": 45,
"items": [
{
"item_id": 123,
"title": "Complete project plan",
"fields": [...],
"comment_count": 5,
"file_count": 2
}
]
}#### Add New Item
POST /podio/item/app/{app_id}/
Content-Type: application/json
{
"fields": {
"title": "New task",
"status": 1,
"due-date": {"start": "2025-02-15"}
},
"tags": ["urgent", "project-alpha"],
"file_ids": [12345]
}Optional query parameters:
**Response:**
{
"item_id": 124,
"title": "New task"
}#### Update Item
PUT /podio/item/{item_id}
Content-Type: application/json
{
"fields": {
"status": 2
},
"revision": 5
}Optional query parameters:
**Response:**
{
"revision": 6,
"title": "New task"
}#### Delete Item
DELETE /podio/item/{item_id}Optional query parameters:
Task Operations
#### Get Tasks
**Note:** Tasks require at least one filter: `org`, `space`, `app`, `responsible`, `reference`, `created_by`, or `completed_by`.
GET /podio/task/?org={org_id}
GET /podio/task/?space={space_id}
GET /podio/task/?app={app_id}&completed=falseQuery parameters:
#### Get Task
GET /podio/task/{task_id}**Response:**
{
"task_id": 789,
"text": "Review project proposal",
"description": "Detailed review of the Q1 proposal",
"status": "active",
"due_date": "2025-02-15",
"due_time": "17:00:00",
"responsible": {
"user_id": 12345,
"name": "John Doe"
},
"created_on": "2025-01-20T10:00:00Z",
"labels": [
{"label_id": 1, "text": "High Priority", "color": "red"}
]
}#### Create Task
POST /podio/task/
Content-Type: application/json
{
"text": "Review project proposal",
"description": "Detailed review of the Q1 proposal",
"due_date": "2025-02-15",
"due_time": "17:00:00",
"responsible": 12345,
"private": false,
"ref_type": "item",
"ref_id": 123,
"labels": [1, 2]
}Optional query parameters:
**Response:**
{
"task_id": 790,
...
}Comment Operations
#### Get Comments on Object
GET /podio/comment/{type}/{id}/Where `{type}` is the object type (e.g., "item", "task") and `{id}` is the object ID.
Optional query parameters:
**Response:**
[
{
"comment_id": 456,
"value": "This looks great!",
"created_on": "2025-01-20T15:30:00Z",
"created_by": {
"user_id": 12345,
"name": "John Doe"
},
"files": []
}
]#### Add Comment to Object
POST /podio/comment/{type}/{id}
Content-Type: application/json
{
"value": "Great progress on this task!",
"file_ids": [12345],
"embed_url": "https://example.com/doc"
}Optional query parameters:
**Response:**
{
"comment_id": 457,
...
}Pagination
Podio uses offset-based pagination with `limit` and `offset` parameters:
POST /podio/item/app/{app_id}/filter/
Content-Type: application/json
{
"limit": 30,
"offset": 0
}Response includes total counts:
{
"total": 150,
"filtered": 45,
"items": [...]
}For subsequent pages, increment the offset:
{
"limit": 30,
"offset": 30
}Code Examples
JavaScript
const response = await fetch(
'https://gateway.maton.ai/podio/org/',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();Python
import os
import requests
response = requests.get(
'https://gateway.maton.ai/podio/org/',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
data = response.json()Notes
Error Handling
| Status | Meaning |
|--------|---------|
| 400 | Missing Podio connection or invalid request |
| 401 | Invalid or missing Maton API key |
| 403 | Forbidden - insufficient permissions |
| 404 | Resource not found |
| 409 | Conflict (revision mismatch on update) |
| 410 | Resource has been deleted |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Podio API |
Troubleshooting: API Key Issues
1. Check that the `MATON_API_KEY` environment variable is set:
echo $MATON_API_KEY2. 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))
EOFTroubleshooting: Invalid App Name
1. Ensure your URL path starts with `podio`. For example:
Resources
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...