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.1.tar.gz (10.1 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.1-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

File details

Details for the file orth-0.1.1.tar.gz.

File metadata

  • Download URL: orth-0.1.1.tar.gz
  • Upload date:
  • Size: 10.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orth-0.1.1.tar.gz
Algorithm Hash digest
SHA256 83acf331eedfdb5d89c2ac20d700b62e5818ed3119ad4b318eaca53111b134dd
MD5 19ab6d8ef642a9d4d3bcfec7d2908347
BLAKE2b-256 296539927d7072131ce9087ca7a3e133eb540630799c8939727022ee109202c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for orth-0.1.1.tar.gz:

Publisher: release.yml on orthogonal-sh/python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orth-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: orth-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 8.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orth-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2e9f9625de4f4f89175eefbf4fb9e28a661008b56c71e32e211cddcb28d6983d
MD5 e5f0b45c8c6c4b1d1868908ce9abcece
BLAKE2b-256 b5c1f34d7b717532f37b4e9caa4f931f0bb908c39527483c5773e4bf1e73e0dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for orth-0.1.1-py3-none-any.whl:

Publisher: release.yml on orthogonal-sh/python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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