LDID Protocol

Overview

RNS LDID protocol consists of the RNS registry hosted at https://api.rns.id/, a smart contract (LDID) in a person's wallet, and a validator looking to validate an LDID.

RNS LDID allows authenticates to verify identities and ensure compliance in seconds with RNS API. Our ID verification API reduces churn by streamlining the minutes-long KYC process to a single click.

It’s designed to be simple and secure for integration with exchanges and banks.

Process Overview

  1. Lookup LDID internal ID by docid, internal_guid or wallet. See https://api.rns.id/swagger/?format=openapi with tag kyc

  2. Call /api/v2/kyc/l1/{internal_guid}/ for L1 verification as an authenticated user

  3. Check the output to see if ID is validated

Scope

This online verification service, for the purpose of verifying the identity of an individual, employs KYC process that may include, but are not limited to the following:

  1. Identity Verification

a. Provider shall verify the identity information provided by the User, such as name, date of birth, date of expiration of identity documents etc.

b. Provider shall verify the authenticity of the User's government-issued identity document.

  1. Known Face Search

Provider shall compare the User's face to a database of known faces to detect and prevent criminals and terrorists.

  1. AML Screening

Determination of a natural person's presence or non-presence on global sanctions lists, PEP lists, watchlists, blacklists, or adverse media (OFAC, UN, HMT, EU, DFT, etc).

  1. Ongoing AML Monitoring

Daily re-check of the customer database against AML watchlists (sanctions, PEPs, adverse media, etc).

  1. Document Monitoring

Daily re-check of the validity of identity documents previously submitted by a given user, based on their expiry date. This includes sending automated requests for replacements if documents expire. Once Document Monitoring is initiated, ongoing monitoring is included for ten years.

Swagger https://api.rns.id/swagger/, filter to KYC APIs.

API Walkthrough

Step 1 -- Get NFTs

Use web3 apis to get nfts in a wallet. The call below uses chainbase for testnet. ID 0x33 or 51 is the latest in that wallet 0xDdbaB36b99D852e8F03727D9f62a83658Fa2C2bB

1 curl -X GET 'https://api.chainbase.online/v1/account/nfts?chain_id=97&address=0xDdbaB36b99D852e8F03727D9f62a83658Fa2C2bB' \
2     -H 'X-API-KEY: key ' \
3     -H 'Content-Type: application/json'

The api returns

1 {
2  "code": 0,
3  "message": "ok",
4  "data": [
5    {
6      "contract_address": "0xa983e239235a65e13fa47d32e85a7fb9bb215d7f",
7      "erc_type": "ERC721",
8      "image_uri": "",
9      "metadata": null,
10      "mint_time": "0001-01-01T00:00:00Z",
11      "mint_transaction_hash": "",
12      "name": "RNS ID",
13      "owner": "0xDdbaB36b99D852e8F03727D9f62a83658Fa2C2bB",
14      "symbol": "RNSId",
15      "token_id": "0x33",
16      "token_uri": "https://api.rns.id/api/v2/portal/identity/nft/92acac98-283e-4eab-93b0-08ca5399586c.json",
17      "total": 1,
18      "total_string": "1",
19      "traits": null
20    },
21    {
22      "contract_address": "0xa983e239235a65e13fa47d32e85a7fb9bb215d7f",
23      "erc_type": "ERC721",
24      "image_uri": "",
25.      "metadata": null,
26      "mint_time": "0001-01-01T00:00:00Z",
27      "mint_transaction_hash": "",
28      "name": "RNS ID",
29      "owner": "0xDdbaB36b99D852e8F03727D9f62a83658Fa2C2bB",
30      "symbol": "RNSId",
31      "token_id": "0x32",
32      "token_uri": "https://api.rns.id/api/v2/portal/identity/nft/c6c6f30b-3e11-47cc-ac50-de9ebeb682b3.json",
33      "total": 1,
34      "total_string": "1",
35      "traits": null
36    },
37    {
38      "contract_address": "0xa983e239235a65e13fa47d32e85a7fb9bb215d7f",
39      "erc_type": "ERC721",
40      "image_uri": "",
41      "metadata": null,
42      "mint_time": "0001-01-01T00:00:00Z",
43      "mint_transaction_hash": "",
44      "name": "RNS ID",
45      "owner": "0xDdbaB36b99D852e8F03727D9f62a83658Fa2C2bB",
46      "symbol": "RNSId",
47      "token_id": "0x31",
48      "token_uri": "https://api.rns.id/api/v2/portal/identity/nft/2d02eae3-a37a-4ee5-9f9c-ad1ca7583e32.json",
49      "total": 1,
50      "total_string": "1",
51      "traits": null
52    }
53  ],
54  "count": 3
55 }

Step 2 -- Get NFT Properties

1 curl https://api.rns.id/api/v2/portal/identity/nft/92acac98-283e-4eab-93b0-08ca5399586c.json | jq

Outputs:

1 {
2   "name": "RNS ID CYO6681H",
3   "description": "RNS ID CYO6681H for Ukraine",
4   "image": "https://rns.mypinata.cloud/ipfs/QmZe5C4eiPpcsZ4mWwaLafcN96CWnVri9n8hgJBqkVNyr1/Ukraine.png",
5   "animation_url": "https://rns.mypinata.cloud/ipfs/QmZe5C4eiPpcsZ4mWwaLafcN96CWnVri9n8hgJBqkVNyr1/Ukraine.mp4",
6   "attributes": [
7     {
8       "trait_type": "Internal ID",
9       "value": "92acac98-283e-4eab-93b0-08ca5399586c"
10     },
11     {
12       "trait_type": "Valid",
13       "value": "True"
14     },
15     {
16       "trait_type": "Issued",
17       "value": 1573430400,
18       "display_type": "date"
19     },
20     {
21       "trait_type": "Expires",
22       "value": 1731283200,
23       "display_type": "date"
24     },
25     {
26       "trait_type": "Jurisdiction",
27       "value": "UKRAINE"
28     },
29     {
30       "trait_type": "ID Type",
31       "value": "Passport"
32     },
33     {
34       "trait_type": "Gender",
35       "value": "M"
36     },
37     {
38       "trait_type": "Age Over 21",
39       "value": "True"
40     },
41     {
42       "trait_type": "Age Over 18",
43       "value": "True"
44     },
45     {
46       "trait_type": "Photo Hash",
47       "value": "None"
48     },
49     {
50       "trait_type": "RNS ID Number",
51       "value": "CYO6681H"
52     }
53   ],
54   "internal_id": "92acac98-283e-4eab-93b0-08ca5399586c",
55   "valid": true,
56   "issued": "2019-11-11 00:00:00+00:00",
57   "expires": "2024-11-11 00:00:00+00:00",
58   "jurisdiction": "UKRAINE",
59   "id_type": "Passport",
60   "gender": "M",
61   "age_over_21": true,
62   "age_over_18": true,
63   "photo_hash": "None",
64   "idnumber": "CYO6681H"
65 }

Step 3 -- Call L1 API

1 curl https://api.rns.id/api/v2/kyc/l2/903076ce-3d48-426b-b297-246c031e9477/ \
2      -H 'Authorization: bearer api:37fbd00bf3875d9c6f904ce291de28a96e74a12be3acaa0a9bbb57273d69b778' \
3      -H 'Content-Type: application/json'

This returns:

1  {
2   "status": {
3     "code": 200,
4     "message": ""
5   },
6   "data": {
7     "has_id": true,
8     "internal_id": "903076ce-3d48-426b-b297-246c031e9477",
9     "valid": true,
10     "expiration_date": "2028-01-11 00:00:00+00:00",
11     "jurisdiction": "Palau",
12     "rns_id": "CGB9933C",
13     "id_type": "ID",
14     "gender": "M",
15     "first_name": "FNAME",
16     "last_name": "LNAME",
17     "issue_date": "2023-01-11 00:00:00+00:00",
18     "birth_date": "1970-01-01",
19     "under_sanctions": false,
20     "url_photo": "https://api.rns.id/api/v2/kyc/photo/903076ce-3d48-426b-b297-246c031e9477/"
21   }
22 }

Step 4 -- Get Photo

1 curl  https://api.rns.id/api/v2/kyc/photo/903076ce-3d48-426b-b297-246c031e9477/ \
2      -H 'Authorization: bearer api:37fbd00bf3875d9c6f904ce291de28a96e74a12be3acaa0a9bbb57273d69b778' \
3      -o photo.jpg

Error List:

200 Successful
400 Invalid Request
401 Not Authorized
403 Forbidden
404 Not found
429 Server Busy - Try again
500 Application Error'

Last updated