---
title: "Google Gemini streamGenerateContent on a PopNow text model"
method: POST
path: "/v1beta/models/{model}:streamGenerateContent"
tags: ["OpenAI Compatible"]
---

# Google Gemini streamGenerateContent on a PopNow text model

`POST /v1beta/models/{model}:streamGenerateContent`

## Request

- Base URL: `https://api.popnow.ai`
- URL: `https://api.popnow.ai/v1beta/models/{model}:streamGenerateContent`
- Auth: HTTP bearer

Same request as `generateContent`. With `?alt=sse` (what the Google
GenAI SDKs send) the response is a server-sent event stream where each
`data:` line is one `GenerateContentResponse`; the final one carries
`finishReason` and `usageMetadata`. There is no `[DONE]` sentinel.
Without `alt=sse` the response is a JSON array of
`GenerateContentResponse` objects written progressively.

Billing: chat models are priced per token in credits (1 credit = $0.001), listed per 1M input and output
tokens in `credits` on `GET /api/v1/models` and `GET /v1/models`. When the request is accepted, the most it
can cost is held from your balance, computed from the input and `max_tokens` (the model's maximum output when
you omit it, so set `max_tokens` to keep holds small). When the reply ends you are charged its actual usage in
fractional credits, with no per-request minimum, and the rest of the hold is released. A balance below the
hold, or a key spend limit that would be exceeded, returns `402` before anything is sent to the model. A request
that fails or that the model refuses is refunded in full. The `X-PopNow-Task-Id` response header names the task;
`GET /api/v1/jobs/recordInfo` shows the final charge in `cost` (USD) and `exactCredits`. Message text is not
kept after the charge settles. Requests are forwarded to the model as sent and each model's own usage policy applies.

## Path parameters

- `model` string, required

## Query parameters

- `alt` 'sse'

## Headers

- `Idempotency-Key` string

## Request body

- GeminiGenerateContentRequest: Google Gemini `generateContent` request. Which generation parameters a model accepts comes from that model's `inputSchema` in `/v1/models` and the catalog. Sampling parameters the model does not declare (temperature, topP, topK, penalties) are ignored and listed in the `X-PopNow-Ignored-Params` response header; any other unsupported parameter returns 400.
  - `contents` object[], required
    - `role` 'user' | 'model'
    - `parts` object[]
  - `systemInstruction` object
  - `tools` object[]
  - `toolConfig` object
  - `generationConfig` object
    - `temperature` number
    - `topP` number
    - `maxOutputTokens` integer
    - `stopSequences` string[]
    - `responseMimeType` string
    - `responseSchema` object
    - `thinkingConfig` object

## Response `200`

An SSE stream (`alt=sse`) or a JSON array of `GenerateContentResponse`.

- GeminiGenerateContentResponse[]
  - `candidates` object[]
    - `index` integer
    - `content` object
      - `role` string
      - `parts` object[]
    - `finishReason` string
  - `usageMetadata` object
    - `promptTokenCount` integer
    - `candidatesTokenCount` integer
    - `totalTokenCount` integer
    - `cachedContentTokenCount` integer
    - `thoughtsTokenCount` integer
  - `modelVersion` string: The PopNow model identifier.
  - `responseId` string

## Other responses

- `400`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).
- `401`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).
- `402`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).
- `403`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).
- `404`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).
- `409`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).
- `413`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).
- `429`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).
- `500`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).
- `503`: Error in the Google `{error:{code,message,status}}` shape. `status` is the google.rpc code name (for example `INVALID_ARGUMENT`, `UNAUTHENTICATED`, `RESOURCE_EXHAUSTED`).

---

[API](https://skmtc.dev/popnow/apis/popnow-api.md) · [All operations](https://skmtc.dev/popnow/apis/popnow-api/llms.txt) · [OpenAPI document](https://skmtc.dev/popnow/apis/popnow-api/revisions/fede911a6e9b?raw)
