Skip to content

List moderations

GET/v1/moderationsKey scope read

Lists the project's moderations, newest first. A form appears once, as its parent moderation and without the fields map, and the author of an item carries id and external_id only. Fetch one moderation by id for the full object. Moderations made with test keys and with live keys are listed together; a test one carries test: true.

Needs a key with the read scope. Authentication

curl "https://api.useinfrared.com/v1/moderations?limit=2" \
  -H "Authorization: Bearer $INFRARED_KEY"
200 OKResponse
{
  "object": "list",
  "data": [
    {
      "object": "moderation",
      "id": "mod_6N1eLwABe6dRMHtzC53hc2",
      "template": {
        "slug": "review",
        "version": 1
      },
      "type": "text",
      "status": "completed",
      "flagged": true,
      "recommendation": "reject",
      "severity": "critical",
      "policies": {
        "spam": 0.9,
        "sexual": 0,
        "illicit": 0,
        "toxicity": 0,
        "violence": 0,
        "gibberish": 0,
        "off_topic": 0,
        "profanity": 0,
        "self_harm": 0,
        "hate_speech": 0,
        "instructions": 1,
        "made_with_ai": 0,
        "links_contact": 0.9,
        "personal_data": 0,
        "lookalike_characters": 0
      },
      "triggered": ["spam", "links_contact", "instructions"],
      "rule": null,
      "reasons": [
        "trigger:spam:review",
        "trigger:links_contact:review",
        "trigger:instructions:flag",
        "triage:reject"
      ],
      "details": {
        "spam": {
          "labels": ["promotion"],
          "matches": [
            {
              "label": "promotion",
              "value": "Skip this shop. I buy mine at https://deals.example.com with the code SAVE20 and get 20% off."
            }
          ]
        },
        "instructions": {
          "labels": ["confidence:100"],
          "matches": [
            {
              "field": null,
              "label": "evidence",
              "value": "I buy mine at https://deals.example.com with the code SAVE20 and get 20% off."
            }
          ],
          "explanation": "The review promotes a competitor by providing a link and discount code for another website."
        },
        "links_contact": {
          "labels": ["url"],
          "matches": [
            {
              "label": "url",
              "value": "https://deals.example.com"
            },
            {
              "end": 55,
              "label": "url",
              "start": 30,
              "value": "https://deals.example.com"
            },
            {
              "label": "url",
              "value": "https://deals.example.com",
              "source": "model"
            }
          ]
        }
      },
      "author": {
        "id": "aut_7ZRftUOZyMjsmFWvJifaOJ",
        "external_id": "user_4821"
      },
      "language": "en",
      "usage": {
        "checks": 1,
        "cached": false
      },
      "latency_ms": 2253,
      "dry_run": false,
      "content_id": "review_9033",
      "context_id": null,
      "metadata": null,
      "created_at": "2026-10-08T09:28:42.640Z",
      "completed_at": "2026-10-08T09:28:45.418Z"
    },
    {
      "object": "moderation",
      "id": "mod_11SrKjWwwIYkkhV7A341eo",
      "template": {
        "slug": "review",
        "version": 1
      },
      "type": "text",
      "status": "completed",
      "flagged": false,
      "recommendation": "allow",
      "severity": "none",
      "policies": {
        "spam": 0,
        "sexual": 0,
        "illicit": 0,
        "toxicity": 0,
        "violence": 0,
        "gibberish": 0,
        "off_topic": 0,
        "profanity": 0,
        "self_harm": 0,
        "hate_speech": 0,
        "instructions": 0,
        "made_with_ai": 0,
        "links_contact": 0,
        "personal_data": 0,
        "lookalike_characters": 0
      },
      "triggered": [],
      "rule": null,
      "reasons": ["triage:allow"],
      "details": {
        "instructions": {
          "labels": ["confidence:100"],
          "matches": [
            {
              "field": null,
              "label": "evidence",
              "value": "Arrived two days early and works exactly as described. The seller answered every question."
            }
          ],
          "explanation": "The review describes a real experience with the product and seller, adhering to the policy."
        }
      },
      "author": {
        "id": "aut_4jb9a0j0nR6JwaRhJm4IWN",
        "external_id": "user_5290"
      },
      "language": "en",
      "usage": {
        "checks": 1,
        "cached": false
      },
      "latency_ms": 1891,
      "dry_run": false,
      "content_id": "review_9032",
      "context_id": null,
      "metadata": null,
      "created_at": "2026-10-08T09:28:38.710Z",
      "completed_at": "2026-10-08T09:28:41.170Z"
    }
  ],
  "has_more": true,
  "next_cursor": "WyIyMDI2LTEwLTA4VDA5OjI4OjM4LjcxMFoiLCIyMWEyMmM2Mi1hY2YwLTQxNWMtYmY1NS0wZDE1MmFmNjVjZjYiXQ"
}

Query parameters

limitintegerDefault 20

Number of items to return, 1 to 100. Default 20.

cursorstring

The next_cursor of the previous page. Omit it for the first page.

templatestring

Return only moderations that ran on the template with this slug.

statusenum

Return only moderations in this status: screening, completed, partial, failed or invalid. Any other value answers 500 internal_error, not 422.

One ofscreeningcompletedpartialfailedinvalid

recommendationenum

Return only moderations with this recommendation: allow, review or reject.

One ofallowreviewreject

flaggedboolean

Send flagged=true to return only flagged moderations. The API reads any non-empty value as true, including false and 0; an empty value (flagged=) returns the moderations that are not flagged.

content_idstring

Return only moderations with this content_id.

author_idstring

Return only moderations of the author with this id of yours, as sent in author_id.

context_idstring

Return only moderations with this context_id.

typestring

Return only moderations of this type: text, image or form. audio and video are accepted and match nothing while those types are in development. Any other value answers 422.

languagestring

Return only moderations whose detected language is this ISO 639-1 code, for example en.

dry_runboolean

Send dry_run=true to return only dry run moderations. As with flagged, any non-empty value is read as true, and an empty value (dry_run=) returns the moderations that are not dry runs.

created_fromtimestamp

Return moderations created at or after this time. ISO 8601 in UTC with a trailing Z, for example 2026-10-01T00:00:00Z. A UTC offset answers 422.

created_totimestamp

Return moderations created at or before this time. Same format as created_from.

Returns

A list object: data holds up to limit moderations, has_more says whether another page exists and next_cursor is the value to send as cursor, or null on the last page.

Errors

400
invalid_cursor

cursor is not a value returned by this endpoint.

422
validation_error

limit is outside 1 to 100, recommendation or type is not one of the listed values, or a date is not ISO 8601 in UTC.

Every endpoint can also answer the errors any request can meet: a missing key, a rate limit, a malformed body. Errors

Something missing or unclear on this page? Write to support@useinfrared.com.