Skip to main content
A record is one answer from one source. An account that NoResponse read on a platform is a record. A row of a leaked table is also a record. Both have the same shape, so one piece of code reads both. A record keeps every field that its source gave, under the name that the source uses. NoResponse hides nothing. A leaked row keeps its passwords, hashes and salts. Each field also gets a kind and a cleaned value, and a field that many sources share gets a role. Your code reads the kind and the role, and it does not need to know the field names of each source.

Get the records

The records are in lookup.records of a person’s report. A screening runs the lookups for each person, so the records are there after a screening reaches the person. Read the report with a key that has the groups scope. A member of your workspace needs a role that can read the group.
cURL
Two SDKs change one name. In Python, source.date is source.date_. In Ruby, a record’s fields is fields_. The other names are the same as in the API. Read a person’s report in the groups reference shows the full report.
To get records with a test key, add a person with the email late@test.noresponse.org and a handle to a test group, then screen the group. The simulator answers the lookups with accounts and leaked rows, and it contacts no source.

The parts of a record

Sources

source.connector names the connector that read the record. A leaked row has the connector breach. source.site is the website that a person knows the source by. A leaked row also has its table and its date, as a year or a year and month. source.kind tells you what the record is: NoResponse can add a kind of source. Read an unknown source.kind as a leaked row.

Fields

Compare values with value, not with original. Two sources can write the same date or phone number in different ways, but their cleaned values are the same.

A platform account

The lookups found this account by a username. The person’s report gives it like this:
Platform account
  • login has the role handle. On a different platform, the handle can have a different field name, but it has the same role.
  • name keeps the two spaces of the original. Its value has one space.
  • twitter_username has the role linked_account. The name of the field names the network.
  • hireable has no role, because few sources give it. It is still in the record, with its kind.
  • The person’s row named this X handle, so twitter_username is in agreed. A reviewer joined the record, so verdict is joined.

A leaked row

The lookups found this row by the person’s email. It has every column of the row, in name order:
Leaked row
  • password, password_hash and salt are fields like the others. detail gives the likely algorithm of the hash.
  • lastip holds an IPv4 address as a whole number, as some forums store it. Its value is the address.
  • regdate is a Unix time. Its value is the moment in UTC. It has the role joined, as created_at has on the platform account. Thus you can compare the two directly.
  • birthday has no value. 07/03/1990 can be the 7th of March or the 3rd of July, and the site does not tell its country. original keeps the value as written.

Kinds

The kind of a field says what sort of value it holds. The kind sets the form of value. There are 45 kinds. A field of any kind is in the record, and text holds what has no other kind.

Roles

The role of a field says which value of its kind it is. A join date and a birth date are both dates, but their roles are joined and born. An account field and a column of a leaked row with the same meaning have the same role. Each role has values of the kinds in its row.

How distinctive a value is

A value that you can search on has distinctive: an email, a phone, a username, a password, a hash, a person name or an IP. rating tells you if a new search on the value can find one person. reason tells you why, in words. A username is common below 30 bits of its character model, or when more than 100 leaked rows hold it. A password is common when leaked data holds it 10 times or more, or when it takes fewer than 10^6 guesses. A hash is common in 10 leaked rows or more. A full name is common in more than 50 leaked rows, and one word of a name is always common. An IP is always common. When NoResponse could not count a value, the value has no distinctive.

Search again

A username or a password in one record often leads to the person’s other accounts. You can start a new search on any value that has distinctive. Name the record and the field with POST .../people/{person_id}/searches, and do not send the value. Nothing searches again by itself. Search the unique and distinctive values first. You can still search a common value. A password or a hash search counts the leaked rows that hold the value first. It stops at counted until you run it with POST .../searches/{search_id}/run. What a search finds joins lookup.records as leads. Each found record’s matched entry names the search in search. The report’s searches list gives each search’s value, and the record and field that it came from. Search again gives the requests, the answers and the rules.

Whose record it is

A search on a username or a name can find accounts of other people. So each record says how likely it is the person:
  • likelihood is from 0.01 to 0.99. A record that the person’s own email or phone found starts at 0.99.
  • agreed names the fields whose values agree with what NoResponse knows of the person. clashed names the fields that differ from the person’s birth date or full name.
  • joined is true when likelihood is 0.9 or more, or when your team joined the record. A record that does not join is a lead.
  • verdict is joined or rejected when your team overruled the record.
To overrule a record, send POST .../people/{person_id}/records with the record’s id and your verdict. Whose record it is gives the request, the answer and the rules.

Limits and remaining

NoResponse never cuts an answer short without a sign. A search of leaked data keeps at most 20 rows of one table and 100 rows in all, from its first 64 tables by name. A row always keeps all its columns. When a search matched more rows, lookup.remaining tells you how many more, for each search and table:
lookup.remaining
by is the kind of value searched, as in matched. rows counts the rows that records does not hold. remaining is absent when records holds every row that matched. To get the rows of one table, search the same field again with that table. A search of one table returns up to 100 rows of it. Everyone who can read the person can read every record and every field. No other permission applies to leaked rows or passwords.