本文へスキップ

XのアカウントやリストからTwitterのRSSフィードを作る方法

Xは公式のRSSフィードを提供していないため、Twitter RSSフィードは自分で作ります。スクリプトでアカウントの最新投稿をJSONで読み取り(1リクエストで約20件)、RSS 2.0のファイルに書き換えて、リーダーに定期的に取得させます。

要点: 15分ごとに更新する場合、フィード1つにつき月に約2,880リクエストです。公開Xリストを使えば、最大5,000アカウントを同じ1リクエストにまとめられます。作るにはSorsa APIが使えます。POST /user-tweets は1リクエストで20投稿を返し、1,000件あたり$0.07からです。100回分の無料リクエストで、最初の2,000投稿を取得できます。

エンドポイント
POST /user-tweets
1ページの件数
1リクエストあたり20投稿
料金
1,000投稿あたり$0.07から

#XにはRSSフィードがありますか?

ありません。Xにはプロフィール、検索、リストのいずれにもRSSフィードがありません。プロフィールのアドレスに /rss を付けても、x.comは通常のウェブページを返します。2026年11月2日に確認しました。現在動いているTwitter RSSフィードは、すべて誰かがXのデータから生成したものです。つまり本当の選択肢は、何の上に作るか、そして誰が運用を続けるかです。

既製の方法には、それぞれ条件が付きます。

  • RSSHubのXルートは、ルートのソースによると、現在はログイン済みのXアカウントの auth_token Cookieか、公式X APIのキーがないと動きません。Cookieを使うとフィードが実在のアカウントに結び付き、そのアカウントが危険にさらされます。
  • ホスト型のフィード生成サービスは、フィードをサブスクリプションとして販売しています。フィードごとに保持する投稿数や更新頻度は、プランで決まります。

RSS自体は健在です。Feedly、Inoreader、NetNewsWire、FreshRSS、Miniflux、n8nのRSS Readノードは、いずれもRSS 2.0を購読できます。作ったフィードは、普段使っているツールにそのままつなげます。フィードではなく、スマートフォンやSlackへの通知がほしいなら、ツイートの通知を受け取る方法を参照してください。

#Twitter RSSフィードの仕組み

Twitter RSSフィードは5つのステップでできていて、Xのデータに触れるのは最初の1つだけです。残りは短いスクリプトとタイマーで済みます。

  1. 最新の投稿をJSONで取得します。 1回のリクエストで、アカウントの最新20投稿が、本文、日付、メディア、投稿者つきで返ります。

  2. 取得済みの投稿を保持します。 小さな状態ファイルを置くと、重複を防げて、フィードに1ページ分より多い投稿を持たせられます。

  3. 各投稿をRSSのitemに変換します。 タイトル、リンク、日付、本文を、どのリーダーでも解釈できる要素に入れます。

  4. XMLファイルを書き出します。 先に一時ファイルへ書いてから入れ替えると、リーダーが中途半端なフィードを取得することがありません。

  5. スケジュールで更新します。 多くのフィードには、15分〜60分ごとが適しています。

    15分ごと: リクエスト1回、新しいファイル1つ 1 Sorsa API /user-tweets 最新20件の投稿 JSONで 2 スクリプト x_rss.py 50件を保持し、 アイテムに変換 3 フィードファイル feed.xml RSS 2.0、 自分のサーバーで配信 4 リーダー Feedly、Inoreader、 NetNewsWire、 FreshRSSまたはn8n 入力: Xアカウント、公開リスト、または検索 自分のタイマーでファイルを取得
    Xのデータを読むのは最初のステップだけです。スクリプトとファイル、リーダーはあなたの側にあります。

データを取得するステップには、Twitter(X)API兼スクレイピングツールであるSorsa APIが使えます。APIキー1つで POST /user-tweets を1回呼ぶと、アカウントの最新20投稿が整ったJSONで返ります。開発者アカウントは不要で、Xのログイン情報を求めることもありません。レスポンスのスキーマはリリースをまたいでも変わらないため、今日書いたフィードのスクリプトがそのまま動き続けます。

リーダーに表示される内容は5つのRSS要素にすべて入っていて、それぞれがレスポンスのフィールドに対応します。

RSSの要素Sorsa APIのフィールド役割
titlefull_text の先頭80文字リーダーはタイトルで項目を一覧表示する
link と guidhttps://x.com/ + user.username + /status/ + id固定のguidで重複を防ぐ
pubDatecreated_at(ISO 8601)RSSにはRFC 822形式の日付が必要
descriptionfull_text と entities[].preview の画像投稿をHTMLにしたもの
dc:creatoruser.display_nameRSSの author はメールアドレスでなければならない
  • title

    Sorsa APIのフィールド
    full_text の先頭80文字
    役割
    リーダーはタイトルで項目を一覧表示する
  • link と guid

    Sorsa APIのフィールド
    https://x.com/ + user.username + /status/ + id
    役割
    固定のguidで重複を防ぐ
  • pubDate

    Sorsa APIのフィールド
    created_at(ISO 8601)
    役割
    RSSにはRFC 822形式の日付が必要
  • description

    Sorsa APIのフィールド
    full_text と entities[].preview の画像
    役割
    投稿をHTMLにしたもの
  • dc:creator

    Sorsa APIのフィールド
    user.display_name
    役割
    RSSの author はメールアドレスでなければならない

#アカウントの投稿をJSONで取得する

アカウントのハンドルを POST /user-tweets に送ると、最新の20投稿が1回のレスポンスで返ります。何もない状態から最初のレスポンスまで、手順は3つです。

  1. キーを取得します。 登録して、ダッシュボードからAPIキーをコピーします。最初の100リクエストは無料で、有効期限はありません。

  2. エンドポイントを呼び出します。 ユーザー名をJSONボディで送り、キーを ApiKey ヘッダーに入れます。パラメーターの一覧はユーザーのツイート取得リファレンス(新しいタブで開きます)にあります。

    Terminal
    curl -X POST "https://api.sorsa.io/v3/user-tweets" \
      -H "ApiKey: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"username": "nasa_launch_desk"}'
    
    Response200 OK
    {
      "tweets": [
        {
          "id": "1985012345678901234",
          "full_text": "Static fire complete. Launch window opens Thursday.",
          "created_at": "2026-11-02T14:05:00Z",
          "lang": "en",
          "likes_count": 1840,
          "retweet_count": 312,
          "reply_count": 95,
          "view_count": 120400,
          "is_reply": false,
          "entities": [
            {
              "type": "photo",
              "link": "https://t.co/k3x9demo",
              "preview": "https://pbs.twimg.com/media/demo-static-fire.jpg"
            }
          ],
          "user": {
            "id": "1700000000000000042",
            "username": "nasa_launch_desk",
            "display_name": "Launch Desk"
          }
        }
      ],
      "next_cursor": "DAABCgABG8a1demoAAA"
    }
    
  3. フィードに表示する内容を選びます。 type には posts(デフォルト)、replies、retweets を指定できます。with_replies: true を付けると、リプライも投稿に混ぜて取得します。next_cursor を使うと、さらに古い次の20投稿を取得できます。

各投稿には投稿者のプロフィール全体も含まれるため、フィードのために名前やアイコンを別のリクエストで取得する必要はありません。403はキーがないかリクエストを使い切ったことを、429は1秒間に20リクエストを超えたことを示します。失敗したリクエストに課金されることはありません。

#PythonでJSONをRSSに変換する

下のスクリプトは、そのJSONをPythonの標準ライブラリだけで有効なRSS 2.0のファイルに変換します。インストールするものはありません。アカウントにも、リストにも、検索にも使えて、実行のあいだに直近50投稿を記憶します。

x_rss.py
"""Write an RSS 2.0 feed of an X account, List or search.

python x_rss.py user nasa_launch_desk
python x_rss.py list 1700000000000000001
python x_rss.py search "from:nasa_launch_desk OR #artemis"
"""
import json
import os
import sys
import urllib.parse
import urllib.request
from datetime import datetime
from email.utils import format_datetime
from xml.sax.saxutils import escape

API = "https://api.sorsa.io/v3"
KEY = os.environ.get("SORSA_API_KEY", "YOUR_API_KEY")
KEEP = 50       # posts the feed keeps
MAX_PAGES = 5   # pages one run may read to catch up


def page(kind, target, cursor):
    if kind == "list":
        query = {"list_id": target}
        if cursor:
            query["next_cursor"] = cursor
        url = API + "/list-tweets?" + urllib.parse.urlencode(query)
        req = urllib.request.Request(url)
    else:
        if kind == "user":
            path, body = "/user-tweets", {"username": target}
        else:
            path, body = "/search-tweets", {"query": target,
                                            "order": "latest"}
        if cursor:
            body["next_cursor"] = cursor
        req = urllib.request.Request(
            API + path, data=json.dumps(body).encode(),
            headers={"Content-Type": "application/json"})
    req.add_header("ApiKey", KEY)
    with urllib.request.urlopen(req, timeout=30) as resp:
        return json.load(resp)


def fetch_new(kind, target, seen):
    new, cursor = [], None
    for _ in range(MAX_PAGES):
        data = page(kind, target, cursor)
        tweets = data.get("tweets") or []
        new += [t for t in tweets if t["id"] not in seen]
        cursor = data.get("next_cursor")
        caught_up = any(t["id"] in seen for t in tweets)
        if not cursor or not seen or caught_up:
            break
    return new


def to_item(t):
    user = t.get("user") or {}
    name = user.get("username", "")
    link = f"https://x.com/{name}/status/{t['id']}"
    text = " ".join(t.get("full_text", "").split())
    when = datetime.fromisoformat(t["created_at"].replace("Z", "+00:00"))
    pics = "".join(f'<p><img src="{escape(e["preview"])}"></p>'
                   for e in t.get("entities") or []
                   if e.get("type") == "photo" and e.get("preview"))
    author = escape(user.get("display_name") or name)
    xml = ("<item>"
           f"<title>{escape(text[:80])}</title>"
           f"<link>{link}</link>"
           f'<guid isPermaLink="true">{link}</guid>'
           f"<pubDate>{format_datetime(when)}</pubDate>"
           f"<dc:creator>{author}</dc:creator>"
           f"<description>{escape(escape(text) + pics)}</description>"
           "</item>")
    return {"id": t["id"], "date": when.isoformat(), "xml": xml}


def main(kind, target):
    safe = (c if c.isalnum() or c in "_-" else "-" for c in target)
    name = "".join(safe)[:60]
    state, feed = name + ".json", name + ".xml"
    items = []
    if os.path.exists(state):
        with open(state, encoding="utf-8") as f:
            items = json.load(f)
    seen = {i["id"] for i in items}
    items += [to_item(t) for t in fetch_new(kind, target, seen)]
    items = sorted(items, key=lambda i: i["date"], reverse=True)[:KEEP]
    with open(state, "w", encoding="utf-8") as f:
        json.dump(items, f)
    home = {"user": f"https://x.com/{target}",
            "list": f"https://x.com/i/lists/{target}"}
    title = escape(f"X {kind}: {target}")
    xml = ('<?xml version="1.0" encoding="UTF-8"?>'
           '<rss version="2.0" '
           'xmlns:dc="http://purl.org/dc/elements/1.1/"><channel>'
           f"<title>{title}</title>"
           f"<link>{home.get(kind, 'https://x.com/')}</link>"
           f"<description>{title}, built with Sorsa API</description>"
           + "".join(i["xml"] for i in items) + "</channel></rss>")
    with open(feed + ".tmp", "w", encoding="utf-8") as f:
        f.write(xml)
    os.replace(feed + ".tmp", feed)
    print(f"{feed}: {len(items)} posts")


if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2])

このフィードが、1ページを単純に変換しただけのものより優れている点は3つあります。

  • 投稿が集中しても取りこぼしません。 実行の間にアカウントが20回を超えて投稿した場合、スクリプトは next_cursor をたどって、すでに持っている投稿に出会うまで(最大5ページ)さかのぼります。
  • 20件ではなく50件を保持します。 JSONの状態ファイルが過去の投稿を覚えているため、投稿の少ない日でもフィードが空になりません。
  • フィードバリデーターの一般的なチェックを通ります。 日付はRFC 822形式、すべてのitemに固定の guid があり、投稿者は dc:creator に入り、投稿のHTMLはXML用に1回だけエスケープされます。

python x_rss.py user nasa_launch_desk を実行すると、スクリプトの隣に nasa_launch_desk.xml というファイルができます。最初の実行は1リクエスト、以降の実行は1リクエストに加えて、追いつくのに必要な追加ページ1つにつき1リクエストです。

#リスト全体や検索を1つのフィードにする

公開Xリストを使うと、最大5,000アカウントが、1アカウントのフィードと同じコストの1つのフィードになります。Sorsa APIの GET /list-tweets は、リストの全メンバーの最新投稿を、時系列順の1ページで返します。そのため、フォローするアカウントが何件でも、更新1回につき消費するリクエストは1つです。

200アカウント、15分ごとに更新 月間リクエスト数(30日) アカウントごとにフィード1つ 更新のたびに200リクエスト 576K Sorsa APIのリストフィード1つ 更新のたびに1リクエスト 2,880
フィードを個別に作ると、リクエストはアカウント数の分だけ増えます。リストのフィードなら増えません。

200アカウントを個別のフィードとして15分ごとに追うと、月に57.6万リクエストかかります。同じ200アカウントを1つのリストにまとめれば、2,880リクエストです。設定するには、Xアプリで公開リストを作る(または他の人の公開リストを使う)、そのアドレスの末尾にある数字(x.com/i/lists/<number>)をコピーして、list_id として渡します。パラメーターはリストのツイート取得リファレンス(新しいタブで開きます)にあります。メンバーやフォロワーについては、Twitter リスト APIのガイドで解説しています。

Terminal
python x_rss.py list 1700000000000000001

検索フィードも同じように動きます。order を latest にして POST /search-tweets を使います。リストを作らずに少数のアカウントを追いたいときや、トピックを追いたいときに使えます。

検索フィードのクエリ
from:nasa_launch_desk OR from:orbit_news_digest
#artemis -filter:replies
"launch window" lang:en min_faves:50

Xの検索演算子はすべて使え、2006年にさかのぼれます。演算子は例つきでTwitterの検索演算子のガイドに一覧があり、リクエストの形式はツイート検索のリファレンス(新しいタブで開きます)にあります。投稿の多いリストやハッシュタグでは、更新の間に20回を超えて投稿されることがあります。その場合スクリプトは追加のページを1ページにつき1リクエストで読み取ります。そのため、混み合うフィードは更新の頻度を下げるのではなく、上げてください。

#スケジュール実行と購読

スクリプトをタイマーで実行し、ウェブサーバーでファイルをリーダーに渡せば、フィードは新しいままです。Linuxサーバーなら、crontabに2行書くだけで、キーを保持して15分ごとにフィードを更新できます。

crontab -e
SORSA_API_KEY=YOUR_API_KEY
*/15 * * * * cd /srv/feeds && python3 x_rss.py user nasa_launch_desk

あとはフォルダーを公開します。そのマシンですでに動いているウェブサーバー(nginx、Caddy、Apache)なら、どれでも /srv/feeds を公開できます。同じサーバー上のFreshRSSやMinifluxのようなセルフホスト型のリーダーなら、ローカルのアドレスからファイルを読めます。手早く試すなら、python3 -m http.server 8080 --directory /srv/feeds で、http://localhost:8080/nasa_launch_desk.xml に公開されます。

フィードのアドレスを、リーダーの「フィードを追加」欄に貼り付けます。リーダーの更新間隔は、cronの実行間隔より短くしないでください。5分ごとに確認するリーダーは、4回のうち3回、同じファイルを見ることになります。

知っておきたいこと

フィードのURLは、自分のリーダーやチームのツールで使うためのものです。公開ページに置くのではなく、長いランダムなパスの後ろか、リーダーのログインの後ろに置いてください。フィードに含まれる投稿の権利は投稿者にあり、フィードには公開投稿だけが入ります。

#n8nでフィードを配信する

n8nなら、自前のサーバーなしで、4つのノードだけで同じフィードをn8n自身のURLで配信できます。リーダーがそのURLを取得するたびに、ワークフローがSorsa APIを1回呼び出し、新しいXMLを返します。

  1. Webhookノードを追加します。 HTTP MethodをGETにし、長いランダムなパスを付けて、Respondを「Using 'Respond to Webhook' Node」に設定します。

  2. HTTP Requestノードを追加します。 https://api.sorsa.io/v3/user-tweets にPOSTし、ヘッダー ApiKey を付けて、JSONボディ {"username": "nasa_launch_desk"} を送ります。

  3. Codeノードを追加します。 tweets 配列をRSSのitemに変換します。コードは下のワークフローにあります。

  4. Respond to Webhookノードを追加します。 Respond WithをTextにし、Codeノードの xml フィールドをResponse Bodyにドラッグして、レスポンスヘッダー Content-Type に application/rss+xml; charset=utf-8 を追加します。

  5. ワークフローを有効化します。 WebhookノードのProduction URLを、リーダーに購読させます。

    n8nワークフロー: 4ノード、フィードのURLは1つ
    1. WebhookFeed URLGET、最後のノードで応答
    2. HTTP RequestSorsa API user tweetsPOST /user-tweets、ヘッダーはApiKey
    3. CodeBuild RSStweetsをRSS 2.0のitemに変換
    4. Respond to WebhookReturn the feedテキスト、application/rss+xml
    const tweets = $input.first().json.tweets || [];
    const esc = (s) => String(s).replace(/&/g, '&amp;')
      .replace(/</g, '&lt;').replace(/>/g, '&gt;');
    const items = tweets.map((t) => {
      const link = 'https://x.com/' + t.user.username + '/status/' + t.id;
      const text = t.full_text.replace(/\s+/g, ' ');
      return '<item><title>' + esc(text.slice(0, 80)) + '</title>' +
        '<link>' + link + '</link>' +
        '<guid isPermaLink="true">' + link + '</guid>' +
        '<pubDate>' + new Date(t.created_at).toUTCString() + '</pubDate>' +
        '<description>' + esc(esc(text)) + '</description></item>';
    }).join('');
    const xml = '<?xml version="1.0" encoding="UTF-8"?>' +
      '<rss version="2.0"><channel><title>X feed</title>' +
      '<link>https://x.com/</link>' +
      '<description>Built with Sorsa API</description>' +
      items + '</channel></rss>';
    return [{ json: { xml } }];

    n8nの空のキャンバスにJSONを貼り付け、HTTP Requestノードにキーを入れて、ワークフローを有効化し、Production URLを購読します。

    Codeノードが、Sorsa APIのtweets配列をRSS 2.0に変換します。ワークフローJSONを使えば、4つのノードを一度に取り込めます。

この方法では、リーダーの更新間隔がコストを決めます。1時間ごとに確認するリーダーなら、フィード1つにつき月に720リクエストです。リストや検索のフィードにするには、HTTP RequestノードのURLとボディを変更します。取得した投稿をワークフローの後続(Slack、スプレッドシート、AIのステップ)にだけ使うなら、RSSは省いてJSONを直接読み取ってください。やり方はn8nでTwitter APIのガイドにあります。

#Twitter RSSフィードの費用

Twitter RSSフィードの費用は、更新1回につき1リクエストです。つまり価格は、アカウントの投稿量ではなく、更新の頻度と運用するフィードの数で決まります。30日の月で見ると次のとおりです。

更新間隔1フィードの月間リクエスト数Starterの1万リクエストで運用できるフィード数
5分ごと8,6401
15分ごと2,8803
30分ごと1,4406
1時間ごと72013
6時間ごと12083
  • 5分ごと

    1フィードの月間リクエスト数
    8,640
    Starterの1万リクエストで運用できるフィード数
    1
  • 15分ごと

    1フィードの月間リクエスト数
    2,880
    Starterの1万リクエストで運用できるフィード数
    3
  • 30分ごと

    1フィードの月間リクエスト数
    1,440
    Starterの1万リクエストで運用できるフィード数
    6
  • 1時間ごと

    1フィードの月間リクエスト数
    720
    Starterの1万リクエストで運用できるフィード数
    13
  • 6時間ごと

    1フィードの月間リクエスト数
    120
    Starterの1万リクエストで運用できるフィード数
    83
更新間隔
月のリクエスト数 2,880 1フィードにつき更新ごとに1リクエスト、30日間
収まるSorsa APIのプラン Starter 月10Kリクエストで$49、このようなフィードが3本分入ります

リストや検索は、含まれるアカウント数にかかわらず1フィードとして数えます。

投稿の多いリストや初回の実行のように、ページが満杯で返ってくる場合、Sorsa APIは投稿を1,000件あたり$0.07からで提供します。公式X APIは、従量課金の料金(新しいタブで開きます)で、読み取った投稿1,000件あたり$5.00を課金します。そのうえ開発者アカウントとOAuthアプリが必要で、従量課金は月間300万件の投稿読み取りが上限です。2026年11月22日からは、Xはエクスパンション経由で返される各投稿の投稿者とメディアにも、1ユーザーあたり$0.010を課金します(Xの10月23日のお知らせ(新しいタブで開きます))。

#今日から最初のフィードを作る

Twitter RSSフィードは、約100行のスクリプトとタイマーでできています。自分で書けないのはデータだけです。そのデータにはSorsa APIが使えます。更新1回につき1リクエスト、1リクエストで20投稿、最大5,000アカウントのリスト全体を1つのフィードに、全プラン毎秒20リクエストです。必要なのは開発者アカウントではなくAPIキー1つで、Xのログイン情報を求められることもありません。100回分の無料リクエストで最初の2,000投稿を取得できるので、プランを選ぶ前に、フィードを作って更新される様子を確認できます。

#よくある質問

Twitter RSSフィードの更新頻度はどのくらいがよいですか?

多くのTwitter RSSフィードには、15分〜60分ごとが適しています。更新のたびに1リクエストなので、15分ごとなら月に2,880リクエスト、1時間ごとなら720リクエストです。リーダーの更新間隔はスクリプトのスケジュールに合わせてください。投稿の多いリストやハッシュタグは更新を頻繁にして、1回の実行で1〜2ページで追いつけるようにします。

無料のTwitter RSSフィードはありますか?

Xには、無料でも有料でも、公式のRSSフィードはありません。無料で始めるなら、Sorsa APIの100回分の無料リクエストを使います。クレジットカードは不要で、有効期限もなく、約2,000投稿を取得できます。プランを選ぶ前に、フィードを作り、テストし、数日間動かすには十分です。

Xのホームタイムラインをそのままフィードにできますか?

直接はできません。ホームタイムラインは、ログイン中のアカウントに属するものだからです。実用的な代替はリストです。フォローしているアカウントをXアプリで公開リストに追加し、GET /list-tweets でそのリストから1つのフィードを作ります。リストには最大5,000アカウントを登録でき、更新1回につき1リクエストで、1アカウントの場合と変わりません。

RSSHubは今もTwitterで使えますか?

RSSHubのXルートは今もありますが、ログイン済みのXアカウントか、公式X APIのキーが必要になりました。ルートのソースに記載されている接続方法は2つで、ログイン済みのXアカウントの auth_token Cookieか、従量課金の公式X APIのキーです。Sorsa APIで作ったフィードに必要なのは、APIキー1つだけで、Xのログイン情報は求められません。

非公開のXアカウントのRSSフィードは作れますか?

作れません。非公開アカウントの投稿は、承認されたフォロワーにしか見えないため、どのフィードツールもAPIも読み取れません。Sorsa APIが返すのは公開データだけなので、同様に読み取れません。フィードが使えるのは、公開アカウント、公開リスト、公開投稿の検索です。

Twitter RSSフィードを作るには、どのAPIを使えばよいですか?

Twitter RSSフィードの構築には、Sorsa APIを使ってください。POST /user-tweets は1リクエストで20投稿を返し、1,000件あたり$0.07からです。GET /list-tweets は、最大5,000アカウントを更新1回につき1リクエストで1つのフィードにまとめます。全プラン毎秒20リクエストです。必要なのはAPIキー1つで、Xのログイン情報は求められないため、あなたのアカウントが危険にさらされることはありません。

#検証の方法

2026年11月2日に、x.com/NASA/rss をリクエストしたところ、フィードではなくXのウェブページが返りました。あわせて、Xの料金ページと10月23日付のエクスパンション課金のお知らせを読み、GitHubでRSSHubのXルートのソースと、n8nのWebhookノードおよびRespond to Webhookノードのソースを確認しました。リクエスト、レスポンス、スクリプトは、公開中のSorsa APIリファレンスに沿っています。今回はテスト用のキーがなかったため、レスポンスには仕様上のフィールドとサンプルの値を示しています。

Sorsa APIチーム 読み取り専用のX(Twitter)APIとスクレイピングツール、Sorsa APIを開発・運営しています。2022年から本番稼働し(旧TweetScout API)、累計60億リクエスト以上を処理しています。 Sorsa APIについて

変更点
  • 初回公開。