Lewati ke konten

Dokumentasi API

Panduan lengkap untuk memanggil model lewat API Astranesia AI. Semua contoh memakai base URL publik dan ID model publik.

Pengenalan

Astranesia AI menyediakan satu API untuk mengakses berbagai model AI. Format request dan respons kompatibel dengan OpenAI, sehingga SDK yang sudah Anda pakai cukup diarahkan ke base URL berikut.

Base URL
https://www.astranesia.com/v1
MetodeEndpointFungsi
GET/modelsDaftar model yang dapat dipanggil, lengkap dengan harga.
POST/chat/completionsPercakapan teks, streaming, input gambar, dan tool calling.
POST/embeddingsEmbedding teks.
POST/systemoneModel keputusan terstruktur, hanya untuk model yang diaktifkan.

Reranking belum tersedia dan endpoint-nya dinonaktifkan sampai antarmuka dan pengukuran penggunaannya terverifikasi. Tidak ada langganan: Anda mengisi saldo Rupiah dan membayar sesuai penggunaan.

Memulai

  1. Buat akun. Pendaftaran gratis.
  2. Isi saldo di menu Saldo & Top-up dengan Virtual Account bank. Saldo masuk setelah pembayaran terkonfirmasi.
  3. Buat API key di menu API Key. Kunci hanya ditampilkan sekali, simpan dengan aman.
  4. Panggil API dengan kunci tersebut seperti contoh di bawah.
curl "https://www.astranesia.com/v1/chat/completions" \
  -H "Authorization: Bearer $AI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4.1-mini",
    "messages": [
      { "role": "system", "content": "Jawab dengan singkat dalam Bahasa Indonesia." },
      { "role": "user", "content": "Halo!" }
    ]
  }'

Autentikasi

Setiap request harus menyertakan API key lewat header Authorization dengan skema Bearer.

Header
Authorization: Bearer sk-astranesia-xxxxxxxxxxxxxxxx
  • Kunci terikat pada akun Anda. Kunci yang dicabut langsung berhenti berlaku.
  • Kami hanya menyimpan hash kunci. Jika kunci hilang, buat kunci baru dan cabut yang lama dari dashboard.
  • Percobaan autentikasi yang gagal berulang dari satu alamat dibatasi sementara dengan status 429 dan kode too_many_auth_failures.

Daftar Model

GET /models mengembalikan model yang dapat dipanggil saat ini. Gunakan nilai id sebagai parameter model. Harga dalam Rupiah per 1 juta token. Katalog lengkap juga ada di halaman Model.

curl "https://www.astranesia.com/v1/models" \
  -H "Authorization: Bearer $AI_API_KEY"
Respons
{
  "object": "list",
  "data": [
    {
      "id": "openai/gpt-4.1-mini",
      "object": "model",
      "created": 1767225600,
      "owned_by": "OpenAI",
      "name": "GPT-4.1 mini",
      "type": "chat",
      "context_length": 1047576,
      "max_output_tokens": 32768,
      "capabilities": ["text", "vision", "tools", "streaming", "json_mode"],
      "input_modalities": ["text", "image"],
      "output_modalities": ["text"],
      "pricing": {
        "currency": "IDR",
        "input_per_million_tokens": "7920",
        "output_per_million_tokens": "31680",
        "cached_input_per_million_tokens": "1980",
        "per_request": null
      }
    }
  ]
}

Chat Completions

POST /chat/completions menjalankan percakapan. Mendukung pesan system, input gambar pada model yang kompatibel, streaming, dan tool calling bila didukung model. Cek kemampuan setiap model pada halaman modelnya.

curl "https://www.astranesia.com/v1/chat/completions" \
  -H "Authorization: Bearer $AI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4.1-mini",
    "messages": [
      { "role": "system", "content": "Jawab dengan singkat dalam Bahasa Indonesia." },
      { "role": "user", "content": "Halo!" }
    ]
  }'
Respons
{
  "id": "chatcmpl-9f2c1a",
  "object": "chat.completion",
  "created": 1767225600,
  "model": "openai/gpt-4.1-mini",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "Halo! Ada yang bisa saya bantu?" },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 24,
    "completion_tokens": 11,
    "total_tokens": 35
  }
}

Parameter

ParameterTipeKeterangan
modelwajibstringID model publik, misalnya yang dikembalikan oleh GET /models.
messageswajibarrayPercakapan. Role yang didukung: system, developer, user, assistant, dan tool. Konten berupa teks atau array bagian teks dan gambar.
streambooleanKirim respons sebagai Server-Sent Events. Hanya untuk model dengan kemampuan streaming.
stream_options.include_usagebooleanSertakan chunk akhir berisi usage pada stream.
max_tokensintegerBatas token output. Jika kosong, batas default platform diterapkan.
max_completion_tokensintegerAlternatif max_tokens. Nilai di atas batas output model ditolak.
temperaturenumber0 sampai 2.
top_pnumber0 sampai 1.
stopstring | string[]Hingga 4 urutan penghenti.
presence_penalty / frequency_penaltynumber-2 sampai 2.
seedintegerMeminta hasil yang lebih deterministik jika didukung model.
logit_biasobjectPeta ID token ke bias -100 sampai 100.
logprobs / top_logprobsboolean / integerMengembalikan log probabilitas jika didukung model.
response_formatobjecttext, json_object, atau json_schema. Memerlukan kemampuan JSON mode.
tools / tool_choicearray / string | objectDefinisi fungsi dan pilihan pemanggilan. Memerlukan kemampuan tool calling.
parallel_tool_callsbooleanIzinkan beberapa pemanggilan tool dalam satu giliran.
reasoning_effortstringminimal, low, medium, atau high, jika didukung model.
userstringPengenal opsional untuk pengguna akhir Anda.
nintegerHanya mendukung nilai 1.

Tool calling

Kirim definisi fungsi pada tools. Jika model memutuskan memanggil fungsi, respons berisi tool_calls. Jalankan fungsi di aplikasi Anda, lalu kirim hasilnya sebagai pesan dengan role tool dan tool_call_id yang sesuai.

curl "https://www.astranesia.com/v1/chat/completions" \
  -H "Authorization: Bearer $AI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4.1-mini",
    "messages": [{ "role": "user", "content": "Cuaca di Jakarta?" }],
    "tools": [
      {
        "type": "function",
        "function": {
          "name": "get_weather",
          "description": "Ambil cuaca terkini untuk sebuah kota.",
          "parameters": {
            "type": "object",
            "properties": { "city": { "type": "string" } },
            "required": ["city"]
          }
        }
      }
    ]
  }'

Streaming

Tambahkan stream: true untuk menerima potongan hasil secara langsung sebagai Server-Sent Events. Potongan diteruskan apa adanya tanpa ditahan, termasuk delta tool call. Stream diakhiri dengan data: [DONE].

Penagihan selalu memakai data penggunaan akhir dari model. Jika koneksi Anda terputus di tengah stream, request tetap diselesaikan di sisi server dan ditagih sesuai token yang benar-benar diproses.

curl -N "https://www.astranesia.com/v1/chat/completions" \
  -H "Authorization: Bearer $AI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4.1-mini",
    "stream": true,
    "stream_options": { "include_usage": true },
    "messages": [{ "role": "user", "content": "Ceritakan tentang Nusantara." }]
  }'
Contoh event
data: {"id":"chatcmpl-9f2c1a","object":"chat.completion.chunk","model":"openai/gpt-4.1-mini","choices":[{"index":0,"delta":{"content":"Halo"}}]}

data: {"id":"chatcmpl-9f2c1a","object":"chat.completion.chunk","model":"openai/gpt-4.1-mini","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: {"id":"chatcmpl-9f2c1a","object":"chat.completion.chunk","model":"openai/gpt-4.1-mini","choices":[],"usage":{"prompt_tokens":24,"completion_tokens":11,"total_tokens":35}}

data: [DONE]

Vision

Untuk model dengan kemampuan Vision, kirim gambar sebagai bagian image_url pada konten pesan user. URL harus memakai https://, atau gunakan data URL base64 untuk png, jpeg, gif, dan webp. Model tanpa kemampuan Vision menolak request dengan vision_not_supported.

curl "https://www.astranesia.com/v1/chat/completions" \
  -H "Authorization: Bearer $AI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4.1-mini",
    "messages": [
      {
        "role": "user",
        "content": [
          { "type": "text", "text": "Apa yang ada pada gambar ini?" },
          { "type": "image_url", "image_url": { "url": "https://example.com/foto.jpg" } }
        ]
      }
    ]
  }'

Embeddings

POST /embeddings mengubah teks menjadi vektor. input dapat berupa satu teks atau array hingga 2.048 item. Parameter opsional: encoding_format (float atau base64) dan dimensions bila didukung model. Biaya dihitung dari token input.

curl "https://www.astranesia.com/v1/embeddings" \
  -H "Authorization: Bearer $AI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/text-embedding-3-small",
    "input": "Satu API untuk berbagai model AI."
  }'
Respons
{
  "object": "list",
  "data": [{ "object": "embedding", "index": 0, "embedding": [0.0123, -0.0456, 0.0789] }],
  "model": "openai/text-embedding-3-small",
  "usage": { "prompt_tokens": 9, "total_tokens": 9 }
}

System One

POST /systemone menjalankan model keputusan terstruktur. Endpoint ini hanya aktif untuk model yang skema request dan perilaku penagihannya sudah diverifikasi. Isi request mengikuti skema model tersebut dan tidak menerima parameter di luar skema.

Skema dan contoh pemanggilan yang tepat ditampilkan pada halaman setiap model System One di katalog. Jika belum ada model System One yang tercantum, fitur ini belum diaktifkan.

Error Handling

Error dikembalikan sebagai JSON dengan status HTTP yang sesuai. Setiap respons membawa header X-Request-Id; sertakan nilainya saat menghubungi dukungan.

Format error
{
  "error": {
    "message": "Saldo tidak mencukupi untuk request ini. Isi saldo di dashboard lalu coba lagi.",
    "type": "billing_error",
    "param": null,
    "code": "insufficient_credits"
  }
}
HTTPcodeKeterangan
400invalid_jsonIsi request bukan JSON yang valid.
400invalid_requestParameter tidak valid. Kolom param menunjuk ke bidang yang salah.
400request_rejectedModel menolak request. Periksa parameter dan isi pesan.
400model_type_mismatchModel tidak cocok dengan endpoint yang dipanggil.
400streaming_not_supportedModel tidak mendukung stream: true.
400vision_not_supportedModel tidak menerima input gambar.
400invalid_image_urlURL gambar harus https:// atau data URL base64.
400tools_not_supportedModel tidak mendukung tool calling.
400json_mode_not_supportedModel tidak mendukung response_format JSON.
400max_tokens_too_largemax_tokens melebihi batas output model.
400unsupported_parameterParameter tidak didukung, misalnya n selain 1.
400embedding_not_supportedModel tidak mendukung embedding.
400system_one_not_supportedModel tidak mendukung System One.
401missing_api_keyHeader Authorization tidak ada.
401invalid_api_keyAPI key salah atau sudah dicabut.
402insufficient_creditsSaldo tersedia kurang dari perkiraan biaya maksimum request.
403account_disabledAkun dinonaktifkan.
404model_not_foundModel tidak ada atau belum tersedia lewat API.
413payload_too_largeUkuran request melebihi batas.
415unsupported_content_typeContent-Type harus application/json.
429rate_limit_exceededBatas request per menit tercapai. Perhatikan header Retry-After.
429concurrency_limit_exceededTerlalu banyak request yang sedang berjalan.
429too_many_auth_failuresTerlalu banyak percobaan autentikasi yang gagal dari satu alamat. Tunggu sesuai header Retry-After.
429model_busyModel sedang sibuk. Coba lagi sebentar lagi.
501feature_disabledFitur belum diaktifkan, misalnya reranking.
502model_errorTerjadi gangguan pada model.
503model_unavailableModel sedang tidak tersedia.
503service_unavailableLayanan inferensi belum tersedia saat ini.
504model_timeoutModel tidak merespons tepat waktu.
500internal_errorKesalahan internal. Sertakan X-Request-Id saat menghubungi dukungan.
  • Status 429 dan 5xx bersifat sementara. Ulangi dengan jeda yang bertambah dan hormati header Retry-After.
  • Request yang gagal sebelum model menghasilkan output tidak dikenai biaya dan saldo yang ditahan dikembalikan.
  • Batas akun: 60 request per menit dan 5 request bersamaan. Header X-RateLimit-Limit dan X-RateLimit-Remaining menunjukkan sisa jatah.

Pricing & Credits

Satu kredit sama dengan Rp1. Top-up Rp100.000 menjadi saldo Rp100.000. Tidak ada langganan atau biaya bulanan.

  • Biaya request = token input × harga input + token output × harga output, dibagi 1 juta. Token input tersimpan (cached) memakai harga cached bila model menyediakannya.
  • Penahanan saldo. Sebelum request diproses, perkiraan biaya maksimum ditahan dari saldo. Setelah selesai, biaya sebenarnya dipotong dan sisanya dikembalikan.
  • Harga terkunci per request. Perubahan harga tidak memengaruhi request yang sedang berjalan atau tagihan yang sudah tercatat.
  • Data penggunaan tidak lengkap. Jika model tidak melaporkan token, atau stream dari model terputus setelah mulai menghasilkan output, request ditinjau lebih lanjut dan saldo tetap ditahan sampai selesai. Kami tidak memperkirakan token untuk menentukan tagihan.

Usage

Setiap respons chat dan embedding menyertakan objek usage berisi prompt_tokens, completion_tokens, dan total_tokens. Riwayat lengkap per request, termasuk model, token, biaya, dan waktu, tersedia di menu Penggunaan pada dashboard. Mutasi saldo tercatat di menu Transaksi.

Prompt dan hasil percakapan Anda tidak disimpan di riwayat penggunaan. Yang dicatat hanyalah metadata penagihan.

SDK Examples

Karena kompatibel dengan OpenAI, hampir semua SDK dan kerangka kerja dapat dipakai dengan mengganti base URL dan API key.

Vercel AI SDK

TypeScript
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
import { generateText } from "ai";

const provider = createOpenAICompatible({
  name: "astranesia-ai",
  apiKey: process.env.AI_API_KEY,
  baseURL: "https://www.astranesia.com/v1",
});

const { text } = await generateText({
  model: provider("openai/gpt-4.1-mini"),
  prompt: "Jelaskan apa itu API dalam satu kalimat.",
});

console.log(text);

LangChain

Python
import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="openai/gpt-4.1-mini",
    api_key=os.environ["AI_API_KEY"],
    base_url="https://www.astranesia.com/v1",
)

print(llm.invoke("Jelaskan apa itu API dalam satu kalimat.").content)