API v2.0 — Production Ready

Criminal Records API for Developers

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

4
Data Sources
2
Endpoints
100/min
Rate Limit
$0.01
Per Search
7
Code Examples
99.9%
Uptime SLA

Why Developers Love Our API

Lightning Fast Integration

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.

Multiple Powerful Endpoints

Criminal Records search across 4 databases + Address Geocoding API. Query Sex Offender Registry, DOC, Arrest, and Court Records, plus validate and geocode addresses.

Simple Authentication

Just add your API key and secret to request headers. No OAuth flows, no tokens to manage - authentication is straightforward and secure.

Pay Only For What You Use

No monthly fees or subscriptions. Pay $0.01 per API call (1 credit = 1 search). Scale up or down as needed with no commitment.

Comprehensive Documentation

Detailed docs with examples in PHP, Python, JavaScript, and cURL. Every parameter explained, every response field documented.

High Rate Limits

100 requests per minute per API key. Need more? Contact us for enterprise rates. Built to handle high-volume applications.

Flexible Filtering

Filter by name, state, city, age, or specify which databases to search. Control response size with limit parameters.

Real-Time Analytics

Track API usage, monitor remaining credits, and view call history in your dashboard. Know exactly how your API is being used.

CORS Enabled

Make API calls directly from browsers. Perfect for web applications, Chrome extensions, and client-side JavaScript apps.

Ready-to-Use Code Examples

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)
	}
}

What Developers Build With Our API

From tenant screening apps to background check platforms — our API powers a wide range of legal and safety applications.

Tenant Screening Platforms

Screen prospective tenants for criminal history, sex offender status, and arrest records automatically before lease signing.

Employment Background Checks

Integrate criminal background screening into HR workflows and applicant tracking systems (with proper FCRA authorization).

Dating Safety Apps

Help users verify the safety of people they meet online by checking for sex offender registration and violent crime history.

Childcare & School Vetting

Screen volunteers, teachers, and childcare workers against sex offender registries and criminal records databases.

Neighborhood Safety Tools

Build community safety features that show nearby registered sex offenders and recent arrests mapped to addresses.

Identity Verification

Cross-reference identity claims with public criminal records to flag discrepancies during onboarding or KYC processes.

Real Estate & Gig Economy

Screen drivers, delivery workers, home services contractors, or hosts against criminal and offender databases before approval.

Law Enforcement & Legal Tools

Build investigative tools, case management software, or legal research applications backed by comprehensive public record data.

Multiple API Endpoints for Different Needs

Criminal Records Search API

Access 4 major databases in a single API call

Sex Offender Registry

Nationwide sex offender records with offense details, addresses, and physical descriptions

Department of Corrections

Prison and corrections records including inmate information, sentences, and release dates

Arrest Records

Recent arrest data with charges, booking information, and mugshot photos

Court Records

Public court filings, case information, and legal proceedings


Address Lookup / Geocoding API

Convert addresses to coordinates and get detailed location data

Geocoding

Address → Lat/Long

Normalization

Standardized format

Components

Parsed address data

Use Cases:

  • Map criminal records to geographic coordinates
  • Validate and normalize user-entered addresses
  • Build location-based search features
  • Calculate distances between addresses
  • Enrich your database with geocoded data
Endpoint: /api-2.0/address-lookup.php
Cost: 1 credit per lookup
Example: ?address=1600+Pennsylvania+Ave+Washington+DC

Clean, Structured JSON Responses

{
  "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"
  }
}

Simple, Transparent Pricing

Pay-As-You-Go

$0.01 / search

1 Credit = 1 API Search — Pay only for what you use

$0.010
Per Search
1 – 999 credits
$0.008
Per Search
1,000 – 9,999
$0.006
Per Search
10,000 – 49,999
Custom
Enterprise
50,000+ / mo
  • No monthly fees or subscriptions
  • No setup costs or hidden charges
  • 100 requests per minute rate limit
  • Search all 4 databases in one call
  • Unlimited API keys per account
  • Real-time usage analytics
  • Credits never expire
  • 99.9% uptime SLA
  • CORS enabled for browser apps
Get Started Free

New accounts get 25 free credits to test the API

Frequently Asked Questions

Create a free account at UnlimitedCriminalChecks.com, go to your Dashboard, and generate an API key. New accounts receive 25 free credits to test the API. Copy your API key and secret, then make your first request using any of the code examples above.
The current stable version is 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.
Each successful API call consumes exactly 1 credit regardless of the number of records returned. A search returning 0 results still consumes 1 credit. Failed requests due to invalid parameters or authentication errors do not consume credits. Credits never expire and carry over indefinitely.
Yes — omit the 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.
The criminal records search API queries 4 databases in a single call: Sex Offender Registry (SOR), Department of Corrections (DOC), Arrest Records, and Court Records. Use the feeds parameter to restrict which databases are queried (e.g., feeds=sor,arrest).
The default rate limit is 100 requests per minute per API key. If exceeded, the API returns HTTP 429 Too Many Requests with a retry_after field specifying seconds to wait. For enterprise-level limits above 100 req/min, contact our team.
Yes, CORS is enabled for all API endpoints. You can make requests directly from browser-based JavaScript applications. However, keep in mind that embedding your API secret in client-side code exposes it — for production browser apps, proxy requests through your own backend server.
Yes. The data is for informational and personal safety purposes only. Using API data for employment decisions, tenant screening, or credit decisions triggers FCRA compliance requirements and requires proper authorization. You may not use the data for harassment, stalking, or any purpose that violates federal or state law. Review our Terms of Service for full details.

Start Building in Minutes

Join hundreds of developers using our API to power their applications

Sign Up Free

Questions? Contact our developer support team