curl --request GET \
--url https://api.scanoss.com/v3/wfp/scan/{id}import requests
url = "https://api.scanoss.com/v3/wfp/scan/{id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.scanoss.com/v3/wfp/scan/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scanoss.com/v3/wfp/scan/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.scanoss.com/v3/wfp/scan/{id}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.scanoss.com/v3/wfp/scan/{id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scanoss.com/v3/wfp/scan/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"scan_id": "018f7b2c-9a3e-7d41-8b6a-2c1d4e5f6a7b",
"status": "uploading",
"received_bytes": 123,
"total_bytes": 123,
"upload_percent": 123,
"phase": "<string>",
"phase_done": 123,
"phase_total": 123,
"files_total": 123,
"result": {
"server": {
"api_version": "<string>",
"knowledge_base": {
"monthly_version": "<string>",
"daily_version": "<string>"
},
"hostname": "<string>",
"elapsed_ms": 123
},
"files": [
{
"path": "<string>",
"source_hash": "<string>",
"file_hash": "<string>",
"match_type": "file",
"matches": [
{
"url_hash": "<string>",
"confidence": "LOW",
"oss_file_path": "<string>",
"match_percentage": 123,
"input_line_ranges": [
{
"start_line": 123,
"end_line": 123
}
],
"oss_line_ranges": [
{
"start_line": 123,
"end_line": 123
}
]
}
]
}
],
"components": {}
},
"error": "<string>"
}{
"status": "error",
"error": {
"code": "SCAN_NOT_FOUND",
"message": "scan session not found"
},
"timestamp": "2026-05-19T11:39:56Z"
}{
"status": "error",
"error": {
"code": "SCAN_EXPIRED",
"message": "scan session expired"
},
"timestamp": "2026-05-19T11:39:56Z"
}Poll progress / result of an async (Mode A) batch scan
Report the state of an async session by scan_id (given as a path
segment). Reflects upload progress (uploading), then scan progress
(scanning), then the result (completed, with result). Terminal
engine failures are reported in-band as status: failed with an error
string — not as an HTTP error code. Only Mode A creates a session;
Mode B returns its result synchronously and has nothing to poll.
curl --request GET \
--url https://api.scanoss.com/v3/wfp/scan/{id}import requests
url = "https://api.scanoss.com/v3/wfp/scan/{id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.scanoss.com/v3/wfp/scan/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scanoss.com/v3/wfp/scan/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.scanoss.com/v3/wfp/scan/{id}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.scanoss.com/v3/wfp/scan/{id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scanoss.com/v3/wfp/scan/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"scan_id": "018f7b2c-9a3e-7d41-8b6a-2c1d4e5f6a7b",
"status": "uploading",
"received_bytes": 123,
"total_bytes": 123,
"upload_percent": 123,
"phase": "<string>",
"phase_done": 123,
"phase_total": 123,
"files_total": 123,
"result": {
"server": {
"api_version": "<string>",
"knowledge_base": {
"monthly_version": "<string>",
"daily_version": "<string>"
},
"hostname": "<string>",
"elapsed_ms": 123
},
"files": [
{
"path": "<string>",
"source_hash": "<string>",
"file_hash": "<string>",
"match_type": "file",
"matches": [
{
"url_hash": "<string>",
"confidence": "LOW",
"oss_file_path": "<string>",
"match_percentage": 123,
"input_line_ranges": [
{
"start_line": 123,
"end_line": 123
}
],
"oss_line_ranges": [
{
"start_line": 123,
"end_line": 123
}
]
}
]
}
],
"components": {}
},
"error": "<string>"
}{
"status": "error",
"error": {
"code": "SCAN_NOT_FOUND",
"message": "scan session not found"
},
"timestamp": "2026-05-19T11:39:56Z"
}{
"status": "error",
"error": {
"code": "SCAN_EXPIRED",
"message": "scan session expired"
},
"timestamp": "2026-05-19T11:39:56Z"
}Path Parameters
The scan_id returned by the Mode A POST /v3/wfp/scan.
Response
Current session state (and result once completed).
Unified status envelope returned by POST /v3/wfp/scan (both modes) and GET /v3/wfp/scan/{id}. Mode B returns it synchronously already at status: completed; Mode A returns it per block (uploading) and on each poll. Zero-valued fields are omitted, so an uploading session carries no scan counters and a running scan carries no result.
Canonical lowercase UUIDv7 session id. In Mode A this is the client-supplied id; in Mode B it is a server-generated id for traceability only (no session is created).
"018f7b2c-9a3e-7d41-8b6a-2c1d4e5f6a7b"
uploading, queued, scanning, completed, failed, expired Bytes received so far (Mode A upload; omitted when 0).
Declared total upload size (Mode A; omitted when 0).
Exact upload progress percent (Mode A; omitted when 0).
Current pipeline pass while scanning, e.g. 'Pass 1: scan files'.
Items processed in the current phase.
Total items in the current phase.
File count of the report, filled in on completion.
Populated only when status is completed. The batchScanner report — byte-identical whether obtained synchronously (Mode B) or by polling an async session to completion (Mode A).
Show child attributes
Show child attributes
Populated only when status is failed.