Meshive Python SDK & CLI
Rent GPUs on Meshive from your terminal or from Python. Launch pods, run serverless tasks, serve models and manage your files: the same things you can do in the console, scriptable.
Documentation · Console · GPU pricing · Use it from AI agents
Install
pip install meshive
Requires Python 3.10 or newer (tested on 3.10 to 3.13). This installs the meshive command and the meshive
Python package. Check it with meshive --version.
In a requirements file, pin the major version so you get fixes but nothing that breaks your code:
meshive>=1,<2
Upgrading from a pre-1.0 release
1.0.0 works with code written for the 0.1 releases; no changes are needed. Change your pin to meshive>=1,<2
and reinstall, and regenerate your lock file if you use one. Most pre-1.0 releases are being removed from PyPI
(see the changelog for dates), so a pin to
one of them stops installing after its removal date. Environments where it is already installed keep working.
Quickstart
1. Get an API key. In the console, open your workspace's Settings → API keys. Pick Read & write so you can create pods.
2. Log in.
meshive login # paste the key; it is saved for later commands
meshive workspaces # note the ID of your workspace
3. Pick a GPU and a template.
meshive gpus # GPUs you can rent right now, with hourly prices
meshive templates --name jupyter # note the template ID
4. Launch a pod.
meshive pod-create <workspace> my-first-pod --template <template-id> --gpu "RTX 3060" --wait running
The CLI shows the hourly price and asks before anything is billed. With --wait running it returns
once the pod is up and prints its ID.
5. Open it.
meshive pod <workspace> <pod> # the pod's URLs (Jupyter, ...) and its login, if it has one
6. Stop or delete it when you're done.
meshive pod-stop <workspace> <pod> # compute billing stops; attached storage is still billed
meshive pod-delete <workspace> <pod>
Use it from Python
from meshive import Meshive, format_hourly
with Meshive() as client: # uses the key saved by `meshive login`, or MESHIVE_API_KEY
workspace = client.list_workspaces()[0].namespace_name
for gpu in client.list_gpus():
print(gpu.gpu_model, f"{gpu.vram} GB", format_hourly(gpu.price_per_hour), gpu.available_gpus)
template = next(t for t in client.list_templates() if t.name == "Jupyter")
estimate = client.estimate_pod("my-first-pod", template.template_id, workspace=workspace, gpu_model="RTX 3060")
print("estimate:", format_hourly(estimate.price_per_hour))
client.create_pod("my-first-pod", template.template_id, workspace=workspace, gpu_model="RTX 3060",
max_price_per_hour=0.10) # never pay more than $0.10/hr for compute
pod = client.wait_for_new_pod("my-first-pod", workspace, until="running")
for endpoint in pod.endpoints:
print(endpoint.name, endpoint.external_url)
client.stop_pod(pod.pod_name, workspace)
AsyncMeshive has the same methods for async code, and the package ships type hints. Prices come back
as the exact numbers the server sent; format_hourly and format_usd round them the way the console
shows them.
Errors are exceptions you can catch by kind. All of them derive from MeshiveError:
from meshive import InsufficientCreditError, PodCreationFailedError, WaitTimeoutError
try:
pod = client.wait_for_new_pod("my-first-pod", workspace, until="running")
except PodCreationFailedError as err:
print("the pod could not start:", err)
except WaitTimeoutError:
print("still not running; `meshive transactions <workspace>` shows what it is waiting for")
| Exception | When |
|---|---|
ConfigurationError |
No API key was found, or the base URL is invalid. Nothing was sent. |
AuthenticationError |
401: the key is missing, wrong or expired. |
PermissionDeniedError |
403: the key is Read only, or your workspace role can't make changes. |
NotFoundError |
404: no such pod, task, asset, ... |
InsufficientCreditError |
402: not enough credit to create or start something. |
ConflictError |
409: no capacity, a name already taken, a price above your cap, storage still in use, ... err.title says which. |
RateLimitError |
429 after the automatic retries. err.retry_after says how long to wait. |
WaitTimeoutError |
A wait_for_* call ran out of time. Also a built-in TimeoutError. |
PodCreationFailedError |
The platform couldn't create the pod and cleaned it up; the message says why. |
What else you can do
| To... | Run |
|---|---|
| Run a script on a GPU and collect the results | meshive task-submit <workspace> train --script train.py --image python:3.12-slim --gpu "RTX 3060" |
| Serve a Hugging Face model behind an API | meshive model-register <workspace> Qwen/Qwen3-0.6B, then meshive serving-deploy |
| Bring in a model or dataset from Hugging Face, CivitAI or a URL | meshive asset-import <workspace> <repo or URL> |
| Download files or task outputs | meshive asset-download <asset>, meshive task-outputs <task> --download ./out |
| SSH into a pod | meshive ssh <workspace> <pod> |
| See why a pod is still starting | meshive transactions <workspace> |
| Watch a pod's usage and logs | meshive pod-metrics <workspace> <pod>, meshive logs <workspace> <pod> |
| Check your credit and spending | meshive credit, meshive workspace <workspace> |
| Host your own machines and see earnings | meshive machines, meshive earnings |
Every command has --help. The CLI reference lists them all.
Good to know
- Nothing is billed without asking. Commands that spend credit or delete something show the price or
a summary first and ask you to confirm. Add
--estimateto see the price only, or--yesto skip the question in scripts. - Two kinds of keys. A Read only key can see everything. A Read & write key is needed to create, change or delete, and it expires (after 30 days by default).
- IDs and names. Lists show the NAME you chose and an ID. Commands take the ID.
- Scripting.
-o jsonprints the full response and-o nameprints only IDs, one per line. - Retries are safe. Rate limits and network errors are retried automatically. Every create or change carries an idempotency key, so a retried request is never applied twice.
Configuration
The API key is looked up in this order: the --api-key option (or Meshive(api_key=...)), the
MESHIVE_API_KEY environment variable, then the file saved by meshive login.
| Variable | Meaning |
|---|---|
MESHIVE_API_KEY |
API key. Handy in CI, where you don't run meshive login. |
MESHIVE_BASE_URL |
API address. Leave it unset unless you were given a different one. |
MESHIVE_CONFIG_DIR |
Where meshive login keeps the key. Defaults to ~/.meshive/ (the directory is 0700, credentials.json is 0600). |
NO_COLOR or MESHIVE_NO_COLOR |
Turn off colors. Colors are already off when the output isn't a terminal. |
meshive logout deletes the saved key.
Troubleshooting
| You see | What to do |
|---|---|
| An error about a missing API key | Run meshive login, or set MESHIVE_API_KEY. |
401 / AuthenticationError |
The key is wrong or has expired. Create a new one under Settings → API keys and log in again. |
403 / PermissionDeniedError when creating or deleting |
The key is Read only, or your role in that workspace is viewer. Use a Read & write key. |
402 / InsufficientCreditError |
Top up credit in the console. |
409 with "No Capacity" |
That GPU is sold out right now. meshive gpus shows what is available. |
A pod stays creating for minutes |
meshive transactions <workspace> shows the current step, such as an image download and its progress. |
A script stops with exit code 2 |
A command that spends credit wanted confirmation. Add --yes, or check with --estimate first. |
| "could not reach the Meshive API" | Check your network, and MESHIVE_BASE_URL if you set it. |
Exit codes
| Code | Meaning |
|---|---|
0 |
Success. |
1 |
The API returned an error, the key is missing or invalid, or the API couldn't be reached. |
2 |
Bad arguments, or a command needed confirmation and didn't get it (no terminal and no --yes, or you answered no). |
130 |
Interrupted with Ctrl-C. |
Versioning
This package follows semantic versioning. Within 1.x, upgrades don't break your code: new
features arrive in minor versions and fixes in patch versions. Anything slated for removal first warns with a
DeprecationWarning and is removed only in the next major version. Every change is listed in the
changelog.
Use Meshive from an AI agent
The Meshive MCP server lets Claude Code, Codex, Cursor and other agents do all of this in plain language.
Learn more
- CLI reference: every command and option
- SDK reference: methods, data models, errors, retries
- Authentication: keys, environment variables, config location
- Changelog
- Contributing: DEVELOPMENT.md
License
Metadata
Release files for meshive 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| meshive-1.0.0.tar.gz | 131.3 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| meshive-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 221.8 kB
Release files / meshive-1.0.0.tar.gz
| Download URL | meshive-1.0.0.tar.gz |
|---|---|
| Size | 131.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b6bf68521b71b79ca53529c47229e9a1e6ff7d9bf77de76df3f85dc3060caa67
|
|
BLAKE2b-256 checksum How to use checksums |
9d1ce4d1608a744866620a5e4f5173ff3753f6577b741b8de36233ef464328f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency logRelease files / meshive-1.0.0-py3-none-any.whl
| Download URL | meshive-1.0.0-py3-none-any.whl |
|---|---|
| Size | 90.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a9488f3f29ce652d7875a0012f3810ae94453a66e4232b99c768547b94d8492f
|
|
BLAKE2b-256 checksum How to use checksums |
d5cad20604356e957be405636bce5f74dca86f2e47d1679359b9204afbd83a85
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency logSecurity for meshive 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for meshive-1.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.