本文へスキップ

Galxe・Zealy・TaskOn で X(Twitter)タスクを確認する

Galxe、Zealy、TaskOn は、それぞれ独自の X 連携で X タスクを確認しますが、費用がかかります。Galxe はフォローやリツイートの確認1件につき10クレジット、Zealy は X の操作1件ごとにクレームクレジットを1〜3追加します。

結論: 確認の回数を増やしたい場合や、コミュニティ参加のようにプラットフォームにないタスクが必要な場合、各プラットフォームの API タスクを使います。参加者の X アカウントを自社のサーバーに送り、5〜10秒待って、はい/いいえの答えを受け取るしくみです。その答えを Sorsa API で返します。タスク1件につき1リクエスト、1チェック$0.0014からで、100回分の無料リクエストで最初の100チェックをカバーできます。

エンドポイント
POST /check-follow
タスク1件につき1リクエスト
料金
1チェックあたり$0.0014から

#Galxe、Zealy、TaskOn の X タスク確認のしくみ

3つのプラットフォームはいずれも、参加者が連携した X アカウントを通じて X タスクを確認しますが、確認の回数を制限する方法はそれぞれ違います。Galxe は確認用クレジット、Zealy は有料プランとクレームクレジット、TaskOn は固定のタスク種別です。

クエストを公開する前に、無料の 相互フォロー確認ツールを使うと、一方のアカウントが他方をフォローしているかを双方向で確認できます。自分で作ったフォロータスクを、手動でテストできます。次の表は、各プラットフォームが単独で行う内容の比較です。

GalxeZealyTaskOn
標準の X タスクフォロー、リツイート、引用、キーワード付き投稿フォロー、投稿、リプライ、リツイート、いいね、引用、スペースフォロー、リツイート、いいね、ハッシュタグやタグ付きの引用、投稿
操作は確認されるかAuthentic Verification がオンの場合のみ。既定ではクリックだけで通る確認される(連携アカウントから)確認される(連携アカウントから)
X の確認にかかる費用1チェック10クレジット。Rewards Hub レベル2または Business+ から操作1件あたりクレームクレジット1〜3。有料プランのみQuest プランに含まれる
自社サーバー向けの経路REST credentialAPI taskCompletion-Based API Task
  • 標準の X タスク

    Galxe
    フォロー、リツイート、引用、キーワード付き投稿
    Zealy
    フォロー、投稿、リプライ、リツイート、いいね、引用、スペース
    TaskOn
    フォロー、リツイート、いいね、ハッシュタグやタグ付きの引用、投稿
  • 操作は確認されるか

    Galxe
    Authentic Verification がオンの場合のみ。既定ではクリックだけで通る
    Zealy
    確認される(連携アカウントから)
    TaskOn
    確認される(連携アカウントから)
  • X の確認にかかる費用

    Galxe
    1チェック10クレジット。Rewards Hub レベル2または Business+ から
    Zealy
    操作1件あたりクレームクレジット1〜3。有料プランのみ
    TaskOn
    Quest プランに含まれる
  • 自社サーバー向けの経路

    Galxe
    REST credential
    Zealy
    API task
    TaskOn
    Completion-Based API Task

Galxe では、X タスクは既定では確認されません。X の credential はすべて、Authentic Verification がオフの状態で始まり、「Page Visit」方式を使います。この方式が記録するのは、参加者がリンクを開いたことであり、フォローやリポストをしたことではありません(Galxe: Create Quest, Tasks Settings(新しいタブで開きます))。Authentic Verification をオンにすると、フォロー、リツイート、引用のチェックごとに10クレジットを消費します。Rewards Hub のレベル2には10K、レベル3には40K、レベル4には80Kのクレジットが付与され、使い切ると Galxe がチェックをオフにします(Galxe: X Authentic Verification Credits(新しいタブで開きます))。いいねは、確認の対象として有効にすることができません。

Zealy の X タスクは、参加者が連携したアカウントから5つの操作を確認します。1回のクレームに必要な1クレジットに、操作ごとのクレームクレジットが加算されます。フォロー、投稿、引用、リプライは1、リツイートは2、いいねは3です(Zealy: Twitter task(新しいタブで開きます))。X タスクは有料プランでのみ利用でき、年払いで月額$149から。プランの月間枠を超えたクレジットは、Standard で1,000あたり$15です(Zealy の料金(新しいタブで開きます))。

TaskOn には、Quest プラン(6か月ごとの支払いで月額$199)に含まれる7種類の X タスクがあります。リプライやコミュニティの確認はありません。X の確認に失敗した参加者に対して、ヘルプでは15分待ち、タスクを1つずつ確認するよう案内しています。

#Sorsa API で自社サーバー上の X タスクを確認する

Galxe、Zealy、TaskOn の X タスクを、各社のクレジットを使わずに確認するには、プラットフォームのカスタム API タスクを自社の小さなサーバーに向け、そのサーバーからTwitter(X)API 兼スクレイピングツールである Sorsa API に問い合わせます。タスク1件が1リクエストで、true か false を返します。料金は$0.0014からで、API キー1つ、全プランで毎秒20リクエストです。

サインインは引き続きプラットフォームの役割です。Zealy と TaskOn は、確認の前に参加者に X アカウントを連携させるので、サーバーに届くハンドルは、クレームする本人のものです。サーバーは、各プラットフォームの形式で答えを返し、Sorsa API のキーをプラットフォームに渡さず、リプライやコミュニティ参加のように、プラットフォームにないチェックも実行します。

Galxe RESTクレデンシャル GET ?user=$socialId Zealy APIタスク POST accounts.twitter TaskOn APIタスク GET ?address=handle 検証サーバー サービス別に1ルート APIキーを保管 チェックを一括実行 Sorsa API タスクごとにリクエスト1回 /check-follow /check-retweet /check-quoted /check-comment /check-community-member Galxeへの返却 {"eligible": 1} 式が1を返す Zealyへの返却 HTTP 200または400 400でメッセージ表示 TaskOnへの返却 {"isValid": true} 常にHTTP 200
1台のサーバーで3つのプラットフォームすべてに答えます。タスクごとに Sorsa API へ1リクエストを送り、各プラットフォームの形式で1回返信します。

5種類のクエストタスクは、5種類の Sorsa API チェックに対応し、各チェックはレスポンスの1つのフィールドで合否が決まります。

クエストタスクSorsa API のリクエスト合格の条件
アカウントをフォローPOST /check-follow(新しいタブで開きます)follow が true
投稿をリツイートPOST /check-retweet(新しいタブで開きます)retweet が true
投稿を引用POST /check-quoted(新しいタブで開きます)status が quoted
投稿にリプライGET /check-comment(新しいタブで開きます)commented が true
X コミュニティに参加POST /check-community-member(新しいタブで開きます)is_member が true

公式 X API には、参加者1人について答えるリクエストがありません。リスト全体を読む方法になります。自分のアカウントのフォロワーを1ページ1,000件、1フォロワーあたり$0.001で、投稿のリツイートユーザーを1アカウントあたり$0.010で取得し、リツイートユーザーのリクエストは15分あたり75回までです(X API の料金(新しいタブで開きます)、X API のレート制限(新しいタブで開きます))。リストは5秒以内の応答に収まらないため、この方法では、サーバーに加えて同期ジョブ、開発者アカウント、OAuth が必要です。

#各 API タスクがサーバーに送る内容

プラットフォームごとに、参加者の送り方も、読み取る答えも違うので、サーバーにはプラットフォームごとに小さなルートが1つずつ必要です。

Galxe REST credentialZealy API taskTaskOn Completion-Based API Task
リクエスト指定した URL への GET または POSTJSON ボディ付きの POST?address= 付きの GET
X ユーザーの渡され方$socialId として URL に埋め込まれるaccounts.twitter.id と .usernameハンドル(数値 ID は渡されない)
シークレット自分で追加するヘッダーX-Api-Key ヘッダーAuthorization: Bearer
合格式が 1 を返すHTTP 200{"result": {"isValid": true}}
不合格式が 0 を返すHTTP 400(message 付き)isValid: false(HTTP 200 のまま)
制限時間5秒10秒10秒、再試行なし
  • リクエスト

    Galxe REST credential
    指定した URL への GET または POST
    Zealy API task
    JSON ボディ付きの POST
    TaskOn Completion-Based API Task
    ?address= 付きの GET
  • X ユーザーの渡され方

    Galxe REST credential
    $socialId として URL に埋め込まれる
    Zealy API task
    accounts.twitter.id と .username
    TaskOn Completion-Based API Task
    ハンドル(数値 ID は渡されない)
  • シークレット

    Galxe REST credential
    自分で追加するヘッダー
    Zealy API task
    X-Api-Key ヘッダー
    TaskOn Completion-Based API Task
    Authorization: Bearer
  • 合格

    Galxe REST credential
    式が 1 を返す
    Zealy API task
    HTTP 200
    TaskOn Completion-Based API Task
    {"result": {"isValid": true}}
  • 不合格

    Galxe REST credential
    式が 0 を返す
    Zealy API task
    HTTP 400(message 付き)
    TaskOn Completion-Based API Task
    isValid: false(HTTP 200 のまま)
  • 制限時間

    Galxe REST credential
    5秒
    Zealy API task
    10秒
    TaskOn Completion-Based API Task
    10秒、再試行なし

$socialId に X のハンドルと数値 ID のどちらが入るのか、Galxe のドキュメントには書かれていません。そのため下のサーバーは両方を受け付け、数字だけなら user_id、それ以外なら username として Sorsa API に渡します。

#4ステップで確認サーバーを作る

下のサーバーは、1つの Node.js ファイルで3つのプラットフォームすべてに答えます。プラットフォームごとに1つのルートがあり、クエストのチェックを Sorsa API で並行して実行する関数を共有します。

  1. キーを取得する。 サインアップして、ダッシュボードから API キーをコピーします。最初の100リクエストは無料で、カードは不要です。

  2. チェックを1つ試す。 参加者が自分のプロジェクトをフォローしているかを尋ねます。username_1 が自分のアカウント、username_2 が参加者です。

    Terminal
    curl -X POST "https://api.sorsa.io/v3/check-follow" \
      -H "ApiKey: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"username_1": "tidewell_protocol",
           "username_2": "nova_quest_hunter"}'
    
    Response200 OK
    {
      "follow": true,
      "user_protected": false
    }
    
  3. クエストを定義する。 QUESTS に、クエストごとの名前と X タスクを書きます。follow には自分のハンドル、retweet、quote、reply には投稿のリンク、community にはコミュニティの ID を指定します。

  4. サーバーを起動する。 ファイルを保存し、SORSA_API_KEY と、長いランダムな RELAY_SECRET を設定して、443番または80番ポートの HTTPS の背後で node verify-server.mjs を実行します。

    Node.js
    // verify-server.mjs: Node.js 18+, after `npm install express`
    import express from "express";
    
    const SORSA = "https://api.sorsa.io/v3";
    const KEY = process.env.SORSA_API_KEY || "YOUR_API_KEY";
    const SECRET = process.env.RELAY_SECRET; // the same value on each platform
    
    // The X tasks each quest requires; the URL path names the quest
    const QUESTS = {
      "launch-week": {
        follow: "tidewell_protocol",
        retweet: "https://x.com/tidewell_protocol/status/2116180244581376001",
      },
    };
    
    async function sorsa(method, path, data) {
      const url = new URL(SORSA + path);
      const init = { method, headers: { ApiKey: KEY },
        signal: AbortSignal.timeout(4000) };
      if (method === "GET") {
        url.search = new URLSearchParams(data);
      } else {
        init.headers["Content-Type"] = "application/json";
        init.body = JSON.stringify(data);
      }
      const res = await fetch(url, init);
      if (!res.ok) throw new Error(`Sorsa API ${res.status}`);
      return res.json();
    }
    
    // One check per task type, each resolving to true or false
    const CHECKS = {
      follow: async (account, u) => (await sorsa("POST", "/check-follow", {
        username_1: account,
        ...(u.user_id ? { user_id_2: u.user_id } : { username_2: u.username }),
      })).follow,
      retweet: async (post, u) => (await sorsa("POST", "/check-retweet",
        { tweet_link: post, ...u })).retweet,
      quote: async (post, u) => (await sorsa("POST", "/check-quoted",
        { tweet_link: post, ...u })).status === "quoted",
      reply: async (post, u) => (await sorsa("GET", "/check-comment",
        { tweet_link: post, ...u })).commented,
      community: async (id, u) => (await sorsa("POST",
        "/check-community-member", { community_id: id, ...u })).is_member,
    };
    
    // The tasks still missing; throws when a check couldn't run
    async function missing(questId, x) {
      const quest = QUESTS[questId];
      if (!quest || !x) throw new Error("unknown quest or user");
      const u = /^\d+$/.test(x) ? { user_id: x }
        : { username: x.replace(/^@/, "") };
      const tasks = Object.entries(quest);
      const done = await Promise.all(tasks.map(([t, v]) => CHECKS[t](v, u)));
      return tasks.filter((_, i) => !done[i]).map(([t]) => t);
    }
    
    const app = express();
    app.use(express.json());
    
    // Galxe REST credential: GET /galxe/<quest>?user=$socialId
    const GALXE = {
      "Access-Control-Allow-Origin": "https://dashboard.galxe.com",
      "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
      "Access-Control-Allow-Headers": "Content-Type, X-Relay-Secret",
    };
    app.options("/galxe/:quest", (req, res) => res.set(GALXE).sendStatus(204));
    app.get("/galxe/:quest", async (req, res) => {
      res.set(GALXE);
      if (req.get("X-Relay-Secret") !== SECRET) return res.status(401).end();
      try {
        const left = await missing(req.params.quest, String(req.query.user));
        res.json({ eligible: left.length ? 0 : 1, missing: left });
      } catch {
        res.json({ eligible: 0, missing: ["not checked, try again"] });
      }
    });
    
    // Zealy API task: POST /zealy/<quest>, the secret arrives as X-Api-Key
    app.post("/zealy/:quest", async (req, res) => {
      if (req.get("X-Api-Key") !== SECRET) {
        return res.status(400).json({ message: "Invalid API key" });
      }
      const x = req.body.accounts?.twitter;
      try {
        const left = await missing(req.params.quest, x?.id || x?.username);
        if (!left.length) return res.json({ message: "X tasks verified" });
        res.status(400).json({ message: `Not done yet: ${left.join(", ")}` });
      } catch {
        res.status(400).json({ message: "Couldn't check now, retry in a minute" });
      }
    });
    
    // TaskOn Completion-Based API Task: GET /taskon/<quest>?address=<handle>
    app.get("/taskon/:quest", async (req, res) => {
      if (req.get("Authorization") !== `Bearer ${SECRET}`) {
        return res.status(401).json({ result: { isValid: false } });
      }
      let isValid = false;
      try {
        const left = await missing(req.params.quest, String(req.query.address));
        isValid = left.length === 0;
      } catch {} // TaskOn reads anything but HTTP 200 as a broken endpoint
      res.json({ result: { isValid } });
    });
    
    app.listen(process.env.PORT || 3000);
    

クエストのコストは、クレーム1回につきタスク1件ごとに1リクエストで、1回のクレームのチェックは同時に実行されます。そのため、5つのタスクでも、答えが返るまでの時間は1つの場合とほぼ変わりません。Sorsa API への各呼び出しは4秒で打ち切られ、Galxe の5秒の枠に収まります。

サーバーは、2種類の答えを区別します。チェックの結果が false なら、クレームは不合格となり、未完了のタスクが示されます。Sorsa API からのタイムアウト、429、403 は、サーバーがチェックできなかったことを意味します。この場合、参加者に不合格と伝えるのではなく、もう一度試すよう求めます。403 はキーがないか、リクエストを使い切ったこと、429 は1秒間に20リクエストを超えたことを示します。失敗したリクエストに課金されることはありません。

知っておきたいこと

POST /check-retweet が1リクエストで調べるのは、投稿の最新のリツイート100件です。リツイートの直後に Verify を押した参加者はこの範囲に入ります。一方、リツイートが数千件ある投稿では、何日も前にリツイートした人は入りません。参加者には、リツイートの直後に確認してもらうか、バックグラウンドジョブで next_cursor をたどってください。方法は Twitter エンゲージメント確認 APIのガイドにあります。

#Galxe を REST credential でつなぐ

Galxe では、サーバーを REST credential として登録します。参加者が Verify を押すと Galxe が指定した URL を呼び出し、返ってきた JSON に対して設定した式を実行して、式が 1 を返したらタスクを完了とします。

  1. credential を開く。 クエストの Task Settings で、Import Your Own Data、REST、GET メソッド、Single Dimension の順に選びます。

  2. ID の種類を選ぶ。 参加者の X アカウントを選ぶと、Galxe が $socialId にその値を入れます。

  3. エンドポイントを入力する。 https://verify.example.com/galxe/launch-week?user=$socialId を使い、ヘッダー X-Relay-Secret にシークレットを設定します。ヘッダーは Space の管理者にしか表示されません。

  4. 式を貼り付ける。 式は true や false ではなく、数値の 1 か 0 を返す必要があります。

    Galxe expression
    function(resp) {
      return resp && resp.eligible === 1 ? 1 : 0;
    }
    
  5. テストして保存する。 タスクを完了したアカウントと完了していないアカウントを1つずつ送り、両方の答えを確認します。

Galxe は、5秒を超えるリクエストをキャンセルし、443番と80番のポートしか受け付けません。credential を保存するときには CORS のプリフライトを送りますが、サーバーの OPTIONS ルートがこれに答えます。リクエストは Galxe のサーバー 35.185.209.0 と 35.203.155.18 から届くので、サーバーの前にファイアウォールがある場合は、この2つのアドレスを許可してください(Galxe Docs: REST credential(新しいタブで開きます))。式そのものは公開されるので、シークレットは含めないでください。

#Zealy を API task でつなぐ

Zealy では、サーバーが API task になります。Zealy が参加者の X の ID とユーザー名を付けて POST を送り、200 が返ればクレームは完了、400 が返れば、設定したメッセージが参加者に表示されます。

  1. タスクを追加する。 クエストエディターで、Add task、Api の順に選びます。

  2. エンドポイントとキーを設定する。 https://verify.example.com/zealy/launch-week と、API キーとしてシークレットを入力します。Zealy はこれを X-Api-Key ヘッダーで送ります。

  3. ユーザーの識別に Twitter を選ぶ。 すると Zealy は、すべてのリクエストに accounts.twitter.id と accounts.twitter.username を含めます。

  4. 保存する。 Zealy はまずエンドポイントをテストします。10秒以内に、HTTP 200 か 400 のどちらかだけで答える必要があります。

Zealy から見える内容を確認するには、テスト用アカウントで同じリクエストを自分で送ります。

Terminal
curl -X POST "https://verify.example.com/zealy/launch-week" \
  -H "X-Api-Key: YOUR_RELAY_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"requestId": "test-1", "accounts": {"twitter":
       {"id": "1849021166738190336", "username": "nova_quest_hunter"}}}'
Response400 Bad Request
{
  "message": "Not done yet: retweet"
}

Zealy はそのメッセージを、クレームの requestId と一緒に参加者に表示します。これで参加者は未完了のタスクがわかり、運営側もログからそのクレームを探せます(Zealy: API task(新しいタブで開きます))。API task は Zealy の X タスクには含まれないため、X クレジットは加算されません。この方法で作ったクエストが消費するのは、クレーム1回につき基本のクレームクレジット1つだけです。標準のフォローとリツイートなら、4を消費します。

#TaskOn の Completion-Based API Task をつなぐ

TaskOn では、サーバーが Completion-Based API Task になります。TaskOn は、参加者の X ハンドルを address に入れて GET を送り、サーバーは常に HTTP 200 で、isValid を true か false にして答えます。

  1. タスクを追加する。 キャンペーンまたはクエストでタスクを追加し、Custom API タブを開いて、Completion-Based API Task を選びます。

  2. API URL を設定する。 Set API URL をクリックし、Social Media Account、X handle の順に選んで、https://verify.example.com/taskon/launch-week を入力します。

  3. TaskOn 専用にする。 Restrict API access exclusively to TaskOn をオンにして、シークレットを Bearer トークンとして入力します。

  4. テストして確定する。 タスクを完了したアカウントと完了していないアカウントを1つずつ入力し、それぞれで Verify をクリックして、両方の答えが正しければ Confirm を押します。

TaskOn は1クリックにつき1回だけ試行し、再試行はしません。200以外のステータスや result がない場合は、エンドポイントの故障として扱います(TaskOn: Completion-Based API Task(新しいタブで開きます))。このため、Sorsa API に接続できなかったときも、サーバーは isValid: false で答えます。参加者が1分後にもう一度 Verify を押せば、次のチェックは新しく実行されます。

#経路ごとの、確認済みクレームの費用

フォローとリツイートが必要なクレーム1件の費用は、Authentic Verification を使う Galxe なら20クレジット、標準の X タスクを使う Zealy ならクレームクレジット4、API タスクの背後で Sorsa API を使うなら2リクエスト($0.0028から)です。

Galxe Authentic Verification 1チェック10クレジット。フォロー + リツイートの申請で20消費 レベル2: 1万クレジット 500申請 レベル3: 4万クレジット 2,000申請 レベル4: 8万クレジット 4,000申請 Zealyの申請クレジット フォロー + リツイート1件あたり ネイティブXタスク 4クレジット APIタスク利用時 1クレジット Standardの月1万クレジット: ネイティブなら2,500申請、 APIタスクなら1万申請 APIタスクの裏でSorsa APIが消費するのはタスクごとにリクエスト1回: フォロー + リツイート1件でリクエスト2回、$0.0028から
標準の X チェックは各プラットフォームのクレジット枠を消費します。API タスクの背後では、X のチェックは Sorsa API のリクエストになります。

プラットフォームのクレジット枠ではなく、自分のプランに合わせて拡張できるのは Sorsa API の経路だけです。フォローとリツイートのクレーム1件で比べると、次のとおりです。

経路フォローとリツイートのクレーム1件で消費するもの可能なクレーム数
API タスクの背後の Sorsa API2リクエスト、$0.0028からプランのリクエスト数の分だけ
Zealy、標準の X タスククレームクレジット4、1,000あたり$15で$0.06Standard の月間10Kクレジットで2,500件
Zealy の API タスククレームクレジット1と2リクエスト同じ10Kクレジットで10K件
Galxe、Authentic VerificationX 確認用クレジット20レベル2で500件、レベル4で4,000件
API タスクの背後の公式 X APIリストの取得:自分のフォロワー1人あたり$0.001、リツイートユーザー1人あたり$0.010開発者アカウント、OAuth、同期ジョブが必要
  • API タスクの背後の Sorsa API

    フォローとリツイートのクレーム1件で消費するもの
    2リクエスト、$0.0028から
    可能なクレーム数
    プランのリクエスト数の分だけ
  • Zealy、標準の X タスク

    フォローとリツイートのクレーム1件で消費するもの
    クレームクレジット4、1,000あたり$15で$0.06
    可能なクレーム数
    Standard の月間10Kクレジットで2,500件
  • Zealy の API タスク

    フォローとリツイートのクレーム1件で消費するもの
    クレームクレジット1と2リクエスト
    可能なクレーム数
    同じ10Kクレジットで10K件
  • Galxe、Authentic Verification

    フォローとリツイートのクレーム1件で消費するもの
    X 確認用クレジット20
    可能なクレーム数
    レベル2で500件、レベル4で4,000件
  • API タスクの背後の公式 X API

    フォローとリツイートのクレーム1件で消費するもの
    リストの取得:自分のフォロワー1人あたり$0.001、リツイートユーザー1人あたり$0.010
    可能なクレーム数
    開発者アカウント、OAuth、同期ジョブが必要
月間のクレーム数
クエスト内のXタスク
APIタスクの裏で動くSorsa API
$39.80
月20Kリクエスト、Proの1,000リクエストあたり$1.99
ZealyのネイティブXタスク
$450
追加のクレームクレジット30K、1,000あたり$15
Galxe Authentic Verification
200Kクレジット
レベル4の80Kを超過: Business+のみ

1クレームにつきタスクごとに1リクエスト。各リツイートは、投稿の直後に確認します。

月間のクレーム数とXタスクを選んでください。3つの合計がそれに合わせて変わります。

Sorsa API は参加者ではなくリクエストに課金し、失敗したリクエストに課金されることはありません。1,000リクエストあたりの料金は、Starter の$4.90から最大プランの$1.40までです。

#ボットとフォロー解除者を報酬リストから除く

確認できたタスクが証明するのは1つの操作であって、1人の人間ではありません。報酬を出す前に、さらに3つのチェックが必要です。アカウントの古さ、公開アカウントであること、フォローが今も続いていることです。

  • アカウントの古さと規模。 GET /info(新しいタブで開きます) は、1リクエストで参加者の created_at、followers_count、tweets_count を返します。そのため、作成から30日未満のアカウントや、投稿が1件もないアカウントを、サーバーで断れます。Galxe には独自の経過期間とフォロワー数の制限があり、Zealy と TaskOn では、サーバーがその役割を担います。
  • 公開アカウント。 フォロー、リツイート、引用のチェックは、参加者のアカウントが非公開だと user_protected: true を返します。非公開アカウントの操作は外部からは確認できません。クエストの間は公開にするよう、参加者に依頼してください。
  • クレーム後のフォロー解除。 Galxe 自身のヘルプにも、クレームのためにフォローして、その後に解除する参加者がいると書かれています。報酬を支払う前に、報酬リストに対して POST /check-follow をもう一度実行してください。
  • いいね。 X は2024年6月にいいねを非公開にしました。そのため、いいねを確認できるのは参加者本人が連携したアカウントだけで、Sorsa API はいいねを返しません(Engadget(新しいタブで開きます))。代わりに、リツイート、引用、リプライを求めてください。この3つは公開のままで、確認できます。

参加者のリスト全体をスコアリングするなら、Twitter ボット検出で、実在のアカウントと量産アカウントを見分けるシグナルを解説しています。コミュニティのタスクと、コミュニティのメンバー一覧については、X リストとコミュニティの APIのガイドをご覧ください。

#X タスクを確認して、次のクエストを実施する

Galxe、Zealy、TaskOn で、X のフォロー、リツイート、引用、リプライ、コミュニティ参加を確認するには、プラットフォームの API タスクの背後で Sorsa API を使います。タスク1件につき1リクエスト、1チェック$0.0014から、全プランで毎秒20リクエストです。開発者アカウントも、自分の X ログインも、フローのどこにも必要ありません。100回分の無料リクエストを使い、タスクを完了したアカウントとしていないアカウントの2つでテスト用クエストに対してサーバーを動かし、公開前に、クエストの X タスクを API タスクに移してください。

#よくある質問

Galxe、Zealy、TaskOn の X タスクを確認するのに最適な API は?

Sorsa API です。各プラットフォームの API タスクの背後で、フォロー、リツイート、引用、リプライ、コミュニティ参加を、それぞれ1リクエストで確認できます。料金は1チェックあたり$0.0014からで、API キー1つ、X の開発者アカウントは不要です。どの選択肢も、次の4点で判断してください。参加者1人につき1つのはい/いいえ、プラットフォームの5〜10秒以内の応答、1チェックあたりの料金、対応するタスクです。Sorsa API は4点すべてを満たします。

Galxe の X タスクが確認されないのはなぜですか?

Galxe が X のフォローやリツイートを確認するのは、Authentic Verification がオンのときだけです。これには Rewards Hub レベル2または Business+ が必要で、1チェックにつき10クレジットを消費し、クレジットを使い切ると Galxe がチェックをオフにします。また、Galxe ID に連携した X アカウントが、タスクを実行したアカウントと別の場合も、参加者は不合格になります。自社サーバーを使う REST credential なら、クレジットの上限を避けられます。

X の投稿にいいねしたことは、クエストで確認できますか?

確認できるのは、参加者本人が連携したアカウントを通じた場合だけです。Zealy の標準のいいねタスクなら確認でき、クレーム1回につきクレームクレジットが3追加されます。Galxe は、いいねを確認の対象として有効にできません。Sorsa API を含む公開データ API は、いいねを確認できません。X は2024年6月から、いいねを投稿者本人にしか表示していないためです。いいねの代わりに、リツイート、引用、リプライを求めてください。

クエストタスクの確認に X の開発者アカウントは必要ですか?

Sorsa API なら不要です。サーバーが ApiKey ヘッダーに API キー1つを付けて送るだけで、X の開発者アカウントも、アプリも、OAuth のフローもありません。参加者は、これまでどおり Galxe、Zealy、TaskOn に X アカウントを連携するだけです。公式 X API は、最初の読み取りの前に、開発者アカウントと、OAuth を使うアプリを求めます。

X タスクの確認を無料でテストできますか?

できます。Sorsa API のアカウントにはすべて100回分の無料リクエストが付き、100チェック分に相当します。カードは不要で、有効期限もありません。これで、数個のテスト用アカウントを使い、Galxe、Zealy、TaskOn でサーバーを一通りテストできます。個別のフォローの確認なら、コード不要で、無料の相互フォロー確認ツールが答えます。

#検証の方法

2026年11月2日に、各プラットフォーム自身の X タスクとカスタム API タスクのドキュメントを読みました。Galxe のヘルプセンターと REST credential のドキュメント、Zealy のタスクのドキュメントと料金ページ、TaskOn の開発者向けドキュメントとガイドブックです。コード内の Sorsa API のエンドポイント、パラメータ、レスポンスのフィールドはすべて、公開中の API リファレンス(45エンドポイント)と照合し、公式 X API の料金とレート制限は、同日に docs.x.com から取得しました。リクエストとレスポンスにはデモアカウントを使っています。クレジットと費用の数字は、公開されている料金をもとにした独自の計算です。

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

変更点
  • 初公開。