> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.resemble.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.resemble.ai/_mcp/server.

# Score Content

Score text or a media file against the fraud categories available to your team.

`POST https://app.resemble.ai/api/v2/signal`

Provide **either** `text` **or** `file`, not both.

## Request parameters

| Field        | Type   | Required              | Description                                                                    |
| ------------ | ------ | --------------------- | ------------------------------------------------------------------------------ |
| `text`       | string | One of `text`, `file` | Text to analyze. Send as JSON.                                                 |
| `file`       | file   | One of `text`, `file` | Audio, image, or video file, up to 15 MB. Send as `multipart/form-data`.       |
| `media_type` | string | No                    | `audio`, `video`, or `image`. Detected from the file's MIME type when omitted. |

## Headers

| Header          | Value                   | Description                                                                |
| --------------- | ----------------------- | -------------------------------------------------------------------------- |
| `Authorization` | `Bearer YOUR_API_TOKEN` | Required. Your API token.                                                  |
| `Content-Type`  | `application/json`      | Required for text submissions. Use `multipart/form-data` for file uploads. |

## Examples

### Score text

```bash
curl --request POST 'https://app.resemble.ai/api/v2/signal' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Content-Type: application/json' \
  --data '{
    "text": "wire the funds now to this account"
  }'
```

### Score an audio file

```bash
curl --request POST 'https://app.resemble.ai/api/v2/signal' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -F 'file=@suspicious_call.wav' \
  -F 'media_type=audio'
```

## Response

```json
{
  "success": true,
  "item": {
    "id": 12345,
    "input_modality": "text",
    "verdict": "fraud",
    "top_category": { "name": "CEO Impersonation / Wire Diversion", "icon": "👔", "score": 0.91 },
    "category_scores": [
      { "name": "CEO Impersonation / Wire Diversion", "icon": "👔", "score": 0.91 },
      { "name": "Vendor Invoice / Payment Redirection", "icon": "📨", "score": 0.70 }
    ],
    "benign_score": 0.12,
    "margin_over_second": 0.21,
    "examples": ["transfer the funds immediately", "send the wire today"],
    "top_matches": [
      { "category": "CEO Impersonation / Wire Diversion", "text": "wire funds to this account…", "score": 0.92 }
    ],
    "duration_seconds": null,
    "created_at": "2026-06-14T10:30:45.123Z"
  }
}
```

### Response fields

| Field                     | Type           | Description                                                                  |
| ------------------------- | -------------- | ---------------------------------------------------------------------------- |
| `success`                 | boolean        | Whether the API request succeeded.                                           |
| `item.id`                 | integer        | Submission identifier, used with [Delete Submission](/detect/signal/delete). |
| `item.input_modality`     | string         | `text`, `audio`, `video`, or `image`.                                        |
| `item.verdict`            | string         | `safe`, `suspicious`, or `fraud`.                                            |
| `item.top_category`       | object         | Highest-scoring category, with `name`, `icon`, and a 0–1 `score`.            |
| `item.category_scores`    | array          | Top categories with their scores. Use this to show alternatives.             |
| `item.benign_score`       | number         | How strongly the content matched benign, non-fraud content.                  |
| `item.margin_over_second` | number         | Gap between the top category score and the runner-up.                        |
| `item.examples`           | array          | Sample phrases from the top category, useful for explaining the verdict.     |
| `item.top_matches`        | array          | The closest individual training examples that matched.                       |
| `item.duration_seconds`   | number \| null | Media duration for audio and video; `null` for text and image.               |
| `item.created_at`         | string         | Submission timestamp.                                                        |

## Error handling

| Status | Cause                                                                                        |
| ------ | -------------------------------------------------------------------------------------------- |
| `400`  | Neither `text` nor `file` was provided, or `media_type` is not `audio`, `video`, or `image`. |
| `403`  | The account does not have Signal access.                                                     |
| `413`  | The uploaded file exceeds the 15 MB limit.                                                   |

```json
{
  "success": false,
  "message": "File exceeds 15 MB limit",
  "max_bytes": 15728640
}
```