Skip to content

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-key

A missing or invalid key returns 403 with an empty body.

Endpoints ​

MethodPathDescription
POST/instantcrim/searchRun and save a search
POST/instantcrim/search/{id}/reprocessReprocess a search

Request Body ​

The request body is a JSON object with the following top-level fields:

FieldTypeRequiredDescription
clientRequestIdString (≤36 chars)NoClient-supplied correlation ID included in the response. A longer value returns 400
subjectObjectYesThe person to search for. See Subject Parameters
optionsObjectNoSearch behavior options. See Search Options
addressTraceObjectNoRun a Screening Address Trace before the criminal search and include its aliases. See Search with Address Trace
userIdString (numeric)NoConsole-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
productIdString (numeric)ConditionalThe instant-criminal product to bill this search against. Required only when the account is entitled to more than one instant-criminal product (400 otherwise)
webhookUrlString (≤2048 chars)NoRun 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 ​

FieldTypeRequiredDescription
subject.nameObjectYesName object is required, including for an SSN-only address trace
subject.name.firstNameStringYesSubject's first name; may be empty for an SSN-only address trace
subject.name.lastNameString | nullYesSubject's last name; may be null for an SSN-only address trace
subject.name.middleNameStringNoSubject's middle name
subject.name.suffixStringNoName suffix (e.g., Jr, Sr, III)
subject.birthDate.yearInteger (4-digit)NoBirth year
subject.birthDate.monthInteger (1–12)NoBirth month
subject.birthDate.dayInteger (1–31)NoBirth day
subject.aliasArray of name objectsNoUp to 12 alternate names, using the same name fields as subject.name
subject.ssnStringNoFull 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 ​

FieldTypeDefaultDescription
options.firstNameExactMatchBooleanfalseWhen true, only returns records where the first name is an exact match
options.lastNameExactMatchBooleanfalseWhen true, only returns records where the last name is an exact match
options.middleNameMatchOnInitialBooleanfalseWhen 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.firstNameTruncationInteger0Deprecated. Keeps only this many leading characters of the first name when matching; 0 uses the whole name
options.lastNameTruncationInteger0Deprecated. The same for the last name
options.lastNameParsePunctuationBooleantrueDeprecated 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 ​

FieldTypeDefaultDescription
options.birthDate.includeIncompleteBooleanfalseInclude records with an incomplete (partial) date of birth
options.birthDate.includePartialBooleanfalseInclude records where only some DOB components match
options.birthDate.includeNullBooleanfalseInclude 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.yearRangeInteger0Widen 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.excludeNullStatesArray of stringsnullWhen 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.

FieldTypeDefaultDescription
options.sexOffender.useSpecificBooleanfalseWhen true, sex-offender-registry records are matched against options.sexOffender.birthDate instead of the standard options.birthDate rules
options.sexOffender.birthDateObjectnullSame 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.includeNationalSexOffenderBooleanfalseWhen true, sex-offender-registry sources bypass options.states and are included nationally, as watchlist sources are

Geographic & Source Filtering ​

FieldTypeDescription
options.statesArray of stringsLimit 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.includeArray of stringsInclude only these source categories
options.sources.excludeArray of stringsExclude these source categories
options.sources.sourceIdArray of stringsTarget 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.

FieldTypeDefaultDescription
addressTrace.includePartialNamesBooleantrueInclude trace names where either first or last name matches
addressTrace.includeNonMatchingNamesBooleanfalseInclude trace names where neither first nor last name matches
addressTrace.addressYearsInteger | nullnullLimit 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 ​

FieldTypeDescription
requestObjectRequest used for the search, including aliases found by SAT when applicable; a full SSN is reduced to its last four digits
searchIdStringThe id this search was persisted under - fetch it later, or use it as the id in Reprocessing a Search
uuidStringSearch identifier that is also the webhook-id of a webhook delivery. Accepted in place of searchId in reprocess URLs
statusStringcompleted for a finished search. A search placed with a webhookUrl replies processing first; a search that could not be completed is error
messageStringOptional explanation for a processing or error status
addressTraceObjectSAT result when addressTrace was requested (also on a reprocess of such a search); has the same shape as a standalone SAT response
result.offsetIntegerAlways 0. The API has no paging inputs
result.limitIntegerMaximum 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.hasMoreBooleanWhether 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.sizeIntegerNumber of records in this response
result.dataArrayArray of criminal result objects

Criminal Result Fields ​

Each object in result.data includes:

FieldTypeDescription
sourceIdStringIdentifier of the data source
sourceTitleStringDisplay name of the data source
subCountryStringState or sub-country code for this source, lowercase (for example ny); may be empty
offenderIdStringUnique offender identifier within the source
nameObjectMatched name (firstName, lastName, middleName, suffix)
birthDateObjectMatched birth date components
sourceCategoryString | nullThe source's category, such as court, doc, inmate, or sex-offender
matchQualityObjectQuality of match. See Match Quality
offenderObjectFull offender record from the source; omitted if unavailable. See Offender Fields
offensesArrayList of offense records. See Offense Fields

Match Quality ​

FieldTypeDescription
isExactNameMatchBooleanBoth first and last name matched exactly
isExactBirthDateMatchBooleanAll provided DOB components matched. A year within options.birthDate.yearRange of the requested year also counts
isPartialBirthDateMatchBooleanAt least one DOB component matched. It is also true for an exact match, so use isExactBirthDateMatch to tell them apart
birthDateSuppliedBooleanfalse 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:

TierBirth-date match
4All provided DOB components match
3At least two components match
2The year matches (including yearRange)
1The record has no date of birth
0Anything 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 ​

FieldTypeDescription
offenderIdStringSource record identifier
hashStringHash of the source offender record
fullNameStringFull name as stored by the source
prefix, firstName, middleName, lastName, suffixStringName components
dobStringDate of birth
yobIntegerYear of birth
ageIntegerAge
birthStateStringState of birth
aka, akaDobsStringAlternate names and associated birth dates
citizenship, language, maritalStatus, militaryServiceStringBackground details

Address and Physical Description ​

FieldTypeDescription
fullAddress, address1, address2StringPrimary street address fields
city, cityStateZip, state, zip, countyStringPrimary locality fields
hair, hairLength, eyeStringHair and eye details
height, weight, buildStringBody measurements and build
race, sex, skinToneStringDemographic and appearance details
scarsMarks, facialHair, teethStringIdentifying physical characteristics

Additional Addresses ​

FieldTypeDescription
workAddress1, workAddress2, workCity, workState, workZip, workAddressDateStringWork address and effective date
schoolAddress1, schoolAddress2, schoolCity, schoolState, schoolZip, schoolAddressDateStringSchool address and effective date
otherAddress1, otherAddress2, otherCity, otherState, otherZip, otherAddressDateStringOther address and effective date

Offense Fields ​

Every offense field is optional and omitted when unavailable.

Case, Charge, and Financial Details ​

FieldTypeDescription
hashStringHash of the source offense record
caseNum, caseTypeStringCase identifier and type
court, courtDateStringCourt and proceeding date
counts, pleaStringCharge count and plea
offenseDate, offenseCode, offenseDesc1, offenseDesc2StringOffense date, code, and descriptions
bail, bond, bondTypeStringBail and bond details
fine, courtCosts, restitutionStringFinancial penalties
chargesFiledDateStringDate charges were filed
amendedCharge, amendedCaseType, amendedDisposition, amendedDispositionDateStringAmended charge and disposition details

Arrest, Warrant, and Disposition ​

FieldTypeDescription
arrestDate, arrestAgency, arrestLocationStringArrest details
warrantNum, warrantDate, warrantCounty, warrantStateStringWarrant details
convictionDate, convictionPlaceStringConviction details
disposition, dispositionDateStringCase disposition and date

Sentence, Custody, and Supervision ​

FieldTypeDescription
sentenceDuration, sentenceDate, sentenceSuspendedStringSentence details
probationDuration, probationDateStringProbation details
commitmentLocation, commitmentCounty, commitmentState, commitmentDateStringCommitment details
supervisionDate, supervisionType, supervisionCounty, supervisionStateStringSupervision details
confineDate, releaseDateStringConfinement and release dates

Record Identifiers and Status ​

FieldTypeDescription
bookingNum, bookingDateStringBooking identifier and date
fbiNum, prisonerIdStringFederal and corrections identifiers
dcState, dcNum, ncicCodeStringDepartment of corrections and NCIC identifiers
statusStringSource record status
registrationDate, lastReportedDate, profileUpdatedDateStringRegistration and reporting dates
commentsArray of stringsSource comments
POST /instantcrim/search/{id}/reprocess

Re-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:

FieldTypeRequiredDescription
optionsObjectNoReplaces the search options for this run only. Omit to reuse the original
webhookUrlString (≤2048 chars)NoRun 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:

HeaderDescription
webhook-idThe search's uuid. Identical on every retry, so use it to de-duplicate
webhook-timestampUnix time in seconds of the attempt
webhook-signaturev1, 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 ​

ValidationDetails
subject.name.firstName and subject.name.lastName fields are requiredThe name object must contain both fields, even for an SSN-only trace; use "" and null when no name is known
Last name without address traceA nonblank subject.name.lastName is required
Address trace without SSNA nonblank first and last name and complete, valid, nonfuture DOB are required
Address trace with SSNsubject.ssn must be a full nine-digit SSN; an invalid nonblank value does not fall back to name/DOB
addressTrace.addressYearsMust be between 1 and 9999, or null for all available years
subject.aliasNo more than 12 aliases may be supplied
clientRequestIdAt most 36 characters
webhookUrlAn absolute https URL of at most 2048 characters, without credentials, whose host resolves to a public address
productIdRequired when the account is entitled to more than one instant-criminal product
userIdNumeric, 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 ​

CodeDescription
200The search finished. Inspect status
202The search was accepted for background processing because the request included a webhookUrl
400Invalid fields, an invalid webhookUrl, or malformed JSON (errors.request); includes an errors object
403Missing or invalid API key, the product is not enabled for the account, or Console-only attribution is not authorized
404Unknown productId, saved search not found or not owned by the account
500Unexpected request failure (errors.search)
503Address trace was requested but is not configured

Examples ​

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