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

# Report

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

Reports a thesis or reply in the name of one of your users. Reports are weighted by the reporter's record; when the weights on a post reach 3 it is hidden until a moderator reviews it, and a `thesis.removed` event goes out on the streams. The author gets a warning, or a 7-day pause on a repeat, and can appeal. See [Moderation and appeals](/cabalspy-id/theses-moderation). Reporting the same post twice has no further effect, and users cannot report their own posts.

## Body

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

<ParamField body="reason" type="string" required>
  One of `spam`, `scam`, `abuse`, `impersonation` or `other`.
</ParamField>

<ParamField body="note" type="string">
  Optional details for the moderators, up to 300 characters.
</ParamField>

<ParamField body="csid_id" type="string" required>
  The reporting user, 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/report" \
    -H "Authorization: Bearer YOUR_KEY" -H "Content-Type: application/json" \
    -d '{"thesis_id":"8d1f5a2e-6c4b-4e0f-9a7d-1b2c3d4e5f60","reason":"scam","note":"Fake contract link","csid_id":"5e2d8c41-7a9b-4c3e-b1f0-6d5e4c3b2a19"}'
  ```

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

  requests.post("https://api-id.cabalspy.xyz/v1/theses/report",
                headers={"Authorization": "Bearer YOUR_KEY"},
                json={"thesis_id": thesis_id, "reason": "spam", "csid_id": session_user_sub})
  ```

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

## Response

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

<ResponseField name="data" type="object">
  `{"reported": true}`
</ResponseField>

<ResponseExample>
  ```json Response theme={null}
  {
    "success": true,
    "data": { "reported": true },
    "meta": { "request_id": "req_5162c7cf7f87", "cached": false, "cache_age_seconds": 0, "version": "v1", "timestamp": "2026-10-13T09:30:00Z" }
  }
  ```
</ResponseExample>

## Errors

| Status | Code | Meaning |
| - | - | - |
| 400 | missing\_parameter | thesis\_id, reason or csid\_id is missing. |
| 400 | invalid\_parameter | Unknown reason, invalid csid\_id, or the user reports their own post. |
| 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 | reporting\_paused | Too many of the user's reports were rejected: no reports for 30 days. |
| 404 | not\_found | The post does not exist or was deleted. |
| 429 | rate\_limited | The user reports too often: 20 reports per day. |
| 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.