Skip to main content

A modern, asynchronous, and type-safe Python SDK for the Zoho Projects API V3.

Project description

Zoho Projects SDK

PyPI - Version Python Versions Build Status License: MIT

A modern, asynchronous, and type-safe Python SDK for the Zoho Projects API V3.

⚠️ Project status: Active development.

Table of Contents

  1. Overview
  2. Highlights
  3. Installation
  4. Configuration
  5. Quick Start
  6. Usage Examples
  7. Architecture
  8. Implemented API Modules
  9. Error Handling & Logging
  10. Development Workflow
  11. Testing Strategy
  12. Contributing
  13. Support & Resources
  14. License

Overview

zoho-projects-sdk wraps the Zoho Projects API with an async-first interface that manages authentication, retries, and data validation for you. The SDK is built on top of httpx, tenacity, and Pydantic V2, giving you a strongly typed client that integrates naturally into modern Python applications.

Highlights

  • Async by default: Every API call is asynchronous to keep your applications responsive under heavy I/O loads.
  • OAuth2 made simple: Automatic access-token refresh handled via ZohoOAuth2Handler with environment-driven configuration.
  • Strong typing everywhere: Responses map to Pydantic models so you get IDE autocomplete and runtime validation for free.
  • Resilient networking: Built-in retries with exponential backoff for transient HTTP errors thanks to tenacity integration.
  • Extensible surface: Resource-specific service classes (projects, tasks, timelogs, etc.) keep the codebase modular and easy to extend.

Installation

Requires Python 3.9+.

pip install zoho-projects-sdk

Or with uv:

uv pip install zoho-projects-sdk

Configuration

The SDK reads credentials from environment variables (directly or via .env).

# .env
ZOHO_PROJECTS_CLIENT_ID="your_client_id"
ZOHO_PROJECTS_CLIENT_SECRET="your_client_secret"
ZOHO_PROJECTS_REFRESH_TOKEN="your_refresh_token"
ZOHO_PROJECTS_PORTAL_ID="your_portal_id"

You can also pass credentials explicitly when instantiating ZohoProjects:

from zoho_projects_sdk.client import ZohoProjects

client = ZohoProjects(
    client_id="...",
    client_secret="...",
    refresh_token="...",
    portal_id="...",
)

Quick Start

import asyncio
from zoho_projects_sdk.client import ZohoProjects


async def main() -> None:
    async with ZohoProjects() as client:
        projects = await client.projects.get_all()
        for project in projects:
            print(project.name)


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

The async context manager ensures the underlying HTTP connection pool is closed cleanly when you are done.

Usage Examples

Fetch a single project

project = await client.projects.get(project_id=123456789)
print(project.id, project.status)

Create a project

from zoho_projects_sdk.models.project_models import Project

new_project = Project(
    name="SDK Launch",
    description="Ship the SDK to production",
)

created = await client.projects.create(new_project)
print(created.id)

Update existing data

updated = await client.projects.update(project_id=created.id, project_data=new_project)
print(updated.updated_time)

Timelog queries with filters

entries = await client.timelogs.get_by_user(user_id=987654321, from_date="2024-01-01", to_date="2024-01-31")
total_hours = sum(entry.hours for entry in entries)
print(total_hours)

Explore the timelogs, tasks, issues, and other service modules for more endpoint-specific helpers. They follow the same async pattern documented above.

Ready-to-run scripts

Architecture

graph TD
    subgraph User Application
        A[Your App]
    end

    subgraph zoho-projects-sdk
        B[ApiClient]
        C[API Modules]
        D[Pydantic Models]
        E[ZohoOAuth2Handler]
        F[Custom Exceptions]
        G[Configuration]
    end

    subgraph External
        H[Zoho Projects API]
        I[.env file]
    end

    A --> B
    B -- Uses --> E
    B -- Makes Calls To --> C
    C -- Interacts with --> H
    C -- Parses to/from --> D
    B -- Raises --> F
    E -- Raises --> F
    G -- Reads from --> I
    E -- Uses Config from --> G

Key components:

  • ZohoProjects client: User-facing façade exposing resource-specific services.
  • ApiClient: Internal HTTP wrapper providing retry logic, default headers, and auth injection.
  • ZohoOAuth2Handler: Refreshes tokens and handles credential loading.
  • models/: Pydantic schemas for the Zoho Projects domain.
  • api/: One module per resource grouping, each delegating network concerns to ApiClient.
  • exceptions.py: Rich error metadata for diagnosing failures.
  • utils/logger.py: Centralized logging setup for consistent formatting.@src/zoho_projects_sdk/utils/logger.py#1-36

Implemented API Modules

The following resource modules are currently available (more coming soon):

  • Attachments
  • Baselines
  • Business Hours
  • Clients
  • Comments
  • Contacts
  • Events
  • Issues
  • Milestones
  • Phases
  • Portals
  • Projects
  • Roles
  • Tags
  • Tasklists
  • Tasks
  • Timelogs
  • Users

See src/zoho_projects_sdk/api for endpoint-level details.

Error Handling & Logging

  • API failures raise APIError with status details and payload context.
  • Network-level problems (timeouts, connectivity, rate limits) are retried automatically up to three times with exponential backoff before surfacing.
  • Configure logging via zoho_projects_sdk.utils.get_logger to feed SDK logs into your existing observability pipeline.

Development Workflow

  1. Clone the repository:

    git clone https://github.com/carlospaiva/zoho-projects-sdk.git
    cd zoho-projects-sdk
    
  2. Install dependencies (production + development):

    uv pip install -e .[dev]
    
  3. Keep code formatted and linted:

    uv run format
    uv run lint
    uv run type-check
    
  4. Run the aggregated quality gate:

    uv run check
    

Testing Strategy

We target 100% line and branch coverage across unit, integration, and end-to-end suites.

  • Run everything:

    uv run test
    
  • Unit tests only:

    uv run pytest tests/unit
    
  • Integration tests (requires live credentials):

    uv run pytest tests/integration
    

Integration suites expect a populated .env so they can hit the live Zoho Projects API responsibly.

Contributing

We welcome issues and pull requests. Please:

  1. Follow the Conventional Commits specification for commit messages.
  2. Ensure uv run check and uv run test both pass before opening a PR.
  3. Include tests and documentation updates covering your changes.
  4. Provide clear reproduction steps when reporting bugs.

Support & Resources

For security-sensitive disclosures, please use responsible reporting practices rather than filing a public issue.

License

Distributed under the MIT License. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zoho_projects_sdk-0.1.7.tar.gz (166.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zoho_projects_sdk-0.1.7-py3-none-any.whl (51.3 kB view details)

Uploaded Python 3

File details

Details for the file zoho_projects_sdk-0.1.7.tar.gz.

File metadata

  • Download URL: zoho_projects_sdk-0.1.7.tar.gz
  • Upload date:
  • Size: 166.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for zoho_projects_sdk-0.1.7.tar.gz
Algorithm Hash digest
SHA256 b7823b4c857d3e7b5e2bd4114a0046edacb66282c1df1b24c7d04de983f00a94
MD5 acad0748b56e79f59d670e5eaf7f916e
BLAKE2b-256 1e24508db2601061769476c68dff955baa51f896382bebc0016c5ba508dc1126

See more details on using hashes here.

File details

Details for the file zoho_projects_sdk-0.1.7-py3-none-any.whl.

File metadata

File hashes

Hashes for zoho_projects_sdk-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 8c0a10ecb677d3543266a30b7d74462ec1fafcc75d6f5437300623de60454aa2
MD5 83731bd0f3250ba3f429a3671aadfe78
BLAKE2b-256 b448fa314d1d304d3369e036127a07bb5d9f8921feceea8edbced6dca372cf3d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page