Skip to main content

dida365-api

An unofficial Python client library for the Dida365/TickTick API, supporting both the Chinese (Dida365) and international (TickTick) versions of the service. Built with modern async Python and robust error handling.

Forked from Cyfine/TickTick-Dida365-API-Client — thanks to Carter Yifeng Cheng (@cyfine) for the original project.

This is a community package created to facilitate task management automation. It is not affiliated with or endorsed by Dida365 or TickTick.

Installation

pip install dida365-api

To install the latest development version directly from GitHub:

pip install git+https://github.com/Konano/dida365-api.git

Quick Start

import asyncio
from dida365 import Dida365Client, ServiceType, TaskCreate, TaskPriority

async def main():
    # Credentials can be passed via constructor, .env file, or environment variables
    client = Dida365Client(
        client_id="your_client_id",
        client_secret="your_client_secret",
        service_type=ServiceType.TICKTICK,  # or ServiceType.DIDA365
        redirect_uri="http://localhost:8080/callback",
        save_to_env=True,  # automatically save credentials & tokens to .env
        # access_token="your_access_token",  # If you already have an access_token, pass it directly to skip OAuth
    )

    # First-time authentication (opens browser, starts local callback server)
    if not client.auth.token:
        await client.authenticate()

    # Create a task
    task = await client.create_task(
        TaskCreate(
            project_id="your_project_id",
            title="My new task",
            content="Task description",
            priority=TaskPriority.HIGH,
        )
    )
    print(f"Created task: {task.title}")

if __name__ == "__main__":
    asyncio.run(main())

Configuration

Credentials can be provided in three ways (checked in this order):

  1. Constructor parameters — directly pass client_id, client_secret, access_token, etc.
  2. .env file — create a .env in your working directory
  3. Environment variables

Example .env file:

DIDA365_CLIENT_ID=your_client_id
DIDA365_CLIENT_SECRET=your_client_secret
DIDA365_REDIRECT_URI=http://localhost:8080/callback
DIDA365_SERVICE_TYPE=ticktick  # or dida365
DIDA365_ACCESS_TOKEN=your_token  # optional: set to skip OAuth flow

OAuth2 Setup

  1. Get your credentials:
  2. In your app's settings, add the redirect URL: http://localhost:8080/callback

API Reference

Official documentation:

Usage

Tasks

from dida365 import TaskCreate, TaskUpdate, TaskPriority, TaskStatus

# Create
task = await client.create_task(
    TaskCreate(
        project_id="project_id",
        title="Complete documentation",
        priority=TaskPriority.HIGH,
    )
)

# Read
task = await client.get_task(project_id="project_id", task_id=task.id)

# Update
task = await client.update_task(
    TaskUpdate(
        id=task.id,
        project_id=task.project_id,
        title="Updated title",
    )
)

# Complete
await client.complete_task(project_id=task.project_id, task_id=task.id)

# Delete
await client.delete_task(project_id=task.project_id, task_id=task.id)

# Filter tasks
tasks = await client.filter_tasks(
    project_ids=["project_id"],
    priority=[TaskPriority.HIGH],
    status=[TaskStatus.NORMAL],
)

Projects

from dida365 import ProjectCreate, ProjectUpdate, ViewMode

# Create
project = await client.create_project(
    ProjectCreate(name="My Project", color="#FF0000", view_mode=ViewMode.KANBAN)
)

# List all
projects = await client.get_projects()

# Get with tasks & columns
data = await client.get_project_with_data(project_id=project.id)

# Update
project = await client.update_project(
    ProjectUpdate(id=project.id, name="Renamed Project")
)

# Delete
await client.delete_project(project_id=project.id)

Tags

from dida365 import TagCreate

# List tags
tags = await client.get_tags()

# Create a tag
tag = await client.create_tag(TagCreate(name="urgent", label="urgent"))

Habits

from dida365 import HabitCreate, HabitUpdate

# List all habits
habits = await client.get_all_habits()

# Create a habit
habit = await client.create_habit(
    HabitCreate(name="Morning run", color="#00FF00", sort_order=0)
)

# Update a habit
habit = await client.update_habit(habit_id=habit.id, habit=HabitUpdate(name="Evening run"))

# Get habit checkins
checkins = await client.get_habit_checkins(
    habit_ids=habit.id, from_stamp=20240101, to_stamp=20240131
)

Focus

from datetime import datetime, timezone, timedelta
from dida365 import FocusCreate, FocusType

# Get focus sessions
sessions = await client.get_focuses(
    from_date="2024-01-01T00:00:00+0800",
    to_date="2024-01-31T00:00:00+0800",
    focus_type=FocusType.POMODORO,
)

# Create a focus session
focus = await client.create_focus(
    FocusCreate(
        type=FocusType.POMODORO,
        start_time=datetime(2024, 1, 1, 9, 0, 0, tzinfo=timezone(timedelta(hours=8))),
        end_time=datetime(2024, 1, 1, 9, 25, 0, tzinfo=timezone(timedelta(hours=8))),
        duration=1500,
    )
)

Countdown

# List all countdowns
countdowns = await client.get_countdowns()

Requirements

  • Python 3.10 or higher

Contributing

Contributions are welcome! Feel free to submit a Pull Request.

License

This project is licensed under the MIT License — see the LICENSE file for details.

Author

Original project by Carter Yifeng Cheng (@cyfine).
This fork maintained by Konano.

Metadata

Release files for dida365-api 0.2.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dida365-api 0.2.5
File Size Uploaded Provenance Actions
dida365_api-0.2.5.tar.gz 27.4 kB With provenance Details for dida365_api-0.2.5.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for dida365-api 0.2.5
File Interpreter ABI Platform Actions
dida365_api-0.2.5-py3-none-any.whl Python 3 none any Details for dida365_api-0.2.5-py3-none-any.whl

Total release size: 55.4 kB

Release files / dida365_api-0.2.5.tar.gz

Download URL dida365_api-0.2.5.tar.gz
Size 27.4 kB
Tags Source
SHA-256 checksum
How to use checksums
3427377786edb6967065cf19f5b194a3f7ea9df252e458775a0b79f3e3593c74
BLAKE2b-256 checksum
How to use checksums
7a8641056cdc47a667f804337dcbb4d383b702df78aa677e71b055c8004f160c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / dida365_api-0.2.5-py3-none-any.whl

Download URL dida365_api-0.2.5-py3-none-any.whl
Size 28.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3006133ac3fafd1a2c34f9ca17f8792090abd4cb002947d537a6e1bf09834e9d
BLAKE2b-256 checksum
How to use checksums
dcbf35a1c489454db1477e3a1e133d384c3225b5104faf972a60c51f8dc6c795
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Security for dida365-api 0.2.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for dida365_api-0.2.5.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page