API Documentation

Decoding API

Usage

API use is limited to 25 per month on the free plan. Attempted calls after the free limit will return a 429 - Too many requests response. Subscribe to one of our pricing options for increased usage.

Try It Out

Loading...

                      

GET Request


    curl -X GET "https://homespy.io/api/decode" \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d '{"make": "YOUR_MAKE", "serial": "YOUR_SERIAL", "model": "YOUR_MODEL"}'
  

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, 'https://homespy.io/api/decode');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      'Authorization: Bearer YOUR_API_TOKEN',
      'Accept: application/json',
      'Content-Type: application/json',
  ]);
  curl_setopt($ch, CURLOPT_POSTFIELDS, '{"make": "YOUR_MAKE", "serial": "YOUR_SERIAL", "model": "YOUR_MODEL"}');

  $response = curl_exec($ch);

  curl_close($ch);
   
  

  use GuzzleHttp\Client;

  $client = new Client();

  $response = $client->get('https://homespy.io/api/decode', [
      'headers' => [
          'Authorization' => 'Bearer YOUR_API_TOKEN',
          'Accept'        => 'application/json',
          'Content-Type'  => 'application/json'
      ],
      // 'body' => '{"make": "YOUR_MAKE", "serial": "YOUR_SERIAL", "model": "YOUR_MODEL"}',
      'json' => [
          'make' => 'YOUR_MAKE',
          'serial' => 'YOUR_SERIAL',
          'model' => 'YOUR_MODEL'
      ]
  ]);
   
  

  fetch('https://homespy.io/api/decode', {
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    // body: '{"make": "YOUR_MAKE", "serial": "YOUR_SERIAL", "model": "YOUR_MODEL"}',
    body: JSON.stringify({
      'make': 'YOUR_MAKE',
      'serial': 'YOUR_SERIAL',
      'model': 'YOUR_MODEL'
    })
  });
  
  

  import axios from 'axios';

  const response = await axios.get('https://homespy.io/api/decode', {
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    // data: '{"make": "YOUR_MAKE", "serial": "YOUR_SERIAL", "model": "YOUR_MODEL"}',
    data: {
      'make': 'YOUR_MAKE',
      'serial': 'YOUR_SERIAL',
      'model': 'YOUR_MODEL'
    }
  });
  
  

  import fetch from 'node-fetch';

  fetch('https://homespy.io/api/decode', {
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    // body: '{"make": "YOUR_MAKE", "serial": "YOUR_SERIAL", "model": "YOUR_MODEL"}',
    body: JSON.stringify({
      'make': 'YOUR_MAKE',
      'serial': 'YOUR_SERIAL',
      'model': 'YOUR_MODEL'
    })
  });
  
  

  using System.Net.Http;
  using System.Net.Http.Headers;

  HttpClient client = new HttpClient();

  HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://homespy.io/api/decode");

  request.Headers.Add("Authorization", "Bearer YOUR_API_TOKEN");
  request.Headers.Add("Accept", "application/json");

  request.Content = new StringContent("{\"make\": \"YOUR_MAKE\", \"serial\": \"YOUR_SERIAL\", \"model\": \"YOUR_MODEL\"}");
  request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

  HttpResponseMessage response = await client.SendAsync(request);
  response.EnsureSuccessStatusCode();
  string responseBody = await response.Content.ReadAsStringAsync();
  
  

  import java.io.IOException;
  import java.net.URI;
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpRequest.BodyPublishers;
  import java.net.http.HttpResponse;

  HttpClient client = HttpClient.newHttpClient();

  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://homespy.io/api/decode"))
      .method("GET", BodyPublishers.ofString("{\"make\": \"YOUR_MAKE\", \"serial\": \"YOUR_SERIAL\", \"model\": \"YOUR_MODEL\"}"))
      .setHeader("Authorization", "Bearer YOUR_API_TOKEN")
      .setHeader("Accept", "application/json")
      .setHeader("Content-Type", "application/json")
      .build();

  HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
  
  

  import requests

  headers = {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Accept': 'application/json',
      # Already added when you pass json=
      # 'Content-Type': 'application/json',
  }

  json_data = {
      'make': 'YOUR_MAKE',
      'serial': 'YOUR_SERIAL',
      'model': 'YOUR_MODEL',
  }

  response = requests.get('https://homespy.io/api/decode', headers=headers, json=json_data)
  
  

  import Foundation

  let jsonData = [
      "make": "YOUR_MAKE",
      "serial": "YOUR_SERIAL",
      "model": "YOUR_MODEL"
  ] as [String : Any]
  let data = try! JSONSerialization.data(withJSONObject: jsonData, options: [])
  // let data = "{\"make\": \"YOUR_MAKE\", \"serial\": \"YOUR_SERIAL\", \"model\": \"YOUR_MODEL\"}".data(using: .utf8)

  let url = URL(string: "https://homespy.io/api/decode")!
  let headers = [
      "Authorization": "Bearer YOUR_API_TOKEN",
      "Accept": "application/json",
      "Content-Type": "application/json"
  ]

  var request = URLRequest(url: url)
  request.allHTTPHeaderFields = headers
  request.httpBody = data as Data

  let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
      if let error = error {
          print(error)
      } else if let data = data {
          let str = String(data: data, encoding: .utf8)
          print(str ?? "")
      }
  }

  task.resume()
  
  

Authentication

Credentials and body are passed in the same call to the below endpoint.


GET https://homespy.io/api/decode

Credentials consist of your api token only. It can be sent in the 'Authorization' header as a bearer token, a parameter of multipart/form data or appended to the request url.

If you are currently logged in, the examples below will automatically include your api token.


Setting the 'Accept' header to application/json will ensure you receive a proper Http response from the server. Standard Http response codes are returned with each request.


 https://homespy.io/api/decode?api_token=YOUR_API_TOKEN

headers: {
  "Content-Type" : "application/json",
  "Authorization" : "Bearer YOUR_API_TOKEN",
  "Accept" => "application/json",
}

curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Content-Type : multipart/form-data",
    "Accept : application/json"
]);

An example of a failed 401 failed authentication response.


{
  "message": "Unauthenticated."
}

Request Parameters

Basic Request: https://homespy.io/api/decode?api_token=YOUR_API_TOKEN&make={YOUR_MAKE}&serial={YOUR_SERIAL}&model={YOUR_MODEL}

serial - String | Required | Any Length
model - String | Required | Any Length
make - Enum | Required | Option Within List Below

The following is the list of allowed make parameters. Values will be formatted for consistency. Whirlpool, Whirl Pool and whirlpool will all format to WHIRLPOOL.

Alternatively you can use the Makes List APIs to keep values consistent.


AOSMITH
ADMIRAL
ALLIANCE
AMANA
AMERICANSTANDARD
AMERICANA
ASKO
BOSCH
BRADFORDWHITE
BRAVOS
BRYANT
CABRIO
CAFE
CALORIC
CARRIER
COLEMAN
COMFORTMAKER
CONQUEST
COOLERATOR
CROSLEY
CRYSTALTIPS
DACOR
DANBY
DUCANE
ELECTROLUX
ESTATE
FIRSTCO
FISHERANDPAYKEL
FRIGIDAIRE
GE
GAGGENAU
GIBSON
GLENWOOD
GOODMAN
HAIER
HAMPTONBAY
HARDWICK
HEIL
HISENSE
HOTPOINT
ICP
IMPERIAL
INGLIS
JANITROL
JENNAIR
JORDAN
KELVINATOR
KENMORE
KITCHENAID
LG
LENNOX
LITTON
MAGICCHEF
MAYCOR
MAYTAG
MENUMASTER
MODERNMAID
NEPTUNE
NORCOLD
NORDYNE
NORGE
NORTEK
PARTNERSPLUS
PAYNE
PEERLESS
PINNACLE
PREMIERE
PUREFIRE
RCA
RHEEM
ROPER
RUUD
SAMSUNG
SPEEDQUEEN
STATE
SUNRAY
TAPPAN
THERMADOR
TRANE
VIKING
VIZIO
WESTINGHOUSE
WHIRLPOOL
WHITEWESTINGHOUSE
YORK

Decoding Responses

All responses are in JSON format. A standard http response code is always returned. In the case of multiple possible manufacture dates, we provide a confidence score for each of the possible dates. The 'mostLikelyYear' property is our algorithm's determination of the manufacture date.

An example of a decode returning multiple possible dates. The confidence score is calculated based on our internal data for similiar models as well as externally sourced data. Some properties like 'details' will only be filled if there is appropriate data.


{
  "result": {
    "status": 200,
    "message": "ok",
    "decoded": {
      "make": "WHIRLPOOL",
      "model": "WDT730PAHZ0",
      "serial": "F91720000",
      "mostLikelyYear": 2019,
      "details": {
        "averageListedPrice": 829,
        "type": "Dishwasher",
        "color": "Stainless Steel",
        "description": "24 Inch Fully Integrated Built-In Dishwasher with 15 Place Setting Capacity"
      },
      "yearOptions": {
        "2019": {
          "year": 2019,
          "confidence": 80,
          "fullDate": "2029-04-22T00:00:00.000000Z"
        }
      },
      "responseTime": 0.9700009822845459
    }
  }
}

In some cases it is not possible to narrow down the date any further due to a lack of existing data for the parameters supplied. This often happens due to a mistyped model or serial number but also could be due to an obscure model number. The following is an example of a serial number decoded but lacking supporting model data to narrow down the options.


{
  "result": {
    "status": 200,
    "message": "ok",
    "decoded": {
      "make": "GE",
      "model": "PSSUUUII",
      "serial": "MM499999",
      "mostLikelyYear": null,
      "details": [],
      "yearOptions": {
        "1995": {
          "year": 1995,
          "confidence": 33,
          "fullDate": "2005-07-01T01:00:00.000000Z"
        },
        "2007": {
          "year": 2007,
          "confidence": 33,
          "fullDate": "2007-07-01T01:00:00.000000Z"
        },
        "2019": {
          "year": 2019,
          "confidence": 33,
          "fullDate": "2019-07-01T01:00:00.000000Z"
        }
      },
      "responseTime": 1.2382619380950928
    }
  }
}

An example of a response returning a 400 error to the client due to the request missing parameters or supplying a non-supported make.


{
  "result": {
    "status": 400,
    "message": "Missing parameter or make value not in expected list.",
    "decoded": null
  }
}

An example of a response returning a 429 error to the client due to the free daily calls being exhausted.


{
  "result": {
    "status": 429,
    'message' => 'Free api calls exhausted. Setup a billing method for increased usage.',
    "decoded": null
  }
}

Optical Character Recognition API

Usage

OCR API use is limited to the unlimited plan at the current time. This API accepts a make parameter and either a Base64 encoded image or a raw image parameter. The image is then stripped of data and cross referenced against our database in order to accurately return the serial and model numbers.

For best results, images should be as focused on the manufacturer's info as possible and include as little extraneous data as possible; images taken from far away or images that don't fully capture the serial and model number can lead to false positives.

Try It Out

Select the appropriate make for the image you are uploading.

Loading...
  
  
                        

Request Using Raw Image


  curl -X POST "https://homespy.io/api/ocr" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json" \
  -F "make=YOUR_MAKE" \
  -F "imageRaw=@pathToImage/image.png"
  

Request Using Encoded Image


  curl -X POST "https://homespy.io/api/ocr" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"make": "YOUR_MAKE", "imageBase64": "YOUR_BASE64_ENCODED_IMAGE"}'
  

Request Using Raw Image


  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, 'https://homespy.io/api/ocr');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      'Authorization: Bearer X1EuyvggI26JpKJ4KzAFWTMh8sBtxV86e5ACK6kE4Zj3lIRBgvMJsjYTwq8B',
      'Accept: application/json',
  ]);
  curl_setopt($ch, CURLOPT_POSTFIELDS, [
      'make' => 'YOUR_MAKE',
      'imageRaw' => new CURLFile('pathToImage/image.png'),
  ]);

  $response = curl_exec($ch);

  curl_close($ch);
  

Request Using Encoded Image


  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, 'https://homespy.io/api/ocr');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      'Authorization: Bearer YOUR_API_TOKEN',
      'Accept: application/json',
      'Content-Type: application/json',
  ]);
  curl_setopt($ch, CURLOPT_POSTFIELDS, '{"make": "YOUR_MAKE", "imageBase64": "your_base64_encoded_image"}');

  $response = curl_exec($ch);

  curl_close($ch);
  

Request Using Raw Image



  use GuzzleHttp\Client;
  use GuzzleHttp\Psr7;

  $client = new Client();

  $response = $client->post('https://homespy.io/api/ocr', [
      'headers' => [
          'Authorization' => 'Bearer YOUR_API_TOKEN',
          'Accept'        => 'application/json'
      ],
      'multipart' => [
          [
              'name' => 'make',
              'contents' => 'YOUR_MAKE'
          ],
          [
              'name' => 'imageRaw',
              'contents' => Psr7\Utils::tryFopen('pathToImage/image.png', 'r')
          ]
      ]
  ]);
  

Request Using Encoded Image


  use GuzzleHttp\Client;

  $client = new Client();

  $response = $client->post('https://homespy.io/api/ocr', [
      'headers' => [
          'Authorization' => 'Bearer YOUR_API_TOKEN',
          'Accept'        => 'application/json',
          'Content-Type'  => 'application/json'
      ],
      // 'body' => '{"make": "YOUR_MAKE", "imageBase64": "YOUR_BASE64_ENCODED_IMAGE"}',
      'json' => [
          'make' => 'FRIGIDAIRE',
          'imageBase64' => 'YOUR_BASE64_ENCODED_IMAGE'
      ]
  ]);
  

Request Using Raw Image


  const form = new FormData();
  form.append('make', 'YOUR_MAKE');
  form.append('imageRaw', File([''], 'pathToImage/image.png'));

  fetch('https://homespy.io/api/ocr', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Accept': 'application/json'
    },
    body: form
  });
  

Request Using Encoded Image


  fetch('https://homespy.io/api/ocr', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    // body: '{"make": "FRIGIDAIRE", "imageBase64": "YOUR_BASE64_ENCODED_IMAGE"}',
    body: JSON.stringify({
      'make': 'FRIGIDAIRE',
      'imageBase64': 'YOUR_BASE64_ENCODED_IMAGE'
    })
  });
  

POST Request With Raw Image


  import axios from 'axios';
  import FormData from 'form-data';
  import * as fs from 'fs';

  const form = new FormData();
  form.append('make', 'YOUR_MAKE');
  form.append('imageRaw', fs.readFileSync('pathToImage/image.png'), 'pathToImage/image.png');

  const response = await axios.post(
    'https://homespy.io/api/ocr',
    form,
    {
      headers: {
        ...form.getHeaders(),
        'Authorization': 'Bearer YOUR_API_TOKEN',
        'Accept': 'application/json'
      }
    }
  );
  

POST Request With Encoded Image


  import axios from 'axios';

  const response = await axios.post(
    'https://homespy.io/api/ocr',
    // '{"make": "FRIGIDAIRE", "imageBase64": "YOUR_BASE64_ENCODED_IMAGE"}',
    {
      'make': 'FRIGIDAIRE',
      'imageBase64': 'YOUR_BASE64_ENCODED_IMAGE'
    },
    {
      headers: {
        'Authorization': 'Bearer YOUR_API_TOKEN',
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      }
    }
  );
  

Request Using Raw Image


  using System.Net.Http;

  HttpClient client = new HttpClient();

  HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://homespy.io/api/ocr");

  request.Headers.Add("Authorization", "Bearer YOUR_API_TOKEN");
  request.Headers.Add("Accept", "application/json");


  MultipartFormDataContent content = new MultipartFormDataContent();
  content.Add(new StringContent("YOUR_MAKE"), "make");
  content.Add(new ByteArrayContent(File.ReadAllBytes("pathToImage/image.png")), "imageRaw", Path.GetFileName("pathToImage/image.png"));
  request.Content = content;

  HttpResponseMessage response = await client.SendAsync(request);
  response.EnsureSuccessStatusCode();
  string responseBody = await response.Content.ReadAsStringAsync();
  

Request Using Encoded Image


  using System.Net.Http;
  using System.Net.Http.Headers;

  HttpClient client = new HttpClient();

  HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://homespy.io/api/ocr");

  request.Headers.Add("Authorization", "Bearer YOUR_API_TOKEN");
  request.Headers.Add("Accept", "application/json");

  request.Content = new StringContent("{\"make\": \"YOUR_MAKE\", \"imageBase64\": \"YOUR_BASE64_ENCODED_IMAGE\"}");
  request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

  HttpResponseMessage response = await client.SendAsync(request);
  response.EnsureSuccessStatusCode();
  string responseBody = await response.Content.ReadAsStringAsync();
  

Request Using Raw Image


  import java.io.File;
  import java.io.IOException;
  import okhttp3.MultipartBody;
  import okhttp3.OkHttpClient;
  import okhttp3.Request;
  import okhttp3.RequestBody;
  import okhttp3.Response;

  OkHttpClient client = new OkHttpClient();

  RequestBody requestBody = new MultipartBody.Builder()
      .setType(MultipartBody.FORM)
      .addFormDataPart("make", "YOUR_MAKE")
      .addFormDataPart("imageRaw", RequestBody.create("", new File("pathToImage/image.png")))
      .build();

  Request request = new Request.Builder()
      .url("https://homespy.io/api/ocr")
      .post(requestBody)
      .header("Authorization", "Bearer YOUR_API_TOKEN")
      .header("Accept", "application/json")
      .build();

  try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
      response.body().string();
  }
  

Request Using Encoded Image


  import java.io.IOException;
  import okhttp3.OkHttpClient;
  import okhttp3.Request;
  import okhttp3.Response;

  OkHttpClient client = new OkHttpClient();

  String requestBody = "{\"make\": \"YOUR_MAKE\", \"imageBase64\": \"YOUR_BASE64_ENCODED_IMAGE\"}";

  Request request = new Request.Builder()
      .url("https://homespy.io/api/ocr")
      .post(requestBody)
      .header("Authorization", "Bearer YOUR_API_TOKEN")
      .header("Accept", "application/json")
      .header("Content-Type", "application/json")
      .build();

  try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
      response.body().string();
  }
  

Request Using Raw Image


  import requests

  headers = {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Accept': 'application/json',
  }

  files = {
      'make': (None, 'YOUR_MAKE'),
      'imageRaw': open('pathToImage/image.png', 'rb'),
  }

  response = requests.post('https://homespy.io/api/ocr', headers=headers, files=files)
  

Request Using Encoded Image


  import requests

  headers = {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Accept': 'application/json',
      # Already added when you pass json=
      # 'Content-Type': 'application/json',
  }

  json_data = {
      'make': 'YOUR_MAKE',
      'imageBase64': 'YOUR_BASE64_ENCODED_IMAGE',
  }

  response = requests.post('https://homespy.io/api/ocr', headers=headers, json=json_data)
  

Request Using Raw Image


  import Foundation

  let url = URL(string: "https://homespy.io/api/ocr")!
  let headers = [
      "Authorization": "Bearer YOUR_API_TOKEN",
      "Accept": "application/json"
  ]

  var request = URLRequest(url: url)
  request.httpMethod = "POST"
  request.allHTTPHeaderFields = headers

  let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
      if let error = error {
          print(error)
      } else if let data = data {
          let str = String(data: data, encoding: .utf8)
          print(str ?? "")
      }
  }

  task.resume()
  

Request Using Encoded Image


  import Foundation

  let jsonData = [
      "make": "YOUR_MAKE",
      "imageBase64": "YOUR_BASE64_ENCODED_IMAGE"
  ] as [String : Any]
  let data = try! JSONSerialization.data(withJSONObject: jsonData, options: [])
  // let data = "{\"make\": \"YOUR_MAKE\", \"imageBase64\": \"YOUR_BASE64_ENCODED_IMAGE\"}".data(using: .utf8)

  let url = URL(string: "https://homespy.io/api/ocr")!
  let headers = [
      "Authorization": "Bearer YOUR_API_TOKEN",
      "Accept": "application/json",
      "Content-Type": "application/json"
  ]

  var request = URLRequest(url: url)
  request.httpMethod = "POST"
  request.allHTTPHeaderFields = headers
  request.httpBody = data as Data

  let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
      if let error = error {
          print(error)
      } else if let data = data {
          let str = String(data: data, encoding: .utf8)
          print(str ?? "")
      }
  }

  task.resume()
  

Authentication

Credentials and body are passed in the same call to the below endpoint.

POST https://homespy.io/api/ocr

Credentials consist of your api token only. It can be sent in the 'Authorization' header as a bearer token, or as part of form data as a parameter called 'api_token'.
If you are currently logged in, the examples below will automatically include your api token.


Setting the 'Accept' header to application/json will ensure you receive a proper Http response from the server. Standard Http response codes are returned with each request.


  headers: {
    "Content-Type" : "application/json",
    "Authorization" : "Bearer YOUR_API_TOKEN"
    "Accept" => "application/json",

  }

    const form = new FormData();
    form.append('api_token', 'YOUR_API_TOKEN');

An example of a response returning a http 401 failed failed authentication response.


{
  "message": "Unauthenticated."
}

Request Parameters

make - String | Option Within List Below | Required
imageBase64 - String | Base64 Encoded | Required If imageRaw Not Present
imageRaw - Image | .jpg, .jpeg, .png, .bmp, .gif, .svg, .webp | Required If imageBase64 Not Present

OCR Available List

The following is the list of allowed make parameters. Values will be formatted for consistency.

Whirlpool, Whirl Pool and whirlpool will all format to WHIRLPOOL.


AOSMITH
ADMIRAL
ALLIANCE
AMANA
AMERICANSTANDARD
AMERICANA
ASKO
BOSCH
BRADFORDWHITE
BRAVOS
BRYANT
CABRIO
CAFE
CALORIC
CARRIER
COLEMAN
COMFORTMAKER
CONQUEST
COOLERATOR
CROSLEY
CRYSTALTIPS
DACOR
DANBY
DUCANE
ELECTROLUX
ESTATE
FIRSTCO
FISHERANDPAYKEL
FRIGIDAIRE
GE
GAGGENAU
GIBSON
GLENWOOD
GOODMAN
HAIER
HAMPTONBAY
HARDWICK
HEIL
HISENSE
HOTPOINT
ICP
IMPERIAL
INGLIS
JANITROL
JENNAIR
JORDAN
KELVINATOR
KENMORE
KITCHENAID
LG
LENNOX
LITTON
MAGICCHEF
MAYCOR
MAYTAG
MENUMASTER
MODERNMAID
NEPTUNE
NORCOLD
NORDYNE
NORGE
NORTEK
PARTNERSPLUS
PAYNE
PEERLESS
PINNACLE
PREMIERE
PUREFIRE
RCA
RHEEM
ROPER
RUUD
SAMSUNG
SPEEDQUEEN
STATE
SUNRAY
TAPPAN
THERMADOR
TRANE
VIKING
VIZIO
WESTINGHOUSE
WHIRLPOOL
WHITEWESTINGHOUSE
YORK

OCR Responses

All responses are in JSON format and a standard http response code is always returned and included in the response body.

An example of a successful OCR response.


{
  "result": {
    "status": 200,
    "message": "success",
    "ocr": {
      "serial": "LA11026776",
      "model": "FRT21P5AQ1"
    }
  }
}

Empty Or Partial OCR Response

For many reasons the image data supplied is not of high enough quality for the serial or model number to be extracted. In these cases, neither the model or serial number could be determined with any confidence and the 'ocr' parameter will be null.


{
  "result": {
    "status": 200,
    "message": "success",
    "ocr": null
  }
}

Occasionally only part of the data can be extracted. In these instances, the 'ocr' parameter will contain the extracted data and the unknown data will be set to null.


{
  "result": {
    "status": 200,
    "message": "success",
    "ocr": {
      "serial": "LA11026776",
      "model": null
    }
  }
}

Makes List API

The following endpoints do not require authentication and can be called as needed.

GET https://homespy.io/api/list/makes

This endpoint returns an array of all currently supported makes.


GET https://homespy.io/api/list/makes/ocr

This endpoint returns an array of all makes supported by OCR.


GET https://homespy.io/api/list/makes/full

This endpoint returns a list of all makes with additional data. Each object has the following structure and properties:


    "KITCHENAID": {
      "apiName": "KITCHENAID", - Standardized name for homespy APIs 
      "formattedName": "Kitchen Aid", - Formatted name for display
      "ocrAvailable": true - Make OCR availability
    }   

List Responses

/api/list/makes/full

{
  "makes": {
    "WHIRLPOOL": {
      "apiName": "WHIRLPOOL",
      "formattedName": "Whirlpool",
      "ocrAvailable": true
    },
    "FRIGIDAIRE": {
      "apiName": "FRIGIDAIRE",
      "formattedName": "Frigidaire",
      "ocrAvailable": true
    },
    "BOSCH": {
      "apiName": "BOSCH",
      "formattedName": "Bosch",
      "ocrAvailable": true
    },
    "GE": {
      "apiName": "GE",
      "formattedName": "GE (General Electric)",
      "ocrAvailable": true
    },
    "SAMSUNG": {
      "apiName": "SAMSUNG",
      "formattedName": "Samsung",
      "ocrAvailable": true
    },
    "LG": {
      "apiName": "LG",
      "formattedName": "LG",
      "ocrAvailable": true
    },
    "KENMORE": {
      "apiName": "KENMORE",
      "formattedName": "Kenmore | Sears | Kenmore Elite",
      "ocrAvailable": true
    },
    "CARRIER": {
      "apiName": "CARRIER",
      "formattedName": "Carrier",
      "ocrAvailable": false
    },
    "LENNOX": {
      "apiName": "LENNOX",
      "formattedName": "Lennox",
      "ocrAvailable": false
    },
    "KITCHENAID": {
      "apiName": "KITCHENAID",
      "formattedName": "Kitchen Aid",
      "ocrAvailable": true
    },
    "MAYTAG": {
      "apiName": "MAYTAG",
      "formattedName": "Maytag",
      "ocrAvailable": true
    },
    "AMANA": {
      "apiName": "AMANA",
      "formattedName": "Amana",
      "ocrAvailable": true
    },
    "RHEEM": {
      "apiName": "RHEEM",
      "formattedName": "Rheem",
      "ocrAvailable": false
    },
    "TRANE": {
      "apiName": "TRANE",
      "formattedName": "Trane",
      "ocrAvailable": true
    },
    "COMFORTMAKER": {
      "apiName": "COMFORTMAKER",
      "formattedName": "Comfort Maker",
      "ocrAvailable": false
    },
    "YORK": {
      "apiName": "YORK",
      "formattedName": "York",
      "ocrAvailable": false
    },
    "PAYNE": {
      "apiName": "PAYNE",
      "formattedName": "Payne",
      "ocrAvailable": false
    },
    "GOODMAN": {
      "apiName": "GOODMAN",
      "formattedName": "Goodman",
      "ocrAvailable": false
    },
    "HEIL": {
      "apiName": "HEIL",
      "formattedName": "Heil",
      "ocrAvailable": false
    },
    "PEERLESS": {
      "apiName": "PEERLESS",
      "formattedName": "Peerless",
      "ocrAvailable": false
    },
    "PINNACLE": {
      "apiName": "PINNACLE",
      "formattedName": "Pinnacle",
      "ocrAvailable": false
    },
    "PUREFIRE": {
      "apiName": "PUREFIRE",
      "formattedName": "Purefire",
      "ocrAvailable": false
    },
    "JENNAIR": {
      "apiName": "JENNAIR",
      "formattedName": "Jenn Air",
      "ocrAvailable": true
    },
    "DUCANE": {
      "apiName": "DUCANE",
      "formattedName": "Ducane",
      "ocrAvailable": false
    },
    "RUUD": {
      "apiName": "RUUD",
      "formattedName": "Ruud",
      "ocrAvailable": false
    },
    "VIKING": {
      "apiName": "VIKING",
      "formattedName": "Viking",
      "ocrAvailable": false
    },
    "BRYANT": {
      "apiName": "BRYANT",
      "formattedName": "Bryant",
      "ocrAvailable": false
    },
    "STATE": {
      "apiName": "STATE",
      "formattedName": "State",
      "ocrAvailable": false
    },
    "ICP": {
      "apiName": "ICP",
      "formattedName": "ICP (International Comfort Products)",
      "ocrAvailable": false
    },
    "NORDYNE": {
      "apiName": "NORDYNE",
      "formattedName": "Nordyne",
      "ocrAvailable": false
    },
    "AOSMITH": {
      "apiName": "AOSMITH",
      "formattedName": "A O Smith",
      "ocrAvailable": false
    },
    "BRADFORDWHITE": {
      "apiName": "BRADFORDWHITE",
      "formattedName": "Bradford White",
      "ocrAvailable": false
    },
    "COLEMAN": {
      "apiName": "COLEMAN",
      "formattedName": "Coleman",
      "ocrAvailable": false
    },
    "ELECTROLUX": {
      "apiName": "ELECTROLUX",
      "formattedName": "Electrolux",
      "ocrAvailable": true
    },
    "HOTPOINT": {
      "apiName": "HOTPOINT",
      "formattedName": "Hotpoint",
      "ocrAvailable": true
    },
    "ADMIRAL": {
      "apiName": "ADMIRAL",
      "formattedName": "Admiral",
      "ocrAvailable": true
    },
    "BRAVOS": {
      "apiName": "BRAVOS",
      "formattedName": "Bravos",
      "ocrAvailable": true
    },
    "CALORIC": {
      "apiName": "CALORIC",
      "formattedName": "Caloric",
      "ocrAvailable": true
    },
    "CROSLEY": {
      "apiName": "CROSLEY",
      "formattedName": "Crosley",
      "ocrAvailable": true
    },
    "GLENWOOD": {
      "apiName": "GLENWOOD",
      "formattedName": "Glenwood",
      "ocrAvailable": true
    },
    "HARDWICK": {
      "apiName": "HARDWICK",
      "formattedName": "Hardwick",
      "ocrAvailable": true
    },
    "IMPERIAL": {
      "apiName": "IMPERIAL",
      "formattedName": "Imperial",
      "ocrAvailable": true
    },
    "MAYCOR": {
      "apiName": "MAYCOR",
      "formattedName": "Maycor",
      "ocrAvailable": true
    },
    "MAGICCHEF": {
      "apiName": "MAGICCHEF",
      "formattedName": "Magic Chef",
      "ocrAvailable": true
    },
    "MENUMASTER": {
      "apiName": "MENUMASTER",
      "formattedName": "Menumaster",
      "ocrAvailable": true
    },
    "NEPTUNE": {
      "apiName": "NEPTUNE",
      "formattedName": "Neptune",
      "ocrAvailable": true
    },
    "LITTON": {
      "apiName": "LITTON",
      "formattedName": "Litton",
      "ocrAvailable": true
    },
    "MODERNMAID": {
      "apiName": "MODERNMAID",
      "formattedName": "Modern Maid",
      "ocrAvailable": true
    },
    "NORGE": {
      "apiName": "NORGE",
      "formattedName": "Norge",
      "ocrAvailable": true
    },
    "SPEEDQUEEN": {
      "apiName": "SPEEDQUEEN",
      "formattedName": "Speed Queen",
      "ocrAvailable": true
    },
    "SUNRAY": {
      "apiName": "SUNRAY",
      "formattedName": "Sunray",
      "ocrAvailable": true
    },
    "ROPER": {
      "apiName": "ROPER",
      "formattedName": "Roper",
      "ocrAvailable": true
    },
    "ESTATE": {
      "apiName": "ESTATE",
      "formattedName": "Estate",
      "ocrAvailable": true
    },
    "NORCOLD": {
      "apiName": "NORCOLD",
      "formattedName": "Norcold",
      "ocrAvailable": true
    },
    "PARTNERSPLUS": {
      "apiName": "PARTNERSPLUS",
      "formattedName": "Partners Plus",
      "ocrAvailable": true
    },
    "CONQUEST": {
      "apiName": "CONQUEST",
      "formattedName": "Conquest",
      "ocrAvailable": true
    },
    "COOLERATOR": {
      "apiName": "COOLERATOR",
      "formattedName": "Coolerator",
      "ocrAvailable": true
    },
    "CRYSTALTIPS": {
      "apiName": "CRYSTALTIPS",
      "formattedName": "Crystal Tips",
      "ocrAvailable": true
    },
    "HAMPTONBAY": {
      "apiName": "HAMPTONBAY",
      "formattedName": "Hampton Bay",
      "ocrAvailable": true
    },
    "JORDAN": {
      "apiName": "JORDAN",
      "formattedName": "Jordan",
      "ocrAvailable": true
    },
    "RCA": {
      "apiName": "RCA",
      "formattedName": "RCA",
      "ocrAvailable": true
    },
    "ASKO": {
      "apiName": "ASKO",
      "formattedName": "Asko",
      "ocrAvailable": false
    },
    "DACOR": {
      "apiName": "DACOR",
      "formattedName": "Dacor",
      "ocrAvailable": false
    },
    "PREMIERE": {
      "apiName": "PREMIERE",
      "formattedName": "Premiere",
      "ocrAvailable": false
    },
    "THERMADOR": {
      "apiName": "THERMADOR",
      "formattedName": "Thermador",
      "ocrAvailable": true
    },
    "TAPPAN": {
      "apiName": "TAPPAN",
      "formattedName": "Tappan",
      "ocrAvailable": false
    },
    "AMERICANSTANDARD": {
      "apiName": "AMERICANSTANDARD",
      "formattedName": "American Standard",
      "ocrAvailable": false
    },
    "FIRSTCO": {
      "apiName": "FIRSTCO",
      "formattedName": "First Co",
      "ocrAvailable": false
    },
    "KELVINATOR": {
      "apiName": "KELVINATOR",
      "formattedName": "Kelvinator",
      "ocrAvailable": false
    },
    "JANITROL": {
      "apiName": "JANITROL",
      "formattedName": "Janitrol",
      "ocrAvailable": false
    },
    "FISHERANDPAYKEL": {
      "apiName": "FISHERANDPAYKEL",
      "formattedName": "Fisher & Paykel",
      "ocrAvailable": false
    },
    "GIBSON": {
      "apiName": "GIBSON",
      "formattedName": "Gibson",
      "ocrAvailable": true
    },
    "GAGGENAU": {
      "apiName": "GAGGENAU",
      "formattedName": "Gaggenau",
      "ocrAvailable": true
    },
    "INGLIS": {
      "apiName": "INGLIS",
      "formattedName": "Inglis",
      "ocrAvailable": true
    },
    "WHITEWESTINGHOUSE": {
      "apiName": "WHITEWESTINGHOUSE",
      "formattedName": "White Westinghouse",
      "ocrAvailable": true
    },
    "WESTINGHOUSE": {
      "apiName": "WESTINGHOUSE",
      "formattedName": "Westinghouse",
      "ocrAvailable": false
    },
    "NORTEK": {
      "apiName": "NORTEK",
      "formattedName": "Nortek",
      "ocrAvailable": false
    },
    "CABRIO": {
      "apiName": "CABRIO",
      "formattedName": "Cabrio",
      "ocrAvailable": true
    },
    "HISENSE": {
      "apiName": "HISENSE",
      "formattedName": "Hisense",
      "ocrAvailable": false
    },
    "AMERICANA": {
      "apiName": "AMERICANA",
      "formattedName": "Americana",
      "ocrAvailable": true
    },
    "ALLIANCE": {
      "apiName": "ALLIANCE",
      "formattedName": "Alliance Laundry",
      "ocrAvailable": true
    },
    "DANBY": {
      "apiName": "DANBY",
      "formattedName": "Danby",
      "ocrAvailable": true
    },
    "CAFE": {
      "apiName": "CAFE",
      "formattedName": "Cafe",
      "ocrAvailable": true
    },
    "HAIER": {
      "apiName": "HAIER",
      "formattedName": "Haier",
      "ocrAvailable": true
    },
    "VIZIO": {
      "apiName": "VIZIO",
      "formattedName": "Vizio",
      "ocrAvailable": true
    }
  }
}
/api/list/makes/ocr

{
  "makes": [
    "LG",
    "FRIGIDAIRE",
    "GIBSON",
    "WHITEWESTINGHOUSE",
    "ELECTROLUX",
    "GE",
    "HOTPOINT",
    "RCA",
    "AMERICANA",
    "CAFE",
    "HAIER",
    "SAMSUNG",
    "WHIRLPOOL",
    "KITCHENAID",
    "MAYTAG",
    "AMANA",
    "JENNAIR",
    "ADMIRAL",
    "BRAVOS",
    "CALORIC",
    "CROSLEY",
    "GLENWOOD",
    "HARDWICK",
    "IMPERIAL",
    "INGLIS",
    "MAYCOR",
    "MAGICCHEF",
    "MENUMASTER",
    "NEPTUNE",
    "LITTON",
    "MODERNMAID",
    "NORGE",
    "SUNRAY",
    "ROPER",
    "ESTATE",
    "NORCOLD",
    "PARTNERSPLUS",
    "CONQUEST",
    "COOLERATOR",
    "CRYSTALTIPS",
    "HAMPTONBAY",
    "JORDAN",
    "CABRIO",
    "SPEEDQUEEN",
    "ALLIANCE",
    "BOSCH",
    "THERMADOR",
    "GAGGENAU",
    "KENMORE",
    "VIZIO",
    "DANBY",
    "TRANE"
  ]
}
/api/list/makes

{
  "makes": [
    "WHIRLPOOL",
    "FRIGIDAIRE",
    "BOSCH",
    "GE",
    "SAMSUNG",
    "LG",
    "KENMORE",
    "CARRIER",
    "LENNOX",
    "KITCHENAID",
    "MAYTAG",
    "AMANA",
    "RHEEM",
    "TRANE",
    "COMFORTMAKER",
    "YORK",
    "PAYNE",
    "GOODMAN",
    "HEIL",
    "PEERLESS",
    "PINNACLE",
    "PUREFIRE",
    "JENNAIR",
    "DUCANE",
    "RUUD",
    "VIKING",
    "BRYANT",
    "STATE",
    "ICP",
    "NORDYNE",
    "AOSMITH",
    "BRADFORDWHITE",
    "COLEMAN",
    "ELECTROLUX",
    "HOTPOINT",
    "ADMIRAL",
    "BRAVOS",
    "CALORIC",
    "CROSLEY",
    "GLENWOOD",
    "HARDWICK",
    "IMPERIAL",
    "MAYCOR",
    "MAGICCHEF",
    "MENUMASTER",
    "NEPTUNE",
    "LITTON",
    "MODERNMAID",
    "NORGE",
    "SPEEDQUEEN",
    "SUNRAY",
    "ROPER",
    "ESTATE",
    "NORCOLD",
    "PARTNERSPLUS",
    "CONQUEST",
    "COOLERATOR",
    "CRYSTALTIPS",
    "HAMPTONBAY",
    "JORDAN",
    "RCA",
    "ASKO",
    "DACOR",
    "PREMIERE",
    "THERMADOR",
    "TAPPAN",
    "AMERICANSTANDARD",
    "FIRSTCO",
    "KELVINATOR",
    "JANITROL",
    "FISHERANDPAYKEL",
    "GIBSON",
    "GAGGENAU",
    "INGLIS",
    "WHITEWESTINGHOUSE",
    "WESTINGHOUSE",
    "NORTEK",
    "CABRIO",
    "HISENSE",
    "AMERICANA",
    "ALLIANCE",
    "DANBY",
    "CAFE",
    "HAIER",
    "VIZIO"
  ]
}

Copyright homespy.io 2024