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,0when no response was received.code: the server'scodeif 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...); ornetwork_error,timeout,invalid_response,missing_api_key,invalid_base_urlwhen there was no usable response.message: theerrortext 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)
| 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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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 logRelease 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 logSecurity 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.
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 logA 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.