Artikel ini membahas langkah-langkah lengkap mulai dari membuat akun developer, mendapatkan Bearer Token, menguji dengan curl dan Python, hingga menghubungkan API ke aplikasi monitoring seperti Sentinel Stack atau Superset Dashboard.
Syarat:
Akun Twitter/X aktif.
Email aktif untuk verifikasi.
Tujuan penggunaan API tidak melanggar kebijakan (tidak menjual data mentah, tidak scraping di luar API resmi).
Membuat Akun Developer:
- Buka Twitter Developer Portal.
Login, lalu pilih Apply for access.
Isi alasan penggunaan, misalnya:
I will use the Twitter API to collect recent public tweets that contain specific hashtags (e.g., #Malioboro) to perform sentiment analysis and visualize public opinion trends in a research dashboard. The data will not be resold or shared publicly.
Centang semua kotak persetujuan, lalu klik Submit.
Untuk Project use, pilih Exploring the API.
Membuat Project &App
Masuk ke menu Projects & Apps → Overview.
Klik New Project (misalnya SentinelMonitor).
Buat App baru atau gunakan App bawaan project.
Isi nama App (misalnya sentiment) lalu klik Save.
Mendapatkan Bearer Token
Buka tab Keys and Tokens di App kamu.
Pada bagian Authentication Tokens, klik Reveal/Regenerate Bearer Token.
Salin token panjang yang dimulai dengan AAAAAAAA....
Simpan token dengan aman (misalnya di file .env).
Perbedaan jenis kredensial:
| Jenis Token | Kegunaan | Diperlukan untuk search hashtag? |
|---|---|---|
| API Key & Secret | Login user (OAuth 1.0a) | ❌ |
| Access Token & Secret | Aksi atas nama user (post, like, dll.) | ❌ |
| Bearer Token | OAuth 2.0 (App-only) untuk akses API publik | ✅ Ya |
Uji Bearer Token dengan Curl
Gunakan perintah berikut (ganti PASTE_TOKEN dengan token kamu):
TOKEN='PASTE_TOKEN' curl -i -H "Authorization: Bearer $TOKEN" \ "https://api.twitter.com/2/tweets/search/recent?query=%23Malioboro&max_results=10&tweet.fields=created_at,lang"
Jika token valid, kamu akan mendapat respon JSON berisi tweet-tweet terbaru dengan hashtag #Malioboro.
Kemungkinan hasil:
200 OK → Berhasil.
401 Unauthorized → Token salah atau belum aktif.
400 Invalid Request → Parameter tidak valid (max_results < 10).
429 Too Many Requests → Kuota habis (rate limit tercapai).
Cek Kuota dan Waktu Reset
Header respons akan menampilkan informasi kuota seperti:
x-rate-limit-limit: 1 x-rate-limit-remaining: 0 x-rate-limit-reset: 1762499920
Artinya kamu hanya mendapat 1 request per 15 menit di plan gratis.
Untuk melihat jam reset dalam waktu lokal:
date -d @1762499920
Berikut hasil pengetesan menggunanakan curl:

Respon di atas kalau diubah ke bentuk pretty-json seperti ini:
{
"data": [
{
"edit_history_tweet_ids": [
"1986630733180604706"
],
"text": "Sewa apartemen jogja wa : 0889-8046-8313 Bisa transit, harian,Blnan Harga mulai 100rb an\n#Pengianapan #penginapanjogja #apartemen #apartemenjogja #apartementransit #apartemenharian #jogja #jogja24jam #kost #kostharian #kosttransit #kostmingguan #kostbulanan #malioboro #tugujogja https://t.co/qrrO2NEqlG",
"id": "1986630733180604706"
},
{
"edit_history_tweet_ids": [
"1986507167973929465"
],
"text": "Sewa apartemen jogja wa : 0889-8046-8313 Bisa transit, harian,Blnan Harga mulai 100rb an\n#Pengianapan #penginapanjogja #apartemen #apartemenjogja #apartementransit #apartemenharian #jogja #jogja24jam #kost #kostharian #kosttransit #kostmingguan #kostbulanan #malioboro #tugujogja https://t.co/nk4iAvzTOp",
"id": "1986507167973929465"
},
{
"edit_history_tweet_ids": [
"1986443009249194225"
],
"text": "Not running, just looking for soto for breakfast.\n\n#malioboro #Yogyakarta #jajan #kepeseng #2025_ZEROBASEONE_WORLDTOUR_HEREANDNOW_IN_BANGKOK #nguntal https://t.co/wmF79Zn5I4",
"id": "1986443009249194225"
},
{
"edit_history_tweet_ids": [
"1986406036614619601"
],
"text": "Sewa apartemen jogja wa : 0889-8046-8313 Bisa transit, harian,Blnan Harga mulai 100rb an\n#Pengianapan #penginapanjogja #apartemen #apartemenjogja #apartementransit #apartemenharian #jogja #jogja24jam #kost #kostharian #kosttransit #kostmingguan #kostbulanan #malioboro #tugujogja https://t.co/XQnmBnYJ8s",
"id": "1986406036614619601"
},
{
"edit_history_tweet_ids": [
"1986380463779553495"
],
"text": "🏨 Sekar Ayu Hotel Malioboro RedPartner! Strategis Gondokusuman, Jogja. 500m ke Malioboro, dkt St. Kridosono & UGM. Nyaman, terjangkau. Fasilitas: AC, WiFi, Parkir. Pesan skrg! Promo: RDAFFASIKLIBUR. WA: 081809325988 💥 #HotelJogja #Malioboro https://t.co/lGcmKRID6u",
"id": "1986380463779553495"
},
{
"edit_history_tweet_ids": [
"1986327219887849916"
],
"text": "Sewa apartemen jogja wa : 0889-8046-8313 Bisa transit, harian,Blnan Harga mulai 100rb an\n#Pengianapan #penginapanjogja #apartemen #apartemenjogja #apartementransit #apartemenharian #jogja #jogja24jam #kost #kostharian #kosttransit #kostmingguan #kostbulanan #malioboro #tugujogja https://t.co/miFPrxgx6H",
"id": "1986327219887849916"
},
{
"edit_history_tweet_ids": [
"1986130166633144662"
],
"text": "Sewa apartemen jogja wa : 0889-8046-8313 Bisa transit, harian,Blnan Harga mulai 100rb an\n#Pengianapan #penginapanjogja #apartemen #apartemenjogja #apartementransit #apartemenharian #jogja #jogja24jam #kost #kostharian #kosttransit #kostmingguan #kostbulanan #malioboro #tugujogja https://t.co/jkqssLkq4F",
"id": "1986130166633144662"
},
{
"edit_history_tweet_ids": [
"1985915541954216362"
],
"text": "RT @08Heyyo92055: #malioboro https://t.co/802xt7ITm6",
"id": "1985915541954216362"
},
{
"edit_history_tweet_ids": [
"1985673677015523520"
],
"text": "Sewa apartemen jogja wa : 0889-8046-8313 Bisa transit, harian,Blnan Harga mulai 100rb an\n#Pengianapan #penginapanjogja #apartemen #apartemenjogja #apartementransit #apartemenharian #jogja #jogja24jam #kost #kostharian #kosttransit #kostmingguan #kostbulanan #malioboro #tugujogja https://t.co/OZ1vd4tIJU",
"id": "1985673677015523520"
},
{
"edit_history_tweet_ids": [
"1985603231456932049"
],
"text": "Sewa apartemen jogja wa : 0889-8046-8313 Bisa transit, harian,Blnan Harga mulai 100rb an\n#Pengianapan #penginapanjogja #apartemen #apartemenjogja #apartementransit #apartemenharian #jogja #jogja24jam #kost #kostharian #kosttransit #kostmingguan #kostbulanan #malioboro #tugujogja https://t.co/FH3MK17APb",
"id": "1985603231456932049"
}
],
"meta": {
"newest_id": "1986630733180604706",
"oldest_id": "1985603231456932049",
"result_count": 10,
"next_token": "b26v89c19zqg8o3fsck6v1d39as92l5akvswngx0if88t"
}
}
Uji dengan Python
Buat file verify_twitter_token.py:
import os, requests BEARER = os.getenv("TWITTER_BEARER_TOKEN") or input("Masukkan Bearer Token: ").strip() URL = "https://api.twitter.com/2/tweets/search/recent?query=%23Malioboro&max_results=10&tweet.fields=created_at,lang" r = requests.get(URL, headers={"Authorization": f"Bearer {BEARER}"}) print(r.status_code, r.text[:400])
Jalankan:
pip install requests python3 verify_twitter_token.py
Jika token valid, kamu akan melihat kode 200 dan daftar tweet.
Menghubungkan ke Aplikasi
Tambahkan token ke file .env aplikasi kamu:
TWITTER_BEARER_TOKEN=AAAAAAAAxxxxxx HASHTAG=#Malioboro
Pipeline seperti Sentinel Stack atau Superset Dashboard akan membaca token ini secara otomatis untuk memantau hashtag dan menganalisis sentimen tweet.
Error yang Sering Terjadi
| Error | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | Token salah / belum aktif | Regenerate token |
| 400 Invalid Request | Parameter tidak valid | Gunakan max_results=10–100 |
| 429 Too Many Requests | Kuota habis | Tunggu waktu reset / upgrade plan |
| 403 Forbidden | Endpoint tidak tersedia di plan | Upgrade ke Basic Plan |
Tips & Best Practice
Gunakan query spesifik:
(#Malioboro) lang:id -is:retweet -is:reply -is:quote
Simpan since_id agar hanya menarik tweet baru.
Tambahkan delay/backoff saat kena 429 (time.sleep(900)).
Jangan commit token ke Git (gunakan .env).
Patuhi kebijakan Twitter Developer dan jangan bagikan data mentah ke publik.
Kesimpulan
Dengan Bearer Token yang valid dan pengaturan interval yang sesuai, kamu bisa membangun sistem monitoring hashtag lengkap — mulai dari pengambilan tweet, analisis sentimen otomatis, hingga visualisasi tren positif–netral–negatif di dashboard internal seperti Superset.