Mulai cepat

1 · Periksa kunci Anda

Panggilan pertama tidak memakan biaya, tidak mengubah apa pun, dan memberi tahu apa yang boleh dilakukan kunci Anda serta seberapa banyak yang sudah Anda pakai. Jika ini mengembalikan 200, semua hal lain dalam dokumen ini tersedia untuk Anda.

curl https://api.xsignalfeed.com/v1/account \
  -H "Authorization: Bearer xsf_your_key"
200 OK
{
  "name": "acme-trading",
  "plan": "pro",
  "key_id": "3f9a1c2b7d4e",
  "scopes": [
    "targets:read",
    "targets:write",
    "stream",
    "replay",
    "reads",
    "webhook",
    "keywords:read",
    "keywords:write"
  ],
  "event_types": [],
  "event_types_all": true,
  "limits": {
    "max_targets": 200,
    "max_conns": 5,
    "max_keywords": 20,
    "requests_per_minute": 600
  },
  "usage": {
    "targets": 12,
    "keywords": 3
  }
}

2 · Pantau sebuah akun

Sebutkan akun dengan handle-nya, tanpa @. Jika kami belum pernah melihatnya, kami mencocokkannya dengan X dan mengaktifkan pengiriman — itu memakan waktu kurang dari semenit dan tidak memerlukan apa pun dari Anda. Responsnya memberi tahu mana dari keduanya yang terjadi.

permintaan
curl -X POST https://api.xsignalfeed.com/v1/monitor/targets \
  -H "Authorization: Bearer xsf_your_key" -H "Content-Type: application/json" \
  -d '{"screen_name": "elonmusk", "event_types": ["followers.verified.add"]}'
201 · 202
{
  "status": "subscribed",
  "state": "subscribed",
  "id": "44196397",
  "screen_name": "elonmusk",
  "name": "Elon Musk",
  "event_types": [
    "followers.verified.add"
  ],
  "event_types_all": false
}
{
  "status": "queued",
  "state": "queued",
  "screen_name": "newaccount",
  "user_id": null,
  "event_types": [],
  "event_types_all": true,
  "note": "target will be resolved and placed shortly; poll GET /v1/monitor/targets/{screen_name}"
}

Akun yang sudah kami kenal langsung berlangganan (201; 200 jika Anda sudah berlangganan). Akun yang belum pernah kami lihat menghasilkan 202: periksa GET /v1/monitor/targets/{target} sampai state menjadi subscribed, atau baca 404 yang details.state-nya failed dan details.reason-nya menyebutkan alasannya: user_not_found, user_suspended, atau user_protected. Jika X memberi tahu kami hal itu dalam sepuluh menit terakhir, POST itu sendiri langsung menjawab dengan 404 tersebut. Secara bawaan setiap tipe peristiwa yang diizinkan kunci Anda dikirim; kirim event_types untuk menerima sebagian saja, misalnya hanya followers.verified.add (caranya). Menambah banyak sekaligus? Gunakan endpoint batch.

3 · Buka stream

Sambungkan, dan peristiwa tiba sebagai JSON satu baris. Tidak ada lagi yang diperlukan — tanpa pesan subscribe, tanpa channel.

import asyncio, json, websockets

async def main():
    url = "wss://ws.xsignalfeed.com/v1/stream?api_key=xsf_your_key"
    async with websockets.connect(url) as ws:
        async for raw in ws:
            ev = json.loads(raw)
            if ev["t"].startswith("system."): continue
            print(ev["t"], ev["target"]["screen_name"], ev["d"].get("text", "")[:60])

asyncio.run(main())

4 · Baca peristiwa pertama Anda

Frame pertama selalu system.hello. Setelah itu, yang sesungguhnya:

unggahan baru, seperti saat tiba di stream
{
  "v": 1,
  "t": "tweet.create",
  "op": "create",
  "id": "tweet:2097879002992070835",
  "ts": 1789012345678,
  "sid": "1789012346012-0",
  "target": {
    "id": "1652541",
    "screen_name": "Reuters",
    "name": "Reuters"
  },
  "d": {
    "tweet_id": "2097879002992070835",
    "kind": "tweet",
    "text": "Ash-covered shoes and a president in crisis…",
    "lang": "en",
    "author": {
      "id": "1652541",
      "screen_name": "Reuters",
      "name": "Reuters",
      "bio": "Top and breaking news, pictures and videos from Reuters.",
      "avatar": "https://pbs.twimg.com/profile_images/1874154135869616128/nJDmubGJ_normal.jpg",
      "banner": "https://pbs.twimg.com/profile_banners/1652541/1573687397",
      "followers": 25900000,
      "following": 1150,
      "tweets": 1080000,
      "location": "Around the world",
      "url": "https://www.reuters.com",
      "verified": true,
      "verified_type": "Business",
      "protected": false,
      "created_at": "2007-03-20T17:46:05Z",
      "category": null
    },
    "reply_to": null,
    "retweet_of": null,
    "quoted": null,
    "media": [
      "https://pbs.twimg.com/media/….jpg"
    ],
    "media_items": [
      {
        "type": "photo",
        "url": "https://pbs.twimg.com/media/….jpg",
        "expanded_url": "https://x.com/Reuters/status/2097879002992070835/photo/1",
        "width": 1200,
        "height": 675
      }
    ],
    "urls": [
      "https://reut.rs/…"
    ],
    "counts": {
      "reply": 12,
      "rt": 40,
      "like": 131,
      "quote": 3,
      "bookmark": 9
    },
    "views": 20411,
    "url": "https://x.com/Reuters/status/2097879002992070835",
    "full": true,
    "kind_final": true
  }
}