# Fal AI models

AI Pass speaks Fal's API. Any model on [fal.ai/models](https://fal.ai/models) can be called through
your AI Pass key, billed to your AI Pass wallet. You do not need a Fal account.

Browse the full catalog at [fal.ai/models](https://fal.ai/models), copy the endpoint id, and call it.

## Base URL

Replace `https://queue.fal.run` with `https://aipass.one/v1/fal` and keep the endpoint id exactly as
Fal writes it.

```
https://aipass.one/v1/fal/{fal-endpoint-id}
```

Your AI Pass key goes in the `Authorization` header. Fal's own `Key` scheme works, and so does
`Bearer`, so a client written for Fal needs a credential change and nothing else.

## Submit a request

```bash
curl -X POST https://aipass.one/v1/fal/fal-ai/gemini-3.1-flash-tts \
  -H "Authorization: Key $AIPASS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"Hi there"}'
```

You get Fal's queue document back, with every URL pointing at AI Pass:

```json
{
  "status": "IN_QUEUE",
  "request_id": "aiprv_68e7a49e-909d-4508-a5b3-b45a1f055c54",
  "response_url": "https://aipass.one/v1/fal/fal-ai/gemini-3.1-flash-tts/requests/aiprv_68e7a49e-...",
  "status_url": "https://aipass.one/v1/fal/fal-ai/gemini-3.1-flash-tts/requests/aiprv_68e7a49e-.../status",
  "cancel_url": "https://aipass.one/v1/fal/fal-ai/gemini-3.1-flash-tts/requests/aiprv_68e7a49e-.../cancel"
}
```

## Poll and collect

```bash
curl "$STATUS_URL" -H "Authorization: Key $AIPASS_API_KEY"
# {"status":"IN_QUEUE",...}  then  {"status":"COMPLETED",...}

curl "$RESPONSE_URL" -H "Authorization: Key $AIPASS_API_KEY"
# {"audio":{"url":"https://v3b.fal.media/files/b/...mp3","content_type":"audio/mpeg","file_size":20013}}
```

The result is Fal's own output document, unchanged. Whatever the model's page on fal.ai says it
returns is what you get.

Asking for the result before the job finishes tells you so rather than returning an empty body:

```json
{"detail":"Provider result is available only after the job is COMPLETED; current state is IN_QUEUE"}
```

## Using the official Fal client

Point its proxy at `https://aipass.one/v1/fal/proxy` and pass your AI Pass key as the credential.
The client keeps its native endpoint ids and its normal queue handling.

## Two kinds of model

**Curated models** are the ones in [Available Models](/panel/developer). They are priced from Fal's
published rate before the request runs, and several of them are also reachable through the ordinary
OpenAI-shaped endpoints, so `gemini-3.1-flash-tts` works at `POST /v1/audio/speech` as well.

**Everything else on fal.ai** still works through the bridge. There is no list to get added to and
no request to file. Because these are not priced ahead of time, they carry a few limits:

| | |
|---|---|
| Rate | 20 submissions per hour |
| Minimum wallet balance | $0.01 |
| Admission hold | $0.01, released at settlement |

If you are running one of these often enough to hit the rate limit, tell us and we will curate it.

## What you are charged

Fal's own per request billing event, plus the AI Pass markup. The hold taken when the job is
admitted is not the price. It is released when the real cost arrives, which is usually within a few
minutes of the job finishing.

A job that fails at Fal is not charged.

## Errors come from Fal

Validation errors are passed through with the model's own message, so they name the field and the
accepted values. Sending an invalid voice to a speech model answers:

```json
{"detail":[{"type":"literal_error","loc":["body","voice"],
  "msg":"Input should be 'Achernar', 'Achird', ... or 'Zubenelgenubi'","input":"nova"}]}
```

That is the model telling you its vocabulary, not AI Pass guessing at it.

## Related

- [fal.ai/models](https://fal.ai/models) to search the catalog
- [REST API](/docs/rest) for the OpenAI-shaped endpoints
- [OpenAI Compatible](/docs/rest/openai-compatible) to point an existing tool at AI Pass
