Appearance
Instant Criminal Search API
The Instant Criminal Search API performs a real-time search of criminal records across national and state-level databases. By default the request waits and returns the results. Add a webhookUrl to run the search in the background instead and have the finished results sent to you; see Webhooks.
Authentication
All requests require an API key passed as a Bearer token in the Authorization header:
Authorization: Bearer your-api-keyA missing or invalid key returns 403 with an empty body.
Endpoints
| Method | Path | Description |
|---|---|---|
POST | /instantcrim/search | Run and save a search |
POST | /instantcrim/search/{id}/reprocess | Reprocess a search |
Request Body
The request body is a JSON object with the following top-level fields:
| Field | Type | Required | Description |
|---|---|---|---|
clientRequestId | String (≤36 chars) | No | Client-supplied correlation ID included in the response. A longer value returns 400 |
subject | Object | Yes | The person to search for. See Subject Parameters |
options | Object | No | Search behavior options. See Search Options |
addressTrace | Object | No | Run a Screening Address Trace before the criminal search and include its aliases. See Search with Address Trace |
userId | String (numeric) | No | Console-only user attribution. Accepted only from an account's protected Console credential (403 otherwise); a non-numeric value returns 400. Omit from ordinary API integrations |
productId | String (numeric) | Conditional | The instant-criminal product to bill this search against. Required only when the account is entitled to more than one instant-criminal product (400 otherwise) |
webhookUrl | String (≤2048 chars) | No | Run the search in the background and send the finished response to this https URL. The immediate reply is 202 with status: processing. See Webhooks |
Unknown request fields are ignored. A request that is not valid JSON, or whose fields have the wrong type, returns 400 with an errors.request message.
Subject Parameters
| Field | Type | Required | Description |
|---|---|---|---|
subject.name | Object | Yes | Name object is required, including for an SSN-only address trace |
subject.name.firstName | String | Yes | Subject's first name; may be empty for an SSN-only address trace |
subject.name.lastName | String | null | Yes | Subject's last name; may be null for an SSN-only address trace |
subject.name.middleName | String | No | Subject's middle name |
subject.name.suffix | String | No | Name suffix (e.g., Jr, Sr, III) |
subject.birthDate.year | Integer (4-digit) | No | Birth year |
subject.birthDate.month | Integer (1–12) | No | Birth month |
subject.birthDate.day | Integer (1–31) | No | Birth day |
subject.alias | Array of name objects | No | Up to 12 alternate names, using the same name fields as subject.name |
subject.ssn | String | No | Full SSN for an address trace: nine digits or NNN-NN-NNNN; send as a string to preserve leading zeros. It is never saved or echoed; the response keeps only its last four digits for a search with an address trace, and omits it otherwise |
The month and day ranges are validated only for a search with an address trace that has no SSN; a negative value is always rejected. Birth date rules in options.birthDate and options.sexOffender apply only when subject.birthDate has at least one part; without one, records are matched on name alone.
A search without addressTrace requires a nonblank last name. An address trace requires either a full SSN or a nonblank first and last name with a complete, valid date of birth. See Search with Address Trace for examples.
Search Options
Name Matching
| Field | Type | Default | Description |
|---|---|---|---|
options.firstNameExactMatch | Boolean | false | When true, only returns records where the first name is an exact match |
options.lastNameExactMatch | Boolean | false | When true, only returns records where the last name is an exact match |
options.middleNameMatchOnInitial | Boolean | false | When true, requires the middle name to match on its first character (records with no middle name on file still match), and prioritizes those matches in ranking. When false, middle name has no effect on which records are returned, though a matching middle name still raises a record's ranking |
options.firstNameTruncation | Integer | 0 | Deprecated. Keeps only this many leading characters of the first name when matching; 0 uses the whole name |
options.lastNameTruncation | Integer | 0 | Deprecated. The same for the last name |
options.lastNameParsePunctuation | Boolean | true | Deprecated and ignored |
When an exact-match option is false, the name is matched by prefix: a search for Rob also matches Robert. The deprecated options appear in the echoed request.options whenever options is sent.
Birth Date Options
| Field | Type | Default | Description |
|---|---|---|---|
options.birthDate.includeIncomplete | Boolean | false | Include records with an incomplete (partial) date of birth |
options.birthDate.includePartial | Boolean | false | Include records where only some DOB components match |
options.birthDate.includeNull | Boolean | false | Include records that have no date of birth. A null-DOB record must additionally match the subject's first and last name exactly (or an alias exactly) — a partial/truncated name match is not enough |
options.birthDate.yearRange | Integer | 0 | Widen the birth-year match to year ± N instead of requiring an exact year. Not range checked: a negative value acts as 0, and the lowest year searched is 1902 |
options.birthDate.excludeNullStates | Array of strings | null | When includeNull is true, drop null-DOB records whose state is in this list (sex-offender-registry records are always exempt from this exclusion). States compare without regard to case, using the source's state when the record has none |
When a search includes an address trace, incomplete-DOB matches are narrowed to states found in the trace. Null-DOB matches from county-scoped sources are narrowed to counties derived from trace addresses when ZIP evidence is available; sources without county scope still pass this geography check. These checks are automatic and do not affect complete-DOB matches or searches without an address trace.
Sex Offender Options
A separate set of birth-date rules applied only to sex-offender-registry records (source category sex-offender), overriding the standard Birth Date Options for those records only. Off by default, so a request that omits this object matches registry records with the same rules as everything else.
| Field | Type | Default | Description |
|---|---|---|---|
options.sexOffender.useSpecific | Boolean | false | When true, sex-offender-registry records are matched against options.sexOffender.birthDate instead of the standard options.birthDate rules |
options.sexOffender.birthDate | Object | null | Same shape as Birth Date Options (includeIncomplete, includePartial, includeNull, yearRange, excludeNullStates), applied to registry records only. If useSpecific is true but this is omitted, the standard rules apply |
options.sexOffender.includeNationalSexOffender | Boolean | false | When true, sex-offender-registry sources bypass options.states and are included nationally, as watchlist sources are |
Geographic & Source Filtering
| Field | Type | Description |
|---|---|---|
options.states | Array of strings | Limit results to specific state codes (e.g., ["NY", "CA", "TX"]). States compare without regard to case, using the source's state when the record has none. Watchlist sources are not state-scoped and are always included |
options.sources.include | Array of strings | Include only these source categories |
options.sources.exclude | Array of strings | Exclude these source categories |
options.sources.sourceId | Array of strings | Target specific data source IDs directly |
The source categories are arrest, court, doc, inmate, sex-offender, warrant, and watchlist. The special source type criminal expands to court, doc, inmate, and sex-offender. The earlier spelling sexoffender is still accepted in requests. An unknown value is not rejected; it simply matches nothing.
Search with Address Trace
Set addressTrace to an object, including {} for default filters, to run SAT before the criminal search. SAT supplies names and aliases to widen the criminal search; the combined response contains both the address trace and criminal results. The account must have SAT enabled. The trace and criminal search are billed separately when both run; if the trace supplies no usable name, only the trace runs and is billed. Creating another search can incur another charge.
| Field | Type | Default | Description |
|---|---|---|---|
addressTrace.includePartialNames | Boolean | true | Include trace names where either first or last name matches |
addressTrace.includeNonMatchingNames | Boolean | false | Include trace names where neither first nor last name matches |
addressTrace.addressYears | Integer | null | null | Limit trace address history to the past 1–9999 years; null includes all available years |
These are the same filters used by the standalone SAT endpoint. The trace's filtered names and address history determine which aliases and geographic evidence the criminal search uses. Trace names are listed first, then caller-supplied aliases; duplicates (ignoring case) and entries equal to the primary name are dropped, and the list is capped at 12, so caller aliases can be pushed out when the trace finds many names. If address trace is not configured for the server, the request returns 503.
Send a full SSN as subject.ssn, or supply subject.name.firstName, subject.name.lastName, and all three subject.birthDate components. A nonblank SSN must have nine digits, with optional NNN-NN-NNNN formatting; an invalid SSN does not fall back to name and DOB. Without an SSN, DOB must be a real, nonfuture date. With an SSN, a missing or partial DOB is permitted. The full SSN is never echoed or saved in the request; the response contains at most its last four digits.
Birth date
The trace usually reports several birth dates for a person. The criminal search uses your subject.birthDate, with any part you left out (year, month, or day) filled in from the trace's best compatible date, so an SSN-only search still queries with a date of birth. Parts you supply always win, and a complete date is used as given. Trace people whose birth dates conflict with the resolved date are left out of the aliases and address evidence; a options.birthDate.yearRange widens what counts as compatible. The resolved birth date is returned in request.subject.birthDate.
The resolved birth date and the merged aliases are fixed once the search has run. They cannot be changed afterwards, including by reprocessing. To search with a different birth date, run a new Smart Search.
Response
The response contains a normalized representation of the request and a fixed-limit result set. Default values may appear in the echoed request even when omitted by the caller.
Top-Level Response Fields
| Field | Type | Description |
|---|---|---|
request | Object | Request used for the search, including aliases found by SAT when applicable; a full SSN is reduced to its last four digits |
searchId | String | The id this search was persisted under - fetch it later, or use it as the id in Reprocessing a Search |
uuid | String | Search identifier that is also the webhook-id of a webhook delivery. Accepted in place of searchId in reprocess URLs |
status | String | completed for a finished search. A search placed with a webhookUrl replies processing first; a search that could not be completed is error |
message | String | Optional explanation for a processing or error status |
addressTrace | Object | SAT result when addressTrace was requested (also on a reprocess of such a search); has the same shape as a standalone SAT response |
result.offset | Integer | Always 0. The API has no paging inputs |
result.limit | Integer | Maximum records returned: 500 for a finished search. The processing reply and the response of a trace that supplied no name show an unused default of 100 |
result.hasMore | Boolean | Whether more records matched than were returned. It is decided after filtering a candidate window of about 1,000 rows, so treat it as a best-effort indicator. |
result.size | Integer | Number of records in this response |
result.data | Array | Array of criminal result objects |
Criminal Result Fields
Each object in result.data includes:
| Field | Type | Description |
|---|---|---|
sourceId | String | Identifier of the data source |
sourceTitle | String | Display name of the data source |
subCountry | String | State or sub-country code for this source, lowercase (for example ny); may be empty |
offenderId | String | Unique offender identifier within the source |
name | Object | Matched name (firstName, lastName, middleName, suffix) |
birthDate | Object | Matched birth date components |
sourceCategory | String | null | The source's category, such as court, doc, inmate, or sex-offender |
matchQuality | Object | Quality of match. See Match Quality |
offender | Object | Full offender record from the source; omitted if unavailable. See Offender Fields |
offenses | Array | List of offense records. See Offense Fields |
Match Quality
| Field | Type | Description |
|---|---|---|
isExactNameMatch | Boolean | Both first and last name matched exactly |
isExactBirthDateMatch | Boolean | All provided DOB components matched. A year within options.birthDate.yearRange of the requested year also counts |
isPartialBirthDateMatch | Boolean | At least one DOB component matched. It is also true for an exact match, so use isExactBirthDateMatch to tell them apart |
birthDateSupplied | Boolean | false when the search had no birth date, so the two flags above carry no meaning |
Result Ordering
result.data is ordered by birth-date match first, then by name:
| Tier | Birth-date match |
|---|---|
| 4 | All provided DOB components match |
| 3 | At least two components match |
| 2 | The year matches (including yearRange) |
| 1 | The record has no date of birth |
| 0 | Anything else, such as only the month or day matching |
Within a tier, an exact year match ranks above a yearRange neighbour, then the name-match score (first, last, and middle), an exact alias match, and finally sourceId and offender. A search that supplies no date of birth ties on the first key and sorts by name alone. When more records match than result.limit, this ordering determines which are dropped, so the strongest matches are the ones kept.
Offender Fields
The offender object contains the normalized source record. Except for offenderId, fields are optional and omitted when unavailable.
Identity and Demographics
| Field | Type | Description |
|---|---|---|
offenderId | String | Source record identifier |
hash | String | Hash of the source offender record |
fullName | String | Full name as stored by the source |
prefix, firstName, middleName, lastName, suffix | String | Name components |
dob | String | Date of birth |
yob | Integer | Year of birth |
age | Integer | Age |
birthState | String | State of birth |
aka, akaDobs | String | Alternate names and associated birth dates |
citizenship, language, maritalStatus, militaryService | String | Background details |
Address and Physical Description
| Field | Type | Description |
|---|---|---|
fullAddress, address1, address2 | String | Primary street address fields |
city, cityStateZip, state, zip, county | String | Primary locality fields |
hair, hairLength, eye | String | Hair and eye details |
height, weight, build | String | Body measurements and build |
race, sex, skinTone | String | Demographic and appearance details |
scarsMarks, facialHair, teeth | String | Identifying physical characteristics |
Additional Addresses
| Field | Type | Description |
|---|---|---|
workAddress1, workAddress2, workCity, workState, workZip, workAddressDate | String | Work address and effective date |
schoolAddress1, schoolAddress2, schoolCity, schoolState, schoolZip, schoolAddressDate | String | School address and effective date |
otherAddress1, otherAddress2, otherCity, otherState, otherZip, otherAddressDate | String | Other address and effective date |
Offense Fields
Every offense field is optional and omitted when unavailable.
Case, Charge, and Financial Details
| Field | Type | Description |
|---|---|---|
hash | String | Hash of the source offense record |
caseNum, caseType | String | Case identifier and type |
court, courtDate | String | Court and proceeding date |
counts, plea | String | Charge count and plea |
offenseDate, offenseCode, offenseDesc1, offenseDesc2 | String | Offense date, code, and descriptions |
bail, bond, bondType | String | Bail and bond details |
fine, courtCosts, restitution | String | Financial penalties |
chargesFiledDate | String | Date charges were filed |
amendedCharge, amendedCaseType, amendedDisposition, amendedDispositionDate | String | Amended charge and disposition details |
Arrest, Warrant, and Disposition
| Field | Type | Description |
|---|---|---|
arrestDate, arrestAgency, arrestLocation | String | Arrest details |
warrantNum, warrantDate, warrantCounty, warrantState | String | Warrant details |
convictionDate, convictionPlace | String | Conviction details |
disposition, dispositionDate | String | Case disposition and date |
Sentence, Custody, and Supervision
| Field | Type | Description |
|---|---|---|
sentenceDuration, sentenceDate, sentenceSuspended | String | Sentence details |
probationDuration, probationDate | String | Probation details |
commitmentLocation, commitmentCounty, commitmentState, commitmentDate | String | Commitment details |
supervisionDate, supervisionType, supervisionCounty, supervisionState | String | Supervision details |
confineDate, releaseDate | String | Confinement and release dates |
Record Identifiers and Status
| Field | Type | Description |
|---|---|---|
bookingNum, bookingDate | String | Booking identifier and date |
fbiNum, prisonerId | String | Federal and corrections identifiers |
dcState, dcNum, ncicCode | String | Department of corrections and NCIC identifiers |
status | String | Source record status |
registrationDate, lastReportedDate, profileUpdatedDate | String | Registration and reporting dates |
comments | Array of strings | Source comments |
Reprocessing a Search
POST /instantcrim/search/{id}/reprocessRe-runs a prior search's criminal query with different options. {id} is the searchId or uuid a search response returned. For a Smart Search the address trace it already ran is reused, without re-running or re-billing it, and addressTrace is included in the response. A search that ran without an address trace is reprocessed the same way, and its response has no addressTrace. A search that has no name to query (its trace found none) returns 400 with an error under searchId. The subject's name, birth date, aliases, and any trace are fixed by the search being reprocessed; only the search options may change:
| Field | Type | Required | Description |
|---|---|---|---|
options | Object | No | Replaces the search options for this run only. Omit to reuse the original |
webhookUrl | String (≤2048 chars) | No | Run the reprocess in the background and send the finished response to this https URL. The immediate reply is 202. See Webhooks |
The response has the same shape as a normal search response, with a new searchId for the reprocessed run. Reprocessing is billed as a zero-cost line under the original search's order. It reuses the original trace and its filters, including addressTrace.addressYears; the request cannot change them. The birth date used is the one the original search resolved (see Birth date); it cannot be replaced, and a birthDate in the reprocess body is ignored. Changing the criminal search options can change the criminal results, and options.birthDate.yearRange can change which trace people count as matching the birth date.
Webhooks
Add webhookUrl to run the search in the background, with or without addressTrace, and the same on reprocess. The API saves the search and replies right away with HTTP 202 and status: processing, then sends the finished response to your URL. Without it, the request waits and returns the results.
webhookUrl must be an absolute https URL, up to 2048 characters, without embedded credentials, whose host resolves to a public address (loopback, private, link-local, multicast, carrier-grade NAT, and IPv6 unique-local addresses are refused, as is a host that cannot be resolved). An invalid URL returns 400 with an error under webhookUrl. The URL is kept only to deliver the webhook; it is not echoed in responses or stored in the saved request.
Example
bash
curl -X POST "https://api.infocusinfo.com/instantcrim/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"subject": {
"name": { "firstName": "Jane", "lastName": "Doe" }
},
"webhookUrl": "https://example.com/hooks/criminal"
}'java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var request = HttpRequest.newBuilder(URI.create("https://api.infocusinfo.com/instantcrim/search"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer your-api-key")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"subject": {
"name": { "firstName": "Jane", "lastName": "Doe" }
},
"webhookUrl": "https://example.com/hooks/criminal"
}
"""))
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());csharp
using System.Net.Http;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.infocusinfo.com/instantcrim/search");
request.Headers.Add("Authorization", "Bearer your-api-key");
request.Content = new StringContent("""
{
"subject": {
"name": { "firstName": "Jane", "lastName": "Doe" }
},
"webhookUrl": "https://example.com/hooks/criminal"
}
""", Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");http
POST https://api.infocusinfo.com/instantcrim/search
Content-Type: application/json
Authorization: Bearer your-api-key
{
"subject": {
"name": { "firstName": "Jane", "lastName": "Doe" }
},
"webhookUrl": "https://example.com/hooks/criminal"
}The reply is the saved search in the processing state. Keep its uuid:
json
{
"request": { "subject": { "name": { "firstName": "Jane", "lastName": "Doe" } } },
"result": { "offset": 0, "limit": 100, "hasMore": false, "size": 0, "data": [] },
"searchId": "18001",
"uuid": "3f2b8c1e-9d4a-4c6b-8e1f-0a1b2c3d4e5f",
"status": "processing",
"message": "The search is processing."
}Placement problems (validation, product access, account checks) are reported immediately with the usual 400, 403, 404, or 503, before anything is accepted.
When the search finishes, the API sends a POST to your URL with the same body as the create response, including status (completed or error). The request follows the Standard Webhooks specification and carries these headers:
| Header | Description |
|---|---|
webhook-id | The search's uuid. Identical on every retry, so use it to de-duplicate |
webhook-timestamp | Unix time in seconds of the attempt |
webhook-signature | v1, plus the base64 HMAC-SHA256 of {webhook-id}.{webhook-timestamp}.{raw body}, keyed with the API key that placed the search |
Respond with any 2xx status to acknowledge. Other responses, timeouts (10 seconds), and connection errors are retried after 1 minute, 5 minutes, 15 minutes, 1 hour, 4 hours, 12 hours, and 24 hours, after which the API stops. Delivery is at least once, and redirects are not followed. If the API key that placed the search has since been revoked or has expired, the delivery cannot be signed and is abandoned without retries. See Verifying a webhook for signature code samples.
A search that cannot be completed is delivered with status: error. A search that was running when the API restarted cannot be resumed (the full SSN is never stored); if it is still processing 15 minutes after it was created, it is marked error and that status is delivered. A search without a webhook that is interrupted this way is not swept and may stay processing. Searches are never re-sent to a provider automatically. Billing is unchanged: a search is billed once, when it completes.
Validation
| Validation | Details |
|---|---|
subject.name.firstName and subject.name.lastName fields are required | The name object must contain both fields, even for an SSN-only trace; use "" and null when no name is known |
| Last name without address trace | A nonblank subject.name.lastName is required |
| Address trace without SSN | A nonblank first and last name and complete, valid, nonfuture DOB are required |
| Address trace with SSN | subject.ssn must be a full nine-digit SSN; an invalid nonblank value does not fall back to name/DOB |
addressTrace.addressYears | Must be between 1 and 9999, or null for all available years |
subject.alias | No more than 12 aliases may be supplied |
clientRequestId | At most 36 characters |
webhookUrl | An absolute https URL of at most 2048 characters, without credentials, whose host resolves to a public address |
productId | Required when the account is entitled to more than one instant-criminal product |
userId | Numeric, and accepted only from the Console credential |
Validation failures return HTTP 400 with every problem at once, keyed by field:
json
{
"errors": {
"lastName": "The subject's Last Name is required.",
"clientRequestId": "Client request ID must be 36 characters or fewer."
}
}HTTP Response Codes
| Code | Description |
|---|---|
200 | The search finished. Inspect status |
202 | The search was accepted for background processing because the request included a webhookUrl |
400 | Invalid fields, an invalid webhookUrl, or malformed JSON (errors.request); includes an errors object |
403 | Missing or invalid API key, the product is not enabled for the account, or Console-only attribution is not authorized |
404 | Unknown productId, saved search not found or not owned by the account |
500 | Unexpected request failure (errors.search) |
503 | Address trace was requested but is not configured |
Examples
Basic Name Search
bash
curl -X POST "https://api.infocusinfo.com/instantcrim/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"subject": {
"name": {
"firstName": "John",
"lastName": "Smith"
}
}
}'java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var request = HttpRequest.newBuilder(URI.create("https://api.infocusinfo.com/instantcrim/search"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer your-api-key")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"subject": {
"name": {
"firstName": "John",
"lastName": "Smith"
}
}
}
"""))
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());csharp
using System.Net.Http;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.infocusinfo.com/instantcrim/search");
request.Headers.Add("Authorization", "Bearer your-api-key");
request.Content = new StringContent("""
{
"subject": {
"name": {
"firstName": "John",
"lastName": "Smith"
}
}
}
""", Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");http
POST https://api.infocusinfo.com/instantcrim/search
Content-Type: application/json
Authorization: Bearer your-api-key
{
"subject": {
"name": {
"firstName": "John",
"lastName": "Smith"
}
}
}Search with Date of Birth and State Filter
bash
curl -X POST "https://api.infocusinfo.com/instantcrim/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"clientRequestId": "req-abc-123",
"subject": {
"name": {
"firstName": "John",
"middleName": "Q",
"lastName": "Smith"
},
"birthDate": {
"year": 1985,
"month": 6,
"day": 15
}
},
"options": {
"lastNameExactMatch": true,
"birthDate": {
"includePartial": true,
"includeIncomplete": true
},
"states": ["NY", "NJ", "CT"]
}
}'java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var request = HttpRequest.newBuilder(URI.create("https://api.infocusinfo.com/instantcrim/search"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer your-api-key")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"clientRequestId": "req-abc-123",
"subject": {
"name": {
"firstName": "John",
"middleName": "Q",
"lastName": "Smith"
},
"birthDate": {
"year": 1985,
"month": 6,
"day": 15
}
},
"options": {
"lastNameExactMatch": true,
"birthDate": {
"includePartial": true,
"includeIncomplete": true
},
"states": ["NY", "NJ", "CT"]
}
}
"""))
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());csharp
using System.Net.Http;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.infocusinfo.com/instantcrim/search");
request.Headers.Add("Authorization", "Bearer your-api-key");
request.Content = new StringContent("""
{
"clientRequestId": "req-abc-123",
"subject": {
"name": {
"firstName": "John",
"middleName": "Q",
"lastName": "Smith"
},
"birthDate": {
"year": 1985,
"month": 6,
"day": 15
}
},
"options": {
"lastNameExactMatch": true,
"birthDate": {
"includePartial": true,
"includeIncomplete": true
},
"states": ["NY", "NJ", "CT"]
}
}
""", Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");http
POST https://api.infocusinfo.com/instantcrim/search
Content-Type: application/json
Authorization: Bearer your-api-key
{
"clientRequestId": "req-abc-123",
"subject": {
"name": {
"firstName": "John",
"middleName": "Q",
"lastName": "Smith"
},
"birthDate": {
"year": 1985,
"month": 6,
"day": 15
}
},
"options": {
"lastNameExactMatch": true,
"birthDate": {
"includePartial": true,
"includeIncomplete": true
},
"states": ["NY", "NJ", "CT"]
}
}Criminal Search with Address Trace by Name and DOB
This runs SAT first, then searches criminal records using the name and eligible aliases from the trace. The identity is synthetic.
bash
curl -X POST "https://api.infocusinfo.com/instantcrim/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"subject": {
"name": { "firstName": "Jane", "lastName": "Doe" },
"birthDate": { "year": 1980, "month": 1, "day": 2 }
},
"addressTrace": {
"includePartialNames": true,
"addressYears": 7
}
}'java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var request = HttpRequest.newBuilder(URI.create("https://api.infocusinfo.com/instantcrim/search"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer your-api-key")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"subject": {
"name": { "firstName": "Jane", "lastName": "Doe" },
"birthDate": { "year": 1980, "month": 1, "day": 2 }
},
"addressTrace": {
"includePartialNames": true,
"addressYears": 7
}
}
"""))
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());csharp
using System.Net.Http;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.infocusinfo.com/instantcrim/search");
request.Headers.Add("Authorization", "Bearer your-api-key");
request.Content = new StringContent("""
{
"subject": {
"name": { "firstName": "Jane", "lastName": "Doe" },
"birthDate": { "year": 1980, "month": 1, "day": 2 }
},
"addressTrace": {
"includePartialNames": true,
"addressYears": 7
}
}
""", Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");http
POST https://api.infocusinfo.com/instantcrim/search
Content-Type: application/json
Authorization: Bearer your-api-key
{
"subject": {
"name": { "firstName": "Jane", "lastName": "Doe" },
"birthDate": { "year": 1980, "month": 1, "day": 2 }
},
"addressTrace": {
"includePartialNames": true,
"addressYears": 7
}
}Criminal Search with Address Trace by SSN
The name object is still required. Empty first name and null last name let SAT find a name to use for the criminal search. This example uses a fictitious SSN and default trace filters.
bash
curl -X POST "https://api.infocusinfo.com/instantcrim/search" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"subject": {
"name": { "firstName": "", "lastName": null },
"ssn": "000-00-0000"
},
"addressTrace": {}
}'java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var request = HttpRequest.newBuilder(URI.create("https://api.infocusinfo.com/instantcrim/search"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer your-api-key")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"subject": {
"name": { "firstName": "", "lastName": null },
"ssn": "000-00-0000"
},
"addressTrace": {}
}
"""))
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());csharp
using System.Net.Http;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.infocusinfo.com/instantcrim/search");
request.Headers.Add("Authorization", "Bearer your-api-key");
request.Content = new StringContent("""
{
"subject": {
"name": { "firstName": "", "lastName": null },
"ssn": "000-00-0000"
},
"addressTrace": {}
}
""", Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");http
POST https://api.infocusinfo.com/instantcrim/search
Content-Type: application/json
Authorization: Bearer your-api-key
{
"subject": {
"name": { "firstName": "", "lastName": null },
"ssn": "000-00-0000"
},
"addressTrace": {}
}Example Response
json
{
"request": {
"clientRequestId": "req-abc-123",
"subject": {
"name": {
"firstName": "John",
"lastName": "Smith"
},
"birthDate": {
"year": 1985,
"month": 6,
"day": 15
},
"alias": []
}
},
"result": {
"offset": 0,
"limit": 500,
"hasMore": false,
"size": 1,
"data": [
{
"sourceId": "ny-statewide",
"sourceTitle": "New York Statewide Criminal",
"subCountry": "ny",
"offenderId": "NY12345678",
"name": {
"firstName": "JOHN",
"lastName": "SMITH"
},
"birthDate": {
"year": 1985,
"month": 6,
"day": 15
},
"sourceCategory": "court",
"matchQuality": {
"isExactNameMatch": true,
"isExactBirthDateMatch": true,
"isPartialBirthDateMatch": true,
"birthDateSupplied": true
},
"offender": {
"offenderId": "NY12345678",
"fullName": "JOHN QUINCY SMITH",
"firstName": "JOHN",
"middleName": "QUINCY",
"lastName": "SMITH",
"dob": "1985-06-15",
"age": 40,
"city": "BROOKLYN",
"state": "NY",
"race": "WHITE",
"sex": "M"
},
"offenses": [
{
"caseNum": "2010-CR-001234",
"caseType": "FELONY",
"offenseDate": "2010-03-22",
"convictionDate": "2010-09-14",
"disposition": "CONVICTED"
}
]
}
]
},
"searchId": "18001",
"uuid": "3f2b8c1e-9d4a-4c6b-8e1f-0a1b2c3d4e5f",
"status": "completed"
}