https://github.com/selfkeyfoundation/relying-party-mp-kycc-demo
https://github.com/selfkeyfoundation/relying-party-mp-kycc-demo
Last synced: 10 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/selfkeyfoundation/relying-party-mp-kycc-demo
- Owner: SelfKeyFoundation
- License: gpl-3.0
- Created: 2020-04-03T11:59:39.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-01-24T01:54:11.000Z (over 3 years ago)
- Last Synced: 2025-04-06T20:49:48.500Z (over 1 year ago)
- Language: JavaScript
- Size: 2.47 MB
- Stars: 0
- Watchers: 4
- Forks: 2
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Login With Selfkey Demo for KYCC users
## Contents
- [Usage](#usage)
- [Integration With KYC-Chain](#kycc-integration)
- [License](#license)
## Usage
### Install
```sh
git clone https://github.com/SelfKeyFoundation/relying-party-mp-kycc-demo.git
cd relying-party-mp-kycc-demo
yarn install
```
### KYC-Chain config
export 2 env variables if you run directly
```
KYCC_API_URL=http://instance-id.kyc-chain.com/
KYCC_API_KEY=my-kycc-api-keu
```
or create an `.env` file containing them if you run with `docker-compose`
### Run
```sh
yarn start
```
### Or with docker
## Integration with KYC-Chain
### Prerequisites
- the webhook endpoint that is exposed on your server should be configured on KYC-Chain instance
- you should get an API key for the instance
### Handle webhook events
The webhook endpoint will receive post request from KYC-Chain instance on any status change of an application.
The request payload will contain application id and status
```js
{
applicationId: '5e8c782aa88e7b00139f589d',
status: 2,
updatedAt: '2020-04-08T12:26:26.479Z'
}
```
Possible application status codes are:
```js
{
MISSING: 0,
IN_PROGRESS: 1,
APPROVED: 2,
REJECTED: 3,
UPLOADED: 4,
INVITED: 5,
USER_PROCESSING: 6,
USER_DECLINED: 7,
CANCELED: 8,
ADDITIONAL_REQUESTED: 9,
CORPORATE_DETAILS: 10,
USER_PROCESSING_REQUIREMENT: 11,
PARTIALLY_APPROVED: 12,
SEND_TOKENS: 13,
MANAGER_ASSIGNED: 14,
DATA_CHECK: 15,
REOPENED: 16
};
```
Example: [routes/webhook.js](https://github.com/SelfKeyFoundation/relying-party-mp-kycc-demo/blob/master/src/routes/webhook.js#L8)
### Control the application via KYC-Chain API
There are 2 official options to work with KYC-Chain API
- use our Node.js client lib
- directly perform http requests
### Install node.js client
[Github](https://github.com/SelfKeyFoundation/selfkey-lib)
```bash
npm install --save @selfkey/node-lib
```
### Initialize node.js client
```js
const sk = require('@selfkey/node-lib');
const client = sk.kycc.createKYCCIntegrationsClient({
apiKey: "",
instanceUrl: ""
});
```
Example: [kycc-client.js](https://github.com/SelfKeyFoundation/relying-party-mp-kycc-demo/blob/master/src/kycc-client.js)
### Get detailed application object
#### Node.js
```js
const application = await kyccClient.applications.get(applicationId);
```
Example: [routes/webhook.js](https://github.com/SelfKeyFoundation/relying-party-mp-kycc-demo/blob/master/src/routes/webhook.js#L12)
#### HTTP
```bash
GET /integrations/v2/applications/
HEADERS:
apiKey:
```
#### Example Response:
```js
{
"attributes": {
"5e81d956f52e300013c7e5c1": {
"description": "Please enter your e-mail address.",
"isAdditional": false,
"label": "Email",
"optional": false,
"schema": "http://platform.selfkey.org/schema/attribute/email.json",
"valid": true,
"value": "test3@test.com"
},
"5e81d956f52e300013c7e5c2": {
"description": "First name",
"isAdditional": false,
"label": "First name",
"optional": false,
"schema": "http://platform.selfkey.org/schema/attribute/first-name.json",
"valid": false,
"value": "Test"
},
"5e81d956f52e300013c7e5c3": {
"description": "Middle name",
"isAdditional": false,
"label": "Middle name",
"optional": true,
"schema": "http://platform.selfkey.org/schema/attribute/middle-name.json",
"valid": false,
"value": "test"
},
"5e81d956f52e300013c7e5c4": {
"description": "Last name",
"isAdditional": false,
"label": "Last name",
"optional": false,
"schema": "http://platform.selfkey.org/schema/attribute/last-name.json",
"valid": true,
"value": "test"
},
"5e81d9d6f52e300013c7e5c6": {
"description": "Bank Statement",
"isAdditional": false,
"label": "Bank Statement",
"optional": false,
"schema": "http://platform.selfkey.org/schema/attribute/bank-statement.json",
"valid": true,
"value": {
"issued": "2020-04-01",
"images": [
{
"content": "5e8c7864a88e7b00139f58ac",
"mimeType": "image/png",
"size": 147726
}
]
}
}
},
"dataChecks": [],
"forms": [],
"notes": [
{
"_id": "5e8c85c2a88e7b00139f58d2",
"external": false,
"content": "I am approving this application",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T13:53:06.748Z"
},
{
"_id": "5e8c8632a88e7b00139f58d7",
"external": false,
"content": "application reopened",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T13:54:58.266Z"
},
{
"_id": "5e8c8851a88e7b00139f58dd",
"external": false,
"content": "I am approving this application",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T14:04:01.784Z"
},
{
"_id": "5e8c8991a88e7b00139f58e1",
"external": false,
"content": "application reopened",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T14:09:21.594Z"
},
{
"_id": "5e8c89bfa88e7b00139f58e7",
"external": false,
"content": "I am approving this application",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T14:10:07.975Z"
},
{
"_id": "5e8c9285a88e7b00139f58eb",
"external": false,
"content": "application reopened",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T14:47:33.428Z"
}
],
"owners": [
{
"_id": "5e8c782aa88e7b00139f589c",
"email": "test3@test.com"
}
],
"payments": [],
"questions": {},
"requirementsLog": {
"5e81d956f52e300013c7e5c2": [
{
"action": "invalidation",
"createdAt": "2020-04-07T12:57:39.575Z",
"manager": "5d25a03ff784627fe5b96918",
"comments": []
}
],
"5e81d956f52e300013c7e5c3": [
{
"action": "invalidation",
"createdAt": "2020-04-07T12:57:39.575Z",
"manager": "5d25a03ff784627fe5b96918",
"comments": []
}
]
},
"type": "individual",
"memberTemplates": [],
"template": {
"_id": "5e81d956f52e300013c7e5be",
"requirements": {
"questions": [
{
"datepicker": false,
"multiple": false,
"optional": false,
"options": [],
"type": "kyc",
"weight": 0,
"_id": "5e81d956f52e300013c7e5c1",
"attributeType": "http://platform.selfkey.org/schema/attribute/email.json",
"description": "Please enter your e-mail address.",
"question": "Email",
"title": "Email"
},
{
"datepicker": false,
"multiple": false,
"optional": false,
"options": [],
"type": "kyc",
"weight": 0,
"_id": "5e81d956f52e300013c7e5c2",
"attributeType": "http://platform.selfkey.org/schema/attribute/first-name.json",
"description": "First name",
"question": "First name",
"title": "First name"
},
{
"datepicker": false,
"multiple": false,
"optional": true,
"options": [],
"type": "kyc",
"weight": 0,
"_id": "5e81d956f52e300013c7e5c3",
"attributeType": "http://platform.selfkey.org/schema/attribute/middle-name.json",
"description": "Middle name",
"question": "Middle name",
"title": "Middle name"
},
{
"datepicker": false,
"multiple": false,
"optional": false,
"options": [],
"type": "kyc",
"weight": 0,
"_id": "5e81d956f52e300013c7e5c4",
"attributeType": "http://platform.selfkey.org/schema/attribute/last-name.json",
"description": "Last name",
"question": "Last name",
"title": "Last name"
}
],
"uploads": [
{
"certifiedTrueCopy": {
"offSystem": false,
"onSystem": false
},
"notary": {
"offSystem": false,
"onSystem": false
},
"idScan": false,
"optional": false,
"selfie": false,
"signature": false,
"weight": 0,
"_id": "5e81d9d6f52e300013c7e5c6",
"attributeType": "http://platform.selfkey.org/schema/attribute/bank-statement.json",
"title": "Bank Statement",
"description": "Bank Statement"
}
],
"options": {
"checkerRequired": false,
"membersEnabled": false
}
},
"submission": {
"documentTemplate": null,
"signatureEnabled": false
},
"welcomeScreen": {
"disclaimerText": "",
"enabled": false
},
"active": true,
"defaultManager": null,
"removed": false,
"type": "individual",
"created": "2020-03-30T11:34:46.345Z",
"history": [
{
"_id": "5e81d956f52e300013c7e5bf",
"event": "create",
"user": "5d25a03ff784627fe5b96918",
"timestamp": "2020-03-30T11:34:46.365Z"
},
{
"_id": "5e81d9d6f52e300013c7e5c5",
"event": "add_requirement",
"user": "5d25a03ff784627fe5b96918",
"timestamp": "2020-03-30T11:36:54.789Z"
},
{
"_id": "5e81d9e4f52e300013c7e5c7",
"event": "edit",
"user": "5d25a03ff784627fe5b96918",
"timestamp": "2020-03-30T11:37:08.862Z"
},
{
"_id": "5e81d9f3f52e300013c7e5c8",
"event": "edit",
"user": "5d25a03ff784627fe5b96918",
"timestamp": "2020-03-30T11:37:23.706Z"
}
],
"legalLinks": [],
"memberTemplates": [
{
"isDefault": true,
"legalEntityTypes": [],
"memberRoles": [
"director_ltd",
"shareholder",
"ubo",
"observer",
"authorizedSignatory",
"other",
"manager",
"member_llc",
"other_llc",
"grantor",
"beneficiary_tst",
"trustee",
"protector",
"founder",
"director_fnd",
"supervisor",
"beneficiary_fnd",
"generalPartner",
"limitedPartner",
"member"
],
"_id": "5e81d956f52e300013c7e5c0",
"memberType": "individual",
"template": null
}
],
"name": "selfkey test",
"description": "selfkey test",
"scope": "608f1f77bcf86cd799438011"
},
"managers": [
{
"_id": "5e8c782aa88e7b00139f589f",
"role": "manager",
"user": "5d25a03ff784627fe5b96918",
"id": "5e8c782aa88e7b00139f589f"
}
],
"members": [],
"statusLog": [
{
"_id": "5e8c9eab957ad100130d4201",
"timestamp": "2020-04-07T15:39:23.359Z",
"code": 9,
"note": null,
"user": null,
"id": "5e8c9eab957ad100130d4201"
},
{
"_id": "5e8c9eab957ad100130d41ff",
"timestamp": "2020-04-07T15:39:23.078Z",
"code": 16,
"id": "5e8c9eab957ad100130d41ff"
},
{
"_id": "5e8c9bdba88e7b00139f5903",
"timestamp": "2020-04-07T15:27:23.291Z",
"code": 2,
"id": "5e8c9bdba88e7b00139f5903"
},
{
"_id": "5e8c957ca88e7b00139f5901",
"timestamp": "2020-04-07T15:00:12.666Z",
"code": 9,
"note": null,
"user": null,
"id": "5e8c957ca88e7b00139f5901"
},
{
"_id": "5e8c957ca88e7b00139f58ff",
"timestamp": "2020-04-07T15:00:12.623Z",
"code": 16,
"id": "5e8c957ca88e7b00139f58ff"
},
{
"_id": "5e8c9531a88e7b00139f58fd",
"timestamp": "2020-04-07T14:58:57.525Z",
"code": 2,
"id": "5e8c9531a88e7b00139f58fd"
},
{
"_id": "5e8c9437a88e7b00139f58fb",
"timestamp": "2020-04-07T14:54:47.066Z",
"code": 9,
"note": null,
"user": null,
"id": "5e8c9437a88e7b00139f58fb"
},
{
"_id": "5e8c9437a88e7b00139f58f9",
"timestamp": "2020-04-07T14:54:47.010Z",
"code": 16,
"id": "5e8c9437a88e7b00139f58f9"
},
{
"_id": "5e8c9325a88e7b00139f58f7",
"timestamp": "2020-04-07T14:50:13.783Z",
"code": 2,
"id": "5e8c9325a88e7b00139f58f7"
},
{
"_id": "5e8c9308a88e7b00139f58f5",
"timestamp": "2020-04-07T14:49:44.686Z",
"code": 9,
"note": null,
"user": null,
"id": "5e8c9308a88e7b00139f58f5"
},
{
"_id": "5e8c9308a88e7b00139f58f3",
"timestamp": "2020-04-07T14:49:44.664Z",
"code": 16,
"id": "5e8c9308a88e7b00139f58f3"
},
{
"_id": "5e8c92d1a88e7b00139f58f1",
"timestamp": "2020-04-07T14:48:49.088Z",
"code": 2,
"id": "5e8c92d1a88e7b00139f58f1"
},
{
"_id": "5e8c9285a88e7b00139f58ef",
"timestamp": "2020-04-07T14:47:33.484Z",
"code": 9,
"note": null,
"user": null,
"id": "5e8c9285a88e7b00139f58ef"
},
{
"_id": "5e8c9285a88e7b00139f58ec",
"timestamp": "2020-04-07T14:47:33.437Z",
"code": 16,
"note": {
"_id": "5e8c9285a88e7b00139f58eb",
"external": false,
"content": "application reopened",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T14:47:33.428Z"
},
"id": "5e8c9285a88e7b00139f58ec"
},
{
"_id": "5e8c89bfa88e7b00139f58e8",
"timestamp": "2020-04-07T14:10:07.977Z",
"code": 2,
"note": {
"_id": "5e8c89bfa88e7b00139f58e7",
"external": false,
"content": "I am approving this application",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T14:10:07.975Z"
},
"id": "5e8c89bfa88e7b00139f58e8"
},
{
"_id": "5e8c8991a88e7b00139f58e5",
"timestamp": "2020-04-07T14:09:21.615Z",
"code": 9,
"note": null,
"user": null,
"id": "5e8c8991a88e7b00139f58e5"
},
{
"_id": "5e8c8991a88e7b00139f58e2",
"timestamp": "2020-04-07T14:09:21.596Z",
"code": 16,
"note": {
"_id": "5e8c8991a88e7b00139f58e1",
"external": false,
"content": "application reopened",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T14:09:21.594Z"
},
"id": "5e8c8991a88e7b00139f58e2"
},
{
"_id": "5e8c8851a88e7b00139f58de",
"timestamp": "2020-04-07T14:04:01.787Z",
"code": 2,
"note": {
"_id": "5e8c8851a88e7b00139f58dd",
"external": false,
"content": "I am approving this application",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T14:04:01.784Z"
},
"id": "5e8c8851a88e7b00139f58de"
},
{
"_id": "5e8c8632a88e7b00139f58db",
"timestamp": "2020-04-07T13:54:58.285Z",
"code": 9,
"note": null,
"user": null,
"id": "5e8c8632a88e7b00139f58db"
},
{
"_id": "5e8c8632a88e7b00139f58d8",
"timestamp": "2020-04-07T13:54:58.268Z",
"code": 16,
"note": {
"_id": "5e8c8632a88e7b00139f58d7",
"external": false,
"content": "application reopened",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T13:54:58.266Z"
},
"id": "5e8c8632a88e7b00139f58d8"
},
{
"_id": "5e8c85c2a88e7b00139f58d4",
"timestamp": "2020-04-07T13:53:06.752Z",
"code": 2,
"note": {
"_id": "5e8c85c2a88e7b00139f58d2",
"external": false,
"content": "I am approving this application",
"owner": "5d25a03ff784627fe5b96918",
"createdAt": "2020-04-07T13:53:06.748Z"
},
"id": "5e8c85c2a88e7b00139f58d4"
},
{
"_id": "5e8c78c3a88e7b00139f58cb",
"timestamp": "2020-04-07T12:57:39.575Z",
"code": 9,
"id": "5e8c78c3a88e7b00139f58cb"
},
{
"_id": "5e8c78b9a88e7b00139f58c9",
"timestamp": "2020-04-07T12:57:29.009Z",
"code": 9,
"note": null,
"user": null,
"id": "5e8c78b9a88e7b00139f58c9"
},
{
"_id": "5e8c78b8a88e7b00139f58c6",
"timestamp": "2020-04-07T12:57:28.975Z",
"code": 16,
"id": "5e8c78b8a88e7b00139f58c6"
},
{
"_id": "5e8c78aea88e7b00139f58c2",
"timestamp": "2020-04-07T12:57:18.483Z",
"code": 3,
"id": "5e8c78aea88e7b00139f58c2"
},
{
"_id": "5e8c78a9a88e7b00139f58bf",
"timestamp": "2020-04-07T12:57:13.451Z",
"code": 9,
"note": null,
"user": null,
"id": "5e8c78a9a88e7b00139f58bf"
},
{
"_id": "5e8c78a9a88e7b00139f58bc",
"timestamp": "2020-04-07T12:57:13.431Z",
"code": 16,
"id": "5e8c78a9a88e7b00139f58bc"
},
{
"_id": "5e8c78a2a88e7b00139f58b8",
"timestamp": "2020-04-07T12:57:06.638Z",
"code": 2,
"id": "5e8c78a2a88e7b00139f58b8"
},
{
"_id": "5e8c7890a88e7b00139f58b5",
"timestamp": "2020-04-07T12:56:48.980Z",
"code": 9,
"id": "5e8c7890a88e7b00139f58b5"
},
{
"_id": "5e8c7868a88e7b00139f58b0",
"timestamp": "2020-04-07T12:56:08.879Z",
"code": 4,
"id": "5e8c7868a88e7b00139f58b0"
},
{
"_id": "5e8c7840a88e7b00139f58ab",
"timestamp": "2020-04-07T12:55:28.902Z",
"code": 11,
"id": "5e8c7840a88e7b00139f58ab"
},
{
"_id": "5e8c783ca88e7b00139f58aa",
"timestamp": "2020-04-07T12:55:24.543Z",
"code": 6,
"id": "5e8c783ca88e7b00139f58aa"
},
{
"_id": "5e8c782aa88e7b00139f58a0",
"timestamp": "2020-04-07T12:55:06.077Z",
"code": 14,
"id": "5e8c782aa88e7b00139f58a0"
},
{
"_id": "5e8c782aa88e7b00139f589e",
"timestamp": "2020-04-07T12:55:06.074Z",
"code": 5,
"id": "5e8c782aa88e7b00139f589e"
}
],
"baseApplicationId": "5e8c782aa88e7b00139f589d",
"createdAt": "2020-04-07T12:55:06.146Z",
"updatedAt": "2020-04-07T15:39:23.369Z",
"currentStatus": 9,
"id": "5e8c782aa88e7b00139f589d",
"statusName": "In Progress"
}
```
### Update application status
You can manage the application status via the following request:
##### Node.js
```js
await client.applications.changeStatus(
applicationId,
client.statuses.APPROVED
);
```
##### HTTP
```bash
POST /integrations/v2/applications//status_changes
HEADERS:
apiKey:
Content-Type: application/json
BODY:
{
"code": 2
}
```
Example: [routes/index.js](https://github.com/SelfKeyFoundation/relying-party-mp-kycc-demo/blob/master/src/routes/index.js)
### Working with personal information
KYC-Chain api application is constructed from 2 sets of personal information
- Identity attributes
- Questions
#### Identity Attributes
Identity Attribute is a predefined atomic peace of information about a person. Attributes are defined with JSON Schema.
Here is the full list of currently supported identity attributes: [https://platform.selfkey.org/repository.json](https://platform.selfkey.org/repository.json)
You can also load a fully resolved list from here: [https://platform.selfkey.org/resolved-repository.json](https://platform.selfkey.org/resolved-repository.json)
##### Invalidate an Attribute
While the manager is checking the application, he can decide to invalidate an identity attribute (request to fill again).
Here is how to do it via the API
##### Node.js
```js
const attributesToInvalidate = ["5e81d956f52e300013c7e5c2", "5e81d956f52e300013c7e5c3"]
const response = await kyccClient.applications.attributes.invalidate(applicationId, attributesToInvalidate);
```
##### HTTP
```bash
POST /integrations/v2/applications//attributes/invalidate?attributes[]=5e81d956f52e300013c7e5c2&attributes[]=5e81d956f52e300013c7e5c3
HEADERS:
apiKey:
```
This operation will cause the `valid` field of the attributes to become `false`
```js
[
...,
"5e81d956f52e300013c7e5c2": {
"description": "First name",
"isAdditional": false,
"label": "First name",
"optional": false,
"schema": "http://platform.selfkey.org/schema/attribute/first-name.json",
"valid": false,
"value": "Test"
},
"5e81d956f52e300013c7e5c3": {
"description": "Middle name",
"isAdditional": false,
"label": "Middle name",
"optional": true,
"schema": "http://platform.selfkey.org/schema/attribute/middle-name.json",
"valid": false,
"value": "test"
},
...
```
##### Request Additional Attribute
While the manager is checking the application, he can decide to request additional attributes from the customer
Here is how to do it via the API
##### Node.js
```js
const additionalAttribute = {
"description": "Please insert an image of your fingerpring",
"label": "Fingerprint",
"optional": false,
"schema": "http://platform.selfkey.org/schema/attribute/fingerprint.json"
}
const response = await kyccClient.applications.attributes.add(applicationId, additionalAttribute);
```
##### HTTP
```bash
POST /integrations/v2/applications//attributes
HEADERS:
apiKey:
Content-Type: application/json
BODY:
{
"description": "Please insert an image of your fingerpring",
"label": "Fingerprint",
"optional": false,
"schema": "http://platform.selfkey.org/schema/attribute/fingerprint.json"
}
```
This operation will add a new attribute to fill in the application and it will contain a new field `isAdditional: true`
```js
[
...,
"5e8de186957ad100130d426f": {
"description": "Please insert an image of your fingerpring",
"label": "Fingerprint",
"optional": false,
"schema": "http://platform.selfkey.org/schema/attribute/fingerprint.json"
"valid": false,
"isAdditional": true
}
```
#### Questions
Besides Identity Attributes KYC-Chain supports general questions to be requested of the customer. Thous are generic text questions and don't have a predefined schema.
##### Invalidate a Question
While the manager is checking the application, he can decide to invalidate the answer to a question (request to answer again).
Here is how to do it via the API
##### Node.js
```js
const questionsToInvalidate = ["5e81d956f52e300013c7e5c2", "5e81d956f52e300013c7e5c3"]
const response = await kyccClient.applications.questions.invalidate(applicationId, questionsToInvalidate);
```
##### HTTP
```bash
POST /integrations/v2/applications//questions/invalidate?questions[]=5e81d956f52e300013c7e5c2&questions[]=5e81d956f52e300013c7e5c3
HEADERS:
apiKey:
```
This operation will cause the `valid` field of the question to become `false`
```js
[
...,
"5e81d956f52e300013c7e5c2": {
"description": "First name",
"isAdditional": false,
"label": "First name",
"optional": false,
"question": "What is your Given Name?"
"valid": false,
"value": "Test",
"type": "input"˝
},
"5e81d956f52e300013c7e5c3": {
"description": "Middle name",
"isAdditional": false,
"label": "Middle name",
"optional": true,
"question": "What is your Middle Name?"
"valid": false,
"value": "test",
"type": "input"
},
...
```
##### Request to Answer Additional Questions
While the manager is checking the application, he can decide to request answers for additional questions from the customer
Here is how to do it via the API
##### Node.js
```js
const additionalQuestion = {
"description": "How many fingers on the hand",
"label": "Fingers on the Hand",
"optional": false,
"questions": "How many fingers do you have on your right hand?",
"type": "select",
"options": ["10", "20", "5", "6"]
}
const response = await kyccClient.applications.questions.add(applicationId, additionalQuestion);
```
##### HTTP
```bash
POST /integrations/v2/applications//questions
HEADERS:
apiKey:
Content-Type: application/json
BODY:
{
"description": "How many fingers on the hand",
"label": "Fingers on the Hand",
"optional": false,
"questions": "How many fingers do you have on your right hand?",
"type": "select",
"options": ["10", "20", "5", "6"]
}
```
This operation will add a new question to fill in the application and it will contain a new field `isAdditional: true`
```js
[
...,
"5e8de186957ad100130d426f": {
"description": "How many fingers on the hand",
"label": "Fingers on the Hand",
"optional": false,
"questions": "How many fingers do you have on your right hand?",
"type": "select",
"options": ["10", "20", "5", "6"],
"isAdditional": true
}
```
## License
[The GPL-3.0 License](http://opensource.org/licenses/GPL-3.0)
Copyright (c) 2018 SelfKey Foundation