TL;DR
invalid_request indicates a request problem. A wrong endpoint is one possible cause; the response message, request body, and model ID determine the next check. Confirm the supported endpoint before changing fields.
Before running the Python examples, install the dependency in the same environment: python -m pip install requests.
Choose the request endpoint
These are three common HiAPI generation endpoints. A model page and the public catalog identify which ones a particular model supports.
| Endpoint | Main body fields | Purpose |
|---|---|---|
/v1/tasks | model + input | Image, video, and audio tasks |
/v1/chat/completions | model + messages | Models supporting chat requests |
/v1/responses | model + input | Models supporting Responses |
In supported_endpoint_types, task, openai, and openai-response map to these endpoints respectively. The catalog can include other protocol types; use that model's integration documentation for types outside this table.
Read the supported endpoints
Set HIAPI_MODEL to the exact ID shown on the model page. This script reads the public catalog without submitting a generation task.
import os
import requests
model_id = os.environ["HIAPI_MODEL"]
response = requests.get("https://api.hiapi.ai/api/pricing", timeout=30)
response.raise_for_status()
models = response.json()["data"]
model = next((m for m in models if m.get("model_name") == model_id), None)
if model is None:
raise SystemExit("Model not present in the public catalog; check its exact model ID")
print("model:", model["model_name"])
print("supported_endpoint_types:", model.get("supported_endpoint_types", []))
Four steps to repair the request
- Check the actual hostname and path, including accidental duplication of
/v1in the base URL. - Match the exact model ID and supported endpoint. A display name is not a substitute for an API model ID.
- Update the body as well as the path: chat
messagescannot be copied unchanged into a task request; task parameters belong insideinput. - Read the HTTP status and error fields again. If it still fails, keep the request ID, model ID, path, and a credential-free request body.
Separate routing, parameters, and authentication
| Symptom | Next check |
|---|---|
| 400 with an invalid-request message | Endpoint, JSON, required fields, and types |
| Explicit unsupported-protocol message | An endpoint declared by the model |
| 401 for a missing or invalid credential | Bearer header and runtime environment variable |
MODEL_UNAVAILABLE from the task endpoint | Model ID, availability, and account access |
Task rejection responses can use top-level error_code; other endpoints may use error.code. Do not assume a single error field covers every endpoint.
FAQ
Does invalid_request always mean the wrong endpoint?
No. Invalid fields, JSON, or missing required values can also cause rejection. Read the message before changing the endpoint.
Is changing the URL enough?
The request body must match too. Chat messages and the task input object have different structures.
What if the model is absent from the public catalog?
Check the exact ID, model page, and account-visible models. Do not silently substitute a similarly named model.
Does this diagnostic code generate content?
No. It only reads the public catalog. A separate generation submission starts a task.





