탐색으로 건너뛰기

Gemini 네이티브

Gemini generateContent 요청과 BeatAPI 키 하나로 Gemini 4 Argon, Gemini 4 Carbon, Gemini 3.8 Flash, Gemini 3.1 Pro를 호출합니다.

  • 현재 모든 Gemini 모델에 POST /v1beta/models/{model}:generateContent를, 스트리밍에는 :streamGenerateContent?alt=sse를 사용합니다.
  • 텍스트·이미지 입력, 텍스트 출력, 스트리밍, 함수 호출, 사고.
  • 키는 x-goog-api-key 헤더나 Bearer 토큰으로 보내세요.
  • 모델은 본문이 아니라 URL에 지정합니다.

텍스트 요청의 기본 URL로는 https://direct.beatapi.io를 사용하세요. Cloudflare의 100초 제한을 받지 않으므로 스트리밍하지 않는 긴 요청도 끊기지 않습니다. https://api.beatapi.io도 동작하며, 네트워크에서 direct.beatapi.io에 접근할 수 없을 때의 대안입니다. 키, 모델, 가격은 양쪽이 같습니다. 이미지와 영상 API는 https://api.beatapi.io만 사용합니다.

POST/v1beta/models/{model}:generateContent실행해 보기

API Explorer에서 이 엔드포인트를 엽니다. BeatAPI API 키를 입력하고 전송하세요. 실제 호출이며 본인 잔액에서 과금됩니다.

모델

URL의 {model} 자리에 다음 ID 중 하나를 넣으세요.

모델 ID컨텍스트(토큰)최대 출력(토큰)포지셔닝입력, 1M 토큰당 USD출력, 1M 토큰당 USD
gemini-4-argon—1,000,000최대 1M 토큰까지 출력할 수 있는 Google의 Gemini 4 플래그십 모델.$1.00$5.00
gemini-4-carbon—1,000,000복잡한 디버깅, 과학적 분석, 에이전트를 위한 Gemini 4 추론 모델$1.00$5.00
gemini-3.8-flash——장기 소프트웨어 엔지니어링, 자율 에이전트, 복잡한 엔터프라이즈 워크플로를 위해 설계된 Google의 가장 지능적인 Flash 모델$0.375$1.875
gemini-3.1-pro-preview1,048,57665,536에이전트 코딩과 복잡한 문제 해결을 위한 추론 중심 Gemini 프리뷰$1.00$6.00
  • 가격은 할인이 적용된 기본 등급입니다. 롱 컨텍스트 등급, 캐시 입력 요금, 캐시 쓰기는 이 표에 없습니다. 가격표를 참고하세요.
  • —는 카탈로그에서 해당 수치를 공개하지 않는다는 뜻입니다.

이 계열의 이전 ID도 계속 동작하며 레거시 모델에 나와 있습니다.

빠른 시작

키는 BEATAPI_API_KEY에 보관하고 브라우저 코드에는 절대 넣지 마세요. 모델 ID는 URL에 들어가므로 본문에는 model 필드가 없습니다. 아래는 요청 예시이며 실제로 기록된 모델 출력이 아닙니다.

candidates[0].content.parts[0].text에서 답변을 읽은 다음 candidates[0].finishReason과 usageMetadata를 확인하세요. HTTP 200만으로는 답변이 작업 요구를 충족한다고 볼 수 없으니 애플리케이션에서 검증하세요. 텍스트 요청은 바로 반환되므로 /v1/tasks를 폴링하지 마세요.

curl --request POST \
--url https://direct.beatapi.io/v1beta/models/gemini-3.8-flash:generateContent \
--header "x-goog-api-key: $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"contents": [
{
"role": "user",
"parts": [
{
"text": "Design a resilient webhook retry strategy for a payments API."
}
]
}
]
}'

엔드포인트와 인증

POST https://direct.beatapi.io/v1beta/models/{model}:generateContent

x-goog-api-key string 필수

x-goog-api-key 헤더에 넣는 BeatAPI 키입니다. Authorization: Bearer <BEATAPI_API_KEY>도 받습니다.

스트리밍은 POST /v1beta/models/{model}:streamGenerateContent?alt=sse를 호출하세요. 키는 x-goog-api-key 헤더나 Authorization: Bearer <key>에 넣으며 둘 다 동작합니다.

:countTokens는 사용할 수 없으며 404를 반환합니다.

요청 파라미터

아래는 효과가 있는 필드입니다. 다른 Gemini 필드(generationConfig.thinkingConfig, generationConfig.responseMimeType, generationConfig.responseSchema, generationConfig.seed, safetySettings, toolConfig, cachedContent)는 요청에서 받지만 효과가 없으니 의존하지 마세요.

contents object[] 필수

대화 내용이며 오래된 턴부터 나열합니다. 각 항목에는 role(user 또는 model)와 parts가 있습니다. 파트는 text, inlineData(mimeType과 base64 data), fileData(mimeType과 fileUri), functionCall 또는 functionResponse입니다.

  • 현재 모든 Gemini 모델이 이미지 입력을 지원합니다. inlineData를 쓰거나 이미지 URL과 함께 fileData를 사용하세요. 다른 미디어는 사용하기 전에 파일 형식을 테스트하세요.
  • contents가 비어 있거나 없으면 400 bad_request입니다.

예시

[
{
"role": "user",
"parts": [
{ "text": "What is in this image?" },
{ "inlineData": { "mimeType": "image/png", "data": "<base64>" } }
]
}
]

systemInstruction object 선택

시스템 프롬프트이며 { "parts": [{ "text": "..." }] } 형식입니다. text 파트만 사용됩니다.

예시

{
"parts": [{ "text": "Answer in one short paragraph." }]
}

generationConfig object 선택

생성 옵션입니다. 효과가 있는 하위 필드: maxOutputTokens, temperature, topP, topK, stopSequences, candidateCount.

예시

{
"temperature": 0.7,
"topP": 0.95,
"maxOutputTokens": 2048,
"stopSequences": ["END"]
}

generationConfig.maxOutputTokens integer 선택

생성 토큰의 상한이며, 사고 토큰을 포함합니다.

  • 허용되는 최댓값은 1,073,741,823이며, 그보다 크면 400 bad_request입니다. 위 표에 있는 모델의 최대 출력 이하로 설정하세요.
  • Gemini 모델은 기본적으로 사고하며, 사고 토큰은 출력으로 과금되고 이 한도에 포함됩니다. 값이 작으면 사고에 모두 쓰여 finishReason: "MAX_TOKENS"와 함께 빈 답변이 나올 수 있습니다. 짧은 답변이라도 최소 1,000토큰을 잡으세요.
  • maxOutputTokens는 요청에 필요한 잔액을 추정하는 데도 쓰입니다. 실제 출력이 작더라도 값이 너무 크면 402 insufficient_credits로 거부될 수 있습니다. 필요한 만큼만 설정하세요.

generationConfig.temperature number 선택

샘플링 온도입니다.

generationConfig.topP number 선택

누클리어스 샘플링입니다. 0 값은 무시됩니다.

generationConfig.topK integer 선택

Top-K 샘플링입니다. 0 값은 무시됩니다.

generationConfig.stopSequences string[] 선택

생성을 멈추는 문자열입니다. 최대 4개까지 사용됩니다.

generationConfig.candidateCount integer 선택

반환할 후보 수입니다. 둘 이상이 필요하지 않다면 설정하지 마세요.

tools object[] 선택

모델이 호출할 수 있는 함수 선언이며 [{ "functionDeclarations": [...] }] 형식입니다. 각 선언에는 name, description, parameters(JSON Schema)가 있습니다. 호출은 functionCall 파트로 반환되며, 결과는 다음 user 턴의 functionResponse 파트로 반환하세요.

  • functionDeclarations만 사용됩니다. googleSearch, codeExecution 같은 내장 도구는 무시됩니다.

예시

[
{
"functionDeclarations": [
{
"name": "get_weather",
"description": "Get the current weather for a city.",
"parameters": {
"type": "object",
"properties": { "city": { "type": "string" } },
"required": ["city"]
}
}
]
}
]

응답

스트리밍하지 않는 호출은 JSON 객체 하나를 반환합니다. 아래는 축약한 예시입니다.

{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"text": "Retry with exponential backoff and jitter, and make every handler idempotent."
}
]
},
"finishReason": "STOP",
"index": 0
}
],
"usageMetadata": {
"promptTokenCount": 19,
"candidatesTokenCount": 16,
"totalTokenCount": 120,
"thoughtsTokenCount": 85
}
}

응답 필드

필드타입설명
candidates[].content.parts[].textstring답변 텍스트입니다.
candidates[].content.parts[].functionCallobject도구 호출이며 name과 args가 있습니다.
candidates[].finishReasonstring완전한 답변이나 도구 호출이면 STOP, maxOutputTokens에 도달하면 MAX_TOKENS, 답변이 필터링되면 SAFETY입니다.
usageMetadata.promptTokenCountinteger입력 토큰입니다.
usageMetadata.candidatesTokenCountinteger보이는 답변의 출력 토큰입니다.
usageMetadata.thoughtsTokenCountinteger사고 토큰입니다. 출력으로 과금됩니다. 사고 텍스트 자체는 반환되지 않습니다.
usageMetadata.totalTokenCountinteger호출의 전체 토큰입니다.

스트리밍

:streamGenerateContent?alt=sse를 호출하세요. 모든 이벤트는 candidates 객체를 담은 data: {...} 한 줄이며, 스트리밍하지 않는 답변과 형식이 같습니다.

  • 마지막 이벤트에는 finishReason이 있습니다(예: "STOP").
  • 응답은 text/event-stream입니다. 모델 호출 전에 발생한 실패는 스트림 이벤트가 아니라 HTTP 상태와 함께 일반 JSON 오류로 반환됩니다.
  • 명시적인 시간 제한을 설정하고, 스트리밍 응답은 안전하게 다시 연결하세요.
data: {"candidates":[{"content":{"role":"model","parts":[{"text":"Retry"}]},"index":0}]}
data: {"candidates":[{"content":{"role":"model","parts":[{"text":" with backoff"}]},"finishReason":"STOP","index":0}],"usageMetadata":{"promptTokenCount":19,"candidatesTokenCount":16,"totalTokenCount":120,"thoughtsTokenCount":85}}

오류

오류 또는 증상원인해결 방법
400: contents는 필수입니다contents가 비어 있거나 없습니다.contents에 턴을 하나 이상 보내세요.
400: maxOutputTokens가 잘못되었습니다generationConfig.maxOutputTokens가 1,073,741,823보다 큽니다.필요한 만큼으로 낮추세요.
402 insufficient_credits잔액이 요청 가격보다 적습니다. 대개 maxOutputTokens가 너무 크기 때문입니다.충전하거나 maxOutputTokens를 낮추세요.
403 forbidden계정이 무료 크레딧 상태인데 모델이 무료 목록에 없거나, 모델이 키의 그룹 밖에 있습니다.충전하거나, 무료 모델을 쓰거나, 그룹에서 해당 모델에 접근할 수 있는 키를 사용하세요.
404 not_found알 수 없는 모델 ID이거나, 이 키에서 사용할 수 없거나, :countTokens 액션입니다.GET /v1/models로 사용 가능한 모델을 확인하세요.
429 rate_limit_exceeded계정 또는 무료 모델 한도에 도달했습니다.Retry-After만큼 기다린 뒤 재시도하세요.
finishReason: "MAX_TOKENS"와 함께 text 없이 200답변을 쓰기 전에 사고가 maxOutputTokens를 모두 써 버렸습니다.generationConfig.maxOutputTokens를 높이세요. 짧은 답변도 최소 1,000입니다.

HTTP 오류 요약

Gemini 네이티브 엔드포인트의 오류 형식은 {"error": {"message", "type": "beatapi_error", "code"}} 하나입니다. 코드는 error.code에 있고, 요청 id는 message로 끝나며, retryable 필드는 없습니다. 오류를 참고하세요.

HTTP 상태코드조치
400bad_request, content_policy_violation요청이나 입력을 수정하세요. 그대로 다시 보내지 마세요.
401missing_api_key, invalid_api_key키를 확인하세요. 재시도하지 마세요.
402insufficient_credits충전하거나 키 한도를 높이세요. max_tokens가 너무 크면 발생할 수 있습니다.
403forbidden모델이 키의 그룹이나 IP 허용 목록 밖에 있거나, 무료 크레딧으로 이 모델을 호출할 수 없습니다.
404not_found알 수 없는 모델입니다. GET /v1/models로 사용 가능한 모델 목록을 확인하세요.
429rate_limit_exceededRetry-After 또는 retry_after_seconds만큼 기다린 뒤 백오프를 두고 재시도하세요.
500internal_error, temporary_error백오프를 적용해 한두 번 재시도하세요.
503model_unavailable, upstream_timeout, temporary_error백오프를 적용해 재시도하거나 다른 모델을 사용하세요.

전체 코드 표와 재시도 정책: 오류.

참고

  • Gemini 모델은 Chat Completions, Responses, Anthropic Messages에서도 응답합니다. 다른 Gemini 페이지를 참고하세요.
  • 사고 토큰은 출력 토큰으로 과금됩니다. 답변만이 아니라 사고와 답변을 합친 만큼 출력 한도를 잡으세요.
  • API 키는 신뢰할 수 있는 서버에 두고, 응답의 요청 ID를 기록하며, 429, 500, 503만 재시도하세요.

인증

AuthorizationBearer

API 키를 Authorization: Bearer <BEATAPI_API_KEY>로 보내세요.

경로 매개변수

modelenum필수
허용된 값:

요청

This endpoint expects an object.
contentslist of objects필수

대화 내용이며 오래된 턴부터 나열합니다. 각 항목에는 role(user 또는 model)와 parts가 있습니다. 파트는 text, inlineData(mimeType과 base64 data), fileData(mimeType과 fileUri), functionCall 또는 functionResponse입니다.

현재 모든 Gemini 모델이 이미지 입력을 지원합니다. inlineData를 쓰거나 이미지 URL과 함께 fileData를 사용하세요. 다른 미디어는 사용하기 전에 파일 형식을 테스트하세요.

contents가 비어 있거나 없으면 400 bad_request입니다.

systemInstructionobject선택 사항

시스템 프롬프트이며 { "parts": [{ "text": "..." }] } 형식입니다. text 파트만 사용됩니다.

generationConfigobject선택 사항

생성 옵션입니다. 효과가 있는 하위 필드: maxOutputTokens, temperature, topP, topK, stopSequences, candidateCount.

toolslist of objects선택 사항

모델이 호출할 수 있는 함수 선언이며 [{ "functionDeclarations": [...] }] 형식입니다. 각 선언에는 name, description, parameters(JSON Schema)가 있습니다. 호출은 functionCall 파트로 반환되며, 결과는 다음 user 턴의 functionResponse 파트로 반환하세요.

functionDeclarations만 사용됩니다. googleSearch, codeExecution 같은 내장 도구는 무시됩니다.

응답

스트리밍하지 않는 호출은 JSON 객체 하나를 반환합니다. 아래는 축약한 예시입니다.

candidateslist of objects선택 사항
usageMetadataobject선택 사항

오류

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
404
Not Found Error
429
Too Many Requests Error
500
Internal Server Error
503
Service Unavailable Error