Access the Podio API with managed OAuth authentication. Manage organizations, workspaces (spaces), apps, items, tasks, comments, and files.
# List organizations
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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))
EOF
https://api.maton.ai/podio/{native-api-path}
Maton proxies requests to api.podio.com and automatically injects your OAuth 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"
Manage your Podio OAuth connections at https://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'podio'}).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": "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.
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 Podio 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/podio/org/')
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.
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 /podio/org/{org_id}
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"
}
}
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"
}
GET /podio/app/space/{space_id}/
Optional query parameters:
include_inactive - Include inactive apps (default: false)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": [...]
}
GET /podio/item/{item_id}
Optional query parameters:
mark_as_viewed - Mark notifications as viewed (default: true)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"
}
}
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
}
]
}
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:
hook - Execute hooks (default: true)silent - Suppress notifications (default: false)Response:
{
"item_id": 124,
"title": "New task"
}
PUT /podio/item/{item_id}
Content-Type: application/json
{
"fields": {
"status": 2
},
"revision": 5
}
Optional query parameters:
hook - Execute hooks (default: true)silent - Suppress notifications (default: false)Response:
{
"revision": 6,
"title": "New task"
}
DELETE /podio/item/{item_id}
Optional query parameters:
hook - Execute hooks (default: true)silent - Suppress notifications (default: false)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=false
Query parameters:
org - Filter by organization ID (required if no other filter)space - Filter by space IDapp - Filter by app IDcompleted - Filter by completion status (true or false)responsible - Filter by responsible user IDscreated_by - Filter by creatordue_date - Date range (YYYY-MM-DD-YYYY-MM-DD)limit - Maximum resultsoffset - Result offsetsort_by - Sort by: created_on, completed_on, rank (default: rank)grouping - Group by: due_date, created_by, responsible, app, space, orgGET /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"}
]
}
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:
hook - Execute hooks (default: true)silent - Suppress notifications (default: false)Response:
{
"task_id": 790,
...
}
GET /podio/comment/{type}/{id}/
Where {type} is the object type (e.g., "item", "task") and {id} is the object ID.
Optional query parameters:
limit - Maximum comments (default: 100)offset - Pagination offset (default: 0)Response:
[
{
"comment_id": 456,
"value": "This looks great!",
"created_on": "2025-01-20T15:30:00Z",
"created_by": {
"user_id": 12345,
"name": "John Doe"
},
"files": []
}
]
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:
alert_invite - Auto-invite mentioned users (default: false)hook - Execute hooks (default: true)silent - Suppress notifications (default: false)Response:
{
"comment_id": 457,
...
}
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
}
const response = await fetch(
'https://api.maton.ai/podio/org/',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
import os
import requests
response = requests.get(
'https://api.maton.ai/podio/org/',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
data = response.json()
silent=true to suppress notifications for bulk operationshook=false to skip webhook triggersrevision in update requests for conflict detection (returns 409 if conflict)curl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| 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 |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
podio. For example:https://api.maton.ai/podio/org/https://api.maton.ai/org/共 2 个版本