curl --request GET \
--url https://api.scanoss.com/v3/components/releasesimport requests
url = "https://api.scanoss.com/v3/components/releases"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.scanoss.com/v3/components/releases', 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/components/releases",
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/components/releases"
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/components/releases")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scanoss.com/v3/components/releases")
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{
"component": {
"purl": "pkg:github/1210395/salahmobile",
"requirement": "^1.0.0",
"version": "v1.2.9",
"info_code": "REQUIREMENT_NOT_MET",
"info_message": "<string>"
},
"releases": [
{
"version": "v1.2.9",
"date": "2024-05-01",
"url": "https://github.com/.../releases/download/v1.2.9/...",
"release_notes": "Fixed: Subscription endpoint now public..."
}
],
"status": {
"status": "SUCCESS",
"message": "<string>"
}
}{
"status": "error",
"error": {
"code": "INVALID_QUERY",
"message": "purl query parameter is required"
},
"timestamp": "2026-05-19T11:39:56Z"
}{
"status": "error",
"error": {
"code": "COMPONENT_NOT_FOUND",
"message": "component not found"
},
"timestamp": "2026-05-19T11:39:56Z"
}{
"status": "error",
"error": {
"code": "INTERNAL_ERROR",
"message": "..."
},
"timestamp": "2026-05-19T11:39:56Z"
}{
"status": "error",
"error": {
"code": "TIMEOUT",
"message": "request timed out"
},
"timestamp": "2026-05-19T11:39:56Z"
}Release notes / changelog for a component
With no requirement, lists every version that has release notes, newest-first and paginated. With a requirement (an exact version or a semver range, interpreted the same way as the other component endpoints), returns the notes of the matching version(s). When the requirement matches version(s) that have no notes row, the response is 200 with an empty releases list and component.info_code = RELEASE_NOTES_UNAVAILABLE.
curl --request GET \
--url https://api.scanoss.com/v3/components/releasesimport requests
url = "https://api.scanoss.com/v3/components/releases"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.scanoss.com/v3/components/releases', 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/components/releases",
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/components/releases"
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/components/releases")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scanoss.com/v3/components/releases")
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{
"component": {
"purl": "pkg:github/1210395/salahmobile",
"requirement": "^1.0.0",
"version": "v1.2.9",
"info_code": "REQUIREMENT_NOT_MET",
"info_message": "<string>"
},
"releases": [
{
"version": "v1.2.9",
"date": "2024-05-01",
"url": "https://github.com/.../releases/download/v1.2.9/...",
"release_notes": "Fixed: Subscription endpoint now public..."
}
],
"status": {
"status": "SUCCESS",
"message": "<string>"
}
}{
"status": "error",
"error": {
"code": "INVALID_QUERY",
"message": "purl query parameter is required"
},
"timestamp": "2026-05-19T11:39:56Z"
}{
"status": "error",
"error": {
"code": "COMPONENT_NOT_FOUND",
"message": "component not found"
},
"timestamp": "2026-05-19T11:39:56Z"
}{
"status": "error",
"error": {
"code": "INTERNAL_ERROR",
"message": "..."
},
"timestamp": "2026-05-19T11:39:56Z"
}{
"status": "error",
"error": {
"code": "TIMEOUT",
"message": "request timed out"
},
"timestamp": "2026-05-19T11:39:56Z"
}Query Parameters
Package URL (e.g. pkg:github/scanoss/engine)
Optional version requirement (e.g. v5.4.5)
Enable the source-purl fallback lookup.
Output encoding for content string values (none default, url_encoded, base64_encoded); control fields and object keys are never encoded.
none, url_encoded, base64_encoded x >= 1x >= 0Response
Component block plus its matching releases (newest-first). When the purl has no notes and show_related_results is set, the releases may come from the component's linked source purl, flagged with component.info_code = WARNING.