> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cabalspy.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Eligibility

> GET /v1/theses/eligibility: whether one of your users can post a thesis on a token or reply, before you show the composer.

Whether one of your users can post a thesis on a token and whether they can reply. Call it before you show a **Post thesis** button: only holders can post, and users who did not grant the scope `thesis`, are beyond your plan's user limit or are paused cannot write.

## Query Parameters

<ParamField query="blockchain" type="string" required>
  Chain of the token. One of solana, bnb, base, eth, rh.
</ParamField>

<ParamField query="mint" type="string" required>
  Token address: a Solana mint or a 0x contract address.
</ParamField>

<ParamField query="csid_id" type="string" required>
  The user, the sub of their ID token.
</ParamField>

<ParamField query="instance" type="string">
  Your Instance ID. Only needed when your account has several instances.
</ParamField>

<ParamField query="api_key" type="string" required>
  Your API key. Alternatively pass it as an Authorization Bearer header.
</ParamField>

## Usage Example

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api-id.cabalspy.xyz/v1/theses/eligibility?blockchain=solana&mint=3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump&csid_id=0b7c4a52-3f1e-4f43-9d0a-2b5e7c1d9a11" \
    -H "Authorization: Bearer YOUR_KEY"
  ```

  ```python Python theme={null}
  import requests

  r = requests.get("https://api-id.cabalspy.xyz/v1/theses/eligibility",
                   params={"blockchain": "solana", "mint": mint, "csid_id": user_sub},
                   headers={"Authorization": "Bearer YOUR_KEY"})
  e = r.json()["data"]
  show_post_button = e["can_post"]
  show_reply_box = e["can_reply"]
  ```

  ```javascript JavaScript theme={null}
  const p = new URLSearchParams({ blockchain: "solana", mint, csid_id: userSub });
  const res = await fetch(`https://api-id.cabalspy.xyz/v1/theses/eligibility?${p}`, {
    headers: { Authorization: "Bearer YOUR_KEY" },
  });
  const { data } = await res.json();
  if (!data.can_post && data.reason === "consent_required") askForThesisScope();
  ```
</CodeGroup>

## Response

<ResponseField name="success" type="boolean">
  True on success.
</ResponseField>

<ResponseField name="data" type="object">
  <Expandable title="data">
    <ResponseField name="can_post" type="boolean">
      The user can post a thesis on this token now.
    </ResponseField>

    <ResponseField name="can_reply" type="boolean">
      The user can reply and react (false while paused).
    </ResponseField>

    <ResponseField name="holder" type="boolean">
      One of the user's verified wallets holds the token. Null when the user cannot write through your app at all.
    </ResponseField>

    <ResponseField name="paused" type="boolean">
      The user is paused from writing by moderation.
    </ResponseField>

    <ResponseField name="reason" type="string">
      Only when the user cannot write through your app: `consent_required` (no scope thesis), `plan_user_limit` or `sandbox_user`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json Can post theme={null}
  {
    "success": true,
    "data": { "can_post": true, "can_reply": true, "holder": true, "paused": false },
    "meta": { "request_id": "req_5162c7cf7f87", "cached": false, "cache_age_seconds": 0, "version": "v1", "timestamp": "2026-10-13T10:04:11Z" }
  }
  ```

  ```json No scope thesis theme={null}
  {
    "success": true,
    "data": { "can_post": false, "can_reply": false, "holder": null, "paused": false, "reason": "consent_required" },
    "meta": { "request_id": "req_5162c7cf7f87", "cached": false, "cache_age_seconds": 0, "version": "v1", "timestamp": "2026-10-13T10:04:11Z" }
  }
  ```
</ResponseExample>

## Errors

| Status | Code | Meaning |
| - | - | - |
| 400 | missing\_parameter | blockchain, mint or csid\_id is missing. |
| 400 | invalid\_parameter | Unknown chain, invalid token address or csid\_id. |
| 401 | missing\_api\_key | API key missing. |
| 403 | invalid\_api\_key | API key invalid or not enabled for CabalSpy ID. |
| 429 | rate\_limit\_exceeded | Rate limit exceeded. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.