Official Python SDK for the SoftSolz platform API.
Project description
softsolz
Official Python SDK for the SoftSolz platform API.
pip install softsolz
Requires Python 3.9 or later. Fully type-annotated (py.typed).
Usage
import os
from softsolz import SoftSolz
client = SoftSolz(api_key=os.environ["SOFTSOLZ_API_KEY"])
me = client.whoami()
form = client.forms.create_form({"name": "Contact Us", "status": "published"})
client.forms.submit_form(form["slug"], {"data": {"full_name": "Jane Doe", "email": "jane@example.com"}})
invoice = client.invoicing.create_invoice({
"customer_id": 42,
"lines": [{"description": "Design work", "quantity": 1, "unit_price_cents": 50000}],
})
client.invoicing.send_invoice(invoice["id"])
Use an sk_test_* key to run against your sandbox workspace; swap to sk_live_* in production. No other configuration changes.
Services
client.blogs, client.customer_auth, client.forms, client.invoicing, client.payments, client.smart_chat, client.social, client.workflows - one method per API operation, generated from the platform's service manifests.
Pagination
List methods return a Page you can iterate; extra pages are fetched automatically:
for invoice in client.invoicing.list_invoices({"status": "overdue"}):
print(invoice["invoice_number"])
Or page manually with page.data, page.has_more, and page.next_page().
Errors
All API failures raise a typed subclass of SoftSolzError carrying status, code, message, details, and request_id:
from softsolz import NotFoundError
try:
client.forms.get_form(999)
except NotFoundError as err:
print(err.code, err.request_id)
Classes: InvalidRequestError (400/422), AuthenticationError (401), PaymentRequiredError (402), PermissionDeniedError (403), NotFoundError (404), ConflictError (409), RateLimitError (429, with retry_after_seconds), APIConnectionError (network).
Retries and idempotency
429 and 5xx responses are retried automatically with exponential backoff (default 2 retries), honouring Retry-After. Every mutating request carries an auto-generated Idempotency-Key, so retries are always safe. Pass your own to control replays:
client.invoicing.create_invoice(body, idempotency_key="order-1234")
Configure per client: SoftSolz(api_key=..., max_retries=3, timeout=60.0).
Webhooks
Verify the Softsolz-Signature header on incoming webhooks using the raw request body:
from softsolz import webhooks
webhooks.assert_valid(
raw_body=request.get_data(),
header_value=request.headers.get("Softsolz-Signature"),
secret=os.environ["SOFTSOLZ_WEBHOOK_SECRET"],
)
webhooks.verify(...) returns {"valid": False, "reason": ...} if you prefer not to raise.
Escape hatch
Call any endpoint directly while keeping auth, retries, and errors:
client.request("GET", "/api/v1/services/forms/forms", query={"limit": 10})
Documentation
- API reference: https://developer.softsolz.uk/api-reference.html
- Webhooks: https://developer.softsolz.uk/webhooks.html
- Playground: https://playground.softsolz.uk
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file softsolz-0.1.1.tar.gz.
File metadata
- Download URL: softsolz-0.1.1.tar.gz
- Upload date:
- Size: 10.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98162d786bb2e64ed551d65c12b293f2b21efb541caa3d0a510a805d0f00169d
|
|
| MD5 |
be549cba961d24a972c2b01f50c1d541
|
|
| BLAKE2b-256 |
121f867c4875c41184a69806a3d434195058a8a2f051b6a99d418ce9be1b28f8
|
Provenance
The following attestation bundles were made for softsolz-0.1.1.tar.gz:
Publisher:
publish-python.yml on soft-solz/sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
softsolz-0.1.1.tar.gz -
Subject digest:
98162d786bb2e64ed551d65c12b293f2b21efb541caa3d0a510a805d0f00169d - Sigstore transparency entry: 1804970696
- Sigstore integration time:
-
Permalink:
soft-solz/sdk@eb2c9e5fa4b2ddf5236d52a7bc105214df42dae2 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/soft-solz
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python.yml@eb2c9e5fa4b2ddf5236d52a7bc105214df42dae2 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file softsolz-0.1.1-py3-none-any.whl.
File metadata
- Download URL: softsolz-0.1.1-py3-none-any.whl
- Upload date:
- Size: 14.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0668180e942805811e0c74a887a1b8c817930fa11452ac1633a84d8640f4a6b5
|
|
| MD5 |
30f2dcb24641f36226bb72bc9f00b50b
|
|
| BLAKE2b-256 |
b0c507216802356de025c8ca8735f4648e0e38b8bf4e2b4b755cf9e5f9e3fa77
|
Provenance
The following attestation bundles were made for softsolz-0.1.1-py3-none-any.whl:
Publisher:
publish-python.yml on soft-solz/sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
softsolz-0.1.1-py3-none-any.whl -
Subject digest:
0668180e942805811e0c74a887a1b8c817930fa11452ac1633a84d8640f4a6b5 - Sigstore transparency entry: 1804970705
- Sigstore integration time:
-
Permalink:
soft-solz/sdk@eb2c9e5fa4b2ddf5236d52a7bc105214df42dae2 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/soft-solz
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python.yml@eb2c9e5fa4b2ddf5236d52a7bc105214df42dae2 -
Trigger Event:
workflow_dispatch
-
Statement type: