PHPackages                             cpnporg/todoist-php - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. cpnporg/todoist-php

Abandoned → [brainite/todoist-php](/?search=brainite%2Ftodoist-php)ArchivedLibrary[Parsing &amp; Serialization](/categories/parsing)

cpnporg/todoist-php
===================

Access the Todoist API

v0.1.0-alpha(10y ago)572MITPHPPHP &gt;=5.3.3

Since Aug 7Pushed 2y ago2 watchersCompare

[ Source](https://github.com/cpnporg/todoist-php)[ Packagist](https://packagist.org/packages/cpnporg/todoist-php)[ Docs](https://github.com/cpnporg/todoist-php)[ RSS](/packages/cpnporg-todoist-php/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (1)Dependencies (1)Versions (2)Used By (0)

Todoist (unofficial PHP SDK)
============================

[](#todoist-unofficial-php-sdk)

Project Status
--------------

[](#project-status)

*This project is no longer maintained.*

Currently, this project provides read-only access to Todoist Tasks and Projects. It adds some basic filtering and manipulation capabilities that are not provided by the API directly.

Basic Usage
-----------

[](#basic-usage)

```
$todoist = new Todoist\Todoist($token);
$tasks = $todoist->getTasks();
$projects = $todoist->getProjects();
```

Design Decision
---------------

[](#design-decision)

`Tasks` and `Projects` are intended to be iterable, chainable and immutable. Each custom method added to the classes return a new object with copies of the items rather than references.

```
foreach ($todoist->getTasks()->filterByProject('Project Name') as $task) {
  // $task is now an array derived from Todoist JSON.
}
```

Task Methods
------------

[](#task-methods)

```
// Filter tasks by project name or ID.
$tasks = $tasks->filterByProject('Project Name');
$tasks = $tasks->filterByProject($project_id);

// Filter tasks by regular expression.
$tasks = $tasks->filterByContentPreg('/regex for task content/');

// Manipulate task content by prepending or appending parent task content.
$tasks = $tasks->applyParentTasks(array(
  // 'prepend' or 'append' parent content
  // default: prepend
  'apply' => 'prepend',

  // Strip content 'pre', 'post' or other from parent task with a colon before adding it.
  // default: '' (do not strip colon content from parent)
  'strip_colon' => 'post',

  // Configure the delimiter to use between task and parent task content.
  // default: ': '
  'delimiter' => ': ',

  // Only apply the parent to short tasks (NULL = apply to all)
  // default: NULL
  'strlen_max' => 5,
));
```

Sync Project Hierarchy
----------------------

[](#sync-project-hierarchy)

WARNING: Each user receives a custom project\_id. Therefore, the project hierarchy sync relies on distinct project names regardless of indentation.

WARNING: It is also important to use the Command Queue to avoid the rate limit error from Todoist.

The following example syncs projects and moves unknown projects to the top.

```
$source_todoist = Todoist::factory($source_token);
$source_projects = $source_todoist->getProjects();

try {
  $todoist = Todoist::factory($token);
  $todoist->useCommandQueue(TRUE);
  $projects = &$todoist->getProjects();
  $projects->syncOrderIndent($source_projects, 'top');
  $todoist->flushCommandQueue();
} catch (\Exception $e) {
  echo "Error: " . $e->getMessage() . "\n";
}
```

###  Health Score

23

—

LowBetter than 27% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity13

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity44

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

3929d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/f8b424d95c68ad9bded85c3a0bc9c659078f703bf754ff359f3726f1b913c263?d=identicon)[wittiws](/maintainers/wittiws)

---

Top Contributors

[![stackpr](https://avatars.githubusercontent.com/u/1994413?v=4)](https://github.com/stackpr "stackpr (24 commits)")

---

Tags

xml

### Embed Badge

![Health badge](/badges/cpnporg-todoist-php/health.svg)

```
[![Health](https://phpackages.com/badges/cpnporg-todoist-php/health.svg)](https://phpackages.com/packages/cpnporg-todoist-php)
```

###  Alternatives

[masterminds/html5

An HTML5 parser and serializer.

1.8k242.8M229](/packages/masterminds-html5)[jms/serializer

Library for (de-)serializing data of any complexity; supports XML, and JSON.

2.3k135.8M851](/packages/jms-serializer)[jms/metadata

Class/method/property metadata management in PHP

1.8k152.8M88](/packages/jms-metadata)[jms/serializer-bundle

Allows you to easily serialize, and deserialize data of any complexity

1.8k89.3M626](/packages/jms-serializer-bundle)[sabre/xml

sabre/xml is an XML library that you may not hate.

52832.2M131](/packages/sabre-xml)[vipnytt/sitemapparser

XML Sitemap parser class compliant with the Sitemaps.org protocol.

772.2M10](/packages/vipnytt-sitemapparser)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
