🧪 Skills

Wrike

Wrike API integration with managed OAuth. Manage tasks, folders, projects, spaces, and team collaboration. Use this skill when users want to manage project w...

v0.1.0
❤️ 0
⬇️ 352
👁 2
Share

Description


name: wrike description: | Wrike API integration with managed OAuth. Manage tasks, folders, projects, spaces, and team collaboration. Use this skill when users want to manage project work, track tasks, handle time logs, or access team resources in Wrike. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). 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

Wrike

Access the Wrike API v4 with managed OAuth authentication. Manage tasks, folders, projects, spaces, groups, comments, attachments, timelogs, workflows, and more.

Quick Start

# List all tasks
python3 <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/wrike/api/v4/tasks')
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/wrike/api/v4/{endpoint-path}

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

List Connections

python3 <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=wrike&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

python3 <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'wrike'}).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

Response:

{
  "connection_id": "32c76f2f-54a0-47ca-b4d2-8e99ad852210",
  "status": "PENDING",
  "url": "https://connect.maton.ai/?session_token=...",
  "app": "wrike"
}

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

Delete Connection

python3 <<'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"]}')
urllib.request.urlopen(req)
print("Deleted")
EOF

Specifying Connection

If you have multiple Wrike connections, specify which one to use with the Maton-Connection header:

req.add_header('Maton-Connection', '{connection_id}')

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

API Reference

Spaces

List Spaces

GET /wrike/api/v4/spaces

Response:

{
  "kind": "spaces",
  "data": [
    {
      "id": "MQAAAAEFzzdO",
      "title": "First space",
      "avatarUrl": "https://www.wrike.com/static/spaceicons2/v3/6/6-planet.png",
      "accessType": "Public",
      "archived": false,
      "defaultProjectWorkflowId": "IEAGXR2EK77ZIOF4",
      "defaultTaskWorkflowId": "IEAGXR2EK4G2YNU4"
    }
  ]
}

Get Space

GET /wrike/api/v4/spaces/{spaceId}

Create Space

POST /wrike/api/v4/spaces
Content-Type: application/json

{
  "title": "New Space"
}

Update Space

PUT /wrike/api/v4/spaces/{spaceId}
Content-Type: application/json

{
  "title": "Updated Space Name"
}

Delete Space

DELETE /wrike/api/v4/spaces/{spaceId}

Folders & Projects

Folders and projects are the main ways to organize work in Wrike. Projects are folders with additional properties (owners, dates, status).

Get Folder Tree

GET /wrike/api/v4/folders

Response:

{
  "kind": "folderTree",
  "data": [
    {
      "id": "IEAGXR2EI7777777",
      "title": "Root",
      "childIds": ["MQAAAAEFzzdO", "MQAAAAEFzzRZ"],
      "scope": "WsRoot"
    },
    {
      "id": "MQAAAAEFzzdV",
      "title": "My Project",
      "childIds": [],
      "scope": "WsFolder",
      "project": {
        "authorId": "KUAXHKXS",
        "ownerIds": ["KUAXHKXS"],
        "customStatusId": "IEAGXR2EJMG2YNA4",
        "createdDate": "2026-03-09T08:15:07Z"
      }
    }
  ]
}

Get Folders in Space

GET /wrike/api/v4/spaces/{spaceId}/folders

Get Folder

GET /wrike/api/v4/folders/{folderId}
GET /wrike/api/v4/folders/{folderId},{folderId},... (up to 100 IDs)

Get Subfolders

GET /wrike/api/v4/folders/{folderId}/folders

Create Folder

POST /wrike/api/v4/folders/{parentFolderId}/folders
Content-Type: application/json

{
  "title": "New Folder"
}

Update Folder

PUT /wrike/api/v4/folders/{folderId}
Content-Type: application/json

{
  "title": "Updated Folder Name"
}

Delete Folder

DELETE /wrike/api/v4/folders/{folderId}

Copy Folder

POST /wrike/api/v4/copy_folder/{folderId}
Content-Type: application/json

{
  "parent": "{destinationFolderId}",
  "title": "Copy of Folder"
}

Tasks

List Tasks

GET /wrike/api/v4/tasks

Response:

{
  "kind": "tasks",
  "data": [
    {
      "id": "MAAAAAEFzzde",
      "accountId": "IEAGXR2E",
      "title": "First task",
      "status": "Active",
      "importance": "Normal",
      "createdDate": "2026-03-09T08:15:07Z",
      "updatedDate": "2026-03-10T07:07:57Z",
      "dates": {
        "type": "Planned",
        "duration": 2400,
        "start": "2026-03-05T09:00:00",
        "due": "2026-03-11T17:00:00"
      },
      "scope": "WsTask",
      "customStatusId": "IEAGXR2EJMG2YNV2",
      "permalink": "https://www.wrike.com/open.htm?id=4392433502"
    }
  ]
}

List Tasks in Folder

GET /wrike/api/v4/folders/{folderId}/tasks

List Tasks in Space

GET /wrike/api/v4/spaces/{spaceId}/tasks

Get Task

GET /wrike/api/v4/tasks/{taskId}
GET /wrike/api/v4/tasks/{taskId},{taskId},... (up to 100 IDs)

Create Task

POST /wrike/api/v4/folders/{folderId}/tasks
Content-Type: application/json

{
  "title": "New Task",
  "description": "Task description",
  "importance": "Normal",
  "dates": {
    "start": "2026-03-15",
    "due": "2026-03-20"
  }
}

Response:

{
  "kind": "tasks",
  "data": [
    {
      "id": "MAAAAAEF7ufN",
      "accountId": "IEAGXR2E",
      "title": "New Task",
      "description": "Task description",
      "status": "Active",
      "importance": "Normal",
      "createdDate": "2026-03-10T07:16:07Z",
      "scope": "WsTask",
      "customStatusId": "IEAGXR2EJMG2YNU4",
      "permalink": "https://www.wrike.com/open.htm?id=4394510285"
    }
  ]
}

Update Task

PUT /wrike/api/v4/tasks/{taskId}
Content-Type: application/json

{
  "title": "Updated Task Title",
  "importance": "High"
}

Update Multiple Tasks

PUT /wrike/api/v4/tasks/{taskId},{taskId},... (up to 100 IDs)
Content-Type: application/json

{
  "status": "Completed"
}

Delete Task

DELETE /wrike/api/v4/tasks/{taskId}

Comments

List Comments

GET /wrike/api/v4/comments
GET /wrike/api/v4/tasks/{taskId}/comments
GET /wrike/api/v4/folders/{folderId}/comments
GET /wrike/api/v4/comments/{commentId},{commentId},... (up to 100 IDs)

Response:

{
  "kind": "comments",
  "data": [
    {
      "id": "IEAGXR2EIMBGYQMR",
      "authorId": "KUAXI4LC",
      "text": "This is a comment",
      "updatedDate": "2026-03-10T07:07:57Z",
      "createdDate": "2026-03-10T07:07:57Z",
      "taskId": "MAAAAAEFzzde"
    }
  ]
}

Create Comment

POST /wrike/api/v4/tasks/{taskId}/comments
Content-Type: application/json

{
  "text": "New comment text"
}

Update Comment

PUT /wrike/api/v4/comments/{commentId}
Content-Type: application/json

{
  "text": "Updated comment text"
}

Delete Comment

DELETE /wrike/api/v4/comments/{commentId}

Attachments

List Attachments

GET /wrike/api/v4/attachments
GET /wrike/api/v4/tasks/{taskId}/attachments
GET /wrike/api/v4/folders/{folderId}/attachments
GET /wrike/api/v4/attachments/{attachmentId},{attachmentId},... (up to 100 IDs)

Response:

{
  "kind": "attachments",
  "data": [
    {
      "id": "IEAGXR2EIYUN54ZV",
      "authorId": "KUAXHKXS",
      "name": "document.pdf",
      "createdDate": "2026-03-09T08:15:08Z",
      "version": 1,
      "type": "Wrike",
      "contentType": "application/pdf",
      "size": 117940,
      "taskId": "MAAAAAEFzzde"
    }
  ]
}

Download Attachment

GET /wrike/api/v4/attachments/{attachmentId}/download

Get Attachment Preview

GET /wrike/api/v4/attachments/{attachmentId}/preview

Get Attachment Access URL

GET /wrike/api/v4/attachments/{attachmentId}/url

Update Attachment

PUT /wrike/api/v4/attachments/{attachmentId}

Delete Attachment

DELETE /wrike/api/v4/attachments/{attachmentId}

Contacts

Contacts represent users and groups in Wrike.

List Contacts

GET /wrike/api/v4/contacts
GET /wrike/api/v4/contacts/{contactId},{contactId},... (up to 100 IDs)

Response:

{
  "kind": "contacts",
  "data": [
    {
      "id": "KUAXHKXS",
      "firstName": "Chris",
      "lastName": "",
      "type": "Person",
      "profiles": [
        {
          "accountId": "IEAGXR2E",
          "email": "user@example.com",
          "role": "User",
          "external": false,
          "admin": false,
          "owner": true,
          "active": true
        }
      ],
      "timezone": "US/Pacific",
      "locale": "en",
      "deleted": false,
      "me": true
    }
  ]
}

Update Contact

PUT /wrike/api/v4/contacts/{contactId}
Content-Type: application/json

{
  "metadata": [{"key": "customKey", "value": "customValue"}]
}

Groups

List Groups

GET /wrike/api/v4/groups
GET /wrike/api/v4/groups/{groupId}

Response:

{
  "kind": "groups",
  "data": [
    {
      "id": "KX7XIKVN",
      "accountId": "IEAGXR2E",
      "title": "My Team",
      "memberIds": ["KUAXHKXS"],
      "childIds": [],
      "parentIds": [],
      "myTeam": true
    }
  ]
}

Create Group

POST /wrike/api/v4/groups
Content-Type: application/json

{
  "title": "New Group",
  "members": ["KUAXHKXS"]
}

Update Group

PUT /wrike/api/v4/groups/{groupId}
Content-Type: application/json

{
  "title": "Updated Group Name"
}

Delete Group

DELETE /wrike/api/v4/groups/{groupId}

Workflows

List Workflows

GET /wrike/api/v4/workflows
GET /wrike/api/v4/spaces/{spaceId}/workflows

Response:

{
  "kind": "workflows",
  "data": [
    {
      "id": "IEAGXR2EK77ZIOF4",
      "name": "Default Workflow",
      "standard": true,
      "hidden": false,
      "customStatuses": [
        {
          "id": "IEAGXR2EJMAAAAAA",
          "name": "New",
          "color": "Blue",
          "group": "Active",
          "hidden": false
        },
        {
          "id": "IEAGXR2EJMG2YNA4",
          "name": "In Progress",
          "color": "Turquoise",
          "group": "Active",
          "hidden": false
        },
        {
          "id": "IEAGXR2EJMAAAAAB",
          "name": "Completed",
          "color": "Green",
          "group": "Completed",
          "hidden": false
        }
      ]
    }
  ]
}

Create Workflow

POST /wrike/api/v4/workflows
Content-Type: application/json

{
  "name": "Custom Workflow"
}

Update Workflow

PUT /wrike/api/v4/workflows/{workflowId}
Content-Type: application/json

{
  "name": "Updated Workflow Name"
}

Custom Fields

List Custom Fields

GET /wrike/api/v4/customfields
GET /wrike/api/v4/spaces/{spaceId}/customfields
GET /wrike/api/v4/customfields/{customfieldId},{customfieldId},... (up to 100 IDs)

Response:

{
  "kind": "customfields",
  "data": [
    {
      "id": "IEAGXR2EJUALBS23",
      "accountId": "IEAGXR2E",
      "title": "Impact",
      "type": "DropDown",
      "spaceId": "MQAAAAEFzzdO",
      "settings": {
        "values": ["Low", "Medium", "High"],
        "options": [
          {"value": "Low", "color": "Green"},
          {"value": "Medium", "color": "Yellow"},
          {"value": "High", "color": "Red"}
        ]
      }
    }
  ]
}

Create Custom Field

POST /wrike/api/v4/customfields
Content-Type: application/json

{
  "title": "Priority",
  "type": "DropDown",
  "settings": {
    "values": ["Low", "Medium", "High"]
  }
}

Update Custom Field

PUT /wrike/api/v4/customfields/{customfieldId}
Content-Type: application/json

{
  "title": "Updated Field Name"
}

Timelogs

List Timelogs

GET /wrike/api/v4/timelogs
GET /wrike/api/v4/tasks/{taskId}/timelogs
GET /wrike/api/v4/folders/{folderId}/timelogs
GET /wrike/api/v4/contacts/{contactId}/timelogs
GET /wrike/api/v4/timelogs/{timelogId},{timelogId},... (up to 100 IDs)

Create Timelog

POST /wrike/api/v4/tasks/{taskId}/timelogs
Content-Type: application/json

{
  "hours": 2,
  "trackedDate": "2026-03-10",
  "comment": "Worked on implementation"
}

Update Timelog

PUT /wrike/api/v4/timelogs/{timelogId}
Content-Type: application/json

{
  "hours": 3,
  "comment": "Updated time entry"
}

Delete Timelog

DELETE /wrike/api/v4/timelogs/{timelogId}

Timelog Categories

GET /wrike/api/v4/timelog_categories

Dependencies

List Dependencies

GET /wrike/api/v4/tasks/{taskId}/dependencies
GET /wrike/api/v4/dependencies/{dependencyId},{dependencyId},... (up to 100 IDs)

Response:

{
  "kind": "dependencies",
  "data": [
    {
      "id": "MgAAAAEFzzdeMwAAAAEFzzdb",
      "predecessorId": "MAAAAAEFzzde",
      "successorId": "MAAAAAEFzzdb",
      "relationType": "FinishToStart",
      "lagTime": 0
    }
  ]
}

Create Dependency

POST /wrike/api/v4/tasks/{taskId}/dependencies
Content-Type: application/json

{
  "predecessorId": "{taskId}",
  "relationType": "FinishToStart"
}

Update Dependency

PUT /wrike/api/v4/dependencies/{dependencyId}
Content-Type: application/json

{
  "relationType": "StartToStart"
}

Delete Dependency

DELETE /wrike/api/v4/dependencies/{dependencyId}

Approvals

List Approvals

GET /wrike/api/v4/approvals
GET /wrike/api/v4/tasks/{taskId}/approvals
GET /wrike/api/v4/folders/{folderId}/approvals
GET /wrike/api/v4/approvals/{approvalId},{approvalId},... (up to 100 IDs)

Response:

{
  "kind": "approvals",
  "data": [
    {
      "id": "IEAGXR2EMEB33OQA",
      "taskId": "MAAAAAEFzzde",
      "authorId": "KUAXHKXS",
      "dueDate": "2026-03-12",
      "decisions": [
        {
          "approverId": "KUAXHKXS",
          "status": "Pending",
          "updatedDate": "2026-03-09T08:15:08Z"
        }
      ],
      "status": "Pending",
      "finished": false
    }
  ]
}

Create Approval

POST /wrike/api/v4/tasks/{taskId}/approvals
Content-Type: application/json

{
  "approvers": ["KUAXHKXS"],
  "dueDate": "2026-03-15"
}

Update Approval

PUT /wrike/api/v4/approvals/{approvalId}

Cancel Approval

DELETE /wrike/api/v4/approvals/{approvalId}

Invitations

List Invitations

GET /wrike/api/v4/invitations

Response:

{
  "kind": "invitations",
  "data": [
    {
      "id": "IEAGXR2EJEAVFLCG",
      "accountId": "IEAGXR2E",
      "firstName": "John",
      "email": "john@example.com",
      "status": "Accepted",
      "inviterUserId": "KUAXHKXS",
      "invitationDate": "2026-03-09T08:14:04Z",
      "role": "User",
      "external": false
    }
  ]
}

Create Invitation

POST /wrike/api/v4/invitations
Content-Type: application/json

{
  "email": "newuser@example.com",
  "firstName": "New",
  "lastName": "User",
  "role": "User"
}

Update Invitation

PUT /wrike/api/v4/invitations/{invitationId}

Delete Invitation

DELETE /wrike/api/v4/invitations/{invitationId}

Work Schedules

List Work Schedules

GET /wrike/api/v4/workschedules
GET /wrike/api/v4/workschedules/{workscheduleId}

Response:

{
  "kind": "workschedules",
  "data": [
    {
      "id": "IEAGXR2EML7ZIOF4",
      "scheduleType": "Default",
      "title": "Default Schedule",
      "workweek": [
        {
          "workDays": ["Mon", "Tue", "Wed", "Thu", "Fri"],
          "capacityMinutes": 480
        }
      ]
    }
  ]
}

Create Work Schedule

POST /wrike/api/v4/workschedules
Content-Type: application/json

{
  "title": "Custom Schedule"
}

Update Work Schedule

PUT /wrike/api/v4/workschedules/{workscheduleId}

Delete Work Schedule

DELETE /wrike/api/v4/workschedules/{workscheduleId}

Users (Admin)

Get User

GET /wrike/api/v4/users/{userId}

Response:

{
  "kind": "users",
  "data": [
    {
      "id": "KUAXHKXS",
      "firstName": "Chris",
      "lastName": "",
      "type": "Person",
      "profiles": [
        {
          "accountId": "IEAGXR2E",
          "email": "user@example.com",
          "role": "User",
          "external": false,
          "admin": false,
          "owner": true,
          "active": true
        }
      ],
      "timezone": "US/Pacific",
      "locale": "en",
      "deleted": false,
      "me": true,
      "title": "Engineer",
      "companyName": "Company",
      "primaryEmail": "user@example.com",
      "userTypeId": "IEAGXR2ENH777777"
    }
  ]
}

Update User

PUT /wrike/api/v4/users/{userId}
PUT /wrike/api/v4/users/{userId},{userId},... (up to 100 IDs)

Access Roles (Admin)

List Access Roles

GET /wrike/api/v4/access_roles

Response:

{
  "kind": "accessRoles",
  "data": [
    {
      "id": "IEAGXR2END777777",
      "title": "Full",
      "description": "Can edit"
    },
    {
      "id": "IEAGXR2END777776",
      "title": "Editor",
      "description": "Can edit, but can't share or delete"
    },
    {
      "id": "IEAGXR2END777775",
      "title": "Limited",
      "description": "Can comment, change statuses, attach files, and start approvals"
    },
    {
      "id": "IEAGXR2END777774",
      "title": "Read Only",
      "description": "Can view"
    }
  ]
}

Audit Log (Admin)

Get Audit Log

GET /wrike/api/v4/audit_log

Response:

{
  "kind": "auditLog",
  "data": [
    {
      "id": "IEAGXR2ENQAAAAABMUI3U3A",
      "operation": "UserLoggedIn",
      "userId": "KUAXHKXS",
      "userEmail": "user@example.com",
      "eventDate": "2026-03-10T07:24:24Z",
      "ipAddress": "35.84.133.252",
      "objectType": "User",
      "objectName": "user@example.com",
      "objectId": "KUAXHKXS",
      "details": {
        "Login Type": "Oauth2",
        "User Agent": "Nango"
      }
    }
  ]
}

Common Operations:

  • UserLoggedIn - User login events
  • Oauth2AccessGranted - OAuth authorization events
  • TaskCreated, TaskDeleted, TaskModified - Task operations
  • FolderCreated, FolderDeleted - Folder operations
  • CommentAdded - Comment events

Data Export (Admin)

Get Data Export

GET /wrike/api/v4/data_export
GET /wrike/api/v4/data_export/{data_exportId}

Returns 202 on first request (export generation starts automatically). Subsequent calls return available daily-updated exports.

Refresh Data Export

POST /wrike/api/v4/data_export

Triggers a new data export refresh.

Get Data Export Schema

GET /wrike/api/v4/data_export_schema

Retrieves the schema documentation for export tables.

Response Format

All Wrike API responses follow a standardized JSON structure:

{
  "kind": "[resource_type]",
  "data": [...]
}

Pagination

Some endpoints support pagination with nextPageToken:

{
  "kind": "timelogs",
  "nextPageToken": "AFZ2V4QAAAAA6AAAAAAAAAAAAAAAAAAA22NEEX6HNLKBU",
  "responseSize": 100,
  "data": [...]
}

Use pageToken parameter for subsequent requests:

GET /wrike/api/v4/timelogs?pageToken={nextPageToken}

Code Examples

JavaScript

async function listTasks() {
  const response = await fetch(
    'https://gateway.maton.ai/wrike/api/v4/tasks',
    {
      headers: {
        'Authorization': `Bearer ${process.env.MATON_API_KEY}`
      }
    }
  );
  return await response.json();
}

async function createTask(folderId, title) {
  const response = await fetch(
    `https://gateway.maton.ai/wrike/api/v4/folders/${folderId}/tasks`,
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ title })
    }
  );
  return await response.json();
}

Python

import os
import json
import urllib.request

def list_tasks():
    url = 'https://gateway.maton.ai/wrike/api/v4/tasks'
    req = urllib.request.Request(url)
    req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
    return json.load(urllib.request.urlopen(req))

def create_task(folder_id, title):
    url = f'https://gateway.maton.ai/wrike/api/v4/folders/{folder_id}/tasks'
    data = json.dumps({'title': title}).encode()
    req = urllib.request.Request(url, data=data, method='POST')
    req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
    req.add_header('Content-Type', 'application/json')
    return json.load(urllib.request.urlopen(req))

Notes

  • Batch Operations: Many endpoints support up to 100 IDs in a single request (comma-separated)
  • Custom Status IDs: Tasks use customStatusId to reference workflow statuses
  • Projects vs Folders: Projects are folders with additional properties (owners, dates, status)
  • IMPORTANT: When using curl commands with URLs containing brackets, use curl -g to disable glob parsing
  • IMPORTANT: When piping curl output to jq, environment variables may not expand correctly in some shells

Error Handling

Status Meaning
400 Bad request or invalid parameters
401 Invalid or missing API key
403 Insufficient permissions/scopes
404 Resource not found
429 Rate limited
4xx/5xx Passthrough error from Wrike API

Resources

Reviews (0)

Sign in to write a review.

No reviews yet. Be the first to review!

Comments (0)

Sign in to join the discussion.

No comments yet. Be the first to share your thoughts!

Compatible Platforms

Pricing

Free

Related Configs