Skip to main content

AstraAPI framework, high performance, easy to learn, fast to code, ready for production

Project description


⚡ AstraAPI

High-Performance · Easy to Learn · Fast to Code · Ready for Production

PyPI MIT License Status Python C++20 Pydantic v2


AstraAPI is a modern, production-grade Python web framework with a C++20 hot-path core. It is inspired by and fully API-compatible with FastAPI — you get the same beautiful decorator-based routing, automatic OpenAPI docs, Pydantic v2 validation, Depends injection, and WebSocket support, while the inner engine is a compiled C++ extension that handles HTTP parsing, route matching, parameter extraction, JSON serialization, CORS, compression, and response building — with zero Python overhead on the critical path.

"AstraAPI = FastAPI's developer experience + uWebSockets' throughput + Node.js cluster's multi-worker model"


✨ Key Features

Feature Description
🚀 C++20 HTTP Core HTTP parsing, route matching, param extraction, JSON encode/decode — all in compiled C++ (_astraapi_core.so)
🎯 FastAPI-Compatible API Same decorators (@app.get, @app.post, …), Depends, Body, Query, Path, Header, Cookie, Form, File, Security
🔄 Zero-Lock Multi-Worker Each worker is a fully independent OS process with its own GIL, event loop, and memory space. Zero shared state = zero lock contention
🌀 uvloop / winloop Event Loop Uses uvloop (Linux/macOS) or winloop (Windows) instead of CPython's default asyncio loop — up to 2–4× more I/O throughput
📄 Auto OpenAPI + Swagger/ReDoc Built-in /docs (Swagger UI) and /redoc (ReDoc) — served directly from C++ pre-built byte buffers
Pydantic v2 Validation Full request body validation, response model serialization, and model_dump_json — all via Pydantic v2
🛡️ Built-in Middleware CORS, TrustedHost, GZip/Brotli compression, Rate Limiting — implemented in C++ with zero Python allocation per request
🔌 WebSocket Support RFC 6455 compliant WebSocket with C++ ring-buffer frame parsing, echo auto-detection, batch frame building, and per-connection backpressure
⚙️ Lazy Imports Heavy imports (Pydantic, OpenAPI models) are deferred until first access. Cold startup reduced from ~4.7 s → ~1–1.5 s
🔁 Hot Reload File-watching reloader (watchfiles) restarts workers on code change
🧪 Test Client Drop-in TestClient based on httpx for sync/async endpoint testing
📁 Static Files + Jinja2 Templates Plug-and-play static file serving and HTML templating
🔒 Security OAuth2, HTTP Basic/Bearer, API Key — mirrors FastAPI's security utilities
🪝 Lifespan Events on_startup / on_shutdown callbacks and async context-manager lifespan
🖥️ Cross-Platform Linux (SO_REUSEPORT + uvloop), macOS (fork + uvloop), Windows (subprocess + winloop + socket.share)

🌟 Inspired by FastAPI

AstraAPI was directly inspired by FastAPI created by Sebastián Ramírez. Every public-facing API — decorators, dependency injection, parameter declarations, OpenAPI generation, security utilities, response models — is intentionally compatible with FastAPI so that existing FastAPI applications can be migrated with minimal changes.

# This is valid AstraAPI code — and also valid FastAPI code
from astraapi import AstraAPI, Depends
from pydantic import BaseModel

app = AstraAPI(title="My API")

class Item(BaseModel):
    name: str
    price: float

@app.post("/items/", response_model=Item)
async def create_item(item: Item):
    return item

What AstraAPI adds on top of the FastAPI mental model:

  • A compiled C++20 extension replaces the entire ASGI hot path
  • A built-in multi-worker supervisor replaces Gunicorn/Uvicorn
  • A uvloop/winloop event loop replaces the default asyncio loop
  • Zero-allocation per-request interning for HTTP method strings, header names, status lines

📦 Installation

pip install astraapi

Note: The package ships a pre-built _astraapi_core.so (Linux) / .pyd (Windows). To build from source:

cd cpp_core && mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
cp _astraapi_core*.so ../../astraapi/_astraapi_core.so

🚀 Quick Start

from astraapi import AstraAPI

app = AstraAPI()

@app.get("/")
async def root():
    return {"message": "Hello from AstraAPI ⚡"}

# Run with built-in multi-worker server
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, workers=4)

🔄 Complete Request Flow

The following diagram shows the full lifecycle of an HTTP request inside AstraAPI:

┌─────────────────────────────────────────────────────────────────────────────┐
│                          CLIENT  (Browser / HTTP Client)                    │
└────────────────────────────────────┬────────────────────────────────────────┘
                                     │  TCP Connection
                                     ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                   MASTER PROCESS  (Supervisor / Accept Thread)              │
│                                                                             │
│  ① listen_sock.accept()  — single blocking accept, no thundering herd      │
│  ② Round-robin dispatch  — SCM_RIGHTS (Linux) / socket.share() (Windows)  │
│  ③ Worker restart        — crashed workers are automatically re-spawned    │
└────────────┬──────────────────────────┬────────────────────────────────────┘
             │ fd / shared socket        │ fd / shared socket
      ┌──────▼──────┐            ┌───────▼──────┐
      │  Worker 0   │            │  Worker 1    │   ... (N workers)
      │  (Process)  │            │  (Process)   │
      │  own GIL    │            │  own GIL     │
      │  own loop   │            │  own loop    │
      └──────┬──────┘            └──────────────┘
             │
             ▼  CppHttpProtocol.data_received()
┌─────────────────────────────────────────────────────────────────────────────┐
│                   C++ HTTP LAYER  (_astraapi_core.so)                       │
│                                                                             │
│  ④ HTTP Parse      — llhttp (Node.js parser, zero-copy view)               │
│  ⑤ Route Match     — Radix trie, O(log n), pre-compiled at startup         │
│  ⑥ Param Extract   — Path params, query string, headers, cookies in C++    │
│  ⑦ JSON Parse      — yyjson (SIMD-accelerated, strict mode)                │
│  ⑧ CORS Check      — case-insensitive origin matching, zero allocation     │
│  ⑨ DI Resolution   — Resolve Depends graph, inject typed params in C++     │
│  ⑩ Compression     — libdeflate (gzip) / Brotli, chosen by Accept-Encoding │
│  ⑪ Rate Limiting   — Sharded mutex counters (16 shards), per-IP           │
└──────────────┬──────────────────────────┬──────────────────────────────────┘
               │                          │
   ┌───────────▼─────────┐    ┌───────────▼─────────────┐
   │  SYNC ENDPOINT      │    │  ASYNC / PYDANTIC        │
   │  (no Python touch)  │    │  ENDPOINT                │
   │                     │    │                          │
   │  C++ builds full    │    │  C++ returns InlineResult│
   │  HTTP response and  │    │  Python: await endpoint  │
   │  calls              │    │  Pydantic validates resp │
   │  transport.write()  │    │  C++ serializes JSON     │
   └─────────────────────┘    └──────────────────────────┘
               │                          │
               └──────────┬───────────────┘
                          ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                      RESPONSE PATH                                          │
│                                                                             │
│  C++ build_response_from_parts() → pre-cached status lines + headers →     │
│  transport.write(bytes)  — single syscall, keep-alive maintained           │
└─────────────────────────────────────────────────────────────────────────────┘
                          │
                          ▼
                      CLIENT  ✅

Request Flow — Step by Step

  1. TCP Accept — The master supervisor calls accept() once and dispatches the file descriptor to a worker via Unix socket (SCM_RIGHTS on Linux) or socket.share() (Windows). Workers never compete for connections.
  2. data_received — Python's asyncio protocol (CppHttpProtocol) receives raw bytes and calls into _astraapi_core via a single C-extension call.
  3. HTTP Parse — C++ uses the llhttp parser (same as Node.js) to parse headers and body. Strings are interned (PyUnicode_InternFromString) once and reused forever.
  4. Route Match — A compiled radix trie matches the method + path in O(log n). Routes are frozen before workers fork — shared as read-only COW pages.
  5. Parameter Extraction — Path params, query strings, headers, cookies extracted in C++ with zero Python dict construction for sync routes.
  6. Endpoint Dispatch — Sync endpoints return directly; async endpoints yield an InlineResult capsule back to Python which awaits the coroutine.
  7. Pydantic Validation — Response models call model_dump_json() — result is passed back to C++ for final serialization.
  8. Response Write — C++ assembles the full HTTP response from pre-cached byte fragments and calls transport.write() — a single syscall.

🏗️ Worker Architecture

┌──────────────────────────────────────────────────────────────────────┐
│                        ASTRAAPI  PROCESS MODEL                       │
├──────────────────────────────────────────────────────────────────────┤
│                                                                      │
│   ┌─────────────────────────────────────────────────────────────┐   │
│   │              MASTER  (Supervisor Process)                    │   │
│   │                                                              │   │
│   │  • listen_sock.accept() ──► round-robin dispatch           │   │
│   │  • Monitors child PIDs via os.waitpid()                    │   │
│   │  • Auto-restarts crashed workers                           │   │
│   │  • Tunes sysctl (somaxconn, tcp_max_syn_backlog)           │   │
│   │  • Raises fd limit (RLIMIT_NOFILE → 65535)                 │   │
│   └──────────┬──────────────┬────────────────┬─────────────────┘   │
│              │              │                │                       │
│    SCM_RIGHTS│   socket.    │  SO_REUSEPORT  │                       │
│    (Linux)   │   share()    │  (kernel does  │  + ─ ─  N workers    │
│              │  (Windows)   │   balancing)   │                       │
│    ┌─────────▼──┐  ┌────────▼──┐  ┌──────────▼──┐                  │
│    │  Worker 0  │  │  Worker 1  │  │  Worker N   │                  │
│    │            │  │            │  │             │                  │
│    │ own GIL    │  │  own GIL   │  │  own GIL    │                  │
│    │ own memory │  │ own memory │  │ own memory  │                  │
│    │ own loop   │  │ own loop   │  │ own loop    │                  │
│    │ uvloop/    │  │ uvloop/    │  │ uvloop/     │                  │
│    │ winloop    │  │ winloop    │  │ winloop     │                  │
│    │            │  │            │  │             │                  │
│    │ CPU pinned │  │ CPU pinned │  │ CPU pinned  │ ← sched_setaff. │
│    │ (core 0)   │  │ (core 1)   │  │ (core N%k)  │                  │
│    └────────────┘  └────────────┘  └─────────────┘                  │
│                                                                      │
│  • Route table frozen before fork → shared as read-only COW pages   │
│  • Zero IPC after startup (SO_REUSEPORT mode)                       │
└──────────────────────────────────────────────────────────────────────┘

Linux — Three Modes (Best → Fallback)

Mode How it works Latency
SO_REUSEPORT Each worker binds its own socket; kernel dispatches SYN packets directly — no master accept thread, no IPC Lowest
Master-Accept + SCM_RIGHTS Master calls accept(), sends fd to worker via sendmsg + SCM_RIGHTS over Unix socketpair Low
Shared socket Single listen socket shared via socket.share() Moderate

Windows

Master uses socket.share(pid) + socket.fromshare() over AF_INET socketpairs. Same round-robin guarantee, no thundering herd.


⚡ Why AstraAPI is Faster Than Uvicorn + Gunicorn

The table below compares what happens on every single request:

Component Uvicorn + Gunicorn AstraAPI
HTTP Parsing Python ASGI scope dict allocation (7+ keys) C++ llhttp, zero Python dict
Route Matching Python regex, dictionary lookup per route C++ radix trie, O(log n), pre-compiled
Param Extraction Python re.match() + dict construction C++ param_extractor, direct struct write
JSON Decode Python json.loads() / orjson.loads() C++ yyjson SIMD parser
JSON Encode Python json.dumps() / orjson.dumps() C++ yyjson writer, single allocation
CORS Python middleware, dict lookups, .encode() calls C++ case-insensitive origin match, no alloc
GZip Python gzip module (GIL-bound) C++ libdeflate (2–3× faster than zlib)
Brotli Requires separate brotli middleware C++ Brotli native, auto-negotiated
Response Build Python bytearray + string formatting C++ pre-cached status lines + single memcpy
Worker Model Gunicorn master-accept → WSGI/ASGI overhead Zero-lock independent processes, no arbiter GIL
Event Loop Default asyncio (libuv-less) uvloop / winloop (libuv-based, 2–4× faster I/O)
Startup Time FastAPI ~4–5 s cold import AstraAPI ~1–1.5 s (lazy imports)
String Interning .encode() per request for method/headers Pre-interned PyUnicode_InternFromString at startup
Memory per request Multiple dict + list allocations in Python Reused C++ buffer pool (buffer_pool.cpp)

Key Architectural Advantages

1. C++ on the hot path, Python only where needed

Sync endpoint:   TCP bytes → C++ parse → C++ route → C++ params → C++ response  (zero Python)
Async endpoint:  TCP bytes → C++ parse → C++ route → C++ params → Python await → C++ serialize

2. Zero thundering herd

Gunicorn's default pre-fork model has all workers call accept() simultaneously, causing a kernel stampede on connection arrival. AstraAPI's master process accepts once and dispatches — workers consume from a queue with guaranteed even distribution (Node.js cluster SCHED_RR pattern).

3. Per-worker CPU affinity

os.sched_setaffinity(0, {worker_id % cpu_count})

Each worker is pinned to a dedicated CPU core, eliminating L2/L3 cache thrashing and TLB flushes caused by process migration across cores.

4. Pre-warmed buffer pool

A C++ buffer_pool pre-allocates std::vector<char> buffers at startup. Per-request allocation becomes an O(1) list pop — no malloc/free on the critical path.

5. Route table frozen and COW-shared

Before forking, app._sync_routes_to_core() freezes the radix trie. All workers inherit it as read-only copy-on-write pages — never copied, never locked.

6. Lazy imports cut startup time by 3–4×

# Heavy imports (pydantic, openapi, routing) deferred to first use
# `from astraapi import AstraAPI` → ~1-1.5s  (vs ~4.7s eager)

🔌 WebSocket Architecture

Client  ──WS Frame──►  C++ ws_frame_parser (ring buffer, RFC 6455)
                            │
                            ▼
                    _WsFastChannel.feed()  ──► Python endpoint await
                            │
                  (echo detected?) ──YES──►  _handle_ws_frames_echo_fd
                            │                 (direct FD write, no Python)
                           NO
                            ▼
                    Python endpoint processes frame
                            │
                    ws.send_text() / send_bytes() / send_json()
                            │
                    C++ ws_build_frame_bytes()  (single allocation)
                            │
                    transport.write()
  • Echo auto-detection: if an endpoint echoes received data, AstraAPI switches to a direct-fd echo handler that bypasses Python entirely
  • Batch frame building: multiple sends within the same event loop tick are coalesced into a single transport.write() via _ws_build_frames_batch
  • Backpressure: pauses transport reading when buffer > 256 messages or 8 MB, resumes at 64 messages / 2 MB
  • WebSocket Groups: broadcast to N connections using pre-built frames (_ws_groups.py) — frame built once, sent to all

🧩 Project Structure

astraapi/
├── __init__.py              # Lazy-import gateway (startup: ~1.5s)
├── applications.py          # AstraAPI class — main app entrypoint
├── routing.py               # APIRouter, APIRoute, path operation decorators
├── _cpp_server.py           # asyncio.Protocol bridge to C++ core
├── _multiworker.py          # Zero-lock multi-worker supervisor
├── _astraapi_core.so        # Compiled C++20 extension
├── _request.py              # Request object
├── _response.py             # Response classes (JSON, HTML, Stream, File…)
├── _routing_base.py         # Base routing primitives
├── _middleware_impl.py      # Middleware stack builder
├── _websocket.py            # WebSocket wrapper (CppWebSocket)
├── _ws_groups.py            # WebSocket group broadcast
├── param_functions.py       # Body, Query, Path, Header, Cookie, Form, File, Depends, Security
├── dependencies/            # DI resolver
├── openapi/                 # OpenAPI schema generation
└── security/                # OAuth2, HTTP Basic/Bearer, API Key

cpp_core/
├── src/
│   ├── app.cpp              # CoreApp, HTTP handler, InlineResult
│   ├── router.cpp           # Radix trie route matching
│   ├── http_parser.cpp      # llhttp wrapper
│   ├── param_extractor.cpp  # Path/query/header param extraction
│   ├── json_writer.cpp      # yyjson-based JSON serialization
│   ├── json_parser.cpp      # yyjson-based JSON parsing
│   ├── ws_frame_parser.cpp  # RFC 6455 WebSocket frame parser
│   ├── ws_ring_buffer.cpp   # Ring buffer for WS frames
│   ├── middleware_engine.cpp # CORS, TrustedHost in C++
│   ├── body_parser.cpp      # JSON/form body parsing
│   ├── response_pipeline.cpp# Response assembly
│   └── dependency_resolver.cpp # C++ DI graph resolution
├── third_party/
│   ├── llhttp/              # Node.js HTTP parser
│   ├── yyjson/              # Fast JSON (SIMD)
│   └── ryu/                 # Fast float→string (d2s)
└── CMakeLists.txt           # C++20, -O3 -march=native -flto

⚙️ Configuration

app = AstraAPI(
    title="My API",
    version="1.0.0",
    description="API description (Markdown supported)",
    docs_url="/docs",          # Swagger UI
    redoc_url="/redoc",        # ReDoc
    openapi_url="/openapi.json",
    root_path="/api/v1",       # For reverse proxy setups
)

app.run(
    host="0.0.0.0",
    port=8000,
    workers=4,         # Number of worker processes
    reload=False,      # Enable hot reload (dev only)
)

📚 Dependencies

Package Role
pydantic ≥ 2.7 Request/response validation and serialization
uvloop (Linux/macOS) High-performance asyncio event loop
winloop (Windows) High-performance asyncio event loop for Windows
orjson Fast JSON fallback for Python-side serialization
watchfiles File change detection for hot reload
annotated-doc Rich type annotation documentation

Optional (install via pip install astraapi[standard]): httpx, jinja2, python-multipart, email-validator, pydantic-settings, pydantic-extra-types


🤝 Contributing

See CONTRIBUTING.md for how to set up the development environment, build the C++ core, and run the test suite.


📄 License

MIT License — see LICENSE.


Made with ⚡ by Lumos Labs HQ · Inspired by FastAPI

Download files

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

Source Distribution

astraapi-0.1.14.tar.gz (1.5 MB view details)

Uploaded Source

Built Distributions

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

astraapi-0.1.14-cp314-cp314-win_amd64.whl (461.3 kB view details)

Uploaded CPython 3.14Windows x86-64

astraapi-0.1.14-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

astraapi-0.1.14-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

astraapi-0.1.14-cp314-cp314-macosx_14_0_arm64.whl (920.0 kB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

astraapi-0.1.14-cp313-cp313-win_amd64.whl (455.5 kB view details)

Uploaded CPython 3.13Windows x86-64

astraapi-0.1.14-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

astraapi-0.1.14-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

astraapi-0.1.14-cp313-cp313-macosx_14_0_arm64.whl (919.9 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

astraapi-0.1.14-cp312-cp312-win_amd64.whl (455.6 kB view details)

Uploaded CPython 3.12Windows x86-64

astraapi-0.1.14-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

astraapi-0.1.14-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

astraapi-0.1.14-cp312-cp312-macosx_14_0_arm64.whl (919.9 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

File details

Details for the file astraapi-0.1.14.tar.gz.

File metadata

  • Download URL: astraapi-0.1.14.tar.gz
  • Upload date:
  • Size: 1.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for astraapi-0.1.14.tar.gz
Algorithm Hash digest
SHA256 6a90b3318b8743fce78bed9938a4a070ede4ae89f486aebacc6ab0e3e2468ceb
MD5 63e1f930c543b8db11b388db8085adde
BLAKE2b-256 4d6a9413824d27dd7c72fefa93ce1aea829aa57f0d4c19e466c22949753c55e1

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: astraapi-0.1.14-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 461.3 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for astraapi-0.1.14-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f440c777b07c086a2c81423a34c80886b831a4d94f28ee8ce1cf89a749beeb2d
MD5 f18d56238aa402c932f9c055cf434d26
BLAKE2b-256 64b07e5dfc0b0a1f67ccccbe0192d21687cd9896873a24f4cef520480dc3eb47

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.14-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 81ef0b4a63f546d004d4acf239049f24152943974623e92dc13c94886f33dd10
MD5 db4038dd0abd6d836c50183aaeca1407
BLAKE2b-256 5a38e813580574cc05e2c23441963709b1064b809d175eded41ef1855708f0b7

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.14-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 02eaa742641364bb4b43443b78bb15c926d77aa733c1381637991299738149d4
MD5 31ef9c1355fe7df25aae0416f1748536
BLAKE2b-256 b5ed48a37d9e813ddeaf85202c74b4c023ae0cfb27e1fe932bad5f13c51c8caa

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.14-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 d29c1e31bb0920ee63eb6fe972957e139901b8ec4fac9bbbc78d956f4f68cc08
MD5 de6e9a8bd854967fd88f46f782de8b3a
BLAKE2b-256 8cd404639d26b83ba6852b4f17f701565993cf0ff88b26830029e675bd7923ac

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: astraapi-0.1.14-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 455.5 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for astraapi-0.1.14-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 177fcc29b329999eb0638ad49d15bd66a24a6907bb308bb289911bc924986612
MD5 7d7e65274f85e70cae5d481d04be289b
BLAKE2b-256 a0026450eab1e4ea4b14adc55bd7195f963403a70da9489806afe19cf1664c06

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.14-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 25b800456d9903e774f4bc996ed2a795b20ee23cdb416382a945ae4d24a2189e
MD5 20b58a38235ec4a2cfc02fce8413164a
BLAKE2b-256 b641a8c62a17570eddeaa0e05a8be527bcf7fad070ac2315e08004f07b16f6a5

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.14-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6716d657b29912a8808871a89e952a4963c8e6dafa094196620ce3a40c9041a3
MD5 c0234f9f8d2a9231543e18faf4b4ef23
BLAKE2b-256 463729148dd756faf57e899a377b3a0e696db632c2379ce7467f70ebbc0aabb6

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.14-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 e1b24ffbb3003df201ddc2d762e64aa38ee53be367c589f138f9c40b218aab7e
MD5 5a6a1cc04a11c838904598721310b13e
BLAKE2b-256 178281933452b8834cbcfea27565c919bf2bb552e94681530725c2a766d31df7

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: astraapi-0.1.14-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 455.6 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for astraapi-0.1.14-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9f5cda85e2baed8ef254f6cd95ea54a046b11b955552aee8ab6f4f4c63b7909d
MD5 11bf71d1f99bba3c04733720d168930c
BLAKE2b-256 8c0d649e39fbc1e66709bc52c3ff31ade5f1d3bef7396f51b09e8a2239dc9658

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.14-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3b8138803f447dbf2f09a0b227d809b0aa317957a8774fe229233de9f628cfca
MD5 62080df7a8121548fb8f6464cce31cfb
BLAKE2b-256 0697cfc3e90117dae2b4939a1777ee81451155c39579347dda208d99ea7c7838

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.14-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1036b9375c822bc8f64475a1b0211166fce04a143b3f9138a1be9e237775515e
MD5 0479931c24281f6c39904766adc1767f
BLAKE2b-256 5f46d092e418c6b1a2ed6a9a3eab7ca1d439026d2f9f72e8e86ba5a277013818

See more details on using hashes here.

File details

Details for the file astraapi-0.1.14-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.14-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 4b30735c595aeda6b4956649946f577f0d6037f0c63d923721566ddd487497ed
MD5 5e2249e363311507dc88820ea2408770
BLAKE2b-256 70a8099480da739525b1192696eb34e0a349b629dc032cb229a70a4a7bf46811

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