cURL JavaScript Node.JS C# Java Go Python Ruby PHP Powershell

Introduction

Verisys Antivirus API provides authorised API consumers with the ability to scan files for malware and NSFW (Not Safe for Work) content. REST API endpoints are provided for performing both synchronous and asynchronous scans.

You can find the OpenAPI Specification for our API here. The spec can be used to auto-generate API clients for many popular programming languages.

 
_  _ ____ ____ _ ____ _   _ ____
|  | |___ |__/ | [__   \_/  [__ 
 \/  |___ |  \ | ___]   |   ___]
Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

Endpoints

Multiple base URLs are available, segregated by geographic region. For compliance purposes, data sent to a specific region never leaves that region.

Note that URLs must include the API version, with the latest version currently at v1

Base URL Region
https://gb1.api.av.ionxsolutions.com/v1 UK
https://eu1.api.av.ionxsolutions.com/v1 EU
https://us1.api.av.ionxsolutions.com/v1 USA

Authentication

API keys are used to authenticate requests. When subscribing to Verisys Antivirus API, we create a default API key for you, and you can create amd manage additional API keys at the Verisys Licensing & Support site.

For example, to call the `/v1/ping` test endpoint
curl --header 'X-Api-Key: API_KEY' https://gb1.api.av.ionxsolutions.com/v1/ping
fetch("https://gb1.api.av.ionxsolutions.com/v1/ping", {
  "method": "GET",
  "headers": {
    "X-API-Key": "API_KEY"
  }
});
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "path": "/v1/ping",
  "headers": {
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) { });
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/ping"),
    Headers =
    {
        { "X-API-Key", "API_KEY" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/ping")
  .get()
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    url := "https://gb1.api.av.ionxsolutions.com/v1/ping"

    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)
    if err != nil {
      fmt.Println("HTTP call failed:", err)
    }

    defer res.Body.Close()
}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/ping"

response = requests.request("GET", url, headers={
    "X-API-Key": "API_KEY"
})
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/ping")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Get.new(url)
request["X-API-Key"] = 'API_KEY'

response = http.request(request)
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/ping",
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
}
$headers=@{}
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/ping' -Method GET -Headers $headers

A valid API key must be sent in an X-API-Key HTTP header with every request.

Rate Limits

To ensure sufficient capacity for all API consumers, we use request rate limiting, on a per-API key basis.

The API returns HTTP code 429 when it receives too many requests, and also returns a Retry-After header, which contains the minimum number of seconds that must be waited before the API can handle another request.

For API requests that are not rate limited, the response includes headers that indicate the current state of your rate limit quota:

Header Value
X-Rate-Limit-Limit Rate limit ceiling that is applicable for the current request, e.g. 1m ("1 minute")
X-Rate-Limit-Remaining Number of requests left for the current rate-limit window, e.g. 9
X-Rate-Limit-Reset The time at which the rate limit resets, specified as an ISO 8601 timestamp

If you are having difficulties with limits, please feel free to contact us.

File Limits

The maximum permitted file sizes are shown below.

Scan Type Scan Method Maximum File Size
Malware Sync 100MB
Malware Async 250MB
NSFW Image Async 8MB
NSFW Image Async 16MB

NSFW Image scanning APIs support the following image formats:

Format Permitted File Extensions
JPEG .jpg, .jpeg
PNG .png
GIF* .gif
WebP .webp

Credits

Each plan comes with a set number of credits, and 1 credit is consumed when you make a request to an API endpoint that requests file scanning:

Every API response includes headers containing information about your remaining credits:

Header Value
X-API-Credit-Limit Total number of credits that were allocated for your current billing cycle, e.g. 10000
X-API-Credit-Remaining Number of credits remaining in your current billing cycle, e.g. 5000

If you need more credits, you can upgrade your plan at any time, or purchase a credit addon that provides additional credits.

Versioning

This API uses versioning. A new API version is released whenever we introduce any backwards-incompatible changes to the API, such as changing a parameter name or type, or deprecating an endpoint. Previous versions will remain functional, but will be considered deprecated, and it is therefore strongly recommended to always use the latest version. When making an API request, the desired version must be used to prefix the endpoint path, for example to call v1 of the ping endpoint: https://gb1.api.av.ionxsolutions.com/v1/ping

Data Retention

Data sent to the API for Malware/NSFW scanning is only kept for the short time it takes to perform the scan, and is then immediately and permanently deleted. Data is not shared with any third parties.

Validation

API endpoints perform validation on all input. Any request that fails validation will result in an error response with HTTP status code 422. The response body will be a ValidationProblemDetails that contains details of all validation errors.

Validation Errors Example

{
    "type": "https://ionxsolutions.com/schema/rest/model-validation-error",
    "title": "One or more validation errors occurred.",
    "status": 422,
    "traceId": "00-dbb62d1d43e81d9af3952ec39bdec4e0-6aa0ae188e8e1154-01",
    "errors": {
        "file_url": [
            "Invalid format for file_url"
        ],
        "file_name": [
            "file_name must not be empty"
        ]
    }
}

Errors

Verisys Antivirus API uses standard HTTP response codes to indicate the success or failure of an API request. In case of an error, the response body will be a ProblemDetails that contains additional information about the error.

Error Code Meaning
401 Unauthorized; API key may be missing or invalid, or your subscription may have expired. Ensure your API key is passed via the X-Api-Key header
403 Forbidden; insufficient credit quota remaining
404 Not Found; resource not found
422 Unprocessable Content; unable to validate your request, see Validation
429 Too Many Requests; rate limit exceeded, see Rate Limits
500 Server Error; something is wrong at our end. Try again later or contact us: contact us

Webhooks

Verisys Antivirus API provides endpoints for performing both synchronous and asynchronous scans. When performing an asynchronous scan, there are two different means to later obtain the scan result:

  1. Polling: repeatedly calling a Fetch Scan Result endpoint (e.g. /v1/malware/{id}, /v1/nsfw/images/{id}) until the result is available
  2. Callback/webhook: we automatically contact one of your API endpoints when the result is available

If you provided a valid callback URL in your asynchronous scan request, when the scan result is available our system will automatically send a POST request to the specified URL with a ScanResult object as the payload.

Each webhook request will include an X-Api-Signature header, which contains an HMAC-256 signature computed over the payload. You can verify that webhook requests originated from the Verisys Antivirus API by computing the HMAC-256 signature and comparing it to the X-Api-Signature header. Each Verisys Antivirus API account uses a unique webhook secret for the HMAC key, which you can find at the Verisys Licensing & Support site.

Security & Privacy

All data in transit is secured by TLS.

Files submitted for scanning are stored in encrypted format (using AES-256), and are only kept for as long as is required to complete the scan - often as little as 1 second.

Files submitted to a particular region will never leave that region - your data will never traverse jurisdictions, allowing you to remain compliant.

Malware Scanning

Fetch Scan Result

Code samples
curl --request GET \
  --url https://gb1.api.av.ionxsolutions.com/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08 \
  --header 'Accept: application/json' \
  --header 'X-API-Key: API_KEY'
fetch("https://gb1.api.av.ionxsolutions.com/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08", {
  "method": "GET",
  "headers": {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "headers": {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08")
  .get()
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08"

    req, _ := http.NewRequest("GET", url, nil)

    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08"

headers = {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("GET", url, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Get.new(url)
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/malware/497f6eca-6276-4993-bfeb-53cbbbba6f08' -Method GET -Headers $headers
GET /v1/malware/{id}

Fetch the result of a previously submitted malware scan job

Parameters

Name In Type Required Description
id path string(uuid) true Identifier of the malware scan job to fetch results for

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "scan_type": "malware",
  "status": "pending",
  "content_name": "string",
  "content_length": 0,
  "signals": [
    "string"
  ],
  "metadata": {
    "property1": "string",
    "property2": "string"
  },
  "created_at": "2019-08-24T14:15:22Z",
  "completed_at": "2019-08-24T14:15:22Z"
}

Responses

Status Meaning Description Schema
200 OK Returns the result of a previously submitted malware scan job ScanResult
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Scan File

Code samples
curl --request POST \
  --url https://gb1.api.av.ionxsolutions.com/v1/malware/scan/file \
  --header 'Accept: application/json' \
  --header 'Content-Type: multipart/form-data; boundary=---011000010111000001101001' \
  --header 'X-API-Key: API_KEY' \
  --form file='@my-file.doc' \
  --form file_name=my-file.docx
const form = new FormData();
form.append("file", "");
form.append("file_name", "my-file.docx");

fetch("https://gb1.api.av.ionxsolutions.com/v1/malware/scan/file", {
  "method": "POST",
  "headers": {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/malware/scan/file",
  "headers": {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n");
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/malware/scan/file"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
    Content = new MultipartFormDataContent
    {
        new StreamContent(File.OpenRead("my-file.docx"))
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "file",
                }
            }
        },
        new StringContent("my-file.docx")
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "file_name",
                }
            }
        },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("multipart/form-data; boundary=---011000010111000001101001");
RequestBody body = RequestBody.create(mediaType, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n");
Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/malware/scan/file")
  .post(body)
  .addHeader("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/malware/scan/file"

    payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n")

    req, _ := http.NewRequest("POST", url, payload)

    req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/malware/scan/file"

payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n"
headers = {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/malware/scan/file")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n"

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/malware/scan/file",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "Content-Type: multipart/form-data; boundary=---011000010111000001101001",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/malware/scan/file' -Method POST -Headers $headers -ContentType 'multipart/form-data; boundary=---011000010111000001101001' -Body '-----011000010111000001101001
Content-Disposition: form-data; name="file"

-----011000010111000001101001
Content-Disposition: form-data; name="file_name"

my-file.docx
-----011000010111000001101001--
'
POST /v1/malware/scan/file

Scans a file for malware

Body parameters
file: binary
file_name: my-file.docx

Parameters

Name In Type Required Description
body body object false none
» file body file(binary) false none
» file_name body string false none

Example responses

201 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "scan_type": "malware",
  "status": "pending",
  "content_name": "string",
  "content_length": 0,
  "signals": [
    "string"
  ],
  "metadata": {
    "property1": "string",
    "property2": "string"
  },
  "created_at": "2019-08-24T14:15:22Z",
  "completed_at": "2019-08-24T14:15:22Z"
}

Responses

Status Meaning Description Schema
201 Created File has been scanned ScanResult
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Scan URL

Code samples
curl --request POST \
  --url https://gb1.api.av.ionxsolutions.com/v1/malware/scan/url \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: API_KEY' \
  --data '{"file_url":"https://www.example.com/my-file","file_name":"my-file.docx"}'
fetch("https://gb1.api.av.ionxsolutions.com/v1/malware/scan/url", {
  "method": "POST",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  },
  "body": "{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}"
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/malware/scan/url",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({file_url: 'https://www.example.com/my-file', file_name: 'my-file.docx'}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/malware/scan/url"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
    Content = new StringContent("{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}");
Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/malware/scan/url")
  .post(body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/malware/scan/url"

    payload := strings.NewReader("{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}")

    req, _ := http.NewRequest("POST", url, payload)

    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/malware/scan/url"

payload = {
    "file_url": "https://www.example.com/my-file",
    "file_name": "my-file.docx"
}
headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("POST", url, json=payload, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/malware/scan/url")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'
request.body = "{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}"

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/malware/scan/url",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "Content-Type: application/json",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/malware/scan/url' -Method POST -Headers $headers -ContentType 'application/json' -Body '{"file_url":"https://www.example.com/my-file","file_name":"my-file.docx"}'
POST /v1/malware/scan/url

Downloads and scans a file for malware

Body parameters
{
  "file_url": "https://www.example.com/my-file",
  "file_name": "my-file.docx"
}

Parameters

Name In Type Required Description
body body ScanUrlCommand false none

Example responses

201 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "scan_type": "malware",
  "status": "pending",
  "content_name": "string",
  "content_length": 0,
  "signals": [
    "string"
  ],
  "metadata": {
    "property1": "string",
    "property2": "string"
  },
  "created_at": "2019-08-24T14:15:22Z",
  "completed_at": "2019-08-24T14:15:22Z"
}

Responses

Status Meaning Description Schema
201 Created File has been scanned ScanResult
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Submit File

Code samples
curl --request POST \
  --url https://gb1.api.av.ionxsolutions.com/v1/malware/submit/file \
  --header 'Accept: application/json' \
  --header 'Content-Type: multipart/form-data; boundary=---011000010111000001101001' \
  --header 'X-API-Key: API_KEY' \
  --form file='@my-file.doc' \
  --form file_name=my-file.docx \
  --form callback_url=https://www.example.com/webhook
const form = new FormData();
form.append("file", "");
form.append("file_name", "my-file.docx");
form.append("callback_url", "https://www.example.com/webhook");

fetch("https://gb1.api.av.ionxsolutions.com/v1/malware/submit/file", {
  "method": "POST",
  "headers": {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/malware/submit/file",
  "headers": {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n");
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/malware/submit/file"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
    Content = new MultipartFormDataContent
    {
        new StreamContent(File.OpenRead("my-file.docx"))
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "file",
                }
            }
        },
        new StringContent("my-file.docx")
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "file_name",
                }
            }
        },
        new StringContent("https://www.example.com/webhook")
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "callback_url",
                }
            }
        },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("multipart/form-data; boundary=---011000010111000001101001");
RequestBody body = RequestBody.create(mediaType, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n");
Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/malware/submit/file")
  .post(body)
  .addHeader("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/malware/submit/file"

    payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n")

    req, _ := http.NewRequest("POST", url, payload)

    req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/malware/submit/file"

payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n"
headers = {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/malware/submit/file")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n"

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/malware/submit/file",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "Content-Type: multipart/form-data; boundary=---011000010111000001101001",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/malware/submit/file' -Method POST -Headers $headers -ContentType 'multipart/form-data; boundary=---011000010111000001101001' -Body '-----011000010111000001101001
Content-Disposition: form-data; name="file"

-----011000010111000001101001
Content-Disposition: form-data; name="file_name"

my-file.docx
-----011000010111000001101001
Content-Disposition: form-data; name="callback_url"

https://www.example.com/webhook
-----011000010111000001101001--
'
POST /v1/malware/submit/file

Submits a file for asynchronous malware scanning.

The result can be obtained at a later date by calling: GET /v1/malware/{id}

Alternatively, if a webhook callback URL is provided, the result will be sent automatically when ready.

Body parameters
file: binary
file_name: my-file.docx
callback_url: https://www.example.com/webhook

Parameters

Name In Type Required Description
body body object false none
» file body file(binary) false none
» file_name body string false none
» callback_url body string false none

Example responses

202 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Responses

Status Meaning Description Schema
201 Created Scan job submitted None
202 Accepted Accepted ScanReceipt
401 Unauthorized Invalid API key ProblemDetails
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Response Headers

Status Header Type Format Description
202 X-API-Result string Identifier of the newly created malware scan job

Submit URL

Code samples
curl --request POST \
  --url https://gb1.api.av.ionxsolutions.com/v1/malware/submit/url \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: API_KEY' \
  --data '{"file_name":"my-file.docx","file_url":"https://www.example.com/my-file","callback_url":"https://www.example.com/webhook"}'
fetch("https://gb1.api.av.ionxsolutions.com/v1/malware/submit/url", {
  "method": "POST",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  },
  "body": "{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}"
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/malware/submit/url",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({
  file_name: 'my-file.docx',
  file_url: 'https://www.example.com/my-file',
  callback_url: 'https://www.example.com/webhook'
}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/malware/submit/url"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
    Content = new StringContent("{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}");
Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/malware/submit/url")
  .post(body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/malware/submit/url"

    payload := strings.NewReader("{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}")

    req, _ := http.NewRequest("POST", url, payload)

    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/malware/submit/url"

payload = {
    "file_name": "my-file.docx",
    "file_url": "https://www.example.com/my-file",
    "callback_url": "https://www.example.com/webhook"
}
headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("POST", url, json=payload, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/malware/submit/url")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'
request.body = "{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}"

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/malware/submit/url",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "Content-Type: application/json",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/malware/submit/url' -Method POST -Headers $headers -ContentType 'application/json' -Body '{"file_name":"my-file.docx","file_url":"https://www.example.com/my-file","callback_url":"https://www.example.com/webhook"}'
POST /v1/malware/submit/url

Submits a URL for asynchronous malware scanning.

The result can be obtained at a later date by calling: GET /v1/malware/{id}

Alternatively, if a webhook callback URL is provided, the result will be sent automatically when ready

Body parameters
{
  "file_name": "my-file.docx",
  "file_url": "https://www.example.com/my-file",
  "callback_url": "https://www.example.com/webhook"
}

Parameters

Name In Type Required Description
body body SubmitUrlCommand false none

Example responses

202 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Responses

Status Meaning Description Schema
201 Created Scan job submitted None
202 Accepted Accepted ScanReceipt
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Response Headers

Status Header Type Format Description
202 X-API-Result string Identifier of the newly created malware scan job

NSFW Image Scanning

Fetch Scan Result

Code samples
curl --request GET \
  --url https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08 \
  --header 'Accept: application/json' \
  --header 'X-API-Key: API_KEY'
fetch("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08", {
  "method": "GET",
  "headers": {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "headers": {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08")
  .get()
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08"

    req, _ := http.NewRequest("GET", url, nil)

    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08"

headers = {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("GET", url, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Get.new(url)
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/497f6eca-6276-4993-bfeb-53cbbbba6f08' -Method GET -Headers $headers
GET /v1/nsfw/images/{id}

Fetch the result of a previously submitted NSFW (Not Safe for Work) image scan job

Parameters

Name In Type Required Description
id path string(uuid) true Identifier of the NSFW image scan job to fetch results for

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "scan_type": "malware",
  "status": "pending",
  "content_name": "string",
  "content_length": 0,
  "signals": [
    "string"
  ],
  "metadata": {
    "property1": "string",
    "property2": "string"
  },
  "created_at": "2019-08-24T14:15:22Z",
  "completed_at": "2019-08-24T14:15:22Z"
}

Responses

Status Meaning Description Schema
200 OK Returns the result of a previously submitted NSFW image scan job ScanResult
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Scan File

Code samples
curl --request POST \
  --url https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/file \
  --header 'Accept: application/json' \
  --header 'Content-Type: multipart/form-data; boundary=---011000010111000001101001' \
  --header 'X-API-Key: API_KEY' \
  --form file='@my-file.doc' \
  --form file_name=my-file.docx
const form = new FormData();
form.append("file", "");
form.append("file_name", "my-file.docx");

fetch("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/file", {
  "method": "POST",
  "headers": {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/nsfw/images/scan/file",
  "headers": {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n");
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/file"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
    Content = new MultipartFormDataContent
    {
        new StreamContent(File.OpenRead("my-file.docx"))
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "file",
                }
            }
        },
        new StringContent("my-file.docx")
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "file_name",
                }
            }
        },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("multipart/form-data; boundary=---011000010111000001101001");
RequestBody body = RequestBody.create(mediaType, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n");
Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/file")
  .post(body)
  .addHeader("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/file"

    payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n")

    req, _ := http.NewRequest("POST", url, payload)

    req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/file"

payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n"
headers = {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/file")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n"

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/file",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001--\r\n",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "Content-Type: multipart/form-data; boundary=---011000010111000001101001",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/file' -Method POST -Headers $headers -ContentType 'multipart/form-data; boundary=---011000010111000001101001' -Body '-----011000010111000001101001
Content-Disposition: form-data; name="file"

-----011000010111000001101001
Content-Disposition: form-data; name="file_name"

my-file.docx
-----011000010111000001101001--
'
POST /v1/nsfw/images/scan/file

Scans an image file for NSFW (Not Safe for Work) content

Body parameters
file: binary
file_name: my-file.docx

Parameters

Name In Type Required Description
body body object false none
» file body file(binary) false none
» file_name body string false none

Example responses

201 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "scan_type": "malware",
  "status": "pending",
  "content_name": "string",
  "content_length": 0,
  "signals": [
    "string"
  ],
  "metadata": {
    "property1": "string",
    "property2": "string"
  },
  "created_at": "2019-08-24T14:15:22Z",
  "completed_at": "2019-08-24T14:15:22Z"
}

Responses

Status Meaning Description Schema
201 Created Image file has been scanned ScanResult
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Scan URL

Code samples
curl --request POST \
  --url https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/url \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: API_KEY' \
  --data '{"file_url":"https://www.example.com/my-file","file_name":"my-file.docx"}'
fetch("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/url", {
  "method": "POST",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  },
  "body": "{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}"
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/nsfw/images/scan/url",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({file_url: 'https://www.example.com/my-file', file_name: 'my-file.docx'}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/url"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
    Content = new StringContent("{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}");
Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/url")
  .post(body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/url"

    payload := strings.NewReader("{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}")

    req, _ := http.NewRequest("POST", url, payload)

    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/url"

payload = {
    "file_url": "https://www.example.com/my-file",
    "file_name": "my-file.docx"
}
headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("POST", url, json=payload, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/url")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'
request.body = "{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}"

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/url",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"file_url\":\"https://www.example.com/my-file\",\"file_name\":\"my-file.docx\"}",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "Content-Type: application/json",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/scan/url' -Method POST -Headers $headers -ContentType 'application/json' -Body '{"file_url":"https://www.example.com/my-file","file_name":"my-file.docx"}'
POST /v1/nsfw/images/scan/url

Downloads and scans an image file for NSFW (Not Safe for Work) content

Body parameters
{
  "file_url": "https://www.example.com/my-file",
  "file_name": "my-file.docx"
}

Parameters

Name In Type Required Description
body body ScanUrlCommand false none

Example responses

201 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "scan_type": "malware",
  "status": "pending",
  "content_name": "string",
  "content_length": 0,
  "signals": [
    "string"
  ],
  "metadata": {
    "property1": "string",
    "property2": "string"
  },
  "created_at": "2019-08-24T14:15:22Z",
  "completed_at": "2019-08-24T14:15:22Z"
}

Responses

Status Meaning Description Schema
201 Created Image file has been scanned ScanResult
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Submit File

Code samples
curl --request POST \
  --url https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/file \
  --header 'Accept: application/json' \
  --header 'Content-Type: multipart/form-data; boundary=---011000010111000001101001' \
  --header 'X-API-Key: API_KEY' \
  --form file='@my-file.doc' \
  --form file_name=my-file.docx \
  --form callback_url=https://www.example.com/webhook
const form = new FormData();
form.append("file", "");
form.append("file_name", "my-file.docx");
form.append("callback_url", "https://www.example.com/webhook");

fetch("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/file", {
  "method": "POST",
  "headers": {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/nsfw/images/submit/file",
  "headers": {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n");
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/file"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
    Content = new MultipartFormDataContent
    {
        new StreamContent(File.OpenRead("my-file.docx"))
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "file",
                }
            }
        },
        new StringContent("my-file.docx")
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "file_name",
                }
            }
        },
        new StringContent("https://www.example.com/webhook")
        {
            Headers =
            {
                ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "callback_url",
                }
            }
        },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("multipart/form-data; boundary=---011000010111000001101001");
RequestBody body = RequestBody.create(mediaType, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n");
Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/file")
  .post(body)
  .addHeader("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/file"

    payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n")

    req, _ := http.NewRequest("POST", url, payload)

    req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/file"

payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n"
headers = {
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/file")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n"

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/file",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nmy-file.docx\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"callback_url\"\r\n\r\nhttps://www.example.com/webhook\r\n-----011000010111000001101001--\r\n",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "Content-Type: multipart/form-data; boundary=---011000010111000001101001",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/file' -Method POST -Headers $headers -ContentType 'multipart/form-data; boundary=---011000010111000001101001' -Body '-----011000010111000001101001
Content-Disposition: form-data; name="file"

-----011000010111000001101001
Content-Disposition: form-data; name="file_name"

my-file.docx
-----011000010111000001101001
Content-Disposition: form-data; name="callback_url"

https://www.example.com/webhook
-----011000010111000001101001--
'
POST /v1/nsfw/images/submit/file

Submits a file for asynchronous NSFW image scanning.

The result can be obtained at a later date by calling GET /v1/nsfw/images/{id}

Alternatively, if a webhook callback URL is provided, the result will be sent automatically when ready.

Body parameters
file: binary
file_name: my-file.docx
callback_url: https://www.example.com/webhook

Parameters

Name In Type Required Description
body body object false none
» file body file(binary) false none
» file_name body string false none
» callback_url body string false none

Example responses

202 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Responses

Status Meaning Description Schema
201 Created Scan job submitted None
202 Accepted Accepted ScanReceipt
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Response Headers

Status Header Type Format Description
202 X-API-Result string Identifier of the submitted NSFW scan job

Submit URL

Code samples
curl --request POST \
  --url https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/url \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: API_KEY' \
  --data '{"file_name":"my-file.docx","file_url":"https://www.example.com/my-file","callback_url":"https://www.example.com/webhook"}'
fetch("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/url", {
  "method": "POST",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  },
  "body": "{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}"
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/nsfw/images/submit/url",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({
  file_name: 'my-file.docx',
  file_url: 'https://www.example.com/my-file',
  callback_url: 'https://www.example.com/webhook'
}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/url"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
    Content = new StringContent("{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}");
Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/url")
  .post(body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/url"

    payload := strings.NewReader("{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}")

    req, _ := http.NewRequest("POST", url, payload)

    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/url"

payload = {
    "file_name": "my-file.docx",
    "file_url": "https://www.example.com/my-file",
    "callback_url": "https://www.example.com/webhook"
}
headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("POST", url, json=payload, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/url")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'
request.body = "{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}"

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/url",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"file_name\":\"my-file.docx\",\"file_url\":\"https://www.example.com/my-file\",\"callback_url\":\"https://www.example.com/webhook\"}",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "Content-Type: application/json",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/nsfw/images/submit/url' -Method POST -Headers $headers -ContentType 'application/json' -Body '{"file_name":"my-file.docx","file_url":"https://www.example.com/my-file","callback_url":"https://www.example.com/webhook"}'
POST /v1/nsfw/images/submit/url

Submits a URL for asynchronous NSFW image scanning.

The result can be obtained at a later date by calling GET /v1/nsfw/images/{id}

Alternatively, if a webhook callback URL is provided, the result will be sent automatically when ready.

Body parameters
{
  "file_name": "my-file.docx",
  "file_url": "https://www.example.com/my-file",
  "callback_url": "https://www.example.com/webhook"
}

Parameters

Name In Type Required Description
body body SubmitUrlCommand false none

Example responses

202 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Responses

Status Meaning Description Schema
201 Created Scan job submitted None
202 Accepted Accepted ScanReceipt
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
422 Unprocessable Entity Validation errors ValidationProblemDetails
500 Internal Server Error Server Error ProblemDetails

Response Headers

Status Header Type Format Description
202 X-API-Result string Identifier of the submitted NSFW scan job

General

Fetch Account Info

Code samples
curl --request GET \
  --url https://gb1.api.av.ionxsolutions.com/v1/me \
  --header 'Accept: application/json' \
  --header 'X-API-Key: API_KEY'
fetch("https://gb1.api.av.ionxsolutions.com/v1/me", {
  "method": "GET",
  "headers": {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/me",
  "headers": {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/me"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/me")
  .get()
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/me"

    req, _ := http.NewRequest("GET", url, nil)

    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/me"

headers = {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("GET", url, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/me")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Get.new(url)
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/me",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/me' -Method GET -Headers $headers
GET /v1/me

Fetch information about your account, including the number of credits remaining

Example responses

200 Response

{
  "plan": "string",
  "credit_limit": 0,
  "credit_remaining": 0,
  "created_date": "2019-08-24T14:15:22Z",
  "period_start_date": "2019-08-24T14:15:22Z",
  "period_end_date": "2019-08-24T14:15:22Z"
}

Responses

Status Meaning Description Schema
200 OK Returns account information Account
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
500 Internal Server Error Server Error ProblemDetails

Test Endpoint

Code samples
curl --request GET \
  --url https://gb1.api.av.ionxsolutions.com/v1/ping \
  --header 'Accept: application/json' \
  --header 'X-API-Key: API_KEY'
fetch("https://gb1.api.av.ionxsolutions.com/v1/ping", {
  "method": "GET",
  "headers": {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "gb1.api.av.ionxsolutions.com",
  "port": null,
  "path": "/v1/ping",
  "headers": {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://gb1.api.av.ionxsolutions.com/v1/ping"),
    Headers =
    {
        { "Accept", "application/json" },
        { "X-API-Key", "API_KEY" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gb1.api.av.ionxsolutions.com/v1/ping")
  .get()
  .addHeader("Accept", "application/json")
  .addHeader("X-API-Key", "API_KEY")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://gb1.api.av.ionxsolutions.com/v1/ping"

    req, _ := http.NewRequest("GET", url, nil)

    req.Header.Add("Accept", "application/json")
    req.Header.Add("X-API-Key", "API_KEY")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
import requests

url = "https://gb1.api.av.ionxsolutions.com/v1/ping"

headers = {
    "Accept": "application/json",
    "X-API-Key": "API_KEY"
}

response = requests.request("GET", url, headers=headers)

print(response.text)
require 'uri'
require 'net/http'
require 'openssl'

url = URI("https://gb1.api.av.ionxsolutions.com/v1/ping")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Get.new(url)
request["Accept"] = 'application/json'
request["X-API-Key"] = 'API_KEY'

response = http.request(request)
puts response.read_body
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gb1.api.av.ionxsolutions.com/v1/ping",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "X-API-Key: API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "API_KEY")
$response = Invoke-WebRequest -Uri 'https://gb1.api.av.ionxsolutions.com/v1/ping' -Method GET -Headers $headers
GET /v1/ping

Can be used to test API connectivity and authentication

Example responses

401 Response

{
  "type": "string",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string",
  "property1": null,
  "property2": null
}

Responses

Status Meaning Description Schema
200 OK Returns an empty body None
401 Unauthorized Invalid API key ProblemDetails
403 Forbidden Insufficient credit quota remaining None
500 Internal Server Error Server Error ProblemDetails

Schemas

Account

{
  "plan": "string",
  "credit_limit": 0,
  "credit_remaining": 0,
  "created_date": "2019-08-24T14:15:22Z",
  "period_start_date": "2019-08-24T14:15:22Z",
  "period_end_date": "2019-08-24T14:15:22Z"
}

Properties

Name Type Required Description
plan string true none
credit_limit integer(int32) true none
credit_remaining integer(int32) true none
created_date string(date-time) true none
period_start_date string(date-time) true none
period_end_date string(date-time) true none

JobType

"malware"

Enumerated Values

Value
malware
nsfw_image
nsfw_text

ProblemDetails

{
  "type": "string",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string",
  "property1": null,
  "property2": null
}

Properties

Name Type Required Description
additionalProperties any false none
type string¦null false none
title string¦null false none
status integer(int32)¦null false none
detail string¦null false none
instance string¦null false none

ScanReceipt

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Properties

Name Type Required Description
id string(uuid) true none

ScanResult

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "scan_type": "malware",
  "status": "pending",
  "content_name": "string",
  "content_length": 0,
  "signals": [
    "string"
  ],
  "metadata": {
    "property1": "string",
    "property2": "string"
  },
  "created_at": "2019-08-24T14:15:22Z",
  "completed_at": "2019-08-24T14:15:22Z"
}

Properties

Name Type Required Description
id string(uuid) true none
scan_type JobType true none
status ScanResultType true none
content_name string true Original filename of the scanned content, e.g. "a-file.docx"
content_length integer(int64) true Size of the scanned content, in bytes
signals [string]¦null false none
metadata object¦null false Content metadata, such as hashes
» additionalProperties string false none
created_at string(date-time) true Time when the Job was first submitted
completed_at string(date-time)¦null false Time when the Job was completed (whether it resulted in an error or not)

ScanResultType

"pending"

Enumerated Values

Value
pending
clean
threat
error

ScanUrlCommand

{
  "file_url": "https://www.example.com/my-file",
  "file_name": "my-file.docx"
}

Properties

Name Type Required Description
file_url string true none
file_name string¦null false none

SubmitUrlCommand

{
  "file_name": "my-file.docx",
  "file_url": "https://www.example.com/my-file",
  "callback_url": "https://www.example.com/webhook"
}

Properties

Name Type Required Description
file_name string true none
file_url string true none
callback_url string¦null false none

ValidationProblemDetails

{
  "type": "string",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string",
  "errors": {
    "property1": [
      "string"
    ],
    "property2": [
      "string"
    ]
  },
  "property1": null,
  "property2": null
}

Properties

Name Type Required Description
additionalProperties any false none
type string¦null false none
title string¦null false none
status integer(int32)¦null false none
detail string¦null false none
instance string¦null false none
errors object false none
» additionalProperties [string] false none