> ## 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.

# Post reply

> POST /v1/theses/replies: reply to a thesis in the name of one of your users.

Replies to a thesis in the name of one of your users. Any of your users who granted the scope `thesis` can reply, holding the token is not required. Replies are one level deep: you reply to a thesis, not to a reply. A `thesis.reply` event goes out on the [stream](/cabalspy-id/stream#thesis-events).

## Body

<ParamField body="thesis_id" type="string" required>
  The thesis to reply to.
</ParamField>

<ParamField body="body" type="string" required>
  The reply, up to 1,000 characters, same text rules as theses.
</ParamField>

<ParamField body="csid_id" type="string" required>
  The author, one of your users.
</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 -X POST "https://api-id.cabalspy.xyz/v1/theses/replies" \
    -H "Authorization: Bearer YOUR_KEY" -H "Content-Type: application/json" \
    -d '{"thesis_id":"8d1f5a2e-6c4b-4e0f-9a7d-1b2c3d4e5f60","body":"Nice call","csid_id":"5e2d8c41-7a9b-4c3e-b1f0-6d5e4c3b2a19"}'
  ```

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

  r = requests.post("https://api-id.cabalspy.xyz/v1/theses/replies",
                    headers={"Authorization": "Bearer YOUR_KEY"},
                    json={"thesis_id": thesis_id, "body": text, "csid_id": session_user_sub})
  reply = r.json()["data"]
  ```

  ```javascript JavaScript theme={null}
  const res = await fetch("https://api-id.cabalspy.xyz/v1/theses/replies", {
    method: "POST",
    headers: { Authorization: "Bearer YOUR_KEY", "Content-Type": "application/json" },
    body: JSON.stringify({ thesis_id: thesisId, body: text, csid_id: session.userSub }),
  });
  const { data } = await res.json();
  ```
</CodeGroup>

## Response

<ResponseField name="success" type="boolean">
  True on success. The status is 201.
</ResponseField>

<ResponseField name="data" type="object">
  The new reply, the same object as in [List replies](/cabalspy-id/theses-replies#response).
</ResponseField>

<ResponseExample>
  ```json Response theme={null}
  {
    "success": true,
    "data": {
      "id": "2a9c7e10-4b3d-4f5e-8a6b-7c8d9e0f1a2b",
      "chain": "solana",
      "mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
      "kind": "reply",
      "parent_id": "8d1f5a2e-6c4b-4e0f-9a7d-1b2c3d4e5f60",
      "body": "Nice call",
      "stance": null,
      "author": { "csid_id": "5e2d8c41-7a9b-4c3e-b1f0-6d5e4c3b2a19", "username": "degen_dan", "name": "Dan", "image_url": "https://pbs.twimg.com/profile_images/.../photo.jpg", "kol_badge": false, "profile_url": "https://id.cabalspy.xyz/u/degen_dan" },
      "likes": 0,
      "replies": 0,
      "reactions": {},
      "my_reactions": [],
      "via": "Example Terminal",
      "created_at": "2026-10-13T09:20:02.118004+00:00",
      "is_mine": false
    },
    "meta": { "request_id": "req_5162c7cf7f87", "cached": false, "cache_age_seconds": 0, "version": "v1", "timestamp": "2026-10-13T09:20:02Z" }
  }
  ```
</ResponseExample>

## Errors

| Status | Code | Meaning |
| - | - | - |
| 400 | missing\_parameter | thesis\_id, body or csid\_id is missing. |
| 400 | invalid\_parameter | csid\_id invalid. |
| 400 | invalid\_body | Text empty, too long, too many links, all caps, spam or a blocked word. |
| 400 | duplicate | The user posted the same text within the last day. |
| 401 | missing\_api\_key | API key missing. |
| 403 | invalid\_api\_key | API key invalid or not enabled for CabalSpy ID. |
| 403 | consent\_required | The user has not granted your app the scope thesis. |
| 403 | plan\_user\_limit | The user is beyond your plan's user limit. |
| 403 | sandbox\_user | Sandbox test users cannot write. |
| 403 | posting\_paused | The user is paused from writing. |
| 404 | not\_found | The thesis does not exist, was hidden or deleted, or is itself a reply. |
| 429 | rate\_limited | The user replies too fast: 30 replies per hour. |
| 429 | rate\_limit\_exceeded | Your API key's request rate is exceeded. |


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