CSAM Detection - Hash Matching API

🚧

Deprecated Endpoint

Soon, we will no longer be offering separate endpoints for our Hash Matching and Classifier CSAM detection models. Moving forward, customers should use our combined endpoint.

Thorn's API returns matches for images and videos against their CSAM database.

Note: you can demarcate whether there were ANY matches if there exists a matched keyword under file -> reasons. For non-match, reasons will be an empty array.

The matched items from the database will be under the hashes field.

Note: startTimestamp and endTimestamp are null in this case since its an image. In the context of a video, the startTimestamp and endTimestamp demarcate when in the sent example the matched hash was found.

"output": {
        "file": {
            "fileType": "image",
            "reasons": [
                "matched"
            ],
            "classifierPrediction": null
        },
        "hashes": [
            {
                "hashType": "saferhashv0",
              	"hashString": null,
                "matchTypes": [
                    "CSAM"
                ],
                "reasons": [
                    "matched"
                ],
                "sources": [
                    {
                        "hashSet": "test",
                        "matches": [
                            {
                                "sourceId": "5da081a7a0fc9970df3593841346e388",
                                "matchDistance": 43,
                                "matchMetadata": null,
                                "matchTransformations": []
                            }
                        ]
                    }
                ],
                "classifierPrediction": null,
                "isLetterboxed": false,
                "startTimestamp": null,
                "endTimestamp": null,
                "frameIndex": null
            }
        ]
    }

Here is a video that matched with a single scene. Note: the video matched for two different sets in MD5, and matched for a single scene using videoSaferhashv0. You can tell where the scene is in the video using, startTimestamp and endTimestamp The frameindex will tell you which frame the scene started.


"output": {
    "file": {
      "fileType": "video",
      "reasons": [
        "matched"
      ],
      "classifierPrediction": null
    },
    "hashes": [
      {
        "hashType": "md5",
        "hashString": null,
        "matchTypes": [
          "CSAM",
          "SE"
        ],
        "reasons": [
          "matched"
        ],
        "sources": [
          {
            "hashSet": "test",
            "matches": [
              {
                "sourceId": "video",
                "matchDistance": 0,
                "matchMetadata": null,
                "matchTransformations": []
              },
              {
                "sourceId": "b6f493d9-2cf6-4c89-ae24-c824ad47c4ab",
                "matchDistance": 0,
                "matchMetadata": null,
                "matchTransformations": []
              }
            ]
          },
          {
            "hashSet": "test-se",
            "matches": [
              {
                "sourceId": "video",
                "matchDistance": 0,
                "matchMetadata": null,
                "matchTransformations": []
              }
            ]
          }
        ],
        "classifierPrediction": null,
        "isLetterboxed": false,
        "startTimestamp": null,
        "endTimestamp": null,
        "frameIndex": null
      },
      {
        "hashType": "videoSaferhashv0",
        "hashString": null,
        "matchTypes": [
          "CSAM",
          "SE"
        ],
        "reasons": [
          "matched"
        ],
        "sources": [
          {
            "hashSet": "test",
            "matches": [
              {
                "sourceId": "test video",
                "matchDistance": 308,
                "matchMetadata": null,
                "matchTransformations": []
              }
            ]
          }
        ],
        "classifierPrediction": null,
        "isLetterboxed": false,
        "startTimestamp": 3.9999999999999987,
        "endTimestamp": 4.599999999999999,
        "frameIndex": 120
      }
    ]
}

This is a response for an image that did not match anything. Note: hashes is empty.

"output": {
      "file": {
        "classifierPrediction": null,
        "fileType": "image",
        "reasons": []
       },
      "hashes": []
    }

Nearly identical for a non-matching video:

"output": {
      "file": {
        "classifierPrediction": null,
        "fileType": "video",
        "reasons": []
       },
      "hashes": []
    }

Other Fields:

  • classifierPrediction : returns the score from the Thorn classifier on the media.
  • isLetterBoxed: returns whether an image is letterboxed.
  • matchDistance: returns the Euclidean distance and is only valid for the Safer hash.
  • matchTransformations: returns whether transformations were applied to match the hashes.
  • matchMetadata: returns additional information on the matches that are in the source database.