Python SDK to call any API on the Orthogonal platform
Project description
Orthogonal Python SDK
Python SDK for calling APIs on the Orthogonal platform.
Call any API on the Orthogonal platform through one client and one credit balance — authentication, routing, and billing are handled for you.
Table of Contents
- Why Orthogonal
- Installation
- Quick Start
- Authentication
- Usage
- Async Usage
- Error Handling
- API Reference
- Related
- License
Why Orthogonal
Orthogonal puts a catalog of APIs behind one account and one balance:
- One integration — call any API on the platform through a single
run()method. - Pay per use — a single credit balance instead of juggling dozens of provider subscriptions.
- Sync and async — a blocking
Orthogonalclient and anawait-ableAsyncOrthogonal, both usable as context managers. - Typed —
RunOptions/RunResponsetyped dicts and full type hints.
Installation
Requires Python 3.9+.
pip install orth
Quick Start
import os
from orthogonal import Orthogonal
with Orthogonal(api_key=os.environ["ORTHOGONAL_API_KEY"]) as orthogonal:
res = orthogonal.run(
api="tavily",
path="/search",
query={"query": "latest AI news"},
)
print(res["data"]) # the upstream API's response
print(res["price"]) # amount charged, e.g. "0.01"
Get an API key from your Orthogonal dashboard.
Authentication
Pass your key to the constructor (reading it from the environment keeps keys out of source):
orthogonal = Orthogonal(api_key=os.environ["ORTHOGONAL_API_KEY"])
Usage
GET request (query params)
res = orthogonal.run(
api="fantastic-jobs",
path="/v1/active-ats",
query={"time_frame": "1h", "limit": 10},
)
POST request (JSON body)
res = orthogonal.run(
api="some-api",
path="/v1/generate",
body={"prompt": "a red bicycle"},
)
Options dict instead of keyword arguments
res = orthogonal.run({
"api": "tavily",
"path": "/search",
"query": {"query": "hello world"},
})
Custom headers
Headers passed to the constructor are sent on every request:
orthogonal = Orthogonal(
api_key=os.environ["ORTHOGONAL_API_KEY"],
headers={"x-my-trace-id": "abc123"},
)
Async Usage
AsyncOrthogonal mirrors the sync client with await and async with:
import asyncio
from orthogonal import AsyncOrthogonal
async def main():
async with AsyncOrthogonal(api_key=os.environ["ORTHOGONAL_API_KEY"]) as orthogonal:
res = await orthogonal.run(
api="tavily",
path="/search",
query={"query": "orthogonal"},
)
print(res["data"])
asyncio.run(main())
Error Handling
run() returns the response on success and raises OrthogonalError on any non-2xx response (invalid key, insufficient credits, or an upstream/validation error). The message describes what went wrong.
from orthogonal import Orthogonal, OrthogonalError
try:
res = orthogonal.run(api="tavily", path="/search", query={"query": "x"})
except OrthogonalError as err:
print(f"request failed: {err}")
API Reference
Orthogonal(api_key, *, headers=None, base_url=...)
| Argument | Type | Description |
|---|---|---|
api_key |
str |
Required. Your Orthogonal API key (orth_live_… / orth_test_…). |
headers |
Mapping[str, str] | None |
Optional headers sent on every request. |
base_url |
str |
Override the API base URL (advanced). |
orthogonal.run(options=None, *, api, path, query=None, body=None) → RunResponse
Call an endpoint. Pass either an options dict or keyword arguments (not both).
| Argument | Type | Description |
|---|---|---|
api |
str |
Required. The API slug (e.g. "tavily"). |
path |
str |
Required. The endpoint path (e.g. "/search"). |
query |
Mapping[str, JSONValue] |
Query parameters. |
body |
Mapping[str, JSONValue] |
Request body for POST/PUT/PATCH. |
RunResponse (a TypedDict)
| Key | Type | Description |
|---|---|---|
success |
bool |
Whether the call succeeded. |
price |
str |
Amount charged in USD (e.g. "0.01"). |
data |
JSONValue |
The upstream API's response. |
AsyncOrthogonal(...)
Same constructor and run(...) signature as Orthogonal, but run() is a coroutine (await) and the client supports async with / await client.close().
OrthogonalError
Raised by run() on a non-2xx response. Subclass of Exception; str(err) is a human-readable message.
Both clients are context managers — use with / async with (or call close()) so the underlying HTTP connection is released.
Related
License
MIT © Orthogonal
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 orth-0.1.0.tar.gz.
File metadata
- Download URL: orth-0.1.0.tar.gz
- Upload date:
- Size: 7.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41e7037e6bf7dd2d4afe2e6b2343560cd50987e86eea4f8d8ed518e6f36cb2c4
|
|
| MD5 |
311312c42fd6f7f3bd8e03a3f639695c
|
|
| BLAKE2b-256 |
dc39a557e4c7275c88d811bf307e1fd1907cb67d48d18f2f1f714b69e086165f
|
File details
Details for the file orth-0.1.0-py3-none-any.whl.
File metadata
- Download URL: orth-0.1.0-py3-none-any.whl
- Upload date:
- Size: 8.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
027895a5da47e360b37a9b06c8e56aaf7915eaac012fcae39786ec4d279ebfa0
|
|
| MD5 |
b51471daacd88ddd5b4485a66be7fabf
|
|
| BLAKE2b-256 |
e306914946d01c06dee8a934b2dc820d68e5cca2d332bbc96c8efbb8cedb0143
|