Skip to main content

RunAPI Core Python SDK

The RunAPI Core Python SDK provides shared authentication, HTTP, retry, error, Files, Uploads, and polling primitives for RunAPI model packages. Install runapi-core only when you are building SDK infrastructure or shared Python tooling; application code should normally install a concrete model package such as runapi-flux-2.

Install

pip install runapi-core

Notes

Use the core package for common client options, error classes, request helpers, file uploads, live pricing, account resources, and task polling behavior that Provider Clients share. Configure it globally or per client:

import runapi.core as runapi

runapi.configure(api_key="sk-...")  # or set RUNAPI_API_KEY in the environment

Request identifiers

RunAPI accepts an optional X-Client-Request-Id header on public API calls. Use printable ASCII values up to 512 characters. Accepted values are echoed in the response and stored with the RunAPI task for support and reconciliation.

Task-creation calls also accept an optional opaque Idempotency-Key up to 512 characters. Generate one value per logical task and reuse it only with identical input after an unknown result. Reusing the value with different input returns 409 Conflict; do not derive it from X-Client-Request-Id.

Recovering Interrupted Requests

Normal run() calls wait for and return the endpoint's terminal result. It also generates an Idempotency-Key before the initial POST when one was not supplied. If a lower-level request is interrupted after RunAPI accepted it, persist the opaque Location from the response and call subscribe(location) to recover the terminal result. Completed JSON responses keep their endpoint-specific type; text, SRT, and VTT responses return str.

from runapi.midjourney import MidjourneyClient

client = MidjourneyClient(api_key="sk-...")
result = client.shorten_prompt.run(prompt="A detailed cinematic mountain landscape")

# Persist this opaque URL after receiving 202 from a lower-level request.
result = client.shorten_prompt.subscribe("https://runapi.ai/api/v1/tasks/task-id")

High-level Python Provider Client resource methods accept per-request options and keep response headers on the returned model object. This example uses the Suno Provider Client; install runapi-suno to run it.

import os

from runapi.core import RequestOptions
from runapi.suno import SunoClient

client = SunoClient(api_key=os.environ["RUNAPI_API_KEY"])
options = RequestOptions(
    headers={
        "X-Client-Request-Id": "order-123",
        "Idempotency-Key": "opaque-logical-task-123",
    },
)

response = client.text_to_music.create(
    prompt="A chill lo-fi beat",
    model="suno-v4.5-plus",
    vocal_mode="instrumental",
    options=options,
)

runapi_task_id = response.runapi_task_id
# Equivalent case-insensitive lookup:
runapi_task_id = response.response_headers["X-RunAPI-Task-Id"]
from runapi.core import FilesClient

files = FilesClient()  # reads RUNAPI_API_KEY, or pass api_key="sk-..."
uploaded = files.create(file="./input.png")
remote = files.create(source="https://cdn.runapi.ai/public/samples/input.png")
inline = files.create(source="iVBORw0KGgo...")
print(uploaded.url)

The existing files.create() method keeps its temporary URL behavior. Every Provider Client also exposes persistent Files and multipart Uploads:

file = client.files.create_file(file="./knowledge.pdf", purpose="user_data")
content = client.files.content(file.id)

upload = client.uploads.create(
    bytes=1048576,
    filename="archive.bin",
    mime_type="application/octet-stream",
)
part = client.uploads.add_part(upload.id, data="./archive.part-01")
completed = client.uploads.complete(upload.id, part_ids=[part.id])

Use files.list(), retrieve(), and delete_file() for the remaining File lifecycle. See https://runapi.ai/docs/resources/files for limits and REST examples.

Public SDK docs live at https://runapi.ai/docs/resources/sdks and the model catalog lives at https://runapi.ai/models.

Universal resources

Every Provider Client exposes files, account, and pricing through one shared HTTP client. pricing.list_schedules() reads the current schedule, and pricing.create_quote() estimates a reservation without creating a Task. The schedule and ordinary quote calls do not require an API key; a quote that uses an existing Task as pricing context requires the key for that Task's Account.

from runapi.core import RequestOptions
from runapi.flux import FluxClient

client = FluxClient(api_key="sk-...")
schedules = client.pricing.list_schedules(
    service="flux",
    action="text_to_image",
    options=RequestOptions(headers={"If-None-Match": '"previous-etag"'}),
)
quote = client.pricing.create_quote(
    service="flux",
    action="text_to_image",
    model="flux-pro",
    params={"prompt": "A glass observatory"},
)

Task responses expose persisted billing facts at response.billing: reservation, settlement, and refund are typed objects when recorded and None when the historical fact is absent. These facts describe that Task and are not recalculated from the current schedule.

License

Licensed under the Apache License, Version 2.0.

Download files

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

Source Distribution

runapi_core-0.8.3.tar.gz (38.5 kB view details)

Uploaded Source

Built Distribution

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

runapi_core-0.8.3-py3-none-any.whl (34.1 kB view details)

Uploaded Python 3

File details

Details for the file runapi_core-0.8.3.tar.gz.

File metadata

  • Download URL: runapi_core-0.8.3.tar.gz
  • Upload date:
  • Size: 38.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Omarchy","version":"4.0.1","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for runapi_core-0.8.3.tar.gz
Algorithm Hash digest
SHA256 7da688608541645fd6d555cabff9e16a97e7f6328cc34aef7c2c06c505a8ddaf
MD5 25ad69f928b7b630ebc24443190b9c1a
BLAKE2b-256 c7516301ca349a6246834ca4ab9f176af3c83cd43f330414e7cc0110a8c00758

See more details on using hashes here.

File details

Details for the file runapi_core-0.8.3-py3-none-any.whl.

File metadata

  • Download URL: runapi_core-0.8.3-py3-none-any.whl
  • Upload date:
  • Size: 34.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Omarchy","version":"4.0.1","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for runapi_core-0.8.3-py3-none-any.whl
Algorithm Hash digest
SHA256 c7a173579338530e2f0dd2f7a2554140aaf8001468cb6d0cc4c406a69bfe2fac
MD5 403ad825dea9e25359bedb30bb70fd0c
BLAKE2b-256 6c4847f039c92d8e53c1ad87a265f0ba581c09f57bd7d9d891c4fa1f4f15133e

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.8.3 This release

2 files

0.8.2

2 files

0.8.1

2 files

0.8.0

2 files

0.7.1

2 files

0.7.0

2 files

0.6.0

2 files

0.5.1

2 files

0.5.0

2 files

0.4.0

2 files

0.3.6

2 files

0.3.5

2 files

0.3.4

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.5

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 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