Integrate millions of arrest records, sex offender data, court records, and address geocoding into your application in minutes
Simple REST API • JSON Responses • 4 Endpoints • 7 Code Languages • Pay-As-You-Go
Get started in under 5 minutes with our copy-paste code examples. No complex setup, no SDKs to install - just make HTTP requests and get JSON responses.
Criminal Records search across 4 databases + Address Geocoding API. Query Sex Offender Registry, DOC, Arrest, and Court Records, plus validate and geocode addresses.
Just add your API key and secret to request headers. No OAuth flows, no tokens to manage - authentication is straightforward and secure.
No monthly fees or subscriptions. Pay $0.01 per API call (1 credit = 1 search). Scale up or down as needed with no commitment.
Detailed docs with examples in PHP, Python, JavaScript, and cURL. Every parameter explained, every response field documented.
100 requests per minute per API key. Need more? Contact us for enterprise rates. Built to handle high-volume applications.
Filter by name, state, city, age, or specify which databases to search. Control response size with limit parameters.
Track API usage, monitor remaining credits, and view call history in your dashboard. Know exactly how your API is being used.
Make API calls directly from browsers. Perfect for web applications, Chrome extensions, and client-side JavaScript apps.
Copy, paste, and start searching in seconds. Examples work right out of the box!
curl -X GET "https://unlimitedcriminalchecks.com/api-2.0/search.php?first_name=John&last_name=Smith&state=CA" \
-H "X-API-Key: your_api_key_here" \
-H "X-API-Secret: your_api_secret_here"
<?php
// Replace with your actual API credentials
$apiKey = 'your_api_key_here';
$apiSecret = 'your_api_secret_here';
// Search parameters
$params = [
'first_name' => 'John',
'last_name' => 'Smith',
'state' => 'CA',
'limit' => 100
];
// Initialize cURL
$ch = curl_init('https://unlimitedcriminalchecks.com/api-2.0/search.php?' . http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . $apiKey,
'X-API-Secret: ' . $apiSecret
]);
// Execute request
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Parse JSON response
$data = json_decode($response, true);
// Handle response
if ($httpCode === 200 && $data['success']) {
echo "Found {$data['results']['total']} total records\n";
echo "Credits remaining: {$data['credits']['remaining']}\n\n";
// Process results
foreach ($data['results']['sor']['records'] as $record) {
echo "{$record['NAME']} - {$record['CITY']}, {$record['STATE']}\n";
}
} else {
echo "Error: {$data['message']}\n";
}
?>
import requests
# Replace with your actual API credentials
api_key = 'your_api_key_here'
api_secret = 'your_api_secret_here'
# API endpoint
url = 'https://unlimitedcriminalchecks.com/api-2.0/search.php'
# Headers with authentication
headers = {
'X-API-Key': api_key,
'X-API-Secret': api_secret
}
# Search parameters
params = {
'first_name': 'John',
'last_name': 'Smith',
'state': 'CA',
'limit': 100
}
# Make API request
response = requests.get(url, headers=headers, params=params)
data = response.json()
# Handle response
if response.status_code == 200 and data['success']:
print(f"Found {data['results']['total']} total records")
print(f"Credits remaining: {data['credits']['remaining']}\n")
# Process results
for record in data['results']['sor']['records']:
print(f"{record['NAME']} - {record['CITY']}, {record['STATE']}")
else:
print(f"Error: {data['message']}")
// Replace with your actual API credentials
const apiKey = 'your_api_key_here';
const apiSecret = 'your_api_secret_here';
// Build query string
const params = new URLSearchParams({
first_name: 'John',
last_name: 'Smith',
state: 'CA',
limit: 100
});
// Make API request
fetch(`https://unlimitedcriminalchecks.com/api-2.0/search.php?${params}`, {
method: 'GET',
headers: {
'X-API-Key': apiKey,
'X-API-Secret': apiSecret
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
console.log(`Found ${data.results.total} total records`);
console.log(`Credits remaining: ${data.credits.remaining}`);
// Process results
data.results.sor.records.forEach(record => {
console.log(`${record.NAME} - ${record.CITY}, ${record.STATE}`);
});
} else {
console.error(`Error: ${data.message}`);
}
})
.catch(error => {
console.error('Request failed:', error);
});
const axios = require('axios');
// Replace with your actual API credentials
const apiKey = 'your_api_key_here';
const apiSecret = 'your_api_secret_here';
// API configuration
const config = {
method: 'get',
url: 'https://unlimitedcriminalchecks.com/api-2.0/search.php',
headers: {
'X-API-Key': apiKey,
'X-API-Secret': apiSecret
},
params: {
first_name: 'John',
last_name: 'Smith',
state: 'CA',
limit: 100
},
timeout: 30000
};
// Make API request
axios(config)
.then(response => {
const data = response.data;
if (data.success) {
console.log(`Found ${data.results.total} total records`);
console.log(`Credits remaining: ${data.credits.remaining}\n`);
// Process results by type
['sor','doc','arrest','court'].forEach(type => {
if (data.results[type]?.records?.length) {
console.log(`\n${type.toUpperCase()} Records:`);
data.results[type].records.forEach(r => {
console.log(` ${r.NAME} - ${r.CITY}, ${r.STATE}`);
});
}
});
} else {
console.error(`Error: ${data.message}`);
}
})
.catch(error => {
console.error('Request failed:', error.message);
});
require 'net/http'
require 'uri'
require 'json'
# Replace with your actual API credentials
api_key = 'your_api_key_here'
api_secret = 'your_api_secret_here'
# Build request URL
uri = URI('https://unlimitedcriminalchecks.com/api-2.0/search.php')
uri.query = URI.encode_www_form(
first_name: 'John',
last_name: 'Smith',
state: 'CA',
limit: 100
)
# Create HTTP request
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.read_timeout = 30
http.open_timeout = 10
request = Net::HTTP::Get.new(uri)
request['X-API-Key'] = api_key
request['X-API-Secret'] = api_secret
# Execute request
response = http.request(request)
data = JSON.parse(response.body)
# Handle response
if response.code.to_i == 200 && data['success']
puts "Found #{data['results']['total']} total records"
puts "Credits remaining: #{data['credits']['remaining']}\n\n"
# Process SOR records
(data['results']['sor']['records'] || []).each do |rec|
puts "#{rec['NAME']} - #{rec['CITY']}, #{rec['STATE']}"
end
else
puts "Error: #{data['message']}"
end
using System;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Web;
class CriminalRecordsApi
{
private static readonly HttpClient client = new HttpClient
{
Timeout = TimeSpan.FromSeconds(30)
};
static async Task Main()
{
string apiKey = "your_api_key_here";
string apiSecret = "your_api_secret_here";
// Build query string
var query = HttpUtility.ParseQueryString(string.Empty);
query["first_name"] = "John";
query["last_name"] = "Smith";
query["state"] = "CA";
query["limit"] = "100";
string url = $"https://unlimitedcriminalchecks.com/api-2.0/search.php?{query}";
// Create request with auth headers
using var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Add("X-API-Key", apiKey);
request.Headers.Add("X-API-Secret", apiSecret);
// Execute request
var response = await client.SendAsync(request);
string body = await response.Content.ReadAsStringAsync();
var data = JsonDocument.Parse(body).RootElement;
if (response.IsSuccessStatusCode && data.GetProperty("success").GetBoolean())
{
int total = data.GetProperty("results").GetProperty("total").GetInt32();
Console.WriteLine($"Found {total} total records");
// Iterate SOR records
var sorRecords = data.GetProperty("results").GetProperty("sor").GetProperty("records");
foreach (var rec in sorRecords.EnumerateArray())
{
string name = rec.TryGetProperty("NAME", out var n) ? n.GetString() : "";
string city = rec.TryGetProperty("CITY", out var c) ? c.GetString() : "";
string state = rec.TryGetProperty("STATE", out var s) ? s.GetString() : "";
Console.WriteLine($" {name} - {city}, {state}");
}
}
else
{
string msg = data.TryGetProperty("message", out var m) ? m.GetString() : "Unknown error";
Console.WriteLine($"Error: {msg}");
}
}
}
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"time"
)
const (
apiKey = "your_api_key_here"
apiSecret = "your_api_secret_here"
)
type APIResponse struct {
Success bool `json:"success"`
Results struct {
Total int `json:"total"`
SOR struct {
Count int `json:"count"`
Records []map[string]interface{} `json:"records"`
} `json:"sor"`
} `json:"results"`
Credits struct {
Used int `json:"used"`
Remaining int `json:"remaining"`
} `json:"credits"`
Message string `json:"message"`
}
func main() {
client := &http.Client{Timeout: 30 * time.Second}
// Build URL with query parameters
params := url.Values{}
params.Set("first_name", "John")
params.Set("last_name", "Smith")
params.Set("state", "CA")
params.Set("limit", "100")
endpoint := "https://unlimitedcriminalchecks.com/api-2.0/search.php?" + params.Encode()
req, _ := http.NewRequest("GET", endpoint, nil)
req.Header.Set("X-API-Key", apiKey)
req.Header.Set("X-API-Secret", apiSecret)
resp, err := client.Do(req)
if err != nil {
fmt.Printf("Request error: %v\n", err)
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var data APIResponse
json.Unmarshal(body, &data)
if data.Success {
fmt.Printf("Found %d total records\n", data.Results.Total)
for _, rec := range data.Results.SOR.Records {
fmt.Printf(" %v - %v, %v\n", rec["NAME"], rec["CITY"], rec["STATE"])
}
} else {
fmt.Printf("Error: %s\n", data.Message)
}
}
From tenant screening apps to background check platforms — our API powers a wide range of legal and safety applications.
Screen prospective tenants for criminal history, sex offender status, and arrest records automatically before lease signing.
Integrate criminal background screening into HR workflows and applicant tracking systems (with proper FCRA authorization).
Help users verify the safety of people they meet online by checking for sex offender registration and violent crime history.
Screen volunteers, teachers, and childcare workers against sex offender registries and criminal records databases.
Build community safety features that show nearby registered sex offenders and recent arrests mapped to addresses.
Cross-reference identity claims with public criminal records to flag discrepancies during onboarding or KYC processes.
Screen drivers, delivery workers, home services contractors, or hosts against criminal and offender databases before approval.
Build investigative tools, case management software, or legal research applications backed by comprehensive public record data.
Access 4 major databases in a single API call
Nationwide sex offender records with offense details, addresses, and physical descriptions
Prison and corrections records including inmate information, sentences, and release dates
Recent arrest data with charges, booking information, and mugshot photos
Public court filings, case information, and legal proceedings
Convert addresses to coordinates and get detailed location data
Address → Lat/Long
Standardized format
Parsed address data
/api-2.0/address-lookup.php?address=1600+Pennsylvania+Ave+Washington+DC
{
"success": true,
"version": "2.0",
"query": {
"first_name": "John",
"last_name": "Smith",
"state": "CA",
"city": null,
"age": null,
"feeds": ["sor", "doc", "arrest", "court"]
},
"results": {
"total": 45,
"sor": {
"count": 12,
"records": [
{
"NAME": "John Smith",
"AGE": 45,
"STATE": "CA",
"CITY": "Los Angeles",
"ADDRESS": "123 Main St",
"OFFENSE": "...",
"..."
}
]
},
"doc": { "count": 15, "records": [...] },
"arrest": { "count": 10, "records": [...] },
"court": { "count": 8, "records": [...] }
},
"credits": {
"used": 1,
"remaining": 9999
},
"meta": {
"execution_time_ms": 234,
"timestamp": "2025-11-20T10:30:45+00:00",
"api_key_name": "Production API"
}
}
1 Credit = 1 API Search — Pay only for what you use
New accounts get 25 free credits to test the API
v2.0. The base URL is https://unlimitedcriminalchecks.com/api-2.0/. Available endpoints are /api-2.0/search.php for criminal records search and /api-2.0/address-lookup.php for address geocoding.state parameter entirely to search all states simultaneously. Specifying state=CA limits results to California. You cannot pass a comma-separated list of states; for multi-state targeted searches, make separate requests per state.feeds parameter to restrict which databases are queried (e.g., feeds=sor,arrest).429 Too Many Requests with a retry_after field specifying seconds to wait. For enterprise-level limits above 100 req/min, contact our team.Join hundreds of developers using our API to power their applications
Questions? Contact our developer support team