{
  "info": {
    "_postman_id": "7d3c1a52-9e4b-4f6a-8c2d-5b1e0a9f3c47",
    "name": "Perspicax API v1",
    "description": "Detect fully AI-generated, photo-like still images with the Perspicax API.\n\n1. Import this collection and the **Perspicax** environment (both files from the docs).\n2. Pick the **Perspicax** environment and paste your key into `apiKey` (its current value).\n3. Start with **Models › List models** to check the key, then **Scans › Create a scan from a file**: choose your image in Body › form-data › image and send.\n\nDevelopment keys (`pcx_test_`) answer only for images your workspace already scanned, with their stored result; production keys (`pcx_live_`, Pro and Enterprise) check every image. Docs: https://perspicax.io/docs/api",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://perspicax.io",
      "type": "string"
    },
    {
      "key": "scanId",
      "value": "",
      "type": "string"
    },
    {
      "key": "cursor",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Scans",
      "description": "Send an image and read its verdict.",
      "item": [
        {
          "name": "Create a scan from a file",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Answered 200 (done) or 202 (still running)', function () {",
                  "  pm.expect(pm.response.code).to.be.oneOf([200, 202]);",
                  "});",
                  "var scan = pm.response.json();",
                  "if (scan && scan.id) pm.collectionVariables.set('scanId', scan.id);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Prefer",
                "value": "wait=30",
                "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new UUID per send. To retry the very same request, put the earlier key here."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/scans",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "scans"
              ]
            },
            "description": "Send one image, as a file (`multipart/form-data`, field `image`) or as a link (JSON `{ \"url\": … }`). A production key checks it with TrueEye and uses your quota; a development key answers at once with the stored result of an image your workspace already scanned, and uses none. In production, add `Prefer: wait=N` to get the verdict in the same call, and `share=true` for a public result page. An `Idempotency-Key` makes retries safe in both modes.\n\n[Docs](https://perspicax.io/docs/api#create-scan)",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "image",
                  "type": "file",
                  "src": [],
                  "description": "Required. Choose your image file (JPEG, PNG, WebP, HEIC, HEIF, AVIF, GIF (still); at most 20 MB)."
                },
                {
                  "key": "model",
                  "value": "trueeye-2.3",
                  "type": "text",
                  "disabled": true,
                  "description": "Optional. A model id from List models."
                },
                {
                  "key": "autoCrop",
                  "value": "false",
                  "type": "text",
                  "disabled": true,
                  "description": "Optional. Tick to check the whole image as sent: borders and app UI around the photo are then not left out."
                },
                {
                  "key": "share",
                  "value": "true",
                  "type": "text",
                  "disabled": true,
                  "description": "Optional. Tick to make the public result page too."
                }
              ]
            }
          },
          "response": [
            {
              "name": "200 · Production key: a completed scan",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "image",
                      "type": "file",
                      "src": [],
                      "description": "Required. Choose your image file (JPEG, PNG, WebP, HEIC, HEIF, AVIF, GIF (still); at most 20 MB)."
                    },
                    {
                      "key": "model",
                      "value": "trueeye-2.3",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. A model id from List models."
                    },
                    {
                      "key": "autoCrop",
                      "value": "false",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to check the whole image as sent: borders and app UI around the photo are then not left out."
                    },
                    {
                      "key": "share",
                      "value": "true",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to make the public result page too."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "Preference-Applied",
                  "value": "wait=30"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Quota-Limit",
                  "value": "35"
                },
                {
                  "key": "X-Quota-Remaining",
                  "value": "23"
                },
                {
                  "key": "X-Quota-Reset",
                  "value": "2026-10-29T00:00:00.000Z"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"id\": \"6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"status\": \"completed\",\n  \"source\": \"api\",\n  \"mode\": \"live\",\n  \"replayOf\": null,\n  \"model\": {\n    \"id\": \"trueeye-2.3\",\n    \"name\": \"TrueEye\",\n    \"version\": \"2.3\"\n  },\n  \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n  \"completedAt\": \"2026-10-28T09:12:49.350Z\",\n  \"image\": {\n    \"sha256\": \"f750730fb99d9aaf619583559e175ec3069aceb2b10fc3d2565148ce28b6b596\",\n    \"width\": 2400,\n    \"height\": 1018,\n    \"mime\": \"image/jpeg\",\n    \"bytes\": 299028,\n    \"filename\": \"harbour.jpg\",\n    \"previewUrl\": \"https://perspicax.io/api/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/image?exp=1761643067&sig=Q2xlYXJseUlsbHVzdHJhdGl2ZQ\"\n  },\n  \"result\": {\n    \"label\": \"ai_generated\",\n    \"inconclusiveReason\": null,\n    \"labelSource\": \"detector\",\n    \"coarse\": \"high\",\n    \"score\": 0.9731,\n    \"thresholds\": null,\n    \"provenance\": {\n      \"c2pa\": null,\n      \"iptcDigitalSourceType\": null\n    },\n    \"metadata\": {\n      \"exifPresent\": false,\n      \"cameraMake\": null,\n      \"software\": null\n    },\n    \"detector\": {\n      \"model\": \"TrueEye\",\n      \"version\": \"2.3\",\n      \"cropScores\": null,\n      \"photoLike\": true,\n      \"mock\": false\n    },\n    \"autoCrop\": {\n      \"enabled\": true,\n      \"applied\": false,\n      \"box\": null,\n      \"imageWidth\": 2400,\n      \"imageHeight\": 1018\n    }\n  },\n  \"usage\": {\n    \"counted\": true,\n    \"cached\": false\n  },\n  \"latencyMs\": 2140,\n  \"share\": null\n}"
            },
            {
              "name": "200 · Development key: the stored result of an earlier scan",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "image",
                      "type": "file",
                      "src": [],
                      "description": "Required. Choose your image file (JPEG, PNG, WebP, HEIC, HEIF, AVIF, GIF (still); at most 20 MB)."
                    },
                    {
                      "key": "model",
                      "value": "trueeye-2.3",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. A model id from List models."
                    },
                    {
                      "key": "autoCrop",
                      "value": "false",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to check the whole image as sent: borders and app UI around the photo are then not left out."
                    },
                    {
                      "key": "share",
                      "value": "true",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to make the public result page too."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "Preference-Applied",
                  "value": "wait=30"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"id\": \"6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"status\": \"completed\",\n  \"source\": \"api\",\n  \"mode\": \"test\",\n  \"replayOf\": \"0b8e4f27-3c1d-4a6e-9f52-7e1a3d9c4b88\",\n  \"model\": {\n    \"id\": \"trueeye-2.3\",\n    \"name\": \"TrueEye\",\n    \"version\": \"2.3\"\n  },\n  \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n  \"completedAt\": \"2026-10-28T09:12:47.222Z\",\n  \"image\": {\n    \"sha256\": \"f750730fb99d9aaf619583559e175ec3069aceb2b10fc3d2565148ce28b6b596\",\n    \"width\": 2400,\n    \"height\": 1018,\n    \"mime\": \"image/jpeg\",\n    \"bytes\": 299028,\n    \"filename\": \"harbour.jpg\",\n    \"previewUrl\": null\n  },\n  \"result\": {\n    \"label\": \"ai_generated\",\n    \"inconclusiveReason\": null,\n    \"labelSource\": \"detector\",\n    \"coarse\": \"high\",\n    \"score\": 0.9731,\n    \"thresholds\": null,\n    \"provenance\": {\n      \"c2pa\": null,\n      \"iptcDigitalSourceType\": null\n    },\n    \"metadata\": {\n      \"exifPresent\": false,\n      \"cameraMake\": null,\n      \"software\": null\n    },\n    \"detector\": {\n      \"model\": \"TrueEye\",\n      \"version\": \"2.3\",\n      \"cropScores\": null,\n      \"photoLike\": true,\n      \"mock\": false\n    },\n    \"autoCrop\": {\n      \"enabled\": true,\n      \"applied\": false,\n      \"box\": null,\n      \"imageWidth\": 2400,\n      \"imageHeight\": 1018\n    }\n  },\n  \"usage\": {\n    \"counted\": false,\n    \"cached\": true\n  },\n  \"latencyMs\": 12,\n  \"share\": null\n}"
            },
            {
              "name": "202 · Still running",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "image",
                      "type": "file",
                      "src": [],
                      "description": "Required. Choose your image file (JPEG, PNG, WebP, HEIC, HEIF, AVIF, GIF (still); at most 20 MB)."
                    },
                    {
                      "key": "model",
                      "value": "trueeye-2.3",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. A model id from List models."
                    },
                    {
                      "key": "autoCrop",
                      "value": "false",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to check the whole image as sent: borders and app UI around the photo are then not left out."
                    },
                    {
                      "key": "share",
                      "value": "true",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to make the public result page too."
                    }
                  ]
                }
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "Location",
                  "value": "/api/v1/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f"
                },
                {
                  "key": "Retry-After",
                  "value": "2"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Quota-Limit",
                  "value": "35"
                },
                {
                  "key": "X-Quota-Remaining",
                  "value": "23"
                },
                {
                  "key": "X-Quota-Reset",
                  "value": "2026-10-29T00:00:00.000Z"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"id\": \"6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"status\": \"queued\",\n  \"source\": \"api\",\n  \"mode\": \"live\",\n  \"replayOf\": null,\n  \"model\": {\n    \"id\": \"trueeye-2.3\",\n    \"name\": \"TrueEye\",\n    \"version\": \"2.3\"\n  },\n  \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n  \"completedAt\": null,\n  \"image\": {\n    \"sha256\": \"f750730fb99d9aaf619583559e175ec3069aceb2b10fc3d2565148ce28b6b596\",\n    \"width\": 2400,\n    \"height\": 1018,\n    \"mime\": \"image/jpeg\",\n    \"bytes\": 299028,\n    \"filename\": \"harbour.jpg\",\n    \"previewUrl\": \"https://perspicax.io/api/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/image?exp=1761643067&sig=Q2xlYXJseUlsbHVzdHJhdGl2ZQ\"\n  },\n  \"result\": null,\n  \"usage\": {\n    \"counted\": false,\n    \"cached\": false\n  },\n  \"latencyMs\": null,\n  \"share\": null\n}"
            },
            {
              "name": "400 · validation_failed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "image",
                      "type": "file",
                      "src": [],
                      "description": "Required. Choose your image file (JPEG, PNG, WebP, HEIC, HEIF, AVIF, GIF (still); at most 20 MB)."
                    },
                    {
                      "key": "model",
                      "value": "trueeye-2.3",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. A model id from List models."
                    },
                    {
                      "key": "autoCrop",
                      "value": "false",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to check the whole image as sent: borders and app UI around the photo are then not left out."
                    },
                    {
                      "key": "share",
                      "value": "true",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to make the public result page too."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/validation_failed\",\n  \"title\": \"Invalid request\",\n  \"status\": 400,\n  \"detail\": \"Send an image file (multipart field \\\"image\\\") or JSON { \\\"url\\\": \\\"https://…\\\" }.\",\n  \"code\": \"validation_failed\",\n  \"instance\": \"/api/v1/scans\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "401 · unauthorized",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "image",
                      "type": "file",
                      "src": [],
                      "description": "Required. Choose your image file (JPEG, PNG, WebP, HEIC, HEIF, AVIF, GIF (still); at most 20 MB)."
                    },
                    {
                      "key": "model",
                      "value": "trueeye-2.3",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. A model id from List models."
                    },
                    {
                      "key": "autoCrop",
                      "value": "false",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to check the whole image as sent: borders and app UI around the photo are then not left out."
                    },
                    {
                      "key": "share",
                      "value": "true",
                      "type": "text",
                      "disabled": true,
                      "description": "Optional. Tick to make the public result page too."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"perspicax\", error=\"invalid_token\""
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/unauthorized\",\n  \"title\": \"Sign-in required\",\n  \"status\": 401,\n  \"detail\": \"A valid API key is required: Authorization: Bearer pcx_live_… or pcx_test_…\",\n  \"code\": \"unauthorized\",\n  \"instance\": \"/api/v1/scans\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            }
          ]
        },
        {
          "name": "Create a scan from a URL",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Answered 200 (done) or 202 (still running)', function () {",
                  "  pm.expect(pm.response.code).to.be.oneOf([200, 202]);",
                  "});",
                  "var scan = pm.response.json();",
                  "if (scan && scan.id) pm.collectionVariables.set('scanId', scan.id);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Prefer",
                "value": "wait=30",
                "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new UUID per send. To retry the very same request, put the earlier key here."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/scans",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "scans"
              ]
            },
            "description": "Send one image, as a file (`multipart/form-data`, field `image`) or as a link (JSON `{ \"url\": … }`). A production key checks it with TrueEye and uses your quota; a development key answers at once with the stored result of an image your workspace already scanned, and uses none. In production, add `Prefer: wait=N` to get the verdict in the same call, and `share=true` for a public result page. An `Idempotency-Key` makes retries safe in both modes.\n\n[Docs](https://perspicax.io/docs/api#create-scan)",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://perspicax.io/images/harbour.jpg\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 · Production key: a completed scan",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://perspicax.io/images/harbour.jpg\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "Preference-Applied",
                  "value": "wait=30"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Quota-Limit",
                  "value": "35"
                },
                {
                  "key": "X-Quota-Remaining",
                  "value": "23"
                },
                {
                  "key": "X-Quota-Reset",
                  "value": "2026-10-29T00:00:00.000Z"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"id\": \"6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"status\": \"completed\",\n  \"source\": \"api\",\n  \"mode\": \"live\",\n  \"replayOf\": null,\n  \"model\": {\n    \"id\": \"trueeye-2.3\",\n    \"name\": \"TrueEye\",\n    \"version\": \"2.3\"\n  },\n  \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n  \"completedAt\": \"2026-10-28T09:12:49.350Z\",\n  \"image\": {\n    \"sha256\": \"f750730fb99d9aaf619583559e175ec3069aceb2b10fc3d2565148ce28b6b596\",\n    \"width\": 2400,\n    \"height\": 1018,\n    \"mime\": \"image/jpeg\",\n    \"bytes\": 299028,\n    \"filename\": \"harbour.jpg\",\n    \"previewUrl\": \"https://perspicax.io/api/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/image?exp=1761643067&sig=Q2xlYXJseUlsbHVzdHJhdGl2ZQ\"\n  },\n  \"result\": {\n    \"label\": \"ai_generated\",\n    \"inconclusiveReason\": null,\n    \"labelSource\": \"detector\",\n    \"coarse\": \"high\",\n    \"score\": 0.9731,\n    \"thresholds\": null,\n    \"provenance\": {\n      \"c2pa\": null,\n      \"iptcDigitalSourceType\": null\n    },\n    \"metadata\": {\n      \"exifPresent\": false,\n      \"cameraMake\": null,\n      \"software\": null\n    },\n    \"detector\": {\n      \"model\": \"TrueEye\",\n      \"version\": \"2.3\",\n      \"cropScores\": null,\n      \"photoLike\": true,\n      \"mock\": false\n    },\n    \"autoCrop\": {\n      \"enabled\": true,\n      \"applied\": false,\n      \"box\": null,\n      \"imageWidth\": 2400,\n      \"imageHeight\": 1018\n    }\n  },\n  \"usage\": {\n    \"counted\": true,\n    \"cached\": false\n  },\n  \"latencyMs\": 2140,\n  \"share\": null\n}"
            },
            {
              "name": "200 · Development key: the stored result of an earlier scan",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://perspicax.io/images/harbour.jpg\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "Preference-Applied",
                  "value": "wait=30"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"id\": \"6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"status\": \"completed\",\n  \"source\": \"api\",\n  \"mode\": \"test\",\n  \"replayOf\": \"0b8e4f27-3c1d-4a6e-9f52-7e1a3d9c4b88\",\n  \"model\": {\n    \"id\": \"trueeye-2.3\",\n    \"name\": \"TrueEye\",\n    \"version\": \"2.3\"\n  },\n  \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n  \"completedAt\": \"2026-10-28T09:12:47.222Z\",\n  \"image\": {\n    \"sha256\": \"f750730fb99d9aaf619583559e175ec3069aceb2b10fc3d2565148ce28b6b596\",\n    \"width\": 2400,\n    \"height\": 1018,\n    \"mime\": \"image/jpeg\",\n    \"bytes\": 299028,\n    \"filename\": \"harbour.jpg\",\n    \"previewUrl\": null\n  },\n  \"result\": {\n    \"label\": \"ai_generated\",\n    \"inconclusiveReason\": null,\n    \"labelSource\": \"detector\",\n    \"coarse\": \"high\",\n    \"score\": 0.9731,\n    \"thresholds\": null,\n    \"provenance\": {\n      \"c2pa\": null,\n      \"iptcDigitalSourceType\": null\n    },\n    \"metadata\": {\n      \"exifPresent\": false,\n      \"cameraMake\": null,\n      \"software\": null\n    },\n    \"detector\": {\n      \"model\": \"TrueEye\",\n      \"version\": \"2.3\",\n      \"cropScores\": null,\n      \"photoLike\": true,\n      \"mock\": false\n    },\n    \"autoCrop\": {\n      \"enabled\": true,\n      \"applied\": false,\n      \"box\": null,\n      \"imageWidth\": 2400,\n      \"imageHeight\": 1018\n    }\n  },\n  \"usage\": {\n    \"counted\": false,\n    \"cached\": true\n  },\n  \"latencyMs\": 12,\n  \"share\": null\n}"
            },
            {
              "name": "202 · Still running",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://perspicax.io/images/harbour.jpg\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "Location",
                  "value": "/api/v1/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f"
                },
                {
                  "key": "Retry-After",
                  "value": "2"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Quota-Limit",
                  "value": "35"
                },
                {
                  "key": "X-Quota-Remaining",
                  "value": "23"
                },
                {
                  "key": "X-Quota-Reset",
                  "value": "2026-10-29T00:00:00.000Z"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"id\": \"6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"status\": \"queued\",\n  \"source\": \"api\",\n  \"mode\": \"live\",\n  \"replayOf\": null,\n  \"model\": {\n    \"id\": \"trueeye-2.3\",\n    \"name\": \"TrueEye\",\n    \"version\": \"2.3\"\n  },\n  \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n  \"completedAt\": null,\n  \"image\": {\n    \"sha256\": \"f750730fb99d9aaf619583559e175ec3069aceb2b10fc3d2565148ce28b6b596\",\n    \"width\": 2400,\n    \"height\": 1018,\n    \"mime\": \"image/jpeg\",\n    \"bytes\": 299028,\n    \"filename\": \"harbour.jpg\",\n    \"previewUrl\": \"https://perspicax.io/api/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/image?exp=1761643067&sig=Q2xlYXJseUlsbHVzdHJhdGl2ZQ\"\n  },\n  \"result\": null,\n  \"usage\": {\n    \"counted\": false,\n    \"cached\": false\n  },\n  \"latencyMs\": null,\n  \"share\": null\n}"
            },
            {
              "name": "400 · validation_failed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://perspicax.io/images/harbour.jpg\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/validation_failed\",\n  \"title\": \"Invalid request\",\n  \"status\": 400,\n  \"detail\": \"Send an image file (multipart field \\\"image\\\") or JSON { \\\"url\\\": \\\"https://…\\\" }.\",\n  \"code\": \"validation_failed\",\n  \"instance\": \"/api/v1/scans\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "401 · unauthorized",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Prefer",
                    "value": "wait=30",
                    "description": "Wait up to N seconds (at most 30) for the verdict; untick to get a 202 at once."
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "A new UUID per send. To retry the very same request, put the earlier key here."
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://perspicax.io/images/harbour.jpg\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"perspicax\", error=\"invalid_token\""
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/unauthorized\",\n  \"title\": \"Sign-in required\",\n  \"status\": 401,\n  \"detail\": \"A valid API key is required: Authorization: Bearer pcx_live_… or pcx_test_…\",\n  \"code\": \"unauthorized\",\n  \"instance\": \"/api/v1/scans\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            }
          ]
        },
        {
          "name": "List scans",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Answered 200', function () {",
                  "  pm.response.to.have.status(200);",
                  "});",
                  "var page = pm.response.json();",
                  "pm.collectionVariables.set('cursor', (page && page.nextCursor) || '');"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/scans?limit=20",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "scans"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20"
                },
                {
                  "key": "cursor",
                  "value": "{{cursor}}",
                  "disabled": true,
                  "description": "The `nextCursor` of the previous page."
                }
              ]
            },
            "description": "The workspace’s scans, newest first, one page at a time: follow `nextCursor` until it is `null`. A development key lists development-mode answers only; a production key lists every other scan of the workspace (the app, the website and production keys).\n\n[Docs](https://perspicax.io/docs/api#list-scans)"
          },
          "response": [
            {
              "name": "200 · A page of scans",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans?limit=20",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ],
                  "query": [
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "cursor",
                      "value": "{{cursor}}",
                      "disabled": true,
                      "description": "The `nextCursor` of the previous page."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Quota-Limit",
                  "value": "35"
                },
                {
                  "key": "X-Quota-Remaining",
                  "value": "23"
                },
                {
                  "key": "X-Quota-Reset",
                  "value": "2026-10-29T00:00:00.000Z"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"items\": [\n    {\n      \"id\": \"6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n      \"status\": \"completed\",\n      \"source\": \"api\",\n      \"mode\": \"live\",\n      \"replayOf\": null,\n      \"model\": {\n        \"id\": \"trueeye-2.3\",\n        \"name\": \"TrueEye\",\n        \"version\": \"2.3\"\n      },\n      \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n      \"completedAt\": \"2026-10-28T09:12:49.350Z\",\n      \"image\": {\n        \"sha256\": \"f750730fb99d9aaf619583559e175ec3069aceb2b10fc3d2565148ce28b6b596\",\n        \"width\": 2400,\n        \"height\": 1018,\n        \"mime\": \"image/jpeg\",\n        \"bytes\": 299028,\n        \"filename\": \"harbour.jpg\",\n        \"previewUrl\": \"https://perspicax.io/api/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/image?exp=1761643067&sig=Q2xlYXJseUlsbHVzdHJhdGl2ZQ\"\n      },\n      \"result\": {\n        \"label\": \"ai_generated\",\n        \"inconclusiveReason\": null,\n        \"labelSource\": \"detector\",\n        \"coarse\": \"high\",\n        \"score\": 0.9731,\n        \"thresholds\": null,\n        \"provenance\": {\n          \"c2pa\": null,\n          \"iptcDigitalSourceType\": null\n        },\n        \"metadata\": {\n          \"exifPresent\": false,\n          \"cameraMake\": null,\n          \"software\": null\n        },\n        \"detector\": {\n          \"model\": \"TrueEye\",\n          \"version\": \"2.3\",\n          \"cropScores\": null,\n          \"photoLike\": true,\n          \"mock\": false\n        },\n        \"autoCrop\": {\n          \"enabled\": true,\n          \"applied\": false,\n          \"box\": null,\n          \"imageWidth\": 2400,\n          \"imageHeight\": 1018\n        }\n      },\n      \"usage\": {\n        \"counted\": true,\n        \"cached\": false\n      },\n      \"latencyMs\": 2140,\n      \"share\": null\n    },\n    {\n      \"id\": \"0b8e4f27-3c1d-4a6e-9f52-7e1a3d9c4b88\",\n      \"status\": \"completed\",\n      \"source\": \"api\",\n      \"mode\": \"live\",\n      \"replayOf\": null,\n      \"model\": {\n        \"id\": \"trueeye-2.3\",\n        \"name\": \"TrueEye\",\n        \"version\": \"2.3\"\n      },\n      \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n      \"completedAt\": \"2026-10-28T09:12:49.080Z\",\n      \"image\": {\n        \"sha256\": \"a828aec688f64ca7fb9fb51418eccfd658d4592ef8ed8370d519086b2eb68762\",\n        \"width\": 928,\n        \"height\": 1152,\n        \"mime\": \"image/jpeg\",\n        \"bytes\": 201286,\n        \"filename\": \"kebab.jpg\",\n        \"previewUrl\": \"https://perspicax.io/api/scans/0b8e4f27-3c1d-4a6e-9f52-7e1a3d9c4b88/image?exp=1761643067&sig=Q2xlYXJseUlsbHVzdHJhdGl2ZQ\"\n      },\n      \"result\": {\n        \"label\": \"not_ai_generated\",\n        \"inconclusiveReason\": null,\n        \"labelSource\": \"detector\",\n        \"coarse\": \"low\",\n        \"score\": 0.0318,\n        \"thresholds\": null,\n        \"provenance\": {\n          \"c2pa\": null,\n          \"iptcDigitalSourceType\": null\n        },\n        \"metadata\": {\n          \"exifPresent\": false,\n          \"cameraMake\": null,\n          \"software\": null\n        },\n        \"detector\": {\n          \"model\": \"TrueEye\",\n          \"version\": \"2.3\",\n          \"cropScores\": null,\n          \"photoLike\": true,\n          \"mock\": false\n        },\n        \"autoCrop\": {\n          \"enabled\": true,\n          \"applied\": false,\n          \"box\": null,\n          \"imageWidth\": 928,\n          \"imageHeight\": 1152\n        }\n      },\n      \"usage\": {\n        \"counted\": true,\n        \"cached\": false\n      },\n      \"latencyMs\": 1870,\n      \"share\": null\n    }\n  ],\n  \"nextCursor\": \"MjAyNi0xMC0yOFQwODo1NTowMy4xMThafDBiOGU0ZjI3LTNjMWQtNGE2ZS05ZjUyLTdlMWEzZDljNGI4OA\"\n}"
            },
            {
              "name": "400 · validation_failed",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans?limit=20",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ],
                  "query": [
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "cursor",
                      "value": "{{cursor}}",
                      "disabled": true,
                      "description": "The `nextCursor` of the previous page."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/validation_failed\",\n  \"title\": \"Invalid request\",\n  \"status\": 400,\n  \"detail\": \"Send an image file (multipart field \\\"image\\\") or JSON { \\\"url\\\": \\\"https://…\\\" }.\",\n  \"code\": \"validation_failed\",\n  \"instance\": \"/api/v1/scans\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "401 · unauthorized",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans?limit=20",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ],
                  "query": [
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "cursor",
                      "value": "{{cursor}}",
                      "disabled": true,
                      "description": "The `nextCursor` of the previous page."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"perspicax\", error=\"invalid_token\""
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/unauthorized\",\n  \"title\": \"Sign-in required\",\n  \"status\": 401,\n  \"detail\": \"A valid API key is required: Authorization: Bearer pcx_live_… or pcx_test_…\",\n  \"code\": \"unauthorized\",\n  \"instance\": \"/api/v1/scans\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "402 · upgrade_required",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans?limit=20",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans"
                  ],
                  "query": [
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "cursor",
                      "value": "{{cursor}}",
                      "disabled": true,
                      "description": "The `nextCursor` of the previous page."
                    }
                  ]
                }
              },
              "status": "Payment Required",
              "code": 402,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/upgrade_required\",\n  \"title\": \"Upgrade required\",\n  \"status\": 402,\n  \"detail\": \"Live keys use production mode, which comes with Pro and Enterprise. Upgrade to Pro, or use a test key (pcx_test_): development mode is free on every plan.\",\n  \"code\": \"upgrade_required\",\n  \"instance\": \"/api/v1/scans\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\",\n  \"suggestedPlan\": \"pro\",\n  \"docs\": \"https://perspicax.io/docs/api#production-mode\"\n}"
            }
          ]
        },
        {
          "name": "Retrieve a scan",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Answered 200', function () {",
                  "  pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/scans/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "scans",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "{{scanId}}",
                  "description": "The scan’s id (set by the last scan you created)."
                }
              ]
            },
            "description": "One scan of your workspace, in any state: check `status`. This is the URL a `202` points to in `Location`. A failed scan has `result: null` and was not counted. A development key reads development-mode answers only.\n\n[Docs](https://perspicax.io/docs/api#get-scan)"
          },
          "response": [
            {
              "name": "200 · A completed scan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Quota-Limit",
                  "value": "35"
                },
                {
                  "key": "X-Quota-Remaining",
                  "value": "23"
                },
                {
                  "key": "X-Quota-Reset",
                  "value": "2026-10-29T00:00:00.000Z"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"id\": \"6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"status\": \"completed\",\n  \"source\": \"api\",\n  \"mode\": \"live\",\n  \"replayOf\": null,\n  \"model\": {\n    \"id\": \"trueeye-2.3\",\n    \"name\": \"TrueEye\",\n    \"version\": \"2.3\"\n  },\n  \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n  \"completedAt\": \"2026-10-28T09:12:49.350Z\",\n  \"image\": {\n    \"sha256\": \"f750730fb99d9aaf619583559e175ec3069aceb2b10fc3d2565148ce28b6b596\",\n    \"width\": 2400,\n    \"height\": 1018,\n    \"mime\": \"image/jpeg\",\n    \"bytes\": 299028,\n    \"filename\": \"harbour.jpg\",\n    \"previewUrl\": \"https://perspicax.io/api/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/image?exp=1761643067&sig=Q2xlYXJseUlsbHVzdHJhdGl2ZQ\"\n  },\n  \"result\": {\n    \"label\": \"ai_generated\",\n    \"inconclusiveReason\": null,\n    \"labelSource\": \"detector\",\n    \"coarse\": \"high\",\n    \"score\": 0.9731,\n    \"thresholds\": null,\n    \"provenance\": {\n      \"c2pa\": null,\n      \"iptcDigitalSourceType\": null\n    },\n    \"metadata\": {\n      \"exifPresent\": false,\n      \"cameraMake\": null,\n      \"software\": null\n    },\n    \"detector\": {\n      \"model\": \"TrueEye\",\n      \"version\": \"2.3\",\n      \"cropScores\": null,\n      \"photoLike\": true,\n      \"mock\": false\n    },\n    \"autoCrop\": {\n      \"enabled\": true,\n      \"applied\": false,\n      \"box\": null,\n      \"imageWidth\": 2400,\n      \"imageHeight\": 1018\n    }\n  },\n  \"usage\": {\n    \"counted\": true,\n    \"cached\": false\n  },\n  \"latencyMs\": 2140,\n  \"share\": null\n}"
            },
            {
              "name": "200 · Still running",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Quota-Limit",
                  "value": "35"
                },
                {
                  "key": "X-Quota-Remaining",
                  "value": "23"
                },
                {
                  "key": "X-Quota-Reset",
                  "value": "2026-10-29T00:00:00.000Z"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"id\": \"6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"status\": \"running\",\n  \"source\": \"api\",\n  \"mode\": \"live\",\n  \"replayOf\": null,\n  \"model\": {\n    \"id\": \"trueeye-2.3\",\n    \"name\": \"TrueEye\",\n    \"version\": \"2.3\"\n  },\n  \"createdAt\": \"2026-10-28T09:12:47.210Z\",\n  \"completedAt\": null,\n  \"image\": {\n    \"sha256\": \"f750730fb99d9aaf619583559e175ec3069aceb2b10fc3d2565148ce28b6b596\",\n    \"width\": 2400,\n    \"height\": 1018,\n    \"mime\": \"image/jpeg\",\n    \"bytes\": 299028,\n    \"filename\": \"harbour.jpg\",\n    \"previewUrl\": \"https://perspicax.io/api/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/image?exp=1761643067&sig=Q2xlYXJseUlsbHVzdHJhdGl2ZQ\"\n  },\n  \"result\": null,\n  \"usage\": {\n    \"counted\": false,\n    \"cached\": false\n  },\n  \"latencyMs\": null,\n  \"share\": null\n}"
            },
            {
              "name": "400 · Not a scan id",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/validation_failed\",\n  \"title\": \"Invalid request\",\n  \"status\": 400,\n  \"detail\": \"Please check the id.\",\n  \"code\": \"validation_failed\",\n  \"instance\": \"/api/v1/scans/not-a-uuid\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "404 · not_found",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/not_found\",\n  \"title\": \"Not found\",\n  \"status\": 404,\n  \"detail\": \"Scan not found.\",\n  \"code\": \"not_found\",\n  \"instance\": \"/api/v1/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "401 · unauthorized",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"perspicax\", error=\"invalid_token\""
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/unauthorized\",\n  \"title\": \"Sign-in required\",\n  \"status\": 401,\n  \"detail\": \"A valid API key is required: Authorization: Bearer pcx_live_… or pcx_test_…\",\n  \"code\": \"unauthorized\",\n  \"instance\": \"/api/v1/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Sharing",
      "description": "Public result pages for scans.",
      "item": [
        {
          "name": "Share a scan",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/scans/:id/share",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "scans",
                ":id",
                "share"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "{{scanId}}",
                  "description": "The scan’s id (set by the last scan you created)."
                }
              ]
            },
            "description": "Makes the scan’s public result page, or returns the one it already has: each scan has one link. Anyone with the link sees the photo and the verdict, never the score, the file name or who shared it. A scan that failed and a development-mode answer cannot be shared.\n\n[Docs](https://perspicax.io/docs/api#share-scan)"
          },
          "response": [
            {
              "name": "201 · The public page",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id/share",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id",
                    "share"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"url\": \"https://perspicax.io/r/Xq7Lm2Pz9Rt4Vb6N\"\n}"
            },
            {
              "name": "200 · The public page",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id/share",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id",
                    "share"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"url\": \"https://perspicax.io/r/Xq7Lm2Pz9Rt4Vb6N\"\n}"
            },
            {
              "name": "400 · A scan that failed",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id/share",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id",
                    "share"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/validation_failed\",\n  \"title\": \"Invalid request\",\n  \"status\": 400,\n  \"detail\": \"This scan failed, so it has no result to share.\",\n  \"code\": \"validation_failed\",\n  \"instance\": \"/api/v1/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/share\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "400 · A development-mode answer",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id/share",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id",
                    "share"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/validation_failed\",\n  \"title\": \"Invalid request\",\n  \"status\": 400,\n  \"detail\": \"This is a development-mode answer: it repeats an earlier result and has no public page. Share the original scan, or use a live key.\",\n  \"code\": \"validation_failed\",\n  \"instance\": \"/api/v1/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/share\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "404 · not_found",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id/share",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id",
                    "share"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/not_found\",\n  \"title\": \"Not found\",\n  \"status\": 404,\n  \"detail\": \"Scan not found.\",\n  \"code\": \"not_found\",\n  \"instance\": \"/api/v1/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/share\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            }
          ]
        },
        {
          "name": "Stop sharing a scan",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/scans/:id/share",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "scans",
                ":id",
                "share"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "{{scanId}}",
                  "description": "The scan’s id (set by the last scan you created)."
                }
              ]
            },
            "description": "The public link answers `404` from now on. Also fine when the scan was not shared.\n\n[Docs](https://perspicax.io/docs/api#stop-sharing)"
          },
          "response": [
            {
              "name": "200 · Done",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id/share",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id",
                    "share"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"ok\": true\n}"
            },
            {
              "name": "400 · Not a scan id",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id/share",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id",
                    "share"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/validation_failed\",\n  \"title\": \"Invalid request\",\n  \"status\": 400,\n  \"detail\": \"Please check the id.\",\n  \"code\": \"validation_failed\",\n  \"instance\": \"/api/v1/scans/not-a-uuid/share\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "404 · not_found",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id/share",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id",
                    "share"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/not_found\",\n  \"title\": \"Not found\",\n  \"status\": 404,\n  \"detail\": \"Scan not found.\",\n  \"code\": \"not_found\",\n  \"instance\": \"/api/v1/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/share\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "401 · unauthorized",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/scans/:id/share",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "scans",
                    ":id",
                    "share"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "{{scanId}}",
                      "description": "The scan’s id (set by the last scan you created)."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"perspicax\", error=\"invalid_token\""
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/unauthorized\",\n  \"title\": \"Sign-in required\",\n  \"status\": 401,\n  \"detail\": \"A valid API key is required: Authorization: Bearer pcx_live_… or pcx_test_…\",\n  \"code\": \"unauthorized\",\n  \"instance\": \"/api/v1/scans/6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f/share\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Usage",
      "description": "Your workspace’s quota.",
      "item": [
        {
          "name": "Get usage",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "usage"
              ]
            },
            "description": "The workspace’s quota, the numbers the app shows: Free’s and Pro’s scans of the UTC day (Pro’s are shared with the app), or the Enterprise pool of the contract period. Any key can read it, in either mode, with the `X-Quota-*` headers. Development mode never uses this quota, and reading it uses none.\n\n[Docs](https://perspicax.io/docs/api#usage)"
          },
          "response": [
            {
              "name": "200 · A Pro workspace",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/usage",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "usage"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Quota-Limit",
                  "value": "35"
                },
                {
                  "key": "X-Quota-Remaining",
                  "value": "23"
                },
                {
                  "key": "X-Quota-Reset",
                  "value": "2026-10-29T00:00:00.000Z"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"plan\": \"pro\",\n  \"limit\": 35,\n  \"used\": 12,\n  \"remaining\": 23,\n  \"window\": \"day\",\n  \"resetsAt\": \"2026-10-29T00:00:00.000Z\",\n  \"needsSignup\": false,\n  \"needsUpgrade\": false,\n  \"overage\": null,\n  \"blocked\": null\n}"
            },
            {
              "name": "401 · unauthorized",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/usage",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "usage"
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"perspicax\", error=\"invalid_token\""
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/unauthorized\",\n  \"title\": \"Sign-in required\",\n  \"status\": 401,\n  \"detail\": \"A valid API key is required: Authorization: Bearer pcx_live_… or pcx_test_…\",\n  \"code\": \"unauthorized\",\n  \"instance\": \"/api/v1/usage\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "402 · upgrade_required",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/usage",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "usage"
                  ]
                }
              },
              "status": "Payment Required",
              "code": 402,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/upgrade_required\",\n  \"title\": \"Upgrade required\",\n  \"status\": 402,\n  \"detail\": \"Live keys use production mode, which comes with Pro and Enterprise. Upgrade to Pro, or use a test key (pcx_test_): development mode is free on every plan.\",\n  \"code\": \"upgrade_required\",\n  \"instance\": \"/api/v1/usage\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\",\n  \"suggestedPlan\": \"pro\",\n  \"docs\": \"https://perspicax.io/docs/api#production-mode\"\n}"
            },
            {
              "name": "403 · forbidden",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/usage",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "usage"
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/forbidden\",\n  \"title\": \"Forbidden\",\n  \"status\": 403,\n  \"detail\": \"The API is switched off for this workspace. Write to contact@perspicax.io to switch it back on.\",\n  \"code\": \"forbidden\",\n  \"instance\": \"/api/v1/usage\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Models",
      "description": "The detector models you can ask for.",
      "item": [
        {
          "name": "List models",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/models",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "models"
              ]
            },
            "description": "The detector models a scan can ask for with `model`. Without `model` you get the default, `trueeye-2.3`. A good first call to check your key.\n\n[Docs](https://perspicax.io/docs/api#models)"
          },
          "response": [
            {
              "name": "200 · Models",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/models",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "models"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"items\": [\n    {\n      \"id\": \"trueeye-2.3\",\n      \"name\": \"TrueEye 2.3\",\n      \"description\": \"Detects fully AI-generated, photo-like still images.\",\n      \"default\": true\n    }\n  ]\n}"
            },
            {
              "name": "401 · unauthorized",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/models",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "models"
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"perspicax\", error=\"invalid_token\""
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/unauthorized\",\n  \"title\": \"Sign-in required\",\n  \"status\": 401,\n  \"detail\": \"A valid API key is required: Authorization: Bearer pcx_live_… or pcx_test_…\",\n  \"code\": \"unauthorized\",\n  \"instance\": \"/api/v1/models\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            },
            {
              "name": "402 · upgrade_required",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/models",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "models"
                  ]
                }
              },
              "status": "Payment Required",
              "code": 402,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/upgrade_required\",\n  \"title\": \"Upgrade required\",\n  \"status\": 402,\n  \"detail\": \"Live keys use production mode, which comes with Pro and Enterprise. Upgrade to Pro, or use a test key (pcx_test_): development mode is free on every plan.\",\n  \"code\": \"upgrade_required\",\n  \"instance\": \"/api/v1/models\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\",\n  \"suggestedPlan\": \"pro\",\n  \"docs\": \"https://perspicax.io/docs/api#production-mode\"\n}"
            },
            {
              "name": "403 · forbidden",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/models",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "models"
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json; charset=utf-8"
                },
                {
                  "key": "RateLimit-Limit",
                  "value": "60"
                },
                {
                  "key": "RateLimit-Remaining",
                  "value": "57"
                },
                {
                  "key": "RateLimit-Reset",
                  "value": "41"
                },
                {
                  "key": "RateLimit-Policy",
                  "value": "60;w=60"
                },
                {
                  "key": "X-Request-Id",
                  "value": "b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                }
              ],
              "body": "{\n  \"type\": \"https://perspicax.io/problems/forbidden\",\n  \"title\": \"Forbidden\",\n  \"status\": 403,\n  \"detail\": \"The API is switched off for this workspace. Write to contact@perspicax.io to switch it back on.\",\n  \"code\": \"forbidden\",\n  \"instance\": \"/api/v1/models\",\n  \"requestId\": \"b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n}"
            }
          ]
        }
      ]
    }
  ]
}
