reflex-dev/reflex · error · GetAppError
detail
Error message
detail
What it means
Raised by get_app() when GET /api/v1/apps/{app_id} returns a non-2xx status. The library parses the server's JSON body and re-raises GetAppError with its 'detail' field (falling back to the raw response text if the body is not JSON). So the message you see is whatever the hosting service reported — most often 'app not found' or an auth/permission error.
Source
Thrown at packages/reflex-hosting-cli/src/reflex_cli/utils/hosting.py:922
ValueError: If the app_id is not valid.
"""
import httpx
if not isinstance(client, AuthenticatedClient):
raise NotAuthenticatedError("not authenticated")
if not isinstance(app_id, str) or not app_id:
raise ValueError("app_id should be a string")
response = httpx.get(
urljoin(constants.Hosting.HOSTING_SERVICE, f"/api/v1/apps/{app_id}"),
headers=authorization_header(client.token),
timeout=constants.Hosting.TIMEOUT,
)
try:
response.raise_for_status()
except httpx.HTTPStatusError as ex:
try:
raise GetAppError(ex.response.json().get("detail")) from ex
except json.JSONDecodeError:
raise GetAppError(ex.response.text) from ex
return response.json()
def create_app(
app_name: str,
client: AuthenticatedClient,
description: str,
project_id: str | None,
provider: str | None = None,
):
"""Create a new application.
Args:
app_name: The name of the application.
description: The description of the application.
project_id: The ID of the project to associate the application with.View on GitHub (pinned to 45b8ed5ab7)
Solutions
- Verify the app_id exists: list apps (list_apps) and confirm the id before calling get_app
- If the detail says unauthenticated/forbidden, re-run `reflex login` and confirm your account has access to the app's project
- Catch reflex_cli.utils.exceptions.GetAppError and handle missing apps explicitly instead of letting it crash
Example fix
from reflex_cli.utils.exceptions import GetAppError
# before
app = get_app(client, app_id)
# after
try:
app = get_app(client, app_id)
except GetAppError as ex:
if "not found" in str(ex):
logger.warning(f"app {app_id} no longer exists")
app = None
else:
raise Defensive patterns
Strategy: try-catch
Validate before calling
apps = {a["name"]: a["id"] for a in (list_apps(client) or [])}
if app_id not in apps.values():
raise LookupError(f"unknown app_id {app_id}") Try / catch
from reflex_cli.utils.exceptions import GetAppError
try:
app = get_app(client, app_id)
except GetAppError as ex:
if "not found" in str(ex).lower():
app = None # treat as deleted
else:
raise Prevention
- Refresh the app id from list_apps instead of caching ids across sessions
- Treat GetAppError with 'not found' as an expected outcome in cleanup/delete scripts
- Log the detail message — it distinguishes auth failures from missing apps
When it happens
Trigger: Calling get_app(), delete_app(), or get_app_logs() with an app_id that does not exist (404 detail), a token lacking access to the app (401/403), or while the hosting service returns 5xx. The message is the server's 'detail' value, hence the generic-looking 'detail' name.
Common situations: App was deleted on the cloud console but the id is still cached locally; wrong project/org token; typo'd or truncated app_id; stale id after re-deploying under a new app.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- project search failed: {ex_details}
- app_id should be a string
- app_name should be a string
- deployment failed: {ex_details}
- bad hostname provided
AI-assisted analysis of reflex-dev/reflex@45b8ed5ab7 (2026-08-28).
Data as JSON: /api/errors/2c67213d6bc086a8.
Report an issue: GitHub.