Skip to main content

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.

python license

Table of Contents

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 Orthogonal client and an await-able AsyncOrthogonal, both usable as context managers.
  • TypedRunOptions / RunResponse typed 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

  • @orth/cli — the Orthogonal command-line tool.
  • @orth/sdk — the official TypeScript/JavaScript SDK.

License

MIT © Orthogonal

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

orth-0.1.0.tar.gz (7.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

orth-0.1.0-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

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

Hashes for orth-0.1.0.tar.gz
Algorithm Hash digest
SHA256 41e7037e6bf7dd2d4afe2e6b2343560cd50987e86eea4f8d8ed518e6f36cb2c4
MD5 311312c42fd6f7f3bd8e03a3f639695c
BLAKE2b-256 dc39a557e4c7275c88d811bf307e1fd1907cb67d48d18f2f1f714b69e086165f

See more details on using hashes here.

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

Hashes for orth-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 027895a5da47e360b37a9b06c8e56aaf7915eaac012fcae39786ec4d279ebfa0
MD5 b51471daacd88ddd5b4485a66be7fabf
BLAKE2b-256 e306914946d01c06dee8a934b2dc820d68e5cca2d332bbc96c8efbb8cedb0143

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page