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

# Check Email Copy for Spam Triggers

> Analyse cold email copy with SpamAssassin and get back the score, threshold, verdict, and the exact rules that fired. Free, with a daily cap shared with the dashboard tool.

Analyse the plain text of a cold email for the content signals SpamAssassin flags — the engine many SMB mailboxes, hosting providers, IT shops, and education and government domains run on inbound mail. The response gives the overall `score`, the spam `threshold` (default `5.0`), a `verdict` (`clean`, `borderline`, or `likely_flagged`), and the `rules` that fired with their points and plain-English descriptions.

SpamAssassin reacts to phrasing, not strategy. To lower a score, reword the phrases behind the highest-`points` rules and re-check — you keep the offer, you change the wording. It's one tool in your deliverability belt: a clean result isn't a guarantee of inbox placement, but it's a fast way to reverse-engineer what content filters react to before you send.

## Pricing and limits

Free — no credits are deducted. Usage is bounded by **100 checks per day per account**, shared with the in-dashboard spam checker (both draw down the same pool), plus the standard **20 requests per second per API key**. Both limits return `429`; the `code` field (`daily_quota_exceeded` vs `rate_limited`) and the `Retry-After` header tell them apart. See [errors](/docs/api-reference/errors) for the full reference.


## OpenAPI

````yaml POST /v1/content-spam-check
openapi: 3.1.0
info:
  title: OrbiSearch Public API
  version: 1.0.0
  description: >-
    Email verification API for developers and agents. [Get your API key
    →](https://orbisearch.com/dashboard/api-keys)


    **Rate limiting:** requests are limited per API key (20 requests per second
    by default). Every response includes `X-RateLimit-Limit`,
    `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers describing the
    current per-key window so clients can self-throttle; `429` responses also
    include a `Retry-After` header with the suggested backoff in seconds.
  contact:
    name: Get API Key
    url: https://orbisearch.com/dashboard/api-keys
servers:
  - url: https://api.orbisearch.com
    description: OrbiSearch Public API
security:
  - ApiKeyAuth: []
paths:
  /v1/content-spam-check:
    post:
      tags:
        - Public API v1
      summary: Check Email Copy for Spam Triggers
      description: >-
        Analyse the text of a cold email for the content signals SpamAssassin

        flags, and get back the same `score`, `threshold`, `verdict`, and fired

        `rules` shown in the OrbiSearch dashboard. Use it to spot and rewrite
        the

        phrases that push a message toward the spam threshold before you send.


        Free to call — no credits are deducted. Usage is bounded by a daily cap
        of

        100 checks per account, **shared** with the in-dashboard spam checker
        (both

        draw down the same pool), plus the standard 20 requests per second per
        API

        key. Exceeding the daily cap returns `429` with `code:
        "daily_quota_exceeded"`

        and a `Retry-After` of seconds until reset; exceeding the per-second
        limit

        returns `429` with `code: "rate_limited"` and a `Retry-After` computed
        from

        the remaining rate-limit window.
      operationId: content_spam_check_v1_content_spam_check_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContentSpamCheckRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContentSpamCheckResponse'
          headers:
            X-RateLimit-Limit:
              description: Maximum requests allowed in the current per-API-key window.
              schema:
                type: integer
                examples:
                  - 20
            X-RateLimit-Remaining:
              description: Requests remaining in the current per-API-key window.
              schema:
                type: integer
                examples:
                  - 13
            X-RateLimit-Reset:
              description: Unix timestamp (seconds) at which the current window resets.
              schema:
                type: integer
                examples:
                  - 1751700000
        '401':
          description: Invalid or missing API key
          content:
            application/json:
              example:
                detail: API key required in X-API-Key header
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
        '422':
          description: Invalid request parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
              example:
                detail: >-
                  Invalid request body field 'content': String should have at
                  least 1 character.
                errors:
                  - loc: body.content
                    msg: >-
                      Invalid request body field 'content': String should have
                      at least 1 character.
                    type: string_too_short
          headers:
            X-RateLimit-Limit:
              description: Maximum requests allowed in the current per-API-key window.
              schema:
                type: integer
                examples:
                  - 20
            X-RateLimit-Remaining:
              description: Requests remaining in the current per-API-key window.
              schema:
                type: integer
                examples:
                  - 13
            X-RateLimit-Reset:
              description: Unix timestamp (seconds) at which the current window resets.
              schema:
                type: integer
                examples:
                  - 1751700000
        '429':
          description: Daily free-tier limit reached
          headers:
            Retry-After:
              description: Seconds until the daily quota resets (UTC midnight).
              schema:
                type: integer
                examples:
                  - 43200
            X-RateLimit-Limit:
              description: Maximum requests allowed in the current per-API-key window.
              schema:
                type: integer
                examples:
                  - 20
            X-RateLimit-Remaining:
              description: Requests remaining in the current per-API-key window.
              schema:
                type: integer
                examples:
                  - 13
            X-RateLimit-Reset:
              description: Unix timestamp (seconds) at which the current window resets.
              schema:
                type: integer
                examples:
                  - 1751700000
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
              example:
                detail: >-
                  You've reached today's limit of 100 checks. Try again
                  tomorrow.
                code: daily_quota_exceeded
        '503':
          description: Spam-analysis engine temporarily unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
              example:
                detail: Spam checker temporarily unavailable. Please try again.
                code: engine_unavailable
          headers:
            X-RateLimit-Limit:
              description: Maximum requests allowed in the current per-API-key window.
              schema:
                type: integer
                examples:
                  - 20
            X-RateLimit-Remaining:
              description: Requests remaining in the current per-API-key window.
              schema:
                type: integer
                examples:
                  - 13
            X-RateLimit-Reset:
              description: Unix timestamp (seconds) at which the current window resets.
              schema:
                type: integer
                examples:
                  - 1751700000
      security:
        - ApiKeyAuth: []
components:
  schemas:
    ContentSpamCheckRequest:
      properties:
        content:
          type: string
          maxLength: 10000
          minLength: 1
          title: Content
          description: >-
            Plain-text email body to analyse. Cold email is plain text in
            practice; HTML is not required.
        subject:
          anyOf:
            - type: string
              maxLength: 255
            - type: 'null'
          title: Subject
          description: >-
            Optional subject line. When provided, it is included in the
            analysis.
      type: object
      required:
        - content
      title: ContentSpamCheckRequest
      description: Email copy to analyse for spam-filter triggers.
      example:
        content: >-
          ACT NOW!! This EXCLUSIVE offer expires TONIGHT. Guaranteed to DOUBLE
          your revenue and make you $50,000 fast. Click here to claim your FREE
          spot!!!
        subject: 'URGENT: claim your spot before midnight'
    ContentSpamCheckResponse:
      properties:
        score:
          type: number
          title: Score
          description: Total SpamAssassin score for the copy. Higher means more spam-like.
          examples:
            - 2.6
        threshold:
          type: number
          title: Threshold
          description: >-
            Score at or above which mail is treated as spam (SpamAssassin
            default is 5.0).
          examples:
            - 5
        verdict:
          type: string
          title: Verdict
          description: >-
            Overall assessment: `clean` (well below threshold), `borderline`
            (approaching threshold), or `likely_flagged` (at or above
            threshold).
          examples:
            - borderline
        rules:
          items:
            $ref: '#/components/schemas/SpamRule'
          type: array
          title: Rules
          description: >-
            Content rules that fired, highest-scoring first. Empty when nothing
            triggered.
      type: object
      required:
        - score
        - threshold
        - verdict
        - rules
      title: ContentSpamCheckResponse
      description: SpamAssassin analysis of the submitted email copy.
      example:
        rules:
          - description: Plain-text message focused on large sums of money
            name: MONEY_NOHTML
            points: 2.5
          - description: Talks about 'acting now' with capitals
            name: ACT_NOW_CAPS
            points: 0.1
        score: 2.6
        threshold: 5
        verdict: borderline
    ApiErrorResponse:
      properties:
        detail:
          type: string
          title: Detail
          description: Human-readable description of what went wrong.
          examples:
            - API key required in X-API-Key header
        code:
          anyOf:
            - type: string
            - type: 'null'
          title: Code
          description: >-
            Stable machine-readable error code, present on conditions a client
            may want to branch on (for example `rate_limited` for the per-second
            limit versus `daily_quota_exceeded` for the daily cap). Absent on
            errors that need no further disambiguation.
          examples:
            - daily_quota_exceeded
        errors:
          anyOf:
            - items:
                $ref: '#/components/schemas/ValidationErrorDetail'
              type: array
            - type: 'null'
          title: Errors
          description: >-
            Individual validation failures, one entry per invalid parameter or
            field. Present only on 422 responses; when the request has a single
            problem, `detail` carries the same message. Absent on all other
            error codes.
      type: object
      required:
        - detail
      title: ApiErrorResponse
      description: Error response body.
    SpamRule:
      properties:
        name:
          type: string
          title: Name
          description: The SpamAssassin rule name that matched.
          examples:
            - MONEY_NOHTML
        points:
          type: number
          title: Points
          description: Points this rule added to the overall spam score.
          examples:
            - 2.5
        description:
          type: string
          title: Description
          description: Plain-English explanation of what the rule detects.
          examples:
            - Plain-text message focused on large sums of money
      type: object
      required:
        - name
        - points
        - description
      title: SpamRule
      description: A single SpamAssassin rule that fired on the submitted copy.
    ValidationErrorDetail:
      properties:
        loc:
          type: string
          title: Loc
          description: >-
            Where in the request the problem is, as a dot-separated path (e.g.
            `query.email`, `body.0`).
          examples:
            - query.email
        msg:
          type: string
          title: Msg
          description: Human-readable description of this validation error.
          examples:
            - 'Missing required query parameter: email.'
        type:
          type: string
          title: Type
          description: >-
            Machine-readable error category (e.g. `missing`, `less_than_equal`,
            `string_too_long`).
          examples:
            - missing
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationErrorDetail
      description: One request-validation failure.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      description: API key for authentication
      in: header
      name: X-API-Key

````