Skip to main content

simpro-py

A thin Python client for the SimPro Cloud REST API (v1.0).

from simpro import SimproClient

client = SimproClient("https://yourtenant.simprosuite.com", "YOUR_API_KEY")

for customer in client.customers.iter_all(0):
    print(customer["ID"], customer.get("CompanyName") or customer.get("FamilyName"))

The distribution is simpro-py-sdk; the import name is simpro.

Install

pip install simpro-py-sdk

Requires Python 3.12+. The only runtime dependency is httpx.

Authentication

SimPro API keys are bearer tokens — create one in SimPro under Administration > API Keys and pass it with your tenant base URL:

client = SimproClient("https://yourtenant.simprosuite.com", "YOUR_API_KEY")

Every request is sent to {base_url}/api/v1.0/.... If your base_url already ends with /api/v1.0 it is stripped automatically, so the well-known doubled-prefix 404 (Invalid route) cannot happen.

Resources

0.1.x ships read-only access to the first-slice resources, one namespace per resource, hung off the client:

Namespace Endpoints
client.companies list(*, search=None, modified_since=None, **filters), get(company_id)
client.customers list(company_id, ...), get(company_id, customer_id), iter_all(company_id, **filters)
client.sites list(company_id, ...), get(company_id, site_id), iter_all(company_id, **filters)
client.jobs list(company_id, ...), get(company_id, job_id), iter_all(company_id, **filters)

company_id is 0 unless your build uses SimPro multi-company.

Notes:

  • Single-customer GETs are type-split in SimPro (company vs individual). client.customers.get(company_id, customer_id) tries the company path first and falls back to individuals, so callers never need the type up front.
  • search is SimPro's documented match-mode param ("all"/"any") that combines with field filters. Field filters themselves are passed verbatim as extra keyword arguments, e.g. client.customers.list(0, Name="Acme").
  • All methods return plain dicts/lists — no DTO layer by design.

Pagination

list() fetches a single page (page, per_page, capped at SimPro's maximum of 250). iter_all() walks every page for you:

for job in client.jobs.iter_all(0):
    ...

Page continuation follows the SimPro convention: the Result-Pages response header carries the total page count; if it is absent, the walk stops on a short page.

Incremental pulls

List endpoints honour the If-Modified-Since watermark. Pass modified_since=<datetime> and the client formats the header (RFC 1123, UTC) and maps a 304 Not Modified answer to an empty result:

since = last_sync_run_at  # aware datetime; naive values are treated as UTC
new_customers = client.customers.list(0, modified_since=since)

Errors

All failures raise a subclass of SimproError:

Exception HTTP status
SimproAuthError 401, 403
SimproNotFound 404
SimproValidationError 422 (.details holds the raw error list)
SimproRateLimitError 429
SimproError anything else, including transport failures

SimPro 422 bodies are normally {"errors": [{"path", "message", "value"}, ...]} but the errors key may be absent — both shapes are handled, and SimproValidationError.details is always a list.

Deliberate omissions

  • No retry, no rate limiting, no caching. SimPro allows roughly 10 requests/second per key; callers doing bulk pulls should pace requests and retry 429s/transport errors themselves.
  • No write endpoints in 0.1.x — read-only first.
  • No DTO layer — responses are plain JSON dicts, so SDK releases never lag the API.

Lineage

This package is a clean rewrite of limx0/simpro-py (MIT), which wrapped SimPro's legacy on-prem JSON-RPC API. The rewrite targets the SimPro Cloud REST API and shares no code with the original; the MIT licence and lineage are retained with thanks.

Development

uv sync
uv run pytest -q
uv run ruff check . && uv run ruff format --check .
uv run mypy

Licence

MIT — see LICENCE.txt.

Metadata

Release files for simpro-py-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 simpro-py-sdk 0.1.0
File Size Uploaded
simpro_py_sdk-0.1.0.tar.gz 37.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for simpro-py-sdk 0.1.0
File Interpreter ABI Platform
simpro_py_sdk-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 50.4 kB

Release files / simpro_py_sdk-0.1.0.tar.gz

Download URL simpro_py_sdk-0.1.0.tar.gz
Size 37.4 kB
Tags Source
SHA-256 checksum
How to use checksums
ca31464d203a86fd951f371eff37fd98166e7e4239a16c8d00edb74232cc0814
BLAKE2b-256 checksum
How to use checksums
f621552b9f1215344f3aea3dab3cb49eaaaeada1695da32d951cfb476d6aa845
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.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 Oct 10, 2026.

Transparency log

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

Download URL simpro_py_sdk-0.1.0-py3-none-any.whl
Size 12.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cc60d76c23105340a7efa67b9a5edc362268714d01e0f8b36647b13e730350e4
BLAKE2b-256 checksum
How to use checksums
afaf6f34cbe4a992db1d28bf63f1382b06147fa0675d48a5325d0a19c49b6278
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.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 Oct 10, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.0

2 release files

0.1.1

2 release files

This release

0.1.0 This release

2 release files

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