Usage

You can use the public version of Fingerbank in three different ways:

Online

Query the fingerprints online.

SQLite

Download the data as an SQLite database.

API

Use the free public API. Register and you'll get a free key that you can use to make API calls from your applications. See the API documentation.

Examples

Query using a DHCP fingerprint

Input
curl \
  -X GET \
  -H "Content-Type: application/json" \
  'https://fingerbank.inverse.ca/api/v1/combinations/interrogate?key=YOURFINGERBANKAPIKEY' \
  -d '{"dhcp_fingerprint":"1,33,3,6,12,15,28,51,58,59,119"}' 
                      
Output
{
    "created_at": "2015-07-31T19:53:57.000Z",
    "device": {
        "created_at": "2014-09-09T15:09:52.000Z",
        "id": 202,
        "inherit": false,
        "mobile": true,
        "name": "Generic Android",
        "parent_id": 11,
        "parents": [
            {
                "approved": true,
                "created_at": "2014-09-09T15:09:50.000Z",
                "devices_count": 16,
                "id": 11,
                "inherit": false,
                "mobile": false,
                "name": "Smartphones/PDAs/Tablets",
                "parent_id": null,
                "submitter_id": null,
                "tablet": false,
                "updated_at": "2014-11-14T19:02:32.000Z"
            }
        ],
        "updated_at": "2015-02-06T15:53:25.000Z"
    },
    "id": 235024,
    "score": 50,
    "updated_at": "2015-07-31T19:53:57.000Z",
    "version": null
}
We get that it is an Android device, with a score of 50.

Query using a DHCP fingerprint and a DHCP vendor

Input
curl \
  -X GET \
  -H "Content-Type: application/json" \
  'https://fingerbank.inverse.ca/api/v1/combinations/interrogate?key=YOURFINGERBANKAPIKEY' \
  -d '{"dhcp_fingerprint":"1,33,3,6,12,15,28,51,58,59,119","dhcp_vendor":"dhcpcd-5.5.6"}'
Output
{
    "created_at": "2014-11-11T13:03:10.000Z",
    "device": {
        "created_at": "2014-09-09T15:09:52.000Z",
        "id": 202,
        "inherit": false,
        "mobile": true,
        "name": "Generic Android",
        "parent_id": 11,
        "parents": [
            {
                "approved": true,
                "created_at": "2014-09-09T15:09:50.000Z",
                "devices_count": 16,
                "id": 11,
                "inherit": false,
                "mobile": false,
                "name": "Smartphones/PDAs/Tablets",
                "parent_id": null,
                "submitter_id": null,
                "tablet": false,
                "updated_at": "2014-11-14T19:02:32.000Z"
            }
        ],
        "updated_at": "2015-02-06T15:53:25.000Z"
    },
    "id": 6772,
    "score": 50,
    "updated_at": "2016-06-22T20:36:22.000Z",
    "version": "4+"
}
We now see it's an Android 4+ device, with the same score.

Query using a DHCP fingerprint, a DHCP vendor and a User Agent

Input
curl \
  -X GET \
  -H "Content-Type: application/json" \
  'https://fingerbank.inverse.ca/api/v1/combinations/interrogate?key=YOURFINGERBANKAPIKEY' \
  -d '{"dhcp_fingerprint":"1,33,3,6,12,15,28,51,58,59,119","dhcp_vendor":"dhcpcd-5.5.6","user_agent":"Mozilla/5.0 (Linux; Android 5.0.2; SM-G920F Build/LRX22G; wv) AppleWebK"}'
Output
{
    "created_at": "2016-06-22T20:40:54.000Z",
    "device": {
        "created_at": "2015-04-16T19:41:45.000Z",
        "id": 6368,
        "inherit": null,
        "mobile": true,
        "name": "Galaxy S6",
        "parent_id": 3809,
        "parents": [
            {
                "approved": true,
                "created_at": "2014-11-13T12:45:57.000Z",
                "devices_count": 435,
                "id": 3809,
                "inherit": false,
                "mobile": true,
                "name": "Samsung Android",
                "parent_id": 202,
                "submitter_id": null,
                "tablet": false,
                "updated_at": "2015-04-24T03:09:27.000Z"
            },
            {
                "approved": true,
                "created_at": "2014-09-09T15:09:52.000Z",
                "devices_count": 597,
                "id": 202,
                "inherit": false,
                "mobile": true,
                "name": "Generic Android",
                "parent_id": 11,
                "submitter_id": null,
                "tablet": false,
                "updated_at": "2015-02-06T15:53:25.000Z"
            },
            {
                "approved": true,
                "created_at": "2014-09-09T15:09:50.000Z",
                "devices_count": 16,
                "id": 11,
                "inherit": false,
                "mobile": false,
                "name": "Smartphones/PDAs/Tablets",
                "parent_id": null,
                "submitter_id": null,
                "tablet": false,
                "updated_at": "2014-11-14T19:02:32.000Z"
            }
        ],
        "updated_at": "2015-04-20T06:39:02.000Z"
    },
    "id": 3870692,
    "score": 140,
    "updated_at": "2016-06-22T20:45:12.000Z",
    "version": "5.0.2"
}
Now we've got an exact match with a high score for a Samsung Galaxy S6 phone running Android 5.0.2.

You can also download and query the local SQLite database (Warning: the downloaded file is over 600 MB).

Query the SQLite3 Database

% sqlite fingerbank.db
List tables
sqlite> .tables
combination        dhcp6_enterprise   dhcp_fingerprint   mac_vendor
device             dhcp6_fingerprint  dhcp_vendor        user_agent
List schema info for the combination table
sqlite> .schema combination
CREATE TABLE "combination" (
  "id" int(11) NOT NULL ,
  "dhcp_fingerprint_id" int(11) DEFAULT NULL,
  "user_agent_id" int(11) DEFAULT NULL,
  "created_at" datetime DEFAULT NULL,
  "updated_at" datetime DEFAULT NULL,
  "device_id" int(11) DEFAULT NULL,
  "version" varchar(255) DEFAULT NULL,
  "dhcp_vendor_id" int(11) DEFAULT NULL,
  "score" int(11) DEFAULT '0',
  "mac_vendor_id" int(11) DEFAULT NULL,
  "submitter_id" int(11) DEFAULT NULL,
  "dhcp6_fingerprint_id" int(11) DEFAULT NULL,
  "dhcp6_enterprise_id" int(11) DEFAULT NULL,
  "fixed" tinyint(1) DEFAULT '0',
  PRIMARY KEY ("id")
);
CREATE INDEX "combinations_combination_unicity" ON "combination" ("user_agent_id","dhcp_fingerprint_id","dhcp_vendor_id","mac_vendor_id","dhcp6_fingerprint_id","dhcp6_enterprise_id");
CREATE INDEX "combinations_combinations_user_agent_id_ix" ON "combination" ("user_agent_id");
CREATE INDEX "combinations_combinations_dhcp_fingerprint_id_ix" ON "combination" ("dhcp_fingerprint_id");
CREATE INDEX "combinations_combinations_dhcp_vendor_id_ix" ON "combination" ("dhcp_vendor_id");
CREATE INDEX "combinations_combinations_mac_vendor_id_ix" ON "combination" ("mac_vendor_id");
CREATE INDEX "combinations_combinations_dhcp6_fingerprint_id_ix" ON "combination" ("dhcp6_fingerprint_id");
CREATE INDEX "combinations_combinations_dhcp6_enterprise_id_ix" ON "combination" ("dhcp6_enterprise_id");
CREATE INDEX "combinations_combinations_device_id_ix" ON "combination" ("device_id");
CREATE INDEX "combinations_index_combinations_on_device_id_and_created_at" ON "combination" ("device_id","created_at");
CREATE INDEX "combinations_index_combinations_on_created_at" ON "combination" ("created_at");

Searh for a DHCP fingerprint

sqlite> select id from dhcp_fingerprint where value = '1,33,3,6,12,15,28,51,58,59,119';
449

Searh for a DHCP vendor

sqlite> select id from dhcp_vendor where value = 'dhcpcd-5.5.6';
4946

Search the combination score of a DHCP fingerprint, a DHCP vendor and a User Agent

sqlite> select combination.score, device.name from combination, device where device.id = combination.device_id and combination.dhcp_fingerprint_id = 449 and combination.dhcp_vendor_id =4946 and user_agent_id IN (select id from user_agent where value like '%Mozilla/5.0 (Linux; Android 5.0.2; SM-G920F Build/LRX22G; wv) AppleWebK%');
140|Galaxy S6

Submitting Fingerprints

When you query the Fingerbank database using the API, if this combination of data is unknown to Fingerbank, it will be automatically added to the Fingerbank database.

You can also submit manually your information using our Web interface.