Skip to main content

guidon-sdk - Python SDK for Guidon

Official Python client for the Guidon REST API (/api/v1): projects, tasks, subtasks, comments, attempts, bug reports and project knowledge (decisions, knowledge sources, roadmap, memory, tech stack).

  • Standard library only (urllib), no dependencies.
  • Python 3.9+.
  • Works with Guidon Cloud (https://useguidon.com) and self-hosted instances.

Install

The PyPI release is pending. The command below will work after the guidon-sdk package is published. The import name remains guidon.

pip install guidon-sdk

Authenticate

Create an API key in Guidon: Profile -> API keys. A key acts as you, limited to the scopes you gave it (tasks:read, tasks:write, tasks:status, comments:write, attempts:write, project:read, project:write, reports:write).

from guidon import Guidon

guidon = Guidon(api_key="guidon_...")          # or set GUIDON_API_KEY
# Self-hosted:
guidon = Guidon(api_key="guidon_...", base_url="https://guidon.example.com")  # or GUIDON_BASE_URL

Usage

project = guidon.projects.list()[0]

columns = guidon.projects.columns(project["id"])        # the board's column keys
todo = guidon.tasks.list(project["id"], status="todo")  # filters applied client-side

task = guidon.tasks.create(project["id"], "Fix the jump", priority="high", status="todo")
guidon.tasks.update(task["id"], description="Feels floaty on 30 Hz monitors")
guidon.tasks.move(task["id"], "in_progress")
guidon.comments.create(task["id"], "Started on this")

sub = guidon.subtasks.create(project["id"], task["id"], "Write a repro")
print(guidon.tasks.context(task["id"]))                 # Markdown working context

guidon.attempts.record(
    task["id"], problem="Jump height varies", approach="Fixed timestep", outcome="partial",
    files_changed=["src/player.gd"],
)

guidon.decisions.create(project["id"], title="Use Godot 4.4", decision_type="technical")
guidon.memory.create(project["id"], content="Builds ship from main only", memory_type="project_rule")
Attribute Methods
projects list(), columns(pid), priorities(pid), references(pid)
tasks list(pid, status=, parent_task_id=), list_page(pid, limit=, cursor=), iter(pid), get, create, update, move, delete, start, complete, context
subtasks list(pid, parent_id), create(pid, parent_id, title, ...)
comments list(task_id), create(task_id, content)
attempts list(task_id), record(task_id, problem=, approach=, outcome=, ...)
reports file(pid, title, files=[(name, bytes, content_type)], ...)
decisions, knowledge, roadmap, memory, technologies list(pid), get(pid, id), create(pid, **fields), update(pid, id, **fields), delete(pid, id)
request(method, path, query=, json=) escape hatch for routes not wrapped yet

Results are the API's JSON objects as plain dicts.

Idempotency

Every write method takes idempotency_key=..., sent as the Idempotency-Key header. Reuse the same key when retrying the same logical write. With a key, the SDK also retries the write automatically on 429/502/503/504 and network errors.

Errors

Everything raises guidon.GuidonError:

from guidon import GuidonError

try:
    guidon.tasks.move(task_id, "done")
except GuidonError as e:
    print(e.status, e.code, e.message)   # 404 not_found Task not found.
  • status: HTTP status, 0 when no response was received.
  • code: the server's code if it sent one, else derived from the status with the server's own table (invalid_request, unauthorized, forbidden, not_found, conflict, unprocessable, rate_limited, internal_error, unavailable...); or network_error, timeout, invalid_response, missing_api_key, invalid_base_url when there was no usable response.
  • message: the error text from the JSON body ({"error": "..."}).
  • hint, docs: the server's "what to do now" and docs link, when sent.
  • also body, retry_after, request_id, method, url.

GET requests are retried (default max_retries=2) on 429/502/503/504 and network errors, honouring Retry-After. Writes are retried only with an idempotency_key (then also on 409 idempotency_in_progress).

Pagination

The task list is cursor-paginated (newest first, up to 1000 per page):

for task in guidon.tasks.iter(project_id, page_size=200):   # fetched page by page
    print(task["title"])

page = guidon.tasks.list_page(project_id, limit=100)        # {"tasks": [...], "next_cursor": ...}
while page["next_cursor"]:
    page = guidon.tasks.list_page(project_id, limit=100, cursor=page["next_cursor"])

tasks.list() fetches every page and returns a list; its status and parent_task_id filters run client-side (the API has no server-side filters). Against a server that doesn't paginate yet, the first page is the whole list. The other list endpoints return everything in one response (up to 500 items for the knowledge collections).

Development

cd sdk/python
python -m unittest discover -s tests -v   # mock http.server, no network
python -m build                           # needs `pip install build`

Links: Homepage - Source - API reference: https://useguidon.com/openapi.json

License

MIT - see LICENSE. This licence covers this SDK/CLI package, not the Guidon service or the rest of the application.

Metadata

Release files for guidon-sdk 0.1.0

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

Source distribution (sdist)

Source distribution for guidon-sdk 0.1.0
File Size Uploaded Provenance Actions
guidon_sdk-0.1.0.tar.gz 16.5 kB With provenance Details for guidon_sdk-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for guidon-sdk 0.1.0
File Interpreter ABI Platform Actions
guidon_sdk-0.1.0-py3-none-any.whl Python 3 none any Details for guidon_sdk-0.1.0-py3-none-any.whl

Total release size: 30.5 kB

Release files / guidon_sdk-0.1.0.tar.gz

Download URL guidon_sdk-0.1.0.tar.gz
Size 16.5 kB
Tags Source
SHA-256 checksum
How to use checksums
f150dad8250fd4f886546b35620d60bfa815cd698b9f6b6359a2511d9ad9318a
BLAKE2b-256 checksum
How to use checksums
6a40047056f7f2ee8d1016d80452c35c38ba2d88fd3a9e79ba2a02520cc27852
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 8, 2026.

Transparency log

Release files / guidon_sdk-0.1.0-py3-none-any.whl

Download URL guidon_sdk-0.1.0-py3-none-any.whl
Size 13.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
323b1de6ca44db863a6d3c64f191a4c5371ac52590271e02a1005a138df0b638
BLAKE2b-256 checksum
How to use checksums
e60f667c8339bf338ae41d0ebde7ae6ba443d37fb1e9f4e7bd4c985e00201396
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 8, 2026.

Transparency log

Security for guidon-sdk 0.1.0

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 guidon_sdk-0.1.0.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 Nov 8, 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.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

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