{"id":105,"library":"upstash","title":"Upstash Python SDK","description":"Unified Python SDK for Upstash cloud services including Redis, Vector, QStash, and Workflow. Provides serverless-friendly clients optimized for edge and serverless environments with HTTP-based connections. Replaces the older individual packages (upstash-redis, upstash-vector, upstash-qstash).","status":"active","version":"1.2.0","language":"python","source_language":"en","source_url":"https://github.com/upstash/upstash-python","tags":["upstash","redis","vector","qstash","serverless","edge","database","python"],"install":[{"cmd":"pip install upstash","lang":"bash","label":"Python (unified SDK)"},{"cmd":"pip install upstash-redis","lang":"bash","label":"Python (Redis only, legacy)"},{"cmd":"pip install upstash-vector","lang":"bash","label":"Python (Vector only, legacy)"},{"cmd":"pip install upstash-qstash","lang":"bash","label":"Python (QStash only, legacy)"}],"dependencies":[{"reason":"Used as the HTTP transport layer for all Upstash API calls.","package":"httpx","optional":false}],"imports":[{"note":"Redis client is imported from upstash_redis, not from the top-level upstash module.","wrong":"from upstash import Redis","symbol":"Redis","correct":"from upstash_redis import Redis"},{"note":"Vector client is the Index class from upstash_vector.","wrong":"from upstash import Vector","symbol":"Index","correct":"from upstash_vector import Index"},{"note":"QStash client is imported from upstash_qstash submodule.","symbol":"QStash","correct":"from upstash_qstash import QStash"}],"quickstart":{"code":"import os\nfrom upstash_redis import Redis\n\nredis = Redis(\n    url=os.environ.get('UPSTASH_REDIS_REST_URL', ''),\n    token=os.environ.get('UPSTASH_REDIS_REST_TOKEN', '')\n)\n\nredis.set('greeting', 'Hello from Upstash!')\nvalue = redis.get('greeting')\nprint(value)","lang":"python","description":"Minimal Redis set/get using the Upstash Redis client with HTTP-based connection."},"warnings":[{"fix":"Use QStash for pub/sub messaging patterns instead of Redis SUBSCRIBE.","message":"Upstash Redis uses HTTP REST calls, not the Redis wire protocol. Standard redis-py commands that rely on persistent TCP connections (SUBSCRIBE, BLPOP, WATCH) are not supported.","severity":"gotcha","affected_versions":"all"},{"fix":"Use the REST URL from the Upstash console (https://...upstash.io), not the redis:// connection string.","message":"Redis.from_env() reads UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN from environment. These must be the REST endpoint, not the standard Redis port 6379 URL.","severity":"gotcha","affected_versions":"all"},{"fix":"from upstash_redis import Redis","message":"The unified 'upstash' package changed internal module structure. Imports like 'from upstash.redis import Redis' do not work. Use 'from upstash_redis import Redis'.","severity":"breaking","affected_versions":"all"},{"fix":"Always check for None when reading keys: value = redis.get('key') or 'default'","message":"Redis.get() returns None for missing keys, not raising a KeyError. Pipeline results are returned as a list, not individual values.","severity":"gotcha","affected_versions":"all"},{"fix":"pipe = redis.pipeline(); pipe.set('a', '1'); pipe.get('a'); results = pipe.execute()","message":"Each Redis command makes an individual HTTP request. Use pipelines to batch multiple commands and reduce latency.","severity":"gotcha","affected_versions":"all"},{"fix":"Continue to use 'pip install upstash-redis' (or other specific Upstash SDKs like upstash-vector, upstash-qstash) until the unified 'upstash' package is officially released and available for your platform.","message":"While the separate upstash-redis, upstash-vector, and upstash-qstash packages are being consolidated, the unified 'upstash' package is not yet available for installation on PyPI or for the specified Python environment (python:3.13-alpine). Attempting 'pip install upstash' will result in 'No matching distribution found'.","severity":"breaking","affected_versions":"all"}],"env_vars":[{"name":"UPSTASH_REDIS_REST_URL","required":true,"description":"REST URL for your Upstash Redis database. Found in the Upstash console."},{"name":"UPSTASH_REDIS_REST_TOKEN","required":true,"description":"REST token for authenticating with your Upstash Redis database."},{"name":"UPSTASH_VECTOR_REST_URL","required":false,"description":"REST URL for your Upstash Vector index."},{"name":"UPSTASH_VECTOR_REST_TOKEN","required":false,"description":"REST token for authenticating with your Upstash Vector index."},{"name":"QSTASH_TOKEN","required":false,"description":"Authentication token for QStash messaging service."}],"last_verified":"2026-05-12T08:08:22.921Z","next_check":"2026-06-17T00:00:00.000Z","problems":[{"fix":"Install the unified `upstash` package and import the client directly from `upstash`.\n```python\n# First, ensure the unified package is installed:\n# pip install upstash\n\n# Then, correct the import statement:\nfrom upstash import Redis\n\nredis = Redis(url='YOUR_UPSTASH_REDIS_REST_URL', token='YOUR_UPSTASH_REDIS_REST_TOKEN')\n```","cause":"The `upstash` unified SDK replaces older individual packages like `upstash-redis`. Attempts to import from the old package name will result in a ModuleNotFoundError.","error":"ModuleNotFoundError: No module named 'upstash_redis'"},{"fix":"Set the necessary environment variables in your operating system or pass the `url` and `token` parameters directly to the client constructor.\n```python\n# Option 1: Set environment variables (recommended for production)\n# export UPSTASH_REDIS_REST_URL='your_redis_url'\n# export UPSTASH_REDIS_REST_TOKEN='your_redis_token'\nfrom upstash import Redis\nredis = Redis() # Reads from environment variables by default\n\n# Option 2: Pass directly in code\nfrom upstash import Redis\nredis = Redis(url='your_redis_url', token='your_redis_token')\n```","cause":"The Upstash client attempted to initialize by reading required connection environment variables (like URL or Token) that were not set and were not explicitly provided during client initialization.","error":"KeyError: 'UPSTASH_REDIS_REST_URL'"},{"fix":"Ensure all asynchronous client calls are preceded by `await` within an `async def` function, and run the main `async` function using `asyncio.run()`.\n```python\nimport asyncio\nfrom upstash import Redis\n\nasync def main():\n    redis = Redis(url='YOUR_UPSTASH_REDIS_REST_URL', token='YOUR_UPSTASH_REDIS_REST_TOKEN')\n    await redis.set('mykey', 'myvalue') # Correct: using await\n    value = await redis.get('mykey')    # Correct: using await\n    print(value)\n    await redis.close() # Ensure to close the client when done\n\nif __name__ == '__main__':\n    asyncio.run(main())\n```","cause":"An asynchronous method of the Upstash client (e.g., `Redis.get()`, `Vector.query()`) was called in an `async` function without the `await` keyword, or called in a synchronous context without being run in an event loop.","error":"RuntimeWarning: coroutine 'Redis.get' was never awaited"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":null,"install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.27,"mem_mb":8.5,"disk_size":"71.3M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.21,"mem_mb":8.5,"disk_size":"143M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.42,"mem_mb":9.8,"disk_size":"78.1M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.34,"mem_mb":9.8,"disk_size":"149M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.59,"mem_mb":9.8,"disk_size":"69.2M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.58,"mem_mb":9.8,"disk_size":"140M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.6,"mem_mb":10.3,"disk_size":"65.3M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.56,"mem_mb":10.3,"disk_size":"139M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.24,"mem_mb":8.4,"disk_size":"70.3M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.23,"mem_mb":8.4,"disk_size":"142M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null}]},"quickstart_checks":{"last_tested":"2026-05-12","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]}}