> For the complete documentation index, see [llms.txt](https://bountyv.gitbook.io/vdocs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bountyv.gitbook.io/vdocs/frontier-passthrough/frontier-overview.md).

# Overview

Raw access to the frontier models, on **each provider's own parameters**.

The [Image API](/vdocs/image-api/images-overview.md) wraps these models behind one normalised shape (`engine`, `aspect`, `preset`, …) so you can swap engines without rewriting your request. The Frontier API does the opposite: one route per model, exposing that provider's native surface as-is. Use it when you already know a provider's API and want its exact controls — Gemini's `image_size` and `aspect_ratio`, OpenAI's fixed size buckets, ModelArk's sequential-set `count` and its reference video/audio roles.

```
POST https://substance-api.com/api/v1/frontier/<model>
```

## What's available

| Endpoint                                                                                                   | Model                                   | Kind         |
| ---------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------ |
| [`/frontier/nano-banana-pro`](/vdocs/frontier-passthrough/frontier-nano-banana-pro.md)                     | Google `gemini-3-pro-image-preview`     | Image, sync  |
| [`/frontier/chatgpt-image`](/vdocs/frontier-passthrough/frontier-chatgpt-image.md)                         | OpenAI `gpt-image-2`                    | Image, sync  |
| [`/frontier/seedream`](/vdocs/frontier-passthrough/frontier-seedream.md)                                   | BytePlus ModelArk Seedream 4.x          | Image, sync  |
| [`/frontier/seedream-5-pro`](/vdocs/frontier-passthrough/frontier-seedream-5-pro.md)                       | BytePlus ModelArk Seedream 5 Pro        | Image, sync  |
| [`/frontier/seedream-5-pro-uncensored`](/vdocs/frontier-passthrough/frontier-seedream-5-pro-uncensored.md) | Seedream 5 Pro, pre-filter-off endpoint | Image, sync  |
| [`/frontier/seedance`](/vdocs/frontier-passthrough/frontier-seedance.md)                                   | BytePlus Dreamina Seedance 2.0          | Video, async |
| [`/frontier/seedance-dirty-dan`](/vdocs/frontier-passthrough/frontier-seedance-dirty-dan.md)               | Seedance 2.0 image-to-video, uncensored | Video, async |
| [`/frontier/omni-flash`](/vdocs/frontier-passthrough/frontier-omni-flash.md)                               | Google `gemini-omni-flash-preview`      | Video, sync  |

## What passthrough does and doesn't mean

**It does** hand you the provider's parameters unchanged, including options the wrapped engines don't expose at all:

* Seedream's **sequential sets** — one call, one coherent set of N images
* Seedance's **reference video and reference audio** roles, alongside images
* ChatGPT Image's automatic **generations vs edits** routing
* Omni Flash, which has no wrapped-engine equivalent

**It doesn't** mean we forward your request blindly. Every frontier route still runs your API key auth, your product entitlement, metering, prompt safeguards, and persistence — so a passthrough result behaves like any other generation: a signed URL, a `generation_id`, and a row in your [generations history](/vdocs/account/generations.md). You get our response envelope, not the provider's raw JSON.

## Reference images

Every image route takes references in whichever form you already have:

* a `data:` URL — `data:image/png;base64,iVBOR...`
* a public `https://` URL
* a bare base64 string

Send them as `images: [...]` (or a single `image: "..."`). **Order is meaningful** — your prompt addresses them as "image 1", "image 2", and so on.

Per-model ceilings:

| Model                | Max reference images                                |
| -------------------- | --------------------------------------------------- |
| ChatGPT Image        | 16                                                  |
| Nano Banana Pro      | 14                                                  |
| Seedream 4.x / 5 Pro | 10 (references + generated ≤ 15)                    |
| Seedance 2.0         | 9 images, plus 3 video and 3 audio (12 files total) |
| Seedance 2 Dirty Dan | 1 image, as a public URL (`image_url`)              |

Going over returns `400` with a `max_reference_images` field rather than failing at the provider.

Both Seedance lanes are the exception on format: their references must be **public https URLs**, because the provider fetches them itself. Use [signed uploads](/vdocs/account/uploads-sign.md) to host your own.

## Pricing

A model costs the same whichever surface you reach it through — the frontier routes meter on the same keys as the wrapped engines:

| Endpoint                              | Price                                              |
| ------------------------------------- | -------------------------------------------------- |
| `/frontier/seedream`                  | $0.29 per image                                    |
| `/frontier/chatgpt-image`             | $0.39                                              |
| `/frontier/nano-banana-pro`           | $0.49                                              |
| `/frontier/seedream-5-pro`            | $0.49 per image                                    |
| `/frontier/seedream-5-pro-uncensored` | $0.49 per image                                    |
| `/frontier/seedance`                  | from $1.59 (scales with `duration`)                |
| `/frontier/seedance-dirty-dan`        | from $2.49 (scales with `duration` + `resolution`) |
| `/frontier/omni-flash`                | $2.49                                              |

The Seedream routes are metered **per output image**: a `count` of 5 costs 5×, and if the provider returns fewer than you asked for, the difference is refunded. Async video refunds in full if the job fails.

If your balance can't cover the call, you get `402` with `required_cents` and the `model` that was priced — before any generation runs.

## Content policy

Most frontier routes are **SFW only**. They run on external providers that moderate server-side and expose no negative prompt or post-generation age check, so prompts go through the SFW guard and the provider's own filter applies on top.

Two exceptions permit adult content, each requiring the separate **`nsfw`** entitlement and each with its own kill-switch: [`/frontier/seedream-5-pro-uncensored`](/vdocs/frontier-passthrough/frontier-seedream-5-pro-uncensored.md) on BytePlus's pre-filter-off image endpoint, and [`/frontier/seedance-dirty-dan`](/vdocs/frontier-passthrough/frontier-seedance-dirty-dan.md) for video, which reaches Seedance 2.0 through a provider whose partner exemption accepts the explicit input ModelArk refuses. For adult generation on our own infrastructure, the self-hosted engines on [Text-to-Image](/vdocs/image-api/images-txt2img.md) and [Image-to-Image](/vdocs/image-api/images-i2i.md) remain the fuller surface.

**Age safeguards apply on every route without exception**, adult lane included: prompts implying minors are rejected with `400`, never merely discouraged.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://bountyv.gitbook.io/vdocs/frontier-passthrough/frontier-overview.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
