Documents

podio

Try it

Read and manage Podio organizations, spaces, apps, items, tasks, and comments via a managed OAuth API.

What it does

Connect to the Podio API through a managed OAuth proxy at https://api.maton.ai/podio/. List organizations and spaces, fetch app and item details, filter items by app, create and update tasks, and post comments. Authentication uses a bearer token (MATON_API_KEY); the proxy injects Podio OAuth credentials, so token handling is handled for you. The skill documents endpoints for organization, space, app, item, task, and comment operations, plus offset-based pagination for filtered item queries.

When to use it

  • Listing the organizations and spaces a connected user belongs to
  • Fetching and filtering items inside a specific Podio app
  • Creating, updating, or deleting Podio items
  • Creating tasks tied to items with assignees and due dates

The skill document

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://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

Base URL

https://api.maton.ai/podio/{native-api-path}

Maton 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
  2. Go to maton.ai/settings
  3. Copy your API key

Connection Management

Manage your Podio OAuth connections at https://api.maton.ai.

List Connections

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

Create Connection

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

Get Connection

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.

Delete Connection

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

Specifying 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://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.

Security & Permissions

  • Access is scoped to workspaces, apps, items, tasks, and comments within the connected Podio account.
  • All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.

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:

  • include_inactive - Include inactive apps (default: false)

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:

  • 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"
  }
}

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:

  • hook - Execute hooks (default: true)
  • silent - Suppress notifications (default: false)

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:

  • hook - Execute hooks (default: true)
  • silent - Suppress notifications (default: false)

Response:

{
  "revision": 6,
  "title": "New task"
}

Delete Item

DELETE /podio/item/{item_id}

Optional query parameters:

  • hook - Execute hooks (default: true)
  • silent - Suppress notifications (default: false)

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=false

Query parameters:

  • org - Filter by organization ID (required if no other filter)
  • space - Filter by space ID
  • app - Filter by app ID
  • completed - Filter by completion status (true or false)
  • responsible - Filter by responsible user IDs
  • created_by - Filter by creator
  • due_date - Date range (YYYY-MM-DD-YYYY-MM-DD)
  • limit - Maximum results
  • offset - Result offset
  • sort_by - Sort by: created_on, completed_on, rank (default: rank)
  • grouping - Group by: due_date, created_by, responsible, app, space, org

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:

  • hook - Execute hooks (default: true)
  • silent - Suppress notifications (default: false)

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:

  • 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": []
  }
]

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:

  • alert_invite - Auto-invite mentioned users (default: false)
  • hook - Execute hooks (default: true)
  • silent - Suppress notifications (default: false)

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://api.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://api.maton.ai/podio/org/',
    headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
data = response.json()

Notes

  • Organization IDs, space IDs, app IDs, and item IDs are integers
  • Field values can be specified by field_id or external_id
  • Category fields use option IDs (integers), not text values
  • Deleting an item also deletes associated tasks (cascade delete)
  • Tasks require at least one filter (org, space, app, responsible, reference, created_by, or completed_by)
  • Use silent=true to suppress notifications for bulk operations
  • Use hook=false to skip webhook triggers
  • Include revision in update requests for conflict detection (returns 409 if conflict)
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets 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

Error Handling

StatusMeaning
400Missing Podio connection or invalid request
401Invalid or missing Maton API key
403Forbidden - insufficient permissions
404Resource not found
409Conflict (revision mismatch on update)
410Resource has been deleted
429Rate limited
4xx/5xxPassthrough error from Podio 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://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

Troubleshooting: Invalid App Name

  1. Ensure your URL path starts with podio. For example:
  • Correct: https://api.maton.ai/podio/org/
  • Incorrect: https://api.maton.ai/org/

Resources

Related skills

Read and write Excel workbooks, worksheets, ranges, tables, and charts in OneDrive through Microsoft Graph with managed OAuth.

by byungkyu800 installs42 stars

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.

by Iván1 installs

Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.

by johnpatternai21 installs8 stars

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants

More from byungkyu

Browse all skills

Read and write Excel workbooks, worksheets, ranges, tables, and charts in OneDrive through Microsoft Graph with managed OAuth.

by byungkyu800 installs42 stars

Query and manage Linear issues, projects, teams, cycles, labels, and comments through a managed OAuth GraphQL endpoint.

by byungkyu518 installs18 stars

Manage Stripe customers, subscriptions, invoices, products, prices, and payments through OAuth-authenticated API calls.

by byungkyu720 installs29 stars

Search, read, and manage YouTube videos, playlists, channels, subscriptions, and comments via managed OAuth.

by byungkyu880 installs145 stars

Manage WooCommerce products, orders, customers, coupons, shipping, taxes, and more through managed OAuth REST API calls.

by byungkyu508 installs18 stars

Manage ClickUp workspaces, spaces, folders, lists, and tasks via the ClickUp API with managed OAuth.

by byungkyu611 installs12 stars