{"components":{"schemas":{"ChatCompletion":{"properties":{"choices":{"items":{"properties":{"finish_reason":{"type":"string"},"index":{"type":"integer"},"message":{"properties":{"content":{"type":"string"},"role":{"type":"string"}},"type":"object"}},"type":"object"},"type":"array"},"created":{"type":"integer"},"id":{"type":"string"},"model":{"type":"string"},"object":{"enum":["chat.completion"],"type":"string"},"usage":{"properties":{"completion_tokens":{"type":"integer"},"prompt_tokens":{"type":"integer"},"total_tokens":{"type":"integer"}},"type":"object"}},"type":"object"},"Error":{"properties":{"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"},"param":{"type":"string"},"type":{"type":"string"}},"type":"object"}},"type":"object"}},"securitySchemes":{"bearerAuth":{"description":"API key apihub. Opsional: endpoint terbuka tanpa key.","scheme":"bearer","type":"http"}}},"info":{"description":"Katalog API publik. Endpoint AI kompatibel dengan OpenAI SDK.","license":{"name":"MIT"},"title":"apihub API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/v1/admin/audit":{"GET":{"description":"Mengembalikan jejak audit: perubahan role, kuota, status, tagihan, dan pengaturan.","operationId":"platform_admin_audit","parameters":[{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}},{"description":"Jumlah baris jejak yang dikembalikan.","in":"query","name":"limit","required":false,"schema":{"default":"100","type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Jejak audit","tags":["admin","audit"]}},"/api/v1/admin/billing":{"GET":{"description":"Mengembalikan pendapatan bulanan, jumlah langganan aktif, invoice yang belum dibayar, dan seluruh langganan beserta invoice.","operationId":"platform_admin_billing","parameters":[{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Ringkasan tagihan service","tags":["admin","billing"]}},"/api/v1/admin/cache":{"GET":{"description":"Mengembalikan jumlah jawaban yang tersimpan di cache, jumlah pemakaiannya, dan lamanya cache berlaku. `DELETE` mengosongkan cache.","operationId":"platform_admin_cache","parameters":[{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Statistik cache","tags":["admin","cache"]}},"/api/v1/admin/invoices/{id}":{"PATCH":{"description":"Mengubah status invoice. Body JSON dengan field `status`, misalnya `paid` atau `refunded`.","operationId":"platform_admin_invoice","parameters":[{"description":"ID invoice.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Ubah status invoice","tags":["admin","billing"]}},"/api/v1/admin/keys":{"GET":{"description":"Mengembalikan seluruh API key yang dibuat pengguna. Isi key tidak pernah disimpan dalam bentuk yang bisa dibaca.","operationId":"platform_admin_keys","parameters":[{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Semua API key","tags":["admin","keys"]}},"/api/v1/admin/plans":{"POST":{"description":"Menyimpan paket baru atau mengubah paket yang ada. Body JSON dengan field `id`, `name`, `description`, `price_monthly`, `quota_day`, `quota_minute`, `features`, `active`, dan `sort_order`. Kuota 0 berarti tanpa batas.","operationId":"platform_admin_plans","parameters":[{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Kelola paket","tags":["admin","plans"]}},"/api/v1/admin/settings":{"POST":{"description":"Menyimpan pengaturan service. Body JSON dengan field `key` dan `value`. GET mengembalikan seluruh pengaturan yang tersimpan.","operationId":"platform_admin_settings","parameters":[{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Kelola pengaturan","tags":["admin","settings"]}},"/api/v1/admin/stats":{"GET":{"description":"Mengembalikan jumlah akun, API key, dan request hari ini serta bulan ini.","operationId":"platform_admin_stats","parameters":[{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Ringkasan service","tags":["admin"]}},"/api/v1/admin/usage":{"GET":{"description":"Mengembalikan pemakaian harian seluruh pengguna, termasuk pengguna teratas. Parameter `days` menerima angka 7 sampai 90, default 30.","operationId":"platform_admin_usage","parameters":[{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}},{"description":"Jumlah hari yang dihitung.","in":"query","name":"days","required":false,"schema":{"default":"30","type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Analitik pemakaian","tags":["admin","usage"]}},"/api/v1/admin/users":{"GET":{"description":"Mengembalikan seluruh akun. Hanya admin yang boleh memanggilnya.","operationId":"platform_admin_users","parameters":[{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Daftar pengguna","tags":["admin","users"]}},"/api/v1/admin/users/{id}":{"PATCH":{"description":"Mengubah role, kuota, status, catatan, kata sandi, atau paket sebuah akun. Field yang tidak dikirim tidak berubah. Body JSON, semua field opsional.","operationId":"platform_admin_user","parameters":[{"description":"ID akun.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Bearer session token milik admin.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Ubah satu akun","tags":["admin","users"]}},"/api/v1/auth/keys":{"GET":{"description":"Mengembalikan daftar API key milik akun. Hanya awalan key yang tersimpan, jadi isi key tidak bisa dilihat lagi setelah dibuat.","operationId":"platform_auth_keys","parameters":[{"description":"Bearer session token atau API key.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Daftar API key","tags":["auth","keys"]}},"/api/v1/auth/login":{"POST":{"description":"Memeriksa email dan kata sandi, lalu mengembalikan session token untuk dashboard. Session token berlaku 7 hari.","operationId":"platform_auth_login","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Masuk","tags":["auth","account","login"]}},"/api/v1/auth/me":{"GET":{"description":"Mengembalikan akun yang sedang masuk beserta pemakaian hari ini. Header Authorization diisi dengan session token atau API key.","operationId":"platform_auth_me","parameters":[{"description":"Bearer session token atau API key.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Profil akun","tags":["auth","account"]}},"/api/v1/auth/password":{"POST":{"description":"Mengganti kata sandi akun. Body JSON dengan field `current_password` dan `password`. Kata sandi baru minimal 8 karakter.","operationId":"platform_auth_password","parameters":[{"description":"Bearer session token.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Ganti kata sandi","tags":["auth","account"]}},"/api/v1/auth/profile":{"PATCH":{"description":"Mengubah nama tampilan akun. Body JSON dengan field `name`. Header Authorization diisi dengan session token.","operationId":"platform_auth_profile","parameters":[{"description":"Bearer session token.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Ubah profil","tags":["auth","account"]}},"/api/v1/auth/register":{"POST":{"description":"Membuat akun baru. Akun gratis mendapat 200 request per hari dan 20 request per menit, dengan penghitung harian yang direset setiap pukul 00.00 WIB. Respons berisi akun, session token, dan API key pertama.","operationId":"platform_auth_register","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Daftar akun","tags":["auth","account","register"]}},"/api/v1/billing":{"GET":{"description":"Mengembalikan paket yang tersedia, langganan yang berjalan, invoice, dan cara pembayaran.","operationId":"platform_billing","parameters":[{"description":"Bearer session token atau API key.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Ringkasan tagihan","tags":["billing"]}},"/api/v1/billing/payment-methods":{"POST":{"description":"Menyimpan cara pembayaran. Body JSON dengan field `kind`, `label`, dan `last4`. Kartu tidak disimpan di server, hanya label dan empat digit terakhir.","operationId":"platform_billing_payment-methods","parameters":[{"description":"Bearer session token.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Simpan cara pembayaran","tags":["billing"]}},"/api/v1/billing/subscribe":{"POST":{"description":"Mengubah paket langganan. Body JSON dengan field `plan_id`. Kuota harian dan per menit ikut mengikuti paket yang dipilih.","operationId":"platform_billing_subscribe","parameters":[{"description":"Bearer session token.","in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Ganti paket","tags":["billing"]}},"/api/v1/catalogue":{"GET":{"description":"Mengembalikan daftar model yang bisa dipanggil beserta ukuran konteks, modalitas, dan harga per satu juta token. Endpoint ini terbuka, jadi bisa dipakai untuk melihat pilihan model sebelum membuat akun.","operationId":"platform_catalogue","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Katalog model","tags":["models","catalogue"]}},"/api/v1/categories":{"GET":{"description":"Mengembalikan daftar kategori endpoint beserta jumlah endpoint di setiap kategori.","operationId":"platform_categories","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Kategori endpoint","tags":["catalog"]}},"/api/v1/chat/completions":{"POST":{"description":"Satu endpoint untuk semua model. Prefix model menentukan penyedia yang dipakai, misalnya `notegpt/gemini-3.1-flash-lite`, `bota/default-model`, atau `chatgpt/auto`. Format request dan respons mengikuti OpenAI SDK, termasuk streaming SSE. Setiap request memakai API key: `Authorization: Bearer sk-cat_...`. Key dibuat gratis di dashboard.","operationId":"ai_chat_completions","parameters":[{"description":"API key dengan awalan `sk-cat_`. Buat sendiri di dashboard.","in":"header","name":"Authorization","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"conversation_id":{"type":"string"},"language":{"type":"string"},"length":{"type":"string"},"max_tokens":{"type":"integer"},"messages":{"items":{"type":"object"},"type":"array"},"model":{"description":"ID model, misalnya gemini-3.1-flash-lite.","type":"string"},"stream":{"description":"Kirim SSE bila true.","type":"boolean"},"temperature":{"type":"number"},"tone":{"type":"string"},"web_search":{"description":"Aktifkan pencarian web realtime.","type":"boolean"}},"required":["messages"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletion"}},"text/event-stream":{"schema":{"type":"string"}}},"description":"Chat completion. Streamed atau non-streamed."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Permintaan tidak valid"}},"summary":"Chat completion (OpenAI-compatible)","tags":["openai","chat","streaming","sse","vision"]}},"/api/v1/endpoints":{"GET":{"description":"Mengembalikan seluruh katalog endpoint apicat beserta parameter, contoh, dan kategorinya. Bisa difilter dengan query parameter `category` dan `q`.","operationId":"platform_endpoints","parameters":[{"description":"Saring berdasarkan slug kategori, misalnya `ai`.","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Pencarian teks bebas pada id, ringkasan, dan tag.","in":"query","name":"q","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Katalog endpoint","tags":["catalog","discovery"]}},"/api/v1/files":{"POST":{"description":"Mengunggah file (OpenAI Files API). Body multipart dengan field `file`. Field `model` menentukan penyedia yang menyimpan file, pakai format yang sama seperti chat completion, misalnya `notegpt/gemini-3.1-flash-lite`. File diteruskan ke penyedia dan tidak disimpan di apicat. Batas ukuran satu file 20 MiB.","operationId":"platform_files","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Unggah file","tags":["openai","files","upload"]}},"/api/v1/files/{file_id}/content":{"GET":{"description":"Mengembalikan lokasi file di penyedia tempat file itu disimpan. Respons berupa pengalihan ke file aslinya.","operationId":"platform_files_content","parameters":[{"description":"ID file, misalnya `file-abc123`.","in":"path","name":"file_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Ambil isi file","tags":["openai","files"]}},"/api/v1/images/generations":{"POST":{"description":"Membuat gambar dari sebuah prompt. Tanpa field `image` permintaan ini menjadi pembuatan gambar dari teks saja. Dengan `image`, gambar itu dipakai sebagai acuan dan model mengubahnya sesuai prompt. Field `image` menerima URL publik, data URL base64, atau id file yang sudah diunggah. Model yang dipakai adalah `notegpt/nano-banana`. Respons mengikuti bentuk OpenAI: array `data` berisi `url` hasil gambar.","operationId":"ai_images_generations","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Membuat gambar","tags":["openai","images","generation","text-to-image"]}},"/api/v1/models":{"GET":{"description":"Mengembalikan daftar model dari semua penyedia. IdentIFIER model memakai format penyedia/nama-model, misalnya `notegpt/gemini-3.1-flash-lite`. Format respons mengikuti OpenAI `list` sehingga bisa dipakai langsung oleh SDK (`client.models.list()`).","operationId":"ai_models","parameters":[{"description":"Bearer token API. Tidak wajib.","in":"header","name":"Authorization","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Daftar model","tags":["openai","models"]}},"/api/v1/models/{provider}/{model}":{"GET":{"description":"Mengembalikan metadata satu model, kompatibel dengan `client.models.retrieve()` dari OpenAI SDK. Path terdiri dari dua bagian: nama penyedia dan nama model.","operationId":"ai_models_retrieve","parameters":[{"description":"Nama penyedia, misalnya `notegpt`, `bota`, atau `chatgpt`.","example":"notegpt","in":"path","name":"provider","required":true,"schema":{"type":"string"}},{"description":"Nama model milik penyedia tersebut.","example":"gemini-3.1-flash-lite","in":"path","name":"model","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Detail model","tags":["openai","models"]}},"/api/v1/openapi.json":{"GET":{"description":"Dokumentasi OpenAPI 3.1 dari seluruh endpoint yang tersedia, bisa diimpor ke Postman, Insomnia, atau Scalar.","operationId":"platform_openapi","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Spesifikasi OpenAPI","tags":["catalog","openapi"]}},"/healthz":{"GET":{"description":"Memeriksa apakah service hidup dan penyedia apa saja yang aktif. Digunakan oleh monitoring.","operationId":"platform_health","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Successful response"}},"summary":"Health check","tags":["ops"]}}},"security":[],"servers":[{"url":"https://api.apicat.me"}],"tags":[{"description":"Endpoint AI yang kompatibel dengan OpenAI SDK, dengan beberapa model dari berbagai penyedia.","name":"AI"},{"description":"Endpoint operasional: kesehatan, metadata, dan katalog API.","name":"Platform"}]}
