# Scanner Jobs

Configure ongoing website monitoring jobs and inspect their latest run history.

## List scanner jobs

> Return the scanner jobs owned by the authenticated tenant, including their most recent run when available.

```json
{"openapi":"3.1.0","info":{"title":"Protege External Review API","version":"1.0.1"},"tags":[{"name":"Scanner Jobs","description":"Configure ongoing website monitoring jobs and inspect their latest run history."}],"servers":[{"url":"https://sandbox.tryprotege.com","description":"Sandbox environment for partner integration and testing."}],"security":[{"bearerApiKey":[]}],"components":{"securitySchemes":{"bearerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Supply the Protege external API key in the `Authorization` header using the format `Bearer <api_key>`.\n"}},"schemas":{"ScannerJobListResponse":{"description":"Paginated collection of scanner jobs.","type":"object","required":["scannerJobs","page"],"properties":{"scannerJobs":{"type":"array","items":{"$ref":"#/components/schemas/ScannerJob"}},"page":{"$ref":"#/components/schemas/PageMetadata"}}},"ScannerJob":{"description":"Scanner job summary returned by list and create operations.","type":"object","required":["id","urls"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"oneOf":[{"type":"string"},{"type":"null"}]},"urls":{"type":"array","items":{"type":"string","format":"uri"}},"scheduler":{"oneOf":[{"type":"string"},{"type":"null"}]},"brand":{"oneOf":[{"$ref":"#/components/schemas/ScannerJobBrand"},{"type":"null"}]},"documentEvaluationType":{"$ref":"#/components/schemas/ScannerJobDocumentEvaluationType"},"lastRun":{"oneOf":[{"$ref":"#/components/schemas/ScannerJobRunSummary"},{"type":"null"}]}}},"ScannerJobBrand":{"description":"Brand assigned to a scanner job.","type":"object","required":["id","name"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"ScannerJobDocumentEvaluationType":{"description":"Review configuration applied to content discovered by the scanner job.","type":"object","required":["id","name"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"ScannerJobRunSummary":{"description":"High-level status for a single execution of a scanner job.","type":"object","required":["id","status","scheduledTime","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["CREATED","RUNNING","FINISHED","FAILED"]},"scheduledTime":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"PageMetadata":{"description":"Standard offset-based pagination metadata.","type":"object","required":["limit","offset","count","total"],"properties":{"limit":{"type":"integer","default":25},"offset":{"type":"integer","default":0},"count":{"type":"integer"},"total":{"type":"integer"}}},"ErrorResponse":{"description":"Standard error envelope returned when a request cannot be fulfilled.","type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable explanation of the failure."}}},"RateLimitError":{"description":"Returned when the client has exceeded the allowed request rate.","type":"object","required":["error","retryAfter"],"properties":{"error":{"type":"string","description":"Human-readable description of the rate-limit violation."},"retryAfter":{"type":"integer","description":"Number of seconds the client should wait before retrying."}}}}},"paths":{"/api/v1/scanner-jobs":{"get":{"summary":"List scanner jobs","description":"Return the scanner jobs owned by the authenticated tenant, including their most recent run when available.","operationId":"listScannerJobs","tags":["Scanner Jobs"],"parameters":[{"name":"id","in":"query","description":"Filter by a specific scanner job identifier.","schema":{"type":"string","format":"uuid"}},{"name":"brandId","in":"query","description":"Filter jobs assigned to a specific brand.","schema":{"type":"string","format":"uuid"}},{"name":"search","in":"query","description":"Case-insensitive search against scanner job names.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of records to return per page.","schema":{"type":"integer","minimum":1,"default":25}},{"name":"offset","in":"query","description":"Number of records to skip before starting the page.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortBy","in":"query","description":"Field used to sort the result set.","schema":{"type":"string","enum":["createdAt","name"]}},{"name":"sortOrder","in":"query","description":"Sort direction for the selected sort field.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Scanner jobs returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScannerJobListResponse"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Number of seconds to wait before retrying."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}}}}
```

## Create a content scanner job

> Create a new website monitoring job that crawls the provided URLs and evaluates discovered content using the selected document evaluation type. The crawl engine is selected automatically based on the evaluation type's useCase.

```json
{"openapi":"3.1.0","info":{"title":"Protege External Review API","version":"1.0.1"},"tags":[{"name":"Scanner Jobs","description":"Configure ongoing website monitoring jobs and inspect their latest run history."}],"servers":[{"url":"https://sandbox.tryprotege.com","description":"Sandbox environment for partner integration and testing."}],"security":[{"bearerApiKey":[]}],"components":{"securitySchemes":{"bearerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Supply the Protege external API key in the `Authorization` header using the format `Bearer <api_key>`.\n"}},"schemas":{"ScannerJobCreateRequest":{"description":"Request body used to create a new scanner job.","type":"object","required":["name","documentEvaluationTypeId","urls"],"properties":{"name":{"type":"string"},"documentEvaluationTypeId":{"type":"string","format":"uuid"},"urls":{"type":"array","items":{"type":"string","format":"uri"}},"scheduler":{"type":"string"},"maxPages":{"type":"integer"},"maxDepth":{"type":"integer"},"maxTrackedPages":{"type":"integer","minimum":1},"newPagesForSuccessiveScans":{"type":"integer","minimum":0},"brandId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"showAllFeedbackInDecisionStore":{"type":"boolean"},"translationEnabled":{"type":"boolean"},"useSitemaps":{"type":"boolean"},"archiveMode":{"oneOf":[{"type":"string","enum":["ON_FOR_ALL","ON_FOR_BRAND_MENTIONED"]},{"type":"null"}]}}},"ScannerJobCreateResponse":{"description":"Wrapper returned after a scanner job is created successfully.","type":"object","required":["scannerJob"],"properties":{"scannerJob":{"$ref":"#/components/schemas/ScannerJob"}}},"ScannerJob":{"description":"Scanner job summary returned by list and create operations.","type":"object","required":["id","urls"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"oneOf":[{"type":"string"},{"type":"null"}]},"urls":{"type":"array","items":{"type":"string","format":"uri"}},"scheduler":{"oneOf":[{"type":"string"},{"type":"null"}]},"brand":{"oneOf":[{"$ref":"#/components/schemas/ScannerJobBrand"},{"type":"null"}]},"documentEvaluationType":{"$ref":"#/components/schemas/ScannerJobDocumentEvaluationType"},"lastRun":{"oneOf":[{"$ref":"#/components/schemas/ScannerJobRunSummary"},{"type":"null"}]}}},"ScannerJobBrand":{"description":"Brand assigned to a scanner job.","type":"object","required":["id","name"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"ScannerJobDocumentEvaluationType":{"description":"Review configuration applied to content discovered by the scanner job.","type":"object","required":["id","name"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"ScannerJobRunSummary":{"description":"High-level status for a single execution of a scanner job.","type":"object","required":["id","status","scheduledTime","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["CREATED","RUNNING","FINISHED","FAILED"]},"scheduledTime":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"ErrorResponse":{"description":"Standard error envelope returned when a request cannot be fulfilled.","type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable explanation of the failure."}}},"RateLimitError":{"description":"Returned when the client has exceeded the allowed request rate.","type":"object","required":["error","retryAfter"],"properties":{"error":{"type":"string","description":"Human-readable description of the rate-limit violation."},"retryAfter":{"type":"integer","description":"Number of seconds the client should wait before retrying."}}}}},"paths":{"/api/v1/scanner-jobs":{"post":{"summary":"Create a content scanner job","description":"Create a new website monitoring job that crawls the provided URLs and evaluates discovered content using the selected document evaluation type. The crawl engine is selected automatically based on the evaluation type's useCase.","operationId":"createScannerJob","tags":["Scanner Jobs"],"requestBody":{"required":true,"description":"Scanner job configuration, including crawl targets, schedule, and review settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScannerJobCreateRequest"}}}},"responses":{"201":{"description":"Scanner job created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScannerJobCreateResponse"}}}},"400":{"description":"Invalid request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Related evaluation type or brand not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Number of seconds to wait before retrying."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}}}}
```

## Get a scanner job

> Retrieve the full configuration and latest run summary for a single scanner job.

```json
{"openapi":"3.1.0","info":{"title":"Protege External Review API","version":"1.0.1"},"tags":[{"name":"Scanner Jobs","description":"Configure ongoing website monitoring jobs and inspect their latest run history."}],"servers":[{"url":"https://sandbox.tryprotege.com","description":"Sandbox environment for partner integration and testing."}],"security":[{"bearerApiKey":[]}],"components":{"securitySchemes":{"bearerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Supply the Protege external API key in the `Authorization` header using the format `Bearer <api_key>`.\n"}},"schemas":{"ScannerJobDetailResponse":{"description":"Wrapper containing a single scanner job record.","type":"object","required":["scannerJob"],"properties":{"scannerJob":{"$ref":"#/components/schemas/ScannerJobDetail"}}},"ScannerJobDetail":{"description":"Full scanner job configuration, including crawl and archival options.","allOf":[{"$ref":"#/components/schemas/ScannerJob"},{"type":"object","required":["showAllFeedbackInDecisionStore","translationEnabled"],"properties":{"maxPages":{"oneOf":[{"type":"integer"},{"type":"null"}]},"maxDepth":{"oneOf":[{"type":"integer"},{"type":"null"}]},"maxTrackedPages":{"oneOf":[{"type":"integer"},{"type":"null"}]},"newPagesForSuccessiveScans":{"oneOf":[{"type":"integer"},{"type":"null"}]},"showAllFeedbackInDecisionStore":{"type":"boolean"},"translationEnabled":{"type":"boolean"},"useSitemaps":{"oneOf":[{"type":"boolean"},{"type":"null"}]},"archiveMode":{"oneOf":[{"type":"string","enum":["ON_FOR_ALL","ON_FOR_BRAND_MENTIONED"]},{"type":"null"}]}}}]},"ScannerJob":{"description":"Scanner job summary returned by list and create operations.","type":"object","required":["id","urls"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"oneOf":[{"type":"string"},{"type":"null"}]},"urls":{"type":"array","items":{"type":"string","format":"uri"}},"scheduler":{"oneOf":[{"type":"string"},{"type":"null"}]},"brand":{"oneOf":[{"$ref":"#/components/schemas/ScannerJobBrand"},{"type":"null"}]},"documentEvaluationType":{"$ref":"#/components/schemas/ScannerJobDocumentEvaluationType"},"lastRun":{"oneOf":[{"$ref":"#/components/schemas/ScannerJobRunSummary"},{"type":"null"}]}}},"ScannerJobBrand":{"description":"Brand assigned to a scanner job.","type":"object","required":["id","name"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"ScannerJobDocumentEvaluationType":{"description":"Review configuration applied to content discovered by the scanner job.","type":"object","required":["id","name"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"ScannerJobRunSummary":{"description":"High-level status for a single execution of a scanner job.","type":"object","required":["id","status","scheduledTime","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["CREATED","RUNNING","FINISHED","FAILED"]},"scheduledTime":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"ErrorResponse":{"description":"Standard error envelope returned when a request cannot be fulfilled.","type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable explanation of the failure."}}},"RateLimitError":{"description":"Returned when the client has exceeded the allowed request rate.","type":"object","required":["error","retryAfter"],"properties":{"error":{"type":"string","description":"Human-readable description of the rate-limit violation."},"retryAfter":{"type":"integer","description":"Number of seconds the client should wait before retrying."}}}}},"paths":{"/api/v1/scanner-jobs/{scannerJobId}":{"get":{"summary":"Get a scanner job","description":"Retrieve the full configuration and latest run summary for a single scanner job.","operationId":"getScannerJob","tags":["Scanner Jobs"],"parameters":[{"name":"scannerJobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Scanner job returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScannerJobDetailResponse"}}}},"400":{"description":"Missing or invalid scanner job id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Scanner job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Number of seconds to wait before retrying."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}}}}
```

## Delete a scanner job

> Permanently delete a scanner job so it no longer runs or appears in list results.

```json
{"openapi":"3.1.0","info":{"title":"Protege External Review API","version":"1.0.1"},"tags":[{"name":"Scanner Jobs","description":"Configure ongoing website monitoring jobs and inspect their latest run history."}],"servers":[{"url":"https://sandbox.tryprotege.com","description":"Sandbox environment for partner integration and testing."}],"security":[{"bearerApiKey":[]}],"components":{"securitySchemes":{"bearerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Supply the Protege external API key in the `Authorization` header using the format `Bearer <api_key>`.\n"}},"schemas":{"ErrorResponse":{"description":"Standard error envelope returned when a request cannot be fulfilled.","type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable explanation of the failure."}}},"RateLimitError":{"description":"Returned when the client has exceeded the allowed request rate.","type":"object","required":["error","retryAfter"],"properties":{"error":{"type":"string","description":"Human-readable description of the rate-limit violation."},"retryAfter":{"type":"integer","description":"Number of seconds the client should wait before retrying."}}}}},"paths":{"/api/v1/scanner-jobs/{scannerJobId}":{"delete":{"summary":"Delete a scanner job","description":"Permanently delete a scanner job so it no longer runs or appears in list results.","operationId":"deleteScannerJob","tags":["Scanner Jobs"],"parameters":[{"name":"scannerJobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Scanner job deleted"},"400":{"description":"Missing or invalid scanner job id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Scanner job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Number of seconds to wait before retrying."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}}}}
```

## Update a scanner job

> Partially update an existing scanner job. Only the fields supplied in the request body are modified.

```json
{"openapi":"3.1.0","info":{"title":"Protege External Review API","version":"1.0.1"},"tags":[{"name":"Scanner Jobs","description":"Configure ongoing website monitoring jobs and inspect their latest run history."}],"servers":[{"url":"https://sandbox.tryprotege.com","description":"Sandbox environment for partner integration and testing."}],"security":[{"bearerApiKey":[]}],"components":{"securitySchemes":{"bearerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Supply the Protege external API key in the `Authorization` header using the format `Bearer <api_key>`.\n"}},"schemas":{"ScannerJobUpdateRequest":{"description":"Partial update payload for a scanner job. Include only the fields you want to change.","type":"object","minProperties":1,"properties":{"name":{"type":"string"},"urls":{"type":"array","minItems":1,"items":{"type":"string","format":"uri"}},"scheduler":{"oneOf":[{"type":"string"},{"type":"null"}]},"documentEvaluationTypeId":{"type":"string","format":"uuid"},"brandId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"maxPages":{"type":"integer"},"maxDepth":{"type":"integer"},"maxTrackedPages":{"type":"integer","minimum":1},"newPagesForSuccessiveScans":{"type":"integer","minimum":0},"showAllFeedbackInDecisionStore":{"type":"boolean"},"translationEnabled":{"type":"boolean"},"useSitemaps":{"type":"boolean"},"archiveMode":{"oneOf":[{"type":"string","enum":["ON_FOR_ALL","ON_FOR_BRAND_MENTIONED"]},{"type":"null"}]}}},"ScannerJobDetailResponse":{"description":"Wrapper containing a single scanner job record.","type":"object","required":["scannerJob"],"properties":{"scannerJob":{"$ref":"#/components/schemas/ScannerJobDetail"}}},"ScannerJobDetail":{"description":"Full scanner job configuration, including crawl and archival options.","allOf":[{"$ref":"#/components/schemas/ScannerJob"},{"type":"object","required":["showAllFeedbackInDecisionStore","translationEnabled"],"properties":{"maxPages":{"oneOf":[{"type":"integer"},{"type":"null"}]},"maxDepth":{"oneOf":[{"type":"integer"},{"type":"null"}]},"maxTrackedPages":{"oneOf":[{"type":"integer"},{"type":"null"}]},"newPagesForSuccessiveScans":{"oneOf":[{"type":"integer"},{"type":"null"}]},"showAllFeedbackInDecisionStore":{"type":"boolean"},"translationEnabled":{"type":"boolean"},"useSitemaps":{"oneOf":[{"type":"boolean"},{"type":"null"}]},"archiveMode":{"oneOf":[{"type":"string","enum":["ON_FOR_ALL","ON_FOR_BRAND_MENTIONED"]},{"type":"null"}]}}}]},"ScannerJob":{"description":"Scanner job summary returned by list and create operations.","type":"object","required":["id","urls"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"oneOf":[{"type":"string"},{"type":"null"}]},"urls":{"type":"array","items":{"type":"string","format":"uri"}},"scheduler":{"oneOf":[{"type":"string"},{"type":"null"}]},"brand":{"oneOf":[{"$ref":"#/components/schemas/ScannerJobBrand"},{"type":"null"}]},"documentEvaluationType":{"$ref":"#/components/schemas/ScannerJobDocumentEvaluationType"},"lastRun":{"oneOf":[{"$ref":"#/components/schemas/ScannerJobRunSummary"},{"type":"null"}]}}},"ScannerJobBrand":{"description":"Brand assigned to a scanner job.","type":"object","required":["id","name"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"ScannerJobDocumentEvaluationType":{"description":"Review configuration applied to content discovered by the scanner job.","type":"object","required":["id","name"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"ScannerJobRunSummary":{"description":"High-level status for a single execution of a scanner job.","type":"object","required":["id","status","scheduledTime","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["CREATED","RUNNING","FINISHED","FAILED"]},"scheduledTime":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"ErrorResponse":{"description":"Standard error envelope returned when a request cannot be fulfilled.","type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable explanation of the failure."}}},"RateLimitError":{"description":"Returned when the client has exceeded the allowed request rate.","type":"object","required":["error","retryAfter"],"properties":{"error":{"type":"string","description":"Human-readable description of the rate-limit violation."},"retryAfter":{"type":"integer","description":"Number of seconds the client should wait before retrying."}}}}},"paths":{"/api/v1/scanner-jobs/{scannerJobId}":{"patch":{"summary":"Update a scanner job","description":"Partially update an existing scanner job. Only the fields supplied in the request body are modified.","operationId":"updateScannerJob","tags":["Scanner Jobs"],"parameters":[{"name":"scannerJobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"description":"Partial scanner job update payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScannerJobUpdateRequest"}}}},"responses":{"200":{"description":"Scanner job updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScannerJobDetailResponse"}}}},"400":{"description":"Invalid scanner job id or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Scanner job or related brand/evaluation type not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Number of seconds to wait before retrying."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}}}}
```

## List scanner job runs

> Return historical executions for a scanner job, ordered by most recent first.

```json
{"openapi":"3.1.0","info":{"title":"Protege External Review API","version":"1.0.1"},"tags":[{"name":"Scanner Jobs","description":"Configure ongoing website monitoring jobs and inspect their latest run history."}],"servers":[{"url":"https://sandbox.tryprotege.com","description":"Sandbox environment for partner integration and testing."}],"security":[{"bearerApiKey":[]}],"components":{"securitySchemes":{"bearerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Supply the Protege external API key in the `Authorization` header using the format `Bearer <api_key>`.\n"}},"schemas":{"ScannerJobRunsResponse":{"description":"Paginated collection of historical runs for a scanner job.","type":"object","required":["scannerRuns","page"],"properties":{"scannerRuns":{"type":"array","items":{"$ref":"#/components/schemas/ScannerJobRun"}},"page":{"$ref":"#/components/schemas/PageMetadata"}}},"ScannerJobRun":{"description":"Detailed execution metadata for a scanner job run.","allOf":[{"$ref":"#/components/schemas/ScannerJobRunSummary"},{"type":"object","required":["updatedAt"],"properties":{"updatedAt":{"type":"string","format":"date-time"}}}]},"ScannerJobRunSummary":{"description":"High-level status for a single execution of a scanner job.","type":"object","required":["id","status","scheduledTime","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["CREATED","RUNNING","FINISHED","FAILED"]},"scheduledTime":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"PageMetadata":{"description":"Standard offset-based pagination metadata.","type":"object","required":["limit","offset","count","total"],"properties":{"limit":{"type":"integer","default":25},"offset":{"type":"integer","default":0},"count":{"type":"integer"},"total":{"type":"integer"}}},"ErrorResponse":{"description":"Standard error envelope returned when a request cannot be fulfilled.","type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable explanation of the failure."}}},"RateLimitError":{"description":"Returned when the client has exceeded the allowed request rate.","type":"object","required":["error","retryAfter"],"properties":{"error":{"type":"string","description":"Human-readable description of the rate-limit violation."},"retryAfter":{"type":"integer","description":"Number of seconds the client should wait before retrying."}}}}},"paths":{"/api/v1/scanner-jobs/{scannerJobId}/runs":{"get":{"summary":"List scanner job runs","description":"Return historical executions for a scanner job, ordered by most recent first.","operationId":"listScannerJobRuns","tags":["Scanner Jobs"],"parameters":[{"name":"scannerJobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","description":"Maximum number of records to return per page.","schema":{"type":"integer","minimum":1,"default":25}},{"name":"offset","in":"query","description":"Number of records to skip before starting the page.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Scanner job runs returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScannerJobRunsResponse"}}}},"400":{"description":"Missing or invalid scanner job id or query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Scanner job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Number of seconds to wait before retrying."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gitbook.tryprotege.com/review/getting-started/api-reference/scanner-jobs.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
