Mengambil Data dari REST API dengan Python untuk Analis
TL;DR
REST API adalah cara sebuah aplikasi ngasih datanya ke program lain lewat URL, dan Python bisa manggil URL itu pakai library requests. Dengan tiga baris kode kamu udah bisa narik data JSON, terus diubah jadi DataFrame pandas buat dianalisis. Yang bikin script API layak dipakai di kerjaan nyata itu tiga hal: API key yang disimpan aman, pagination biar semua halaman keambil, dan retry biar nggak berhenti gara-gara server lagi sibuk.
REST API adalah cara sebuah aplikasi ngasih datanya ke program lain lewat URL. Kamu kirim permintaan ke satu alamat, server balas data dalam format JSON, selesai.
Buat analis, ini artinya kamu berhenti nunggu. Nggak perlu lagi minta tim IT export CSV tiap Senin pagi, terus nunggu tiga hari, terus dapet file yang formatnya beda dari minggu lalu.
Aku pakai cara ini buat narik data kurs, data cuaca, data marketplace, sampai data internal dari sistem kasir. Di bawah ini urutan lengkapnya, dari request pertama sampai script yang aman dipakai tiap hari.
Apa itu REST API dan kenapa analis perlu peduli?
REST API adalah kumpulan alamat URL yang disediakan sebuah sistem supaya program lain bisa minta atau kirim data. Kamu panggil satu URL, server balas datanya dalam JSON. Buat analis, API itu sumber data yang selalu fresh dan formatnya konsisten, beda dari file ekspor manual yang gampang berubah.
Satu API biasanya punya banyak endpoint. Endpoint itu alamat spesifik untuk satu jenis data, misalnya /transactions buat transaksi dan /products buat katalog produk.
Cara narik data lewat API ini masuk tahap ekstraksi dalam alur ETL. Setelah datanya masuk, baru kamu bersihin dan simpan.
Apa yang perlu disiapin sebelum narik data?
Tiga hal: dokumentasi API-nya, kredensial kalau dibutuhin, dan dua library Python. Buka dokumentasi resmi penyedia API dulu, cari daftar endpoint dan parameter yang mereka terima. Sepuluh menit baca dokumentasi bisa nghemat dua jam nebak-nebak.
pip install requests pandas
requests yang manggil API, pandas yang ngubah hasilnya jadi tabel. Dokumentasi lengkap requests ada di requests.readthedocs.io.
Gimana cara ambil data dari REST API dengan Python?
Empat langkah: kirim GET request ke endpoint, cek status code-nya, ubah response jadi dict Python pakai .json(), lalu masukin ke DataFrame. Buat API sederhana tanpa autentikasi, seluruh prosesnya muat dalam lima baris kode.
- Kirim request. Pakai
requests.get()dan selalu kasihtimeout. - Cek statusnya.
raise_for_status()bakal ngelempar error kalau servernya balas 404 atau 500. - Parse JSON-nya.
.json()ngubah teks JSON jadi dictionary Python. - Masukin ke DataFrame. Baru dari sini kamu bisa filter, agregasi, dan simpan.
import requests
import pandas as pd
url = "https://api.frankfurter.app/latest"
params = {"from": "USD", "to": "IDR"}
response = requests.get(url, params=params, timeout=15)
response.raise_for_status()
data = response.json()
print(data)
# {'amount': 1.0, 'base': 'USD', 'date': '2025-09-22', 'rates': {'IDR': 15234.5}}
kurs = data["rates"]["IDR"]
print(f"1 USD = Rp{kurs:,.0f}")
Frankfurter itu API kurs gratis yang gak butuh key, jadi enak buat latihan pertama. Parameter dikirim lewat argumen params, bukan ditempel manual ke string URL. Requests yang ngurus encoding-nya.
Gimana cara masukin API key dengan aman?
Sebagian besar API bisnis minta kredensial. Bentuknya biasanya header Authorization: Bearer <token> atau parameter api_key di URL. Aturan pentingnya cuma satu: jangan pernah nulis key langsung di dalam file notebook yang bakal kamu share atau push ke GitHub.
import os
import requests
API_KEY = os.environ["NGULIK_API_KEY"]
headers = {
"Authorization": f"Bearer {API_KEY}",
"Accept": "application/json",
}
response = requests.get(
"https://api.contoh-erp.id/v1/transactions",
headers=headers,
params={"start_date": "2025-09-01", "end_date": "2025-09-30"},
timeout=30,
)
response.raise_for_status()
Simpan key-nya di environment variable atau file .env yang kamu masukin ke .gitignore. Kalau key kamu bocor di repo publik, siapa pun bisa pakai kuota kamu.
Gimana cara ambil semua halaman kalau datanya dipaginasi?
Hampir semua API besar motong hasilnya jadi halaman, biasanya 50 sampai 100 baris per halaman. Kamu harus ngulang request sambil naikin nomor halaman sampai server balas halaman kosong. Pola paling aman: pakai while dengan kondisi berhenti yang jelas plus batas maksimum halaman.
def ambil_semua_transaksi(start, end, max_page=200):
semua = []
page = 1
while page <= max_page:
r = requests.get(
"https://api.contoh-erp.id/v1/transactions",
headers=headers,
params={"start_date": start, "end_date": end,
"page": page, "per_page": 100},
timeout=30,
)
r.raise_for_status()
batch = r.json().get("data", [])
if not batch:
break
semua.extend(batch)
page += 1
return pd.DataFrame(semua)
df = ambil_semua_transaksi("2025-09-01", "2025-09-30")
print(len(df), "baris")
Batas max_page itu rem darurat. Tanpa itu, satu bug kecil di sisi server bisa bikin loop kamu jalan semalaman.
Gimana cara nanganin error dan rate limit?
Server bisa balas 429 kalau kamu minta terlalu cepat, atau 503 kalau lagi sibuk. Jawabannya bukan nyoba terus tanpa jeda, tapi retry dengan jeda yang makin panjang. Requests udah punya mekanismenya lewat objek Retry dari urllib3, jadi kamu gak perlu nulis logika tunggu sendiri.
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry = Retry(
total=5,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["GET"],
)
session = requests.Session()
session.mount("https://", HTTPAdapter(max_retries=retry))
r = session.get(url, headers=headers, timeout=30)
Dengan backoff_factor=1, jeda antar percobaan naik jadi 0, 2, 4, 8, lalu 16 detik. Server dapet ruang bernapas, script kamu gak mati di tengah jalan.
Satu hal lagi yang sering kelewat: pasang header User-Agent yang jelas nyebut nama aplikasi dan kontak kamu. Kalau ada masalah, tim di seberang tau harus ngehubungi siapa.
Contoh kasus: toko_berkah ngecek margin barang impor
Toko Berkah beli aksesoris HP dari supplier luar dengan harga dolar, tapi jual dalam rupiah. Harga jualnya udah dipasang 4 bulan lalu dan belum pernah dihitung ulang.
Script di bawah narik kurs 30 hari terakhir, lalu ngitung ulang harga pokok tiap SKU.
import requests
import pandas as pd
r = requests.get(
"https://api.frankfurter.app/2025-08-24..2025-09-22",
params={"from": "USD", "to": "IDR"},
timeout=15,
)
r.raise_for_status()
rates = r.json()["rates"]
kurs = pd.DataFrame(
[{"tanggal": tgl, "usd_idr": v["IDR"]} for tgl, v in rates.items()]
)
kurs["tanggal"] = pd.to_datetime(kurs["tanggal"])
kurs = kurs.sort_values("tanggal")
produk = pd.DataFrame({
"sku": ["BRK-001", "BRK-014", "BRK-027"],
"nama": ["Charger 20W", "Case Bening", "Kabel USB-C 1m"],
"harga_usd": [3.20, 1.10, 1.85],
"harga_jual_idr": [79000, 25000, 42000],
})
kurs_terakhir = kurs["usd_idr"].iloc[-1]
produk["hpp_idr"] = (produk["harga_usd"] * kurs_terakhir).round(0)
produk["margin_pct"] = (
(produk["harga_jual_idr"] - produk["hpp_idr"]) / produk["harga_jual_idr"] * 100
).round(1)
print(produk[["sku", "nama", "hpp_idr", "harga_jual_idr", "margin_pct"]])
Hasil di dataset latihan ngulikdata: satu SKU, Case Bening, margin-nya tinggal 32,1 persen dari 41 persen waktu harga jualnya ditetapkan. Kurs naik 258 rupiah dalam sebulan dan harga jual gak ikut disesuaikan.
Angka kecil per unit. Tapi Case Bening laku 1.180 unit sebulan, jadi selisihnya sekitar Rp2,7 juta yang hilang tanpa ada yang sadar.
Script ini jalan 4 detik. Ngecek manual satu per satu di kalkulator butuh setengah jam, dan biasanya gak pernah beneran dikerjain.
Kesalahan umum waktu narik data dari API
| Kesalahan | Akibatnya | Perbaikannya |
|---|---|---|
| Gak pasang timeout | Script nggantung tanpa batas waktu | Selalu isi timeout= di tiap request |
| Nempel API key di notebook | Key bocor begitu file di-share | Simpan di environment variable |
| Lupa cek status code | Halaman error ikut masuk DataFrame | Panggil raise_for_status() |
| Cuma ambil halaman pertama | Data kepotong diam-diam | Loop pagination sampai batch kosong |
| Narik ulang semua data tiap hari | Kuota habis, request lambat | Filter pakai parameter tanggal |
| Langsung analisis tanpa validasi | Kesimpulan salah dari data bolong | Cek jumlah baris dan nilai kosong dulu |
Yang paling sering bikin masalah itu nomor empat. Datanya kelihatan normal, grafiknya jalan, cuma isinya separuh. Biasakan ngecek jumlah baris sama kualitas datanya setiap kali script selesai jalan.
Simpan hasilnya biar bisa dipakai lagi
Setelah data masuk DataFrame, simpan ke file supaya kamu gak perlu manggil API berulang kali waktu lagi eksplorasi.
df.to_parquet("transaksi_september.parquet", index=False)
df.to_csv("transaksi_september.csv", index=False)
Parquet lebih kecil dan lebih cepat dibaca ulang. CSV lebih gampang dibuka orang lain di Excel. Cara bacanya balik lagi aku bahas di panduan pandas read_csv.
FAQ
Apa bedanya REST API sama scraping?
API ngasih data dalam format yang memang disiapin buat dibaca mesin, biasanya JSON, dan strukturnya stabil. Scraping ngambil data dari tampilan halaman web yang dirancang buat mata manusia, jadi gampang rusak begitu layoutnya diubah. Kalau sumbernya punya API resmi, pakai API. Cara scraping-nya aku bahas terpisah di tutorial Requests dan BeautifulSoup.
Butuh install apa aja buat mulai?
Cuma dua: requests buat manggil API dan pandas buat ngolah hasilnya. Jalanin pip install requests pandas di terminal atau di sel notebook pakai tanda seru di depannya. Requests bukan bagian dari Python standar, jadi harus diinstall dulu. Kalau kamu pakai Google Colab, dua-duanya udah tersedia dari awal.
Kenapa response-nya kosong padahal status code 200?
Status 200 cuma bilang servernya nerima request kamu, bukan berarti ada isinya. Cek dulu response.text buat lihat mentahnya. Biasanya ada tiga penyebab: parameter filter kamu terlalu sempit, tanggalnya di luar rentang data, atau kamu lupa kirim API key sehingga server balas objek kosong tanpa error.
Berapa lama boleh nunggu satu request?
Selalu pasang timeout, aku biasa kasih 15 detik buat API yang responnya kecil. Tanpa timeout, script kamu bisa nggantung selamanya kalau servernya gak balas. Kalau API-nya emang lambat karena datanya besar, naikin ke 60 detik sambil pecah permintaannya jadi rentang tanggal yang lebih pendek.
Bisa gak minta AI yang nulisin script-nya?
Bisa, dan buat kode berulang kayak loop pagination itu ngirit waktu. Tapi kamu tetap harus ngerti responnya, soalnya AI gak tau struktur JSON API internal kantor kamu. Aku bahas batas amannya di artikel soal AI untuk ambil data web.
Mulai dari satu endpoint dulu
Tiga hal yang bikin script API kamu layak dipakai di kerjaan beneran: timeout di tiap request, key yang disimpan di environment variable, dan loop pagination yang berhenti dengan benar.
Sisanya tinggal ngulang pola yang sama ke endpoint lain.
Coba hari ini juga: ambil satu API gratis, narik datanya, simpan jadi CSV. Kalau kamu mau ngasah dulu bagian ngolah datanya, latihan agregasinya ada di panduan pandas groupby.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.
Pandas read_excel: Baca File Excel di Python
pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.
Pandas read_csv: Baca File CSV di Python untuk Analis
pandas read_csv baca file CSV jadi DataFrame siap olah cuma satu baris kode. Ini cara pakai plus parameter penting kayak sep, encoding, dan usecols dengan contoh data toko.