Sighthound Cloud API

Computer vision API for developers

Detection, recognition, and demographics API for cloud-connected applications.

Demo Now

Detection API & Recognition API

Sighthound Cloud offers a Detection API for person, face, gender, age, and facial landmark detections; and a Recognition API that developers can use for vehicle recognition applications. Try out the following demo to see the Detection API and Recognition API in action.

Sighthound Cloud API Service

Sighthound Cloud is an API service that allows developers to add computer vision to their applications. Simple REST APIs return the location of any people and faces found in an image. Faces can be analyzed for gender, age, and facial landmark detections. Our landmark detector can find the various facial features in the detected faces, including eyes, nose and mouth, by fitting 68 landmark points to those features.

The detectors and recognizers are all based on state-of-the-art research from Sighthound’s Computer Vision Research Lab, and have higher rates of precision, recall and mean accuracy than other publicly available software.

Sighthound Cloud is free for developers and available for commercial purposes to those with a paid account. To get started, see below.

Quickstart Guides

Recognition API

To get started with the Recognition API, view the face recognition tutorial to see code examples in popular languages, and then refer to the API documentation for full details.

Detection API

View the Detection API code examples below or refer to the API documentation for full details.

Code Examples


var image = {image: ""};
var xmlhttp = new XMLHttpRequest();
var result;

xmlhttp.onreadystatechange = function () {
  if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
    result = xmlhttp.responseText;
}"POST", ",person&faceOption=landmark,gender");
xmlhttp.setRequestHeader("Content-type", "application/json");
xmlhttp.setRequestHeader("X-Access-Token", "YOUR-CLOUD-TOKEN");

import base64
import json
import os
import ssl
    import httplib  # Python 2
    import http.client as httplib  # Python 3

headers = {"Content-type": "application/json",
           "X-Access-Token": "YOUR-CLOUD-TOKEN"}
conn = httplib.HTTPSConnection("", 

# To use a hosted image uncomment the following line and update the URL
#image_data = ""

# To use a local file uncomment the following line and update the path
#image_data = base64.b64encode(open("/path/to/local/image.jpg", "rb").read()).decode()

params = json.dumps({"image": image_data})
conn.request("POST", "/v1/detections?type=face,person&faceOption=landmark,gender", params, headers)
response = conn.getresponse()
result =
print("Detection Results = " + str(result))

require "json"
require "net/http"
require "uri"

uri = URI.parse(",person&faceOption=landmark,gender")

connection =, uri.port)
connection.use_ssl = true

request =
request.add_field("X-Access_Token", "YOUR-CLOUD-TOKEN")
request.add_field("Content-type", "application/json")
request.body = {"image" => ""}.to_json

response = connection.request(request)
puts response.body

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

class UrlSample
    static void Main(string[] args)
        // Option 1 - Image is a file on local filesystem
        // Comment out the following 2 lines if using a URL.
        string imageFilePath = @"PATH TO IMAGE"; 
        string imgBase64String = GetBase64StringForImage(imageFilePath);

        // Option 2 - Image path is a URL
        // Uncomment the following 2 lines if using a URL.
        // string imageUrlPath = "";
        // string imgBase64String = GetBase64StringForImage(imageUrlPath); 

        Dictionary dict = new Dictionary();
        dict.Add("image", imgBase64String);
        string json = JsonConvert.SerializeObject(dict, Formatting.Indented);
        byte[] body = Encoding.UTF8.GetBytes(json);

        WebRequest request = WebRequest.Create(",person&faceOption=landmark,gender");
        request.Method = "POST";
        request.ContentType = "application/json";
        request.ContentLength = json.Length;
        request.Headers["X-Access-Token"] = "YOUR API KEY"; // "Your-API-Key";
        Stream requestStream = request.GetRequestStream();
        requestStream.Write(body, 0, body.Length);

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(),
            json = reader.ReadToEnd();
            JObject result = JObject.Parse(json);
            if (response.StatusCode == HttpStatusCode.OK)
                JObject image = result["image"].Value();
                Console.WriteLine("analyzed image {0}x{1} with orientation {2}",
                JArray objects = (JArray)result["objects"];
                foreach (JObject obj in objects.Children())
                    string type = obj["type"].Value();
                    JObject bbox = (JObject)obj["boundingBox"];
                    Console.WriteLine("found '{0}' {1}x{2} at ({3},{4})", type,
        catch (WebException we)
            StreamReader reader = new StreamReader(we.Response.GetResponseStream(),
            json = reader.ReadToEnd();
            JObject info = JObject.Parse(json);
            Console.WriteLine("REQUEST FAILED\nerror: {0}\nreason: '{1}'",

    protected static string GetBase64StringForImage(string imgPath)  
        byte[] imageBytes = System.IO.File.ReadAllBytes(imgPath);  
        string base64String = Convert.ToBase64String(imageBytes);  
        return base64String;  


import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;

public class UrlSample {
  private static final String api = ",person&faceOption=landmark,gender";
  private static final String accessToken = "Your-API-Key";
  private static String imageUrl = "";
  public static void main(String[] args) throws IOException {
    JsonObject jsonImage = Json.createObjectBuilder().add("image", imageUrl).build();
    URL apiURL = new URL(api);
    HttpURLConnection connection = (HttpURLConnection) apiURL.openConnection();
    connection.setRequestProperty("Content-Type", "application/json");
    connection.setRequestProperty("X-Access-Token", accessToken);
    byte[] body = jsonImage.toString().getBytes();
    OutputStream os = connection.getOutputStream();
    int httpCode = connection.getResponseCode();
    if ( httpCode == 200 ){
        JsonReader jReader = Json.createReader(connection.getInputStream());
        JsonObject jsonBody = jReader.readObject();
    } else {
        JsonReader jReader = Json.createReader(connection.getErrorStream());
        JsonObject jsonError = jReader.readObject();

curl -X POST -H "X-Access-Token: YOUR-CLOUD-TOKEN" \
-H "Content-Type: application/json" \
-d '{"image": ""}' \,person&faceOption=landmark,gender

URL and Headers

Content-Type: application/json
X-Access-Token: Your-API-Key

Optional URL Parameters

type A comma-separated list of object categories to detect. Valid options are ‘all’, ‘face’, ‘person’. Default is ‘all’.
faceOption For type 'face', additional detections can be performed by passing comma-separated list of values. Valid options are ‘gender’ and ‘landmark’. Default is face bounding box only.

Body Parameters

image The image to analyze. This can be a URL to an image (authentication data in URL is accepted) or inline as base64 encoded data.


The result is a JSON array of all detected objects and information about the processed image.

{ "image": {
    "width": 1280, "height": 960, "orientation": 1},
  "objects": [
    {"type": "person",
      "boundingBox": { "x": 363, "y": 182, "height": 778, "width": 723} },
    {"type": "face",
      "boundingBox": {"x": 508, "y": 305, "height": 406, "width": 406,},
      "attributes": {
        "gender": "male", "genderConfidence": 0.9883, "frontal": true},
      "landmarks": {
        "faceContour": [[515,447],[517,491]...[872,436]],
        "noseBridge": [[710,419],[711,441]...[712,487]],
        "noseBall": [[680,519],[696,522]...[742,518]],
        "eyebrowRight": [[736,387],[768,376]...854,394]],
        "eyebrowLeft": [[555,413],[578,391]...679,391]],
        "eyeRight": [[753,428],[774,414]...[777,432]],
        "eyeRightCenter": [[786,423]],
        "eyeLeft": [[597,435],[617,423]...[619,442]],
        "eyeLeftCenter": [[630,432]],
        "mouthOuter": [[650,590],[674,572]...[675,600]],
        "mouthInner": [[661,587],[697,580]...[697,584]]}
objects An array of all detected objects. Each includes the type of detection results returned, face or person, and a boundingBox of the object's location in the image. The x, y, width, and height values are defined in a coordinate space with (0,0) as the top left corner of the image.
image The width, height, and orientation of the processed image. Orientation defaults to 1, else the value found in the image's Exif data and indicates that bounding boxes have been translated to match that coordinate space.

Get Support

Ask questions and share your projects in our forums or by emailing our support team.