Contract Audit
curl --request GET \
--url https://demo.serialized.xyz/v1/audit/contract \
--header 'Authorization: <api-key>'import requests
url = "https://demo.serialized.xyz/v1/audit/contract"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://demo.serialized.xyz/v1/audit/contract', 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://demo.serialized.xyz/v1/audit/contract",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$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://demo.serialized.xyz/v1/audit/contract"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://demo.serialized.xyz/v1/audit/contract")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo.serialized.xyz/v1/audit/contract")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_bodyToken Security Audit
Contract Audit
Full Serialized Audit verdict for a token on EVM or Solana: safety verdict, vulnerabilities, ownership/renounce state, proxy detection, open-source status (on Solana: mint and freeze authorities, Token-2022 extensions). Synchronous: the reply always carries the verdict. An already-audited contract answers in milliseconds; a first-time audit holds until it completes.
GET
/
v1
/
audit
/
contract
Contract Audit
curl --request GET \
--url https://demo.serialized.xyz/v1/audit/contract \
--header 'Authorization: <api-key>'import requests
url = "https://demo.serialized.xyz/v1/audit/contract"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://demo.serialized.xyz/v1/audit/contract', 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://demo.serialized.xyz/v1/audit/contract",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$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://demo.serialized.xyz/v1/audit/contract"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://demo.serialized.xyz/v1/audit/contract")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo.serialized.xyz/v1/audit/contract")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_bodyGET /v1/audit/contract · 750 credits
Full Serialized Audit verdict for a token on EVM or Solana: safety verdict, vulnerabilities, ownership/renounce state, proxy detection, open-source status (on Solana: mint and freeze authorities, Token-2022 extensions). Synchronous: the reply always carries the verdict. An already-audited contract answers in milliseconds; a first-time audit holds until it completes.
The verdict sits under
data.audit: isSafe, isTokenSafe, isHookSafe, vulnerabilities[] (each with type, impact, mitigated, gateReason), sourceType, isProxy, implementationAddress, hookAddress, hookAudit, name, symbol, address, chain, createdAt, plus solanaState on Solana (the mint configuration the verdict reads, null on EVM). Billed once per served verdict. An EVM contract that has no liquidity pool yet answers 404; retry once it trades.Authorizations
Your raw API key (not needed on the demo server).
Query Parameters
Public chain id - evm:<id> or solana.
Token/contract address. On Solana, the token's base58 mint, case-sensitive: send it exactly as written.
Response
200
Standard { data, meta } envelope.