diff --git a/.gitignore b/.gitignore
index 76add87..eaa4267 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
node_modules
-dist
\ No newline at end of file
+# dist
\ No newline at end of file
diff --git a/certs/Private_G1_chain.pem b/certs/Private_G1_chain.pem
index be98f55..b6fdb35 100644
--- a/certs/Private_G1_chain.pem
+++ b/certs/Private_G1_chain.pem
@@ -1,110 +1,99 @@
-----BEGIN CERTIFICATE-----
-MIIFhDCCA2ygAwIBAgIEAJimITANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMTMwMQYDVQQDDCpTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUHJpdmF0ZSBSb290IENBIC0gRzEwHhcNMTMxMTE0
-MTM0ODU1WhcNMjgxMTEzMjMwMDAwWjBiMQswCQYDVQQGEwJOTDEeMBwGA1UECgwV
-U3RhYXQgZGVyIE5lZGVybGFuZGVuMTMwMQYDVQQDDCpTdGFhdCBkZXIgTmVkZXJs
-YW5kZW4gUHJpdmF0ZSBSb290IENBIC0gRzEwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQDaIMh56ynwnEhE7Ey54KpX5j1XDoxbHDCgXctute55RjmG2hy6
-fuq++q/dCSsj38Pi/KYn/PN13EF05k39IRvakb0AQNVyHifNKXfta6Tzi5QcM4BK
-09DB4Ckb6TdZTNUtWyEcAtRblYaVSQ4Xr5QODNqu2FGQucraVXqCIx81azlOE2Jb
-Zli9AZKn94pP57A11dUYhxMsh70YosJEKVB8Ue4ROksHhb/nnOISG+2y9FD5M8u8
-jYhp00TGZGVu5z0IFgtqX0i8GmrH0ub9AWjf/iU4MWjGVRSq0cwUHEeKRj/UD9a8
-xIEn9TxIfYj+6+s4tn9dW/4PV5jc6iGJx6ExTPfOR7VHpxS4XujrZb5Ba/+oj/ON
-dOfR0JSm2itCytbtjQBBL0oocIIqaqOna1cufHkcn9VleF7Zvz/8njQIpAU4J4nJ
-4pE5pQ3k4ORAGNnq5R9hAqqUQGDlo3Uj8PBou0nPzQ7JNgGkN+my/lGr4rceUNK/
-8CoGnYFUH+UyFtJkvlLlEkb688/IdNdGgY+vuXCAB6xfKlJjAGChFUBb6swbNeNc
-tVEdUj7Weg4Jt5gXu78C2mjs9x5lcHOgMO4ZmvYJ3Ejp4k3nNa45HOIVkYrfQrrB
-HzBhR0BuReAagurcbtUjJFd7BtufGVLfU3CUn1l6u3/9eG4DGH6pq+dSKQIDAQAB
-o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
-Kv25Kx76w4SHBtuB/4aXdQ3rAYswDQYJKoZIhvcNAQELBQADggIBAEvpmXMOOKdQ
-wUPysrsdIkGJUFF+dvmsJDiOuAqV0A1nNTooL3esvDLEZAWZwKTOwRomnHzeCfS/
-QxRKTkVX21pfrHf9ufDKykpzjl9uAILTS76FJ6//R0RTIPMrzknQpG2fCLR5DFEb
-HWU/jWAxGmncfx6HQYl/azHaWbv0dhZOUjPdkGAQ6EPvHcyNU9yMkETdw0X6ioxq
-zMwkGM893oBrMmtduiqIf3/H6HTXoRKAc+/DXZIq/pAc6eVMa6x43kokluaam9L7
-8yDrlHbGd2VYAr/HZ0TjDZTtI2t2/ySTb7JjC8wL8rSqxYmLpNrnhZzPW87sl2OC
-FC3re3ZhtJkIHNP85jj1gqewTC7DCW6llZdB3hBzfHWby0EX2RlcwgaMfNBEV5U0
-IogccdXV+S6zWK4F+yBr0sXUrdbdMFu+g3I9CbXxt0q4eVJtoaun4M2Z+bZMqZvy
-9FryBdSfhpgmJqwFz2luOhPOVCblCPhLrUeewrvuBXoZQWt1ZjuHfwJZ1dgjszVE
-qwY9S0SdqCg2ZlL9s3vDIrrd3wLWrcHLQMd9gwsppNv9c7JfIJdlcZLTmF9EuL6e
-CvVVrqBVqLHjva4erqYol6K/jbSfUtRCy8IlFU7LYu1KLehZKYvj3vekj3Cn08Aq
-ljr/Q8Pw+OfUZTzKg4PVDQVfFqKtyosv
+MIIHdDCCBVygAwIBAgIQCTtvhv0uAIdCZI0KPg1d4TANBgkqhkiG9w0BAQsFADBl
+MQswCQYDVQQGEwJJRTEhMB8GA1UEChMYRGlnaUNlcnQgSXJlbGFuZCBMaW1pdGVk
+MTMwMQYDVQQDEypEaWdpQ2VydCBHMiBUTFMgRVUgUlNBNDA5NiBTSEEzODQgMjAy
+MiBDQTEwHhcNMjQwMzE5MDAwMDAwWhcNMjUwMzE4MjM1OTU5WjBTMQswCQYDVQQG
+EwJOTDEQMA4GA1UEBxMHVXRyZWNodDEdMBsGA1UEChMUS2FtZXIgdmFuIEtvb3Bo
+YW5kZWwxEzARBgNVBAMTCmFwaS5rdmsubmwwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDgff29P8DzK6WAinCpuGCoAYeqplzEANeChbUTJO0YWZf70NEy
+ZpesFBRjl5HA5uhyEZORkJ0pA89YUQ6hasE9T9OtAMV57oRqDDEoVdKjNlujgN66
+rSbkz4sll8BCdF8vqvgy7kSCgr25619WSDUwx2jFShycqcNANTwMRXl8xGJ9WCSu
+B71lWDbt3V107otIBrj8+YoT0MFLOMcD/QUvk663Uh0UfjPIpCN475eTQljiWQ6t
+UIZWGCXn3CM37XMAYh4MkXRLCKf4oBeaK5w7UWEcj00SlPnqNOBbDf945DxOmGFl
+dLUYM3yEF4q6nslZj976KzZaJyiAVxLDmu7LAgMBAAGjggMwMIIDLDAfBgNVHSME
+GDAWgBQYieev8Cj2fMpoBVLhYtiR1hZlYDAdBgNVHQ4EFgQUOo7d4A/DIRPs8rVm
+e+NK5F7gtN4wFQYDVR0RBA4wDIIKYXBpLmt2ay5ubDA+BgNVHSAENzA1MDMGBmeB
+DAECAjApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMw
+DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBP
+BgNVHR8ESDBGMESgQqBAhj5odHRwOi8vY3JsLmRpZ2ljZXJ0LmV1L0RpZ2lDZXJ0
+RzJUTFNFVVJTQTQwOTZTSEEzODQyMDIyQ0ExLmNybDCBgwYIKwYBBQUHAQEEdzB1
+MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5kaWdpY2VydC5ldTBOBggrBgEFBQcw
+AoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuZXUvRGlnaUNlcnRHMlRMU0VVUlNB
+NDA5NlNIQTM4NDIwMjJDQTEuY3J0MAwGA1UdEwEB/wQCMAAwggF9BgorBgEEAdZ5
+AgQCBIIBbQSCAWkBZwB3AE51oydcmhDDOFts1N8/Uusd8OCOG41pwLH6ZLFimjnf
+AAABjlYWK7oAAAQDAEgwRgIhANRvIePiWyNoKeOR7/dfEXmB7U3QCUjHQf7sRlNv
+3wAPAiEAi9X6iLPay8LDsawjYRp6qW1+CpsGHbPssP5/JzeK6FYAdQDm0jFjQHeM
+wRBBBtdxuc7B0kD2loSG+7qHMh39HjeOUAAAAY5WFixQAAAEAwBGMEQCIDZ2wT6S
+17TSyqYtumUQmZUA9zcCj+aVZZpuwhUWlVPoAiAEk280/8xEx6D8x8VW7n+iGi/Y
+CIk+IkunkDfJg3rx7wB1AM8RVu7VLnyv84db2Wkum+kacWdKsBfsrAHSW3fOzDsI
+AAABjlYWK3wAAAQDAEYwRAIgaC0qLC23aOdFyMJQGbXx3K9kTnmrkC9MbjyPhiqj
+4QkCIF5yiqo/0FoL7MTUBFvN9greMIGdFj4g1tGr24kGYXfbMA0GCSqGSIb3DQEB
+CwUAA4ICAQBw6bppiKHoXZLCpJy/jhRmAXOTDv2hnaj4PKbOj1LTtKGvxWub4hZE
+l5gBcKfCqkr0CMUApo6Nkp8P7aCm9ew4bTPA72GEU1qHTgEzMD8+KyqKc8xh35IB
+MMjUkttBW9uX8GtDqn0pmYONGGLU5IUZ+qdBUExaUexeUL5ryZjlswrpIsqiI9Kx
+0UlE1ndP3pQ130mBTH6xrmd+8YN3LLceJnZ9VHw0evk2N3DIpZzqCqRkT6wxlxEB
+OM82IXYRKNVNYVquRObWsP8k9+Wuj9s7i/bUkDqQ/76i8rt1vXeE3eVz8eZCp3My
+ubwQ5q7D73TOiSpW1jQJm0C7LS4ywr4w2F1VrTD4fVvU6LYPTwpshG9CK+ztpT4t
+E7SkpnPtawcsbWDZrUjhDdSFLuZLo7Rofc4B0Jq+R50rDKHPiOCZjYB+Da7ZMdyP
+2JApylOMDmxM5Njw0I4OuQARPhTnycJ7xu9hD0f/5Y5nMe6rxWe7eT0u2UKccfPs
+STVqvpmCH5JZKtu5ZpMcwKVO3rsYjEL2WztqQNQGn+qvhAty1XaABTh40BA46PHB
+/btFQccVlC+BUXBlna+7tmPup4BdhPBRmVfD7puo2f9MT2sucYgv5gY467xgy8zU
+NsGXaRU9d+dmVSeq2lkJn5QtDiUfXlndQzK7drnhGtN9CjQKQlbfBA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIGoTCCBImgAwIBAgIEAJimiDANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMTMwMQYDVQQDDCpTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUHJpdmF0ZSBSb290IENBIC0gRzEwHhcNMTMxMTE1
-MTAwNDEzWhcNMjgxMTEyMjMwMDAwWjBmMQswCQYDVQQGEwJOTDEeMBwGA1UECgwV
-U3RhYXQgZGVyIE5lZGVybGFuZGVuMTcwNQYDVQQDDC5TdGFhdCBkZXIgTmVkZXJs
-YW5kZW4gUHJpdmF0ZSBTZXJ2aWNlcyBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEAvwOIqjkS4zOz5/8mp/xJ0N2031fQVS53AwimkLBrkqut
-ypo0dZKyn4JEoNs2KmwdjMNC4TWWn8aagdAzL0e8pIdJwuswDb2S5yKRCs1cvaTH
-op+ueVc8QoQbiQXx25ryJn0c+Se3DTo+0DGljnf+UXUqoDSnV0upptEt+yM7m17W
-ndBUzOUk/hh6dw63gkHSJn9fiN/Apd5iRH+fnAr6AE6uKcSYtjkrr4mt64WJCLFM
-9aISg3eplf3Gqv7Pzr7AVxr/VAMuSLz9EQdMveOYEqzjxDZJptvrGAmfFMYPkEDC
-yXPXF8Njbh5CVdCiaJye2dJXvYwnUtTCBs8Qbcf7Fzl5NFKEB7bvmY85kGZV5SJd
-3EPbSiNUtMZ2Dx5trC9NxobI4iOIdzIGx8t+lZ2hOSrBhidgXBa2AkbxqdVl+ibY
-wI2FOtdXg/EQzps2owvQST4uQAqthHsR2bGcAoKASXNSuBNrzUz0eu84k/Si/aPy
-Q1Yo3AkqC5qkX6QQP5JzjrTXTcoxsKYsqNdxyACA80/D0RXX5yNTMfMoAPl/n1Ax
-D8h1LB1tf3uiDImTkfU0Fjorqe7oTJdtWQLep+e+CVcDpuSzssk+6aKZnKESOzv6
-S+V85Z+iHfELSRku64dMZL6i4Yzr0MPidxwAvZGg7nuf48ruKeyE8C81V/fT2RcC
-AwEAAaOCAVkwggFVMA8GA1UdEwEB/wQFMAMBAf8wXQYDVR0gBFYwVDAMBgpghBAB
-h2sBAggEMAwGCmCEEAGHawECCAUwNgYKYIQQAYdrAQIIBjAoMCYGCCsGAQUFBwIB
-FhpodHRwczovL2Nwcy5wa2lvdmVyaGVpZC5ubDBLBggrBgEFBQcBAQQ/MD0wOwYI
-KwYBBQUHMAKGL2h0dHA6Ly9jZXJ0LnBraW92ZXJoZWlkLm5sL1ByaXZhdGVSb290
-Q0EtRzEuY2VyMA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQq/bkrHvrDhIcG
-24H/hpd1DesBizBGBgNVHR8EPzA9MDugOaA3hjVodHRwOi8vY3JsLnBraW92ZXJo
-ZWlkLm5sL1ByaXZhdGVSb290TGF0ZXN0Q1JMLUcxLmNybDAdBgNVHQ4EFgQUPq+o
-D4eiLEF7FGwb89to05KnRKgwDQYJKoZIhvcNAQELBQADggIBAD679+kWzn1Qf9Nv
-GMlO+HFSTXmJ1M5/SMnbaXJCa1EHMzL7KErSc5BnQcwjV4HCrtQB9hRc6tzso2tE
-PAj9ytopNIvCelnW9ooYQ7wLuNErZU+LNYyOad7+pP+YSmwsIKF8wSBjz6IFgC+9
-NtWjNL00enDXPo0/gcVTAuwUuk2qXH4qhqU3IhnstHWgnlOH+dS1UsJR1Za+JTFa
-9mxy9vDC/D/MbFYcUd88M3QZ1aadUjZAbLR6dhZGsuFJSqX2Ck7F1ZNt48Hd2uB1
-DRYBedT7w+D/lKoJMz5XsYAVZx7yon3aohz+7SiuaQrvB6zo8HkMTRDGR1SKvguc
-yposE1o3SCkutP34xNvAG3Ykuop9J4vjdfmJ5G22eHwclbi037jGc2xv64KSanS9
-09VDFO4KCrKICwEUG4n36Dg8gEdYNLukZBvnH9LPdVao7cl8S6Clpd1JTTnMl1KD
-IVjICvggNklD0A+9Zl6o25ongji1F9SGLVy9LHkmymGybAvWvYTZJaOmzYtdxwih
-KxywNovJruAnD37+T63lt5S/FSpLSjOfKj0dvBxCPPeNs2B418/A3HTGz63e2dCV
-T+QOH14xfKJ+k9/ZFr5XuhkingMUG6vZeND4HWVJzc4mq6Ic27QKS9ulmcUdYos+
-0nOnmkmh5knv11C1n8YATbQjZh0i
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
+5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
+1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
+NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
+Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
+8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
+pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIG/DCCBOSgAwIBAgIIU2w5U7TnvlwwDQYJKoZIhvcNAQELBQAwZjELMAkGA1UE
-BhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjE3MDUGA1UEAwwu
-U3RhYXQgZGVyIE5lZGVybGFuZGVuIFByaXZhdGUgU2VydmljZXMgQ0EgLSBHMTAe
-Fw0xNjExMDMxMDM2MTFaFw0yODExMTIwMDAwMDBaMIGAMQswCQYDVQQGEwJOTDEg
-MB4GA1UECgwXUXVvVmFkaXMgVHJ1c3RsaW5rIEIuVi4xFzAVBgNVBGEMDk5UUk5M
-LTMwMjM3NDU5MTYwNAYDVQQDDC1RdW9WYWRpcyBQS0lvdmVyaGVpZCBQcml2YXRl
-IFNlcnZpY2VzIENBIC0gRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCo9ep1FEPp6FQIgMT8wD5UoTDQoqkE43vWFx2ur6cxYQFpWXefd0dpdaugwOJ5
-igIilAoIrd+FdYxbJxQOkrbmkFX1mdW2mAf10+9BW5rn1HvwHG/nvZ8kyaeZuEyE
-UmVZ+EEFw+7hOru7YPkxA5U7N3IY409xAjiYS3Cti388bLPfE3Ci0Rt2WQlL3jbn
-SlAty2ZdJ5aCRkL3Cm8wERlwZ0lsLsTIQo1TCw6WfrDgEk+41MvP3eh+0wL3lWPn
-SPzwvI13Dd5PjT7Pte73oVpqRwgWl+2ZjGD7vwNf14rma3Khuwv74lWWJIr9EHu4
-miseqVlhk4mFpPC4zsKM6AeXfhZwKLmGAwM54yHw7hjvSPoBilpGiKdIdELMfFzW
-ToSOjMXPQZyHSF5F13sj/hD+YLRBx95QsDa+1xWJq4hv+/t/WPuw1E+s8JYQ/5HK
-ArYfGNMou20skdJyvYW5H+NcZ0guCaF6zdrUDkFv+uI+MkWQMxGw/mwqZX/cW4EC
-4PPG1j3NEK6/gfU7LT4W/M/GIBC6kJ+L5AJtDIvW8719oIp0UBmhF1nZyQSX6Wda
-plsM6CNYZ7SSq+kUC4k6Oalzsnv4kNy7ru6yzHoI33V6VXQcs2BevJjbf09YIHoh
-2cPKPB0nIvRNq9Lvpek0mi5lGzmDj+/DxRySLdPJbzzdCQIDAQABo4IBkTCCAY0w
-UgYIKwYBBQUHAQEERjBEMEIGCCsGAQUFBzAChjZodHRwOi8vY2VydC5wa2lvdmVy
-aGVpZC5ubC9Eb21Qcml2YXRlU2VydmljZXNDQS1HMS5jZXIwHQYDVR0OBBYEFLls
-phO6uy80Y4MxLvl+SR3fAPVjMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgw
-FoAUPq+oD4eiLEF7FGwb89to05KnRKgwJQYIKwYBBQUHAQMEGTAXMBUGCCsGAQUF
-BwsCMAkGBwQAi+xJAQIwXQYDVR0gBFYwVDAMBgpghBABh2sBAggEMAwGCmCEEAGH
-awECCAUwNgYKYIQQAYdrAQIIBjAoMCYGCCsGAQUFBwIBFhpodHRwczovL2Nwcy5w
-a2lvdmVyaGVpZC5ubDBNBgNVHR8ERjBEMEKgQKA+hjxodHRwOi8vY3JsLnBraW92
-ZXJoZWlkLm5sL0RvbVByaXZhdGVTZXJ2aWNlc0xhdGVzdENSTC1HMS5jcmwwDgYD
-VR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQCM9aEWB9EutS4/TKJ0hSrJ
-ljJSt0sAFxkoi6upCv7+C9Pjp+R5woGAwiBctbM5PyT+KpOKlDZKL3mrXSUc/71q
-NxsPlZR703c+HhlkvDCHbk9afrAXWtXz0sKVs8KaNS2W4k7O8xGNZVMjMwpanQdB
-csTnFPu12OTj8BCv4aOFxIYnPqPHkl8VTAi2pTArCtTQk9vi6QaXPzSmfi/rDINC
-JUAOnA3BEeZZI+BD8yCzE2x9M1N0AIn3UZRfVMfLJdI68a67lt3fLh2ZbLcjE0Pi
-4arBqxzFyKa1LyVsnA1Yg5UCZQh8U9l+5DS5dNS9lDVSBcd9iUio+lg8LvAQ7biz
-+FFiLSqxVcWDuUg079d8JjPakm4JllmORlnSfWlcTHmgKmQOR0TgtXUL/7EDW2qb
-mRb5hUttT6ixBKnjtllnXmpOkx8hZn0F0hqjnIUsw8E0SdpYlrvIKszmowoKtZps
-zL/REVZybhfki5zj22GBMNBBP5MWTkltAZ8x2qu8iUw7MAUkBJy14cWmbqxue95J
-tT3a2/BnSMofYQNALQM4Ay9iZZyCUJIF/EYxg1OXmv65UthXpc4DdApICObyxY+/
-OABPJWHtxuG27SmMBx/MT3ZEs6vswVqGIsbPZydVSqerDskkP1AOl4iFEwmGOtfL
-B+VGn3werrg7IVfbCWEqdA==
+MIIF1DCCBLygAwIBAgIQBk+E/3kfpnbynPNlN6J0njANBgkqhkiG9w0BAQwFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0yMjA5MTkwMDAwMDBaFw0zMjA5MTgyMzU5NTlaMGUxCzAJBgNVBAYTAklF
+MSEwHwYDVQQKExhEaWdpQ2VydCBJcmVsYW5kIExpbWl0ZWQxMzAxBgNVBAMTKkRp
+Z2lDZXJ0IEcyIFRMUyBFVSBSU0E0MDk2IFNIQTM4NCAyMDIyIENBMTCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAN4iiUwFRU3M4Ybw83MDTNpV49ks4gHZ
+eFKbAw3CFAG5OLvVEZXaO2UFlikNK6pyHAH9c7vO19t7VF3lA2c0Y0MNhHcKRkYc
+fGKPffhcDaV5lKtE/azrbatl9Mpc/X+sG/0EjOLUDRGldG4EANSNFKlPN0nhGtp2
+rEDe24v9IFE7wAlu9cPkgE+CDNT3vauSGhThbP34twARP5s10zmUqqi63ZAS3jhJ
+KV41aI84Mc/jrg2o4aYKGhUBrSMu0XT4Q7D3aMIv1s44BrhbNpRrFwjw+frzu3Bz
+S/kp2ymdmeCX7EgZr2OKTCxdY0zkxsgt5TxQIAuWJIDSWC6SYtf+DYP7M4j5kVRM
+M4aEVuDcKxLlR9r+lJWBbQ025PAtph+wsW2Uqsnl2gjv5da3t+H2fABZ3k7HyYRJ
+s6CAdqygQT1cuTIuJAQChlLW+9ewa0S+Ny4zV9U7K2xH5DWe3xsWzusHWBADmB+J
+jwPShK1sQeOfMtz2VMLIXbbk5ktW4qjJc7TUqx6oqiymRsc1ftAmr92n+pZY01Ww
+qx9AigmvaSwpsBoMxJJWPz4x/L1BY7TQ7bxYC/1QUEFp3LL6B+O1wienOVX570v+
+gh/0HcFLSb7c+SAThCu9ZamrPsfqUhJiX0mX2xLKXXAYE1090iweqPJLSS4w39YS
+Rw/XLWMGwhbvAgMBAAGjggGCMIIBfjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1Ud
+DgQWBBQYieev8Cj2fMpoBVLhYtiR1hZlYDAfBgNVHSMEGDAWgBROIlQgGJXm427m
+D/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
+CCsGAQUFBwMCMHYGCCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29j
+c3AuZGlnaWNlcnQuY29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdp
+Y2VydC5jb20vRGlnaUNlcnRHbG9iYWxSb290RzIuY3J0MEIGA1UdHwQ7MDkwN6A1
+oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RH
+Mi5jcmwwPQYDVR0gBDYwNDALBglghkgBhv1sAgEwBwYFZ4EMAQEwCAYGZ4EMAQIB
+MAgGBmeBDAECAjAIBgZngQwBAgMwDQYJKoZIhvcNAQEMBQADggEBAEQOjk9D1gf8
+jJfOqSjbuuYCy3hdaFZwfi3kfhGaFoT5V5nhu2cnruBw1KREgawfxi7xcLwBaQbq
+RBGchvqPSfRboGU1qYmhUyo2el2wCLWXgVJxuy1PSW2cPIN3MYo0y8XDo78cVlw0
+eZs2z8F8W8AkGqhjhVCrOoL1+gPrzO3b0akjzeGGtihbwDpH7/EH0o1ZkcdZYhUy
+HubnWq/LYupz26kZVQMHuaSgYPhnI6gsBk4A0Mz+JnMEf+nAXu9oeXZiFPFV5omz
+QUMeo5mz+K3ERI45CtB38aoCxMuvgIpw1Db7vzFWV/8e/T/hhJCnnApirbqJU42B
+J+sOZ9FoWLo=
-----END CERTIFICATE-----
+
diff --git a/dist/cjs/index.js b/dist/cjs/index.js
new file mode 100644
index 0000000..8fb9235
--- /dev/null
+++ b/dist/cjs/index.js
@@ -0,0 +1,199 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __rest = (this && this.__rest) || function (s, e) {
+ var t = {};
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+ t[p] = s[p];
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+ t[p[i]] = s[p[i]];
+ }
+ return t;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.KVK = void 0;
+const node_fs_1 = __importDefault(require("node:fs"));
+const node_path_1 = __importDefault(require("node:path"));
+const node_https_1 = __importDefault(require("node:https"));
+const node_crypto_1 = __importDefault(require("node:crypto"));
+const node_fetch_1 = __importDefault(require("node-fetch"));
+const BASE_URL = 'https://api.kvk.nl/api';
+const CERTIFICATE_PATH = '../../certs/Private_G1_chain.pem';
+class KVK {
+ constructor(apiKey, baseUrl, certificate, httpsAgent) {
+ this.apiKey = apiKey;
+ this.baseUrl = baseUrl || BASE_URL;
+ this.certificate = certificate || this.getCertificate();
+ this.httpsAgent = httpsAgent || this.createHttpsAgent();
+ }
+ getCertificate() {
+ const pathToCertificate = node_path_1.default.join(__dirname, CERTIFICATE_PATH);
+ const certificate = node_fs_1.default.readFileSync(pathToCertificate, {
+ encoding: 'utf-8',
+ });
+ return certificate;
+ }
+ createHttpsAgent() {
+ const httpsAgent = new node_https_1.default.Agent({
+ ca: this.certificate,
+ secureOptions: node_crypto_1.default.constants.SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION,
+ });
+ return httpsAgent;
+ }
+ static validateKvkNummer(val) {
+ if (val.length !== 8)
+ return false;
+ return /^\d+$/.test(val);
+ }
+ static validateVestigingsnummer(val) {
+ if (val.length !== 12)
+ return false;
+ return /^\d+$/.test(val);
+ }
+ request({ endpoint, params = {}, headers = {}, }) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const query = new URLSearchParams(Object.assign({}, Object.fromEntries(Object.entries(params).filter(([_, v]) => v != null)))).toString();
+ const url = this.baseUrl + endpoint + (query ? `?${query}` : '');
+ const res = yield (0, node_fetch_1.default)(url, {
+ method: 'GET',
+ headers: Object.assign({ Accept: 'application/json', apiKey: this.apiKey }, headers),
+ agent: this.httpsAgent,
+ });
+ const data = yield res.json();
+ return data;
+ });
+ }
+ /**
+ * @deprecated This function is deprecated and will be removed in a future version.
+ * The KVK api will stop supporting searching on the V1 endpoint starting 29-07-2024
+ * Use [zoekenV2] instead.
+ */
+ zoeken(_a) {
+ var { kvkNummer, vestigingsnummer, postcode, huisnummer, pagina = 1, aantal = 15 } = _a, params = __rest(_a, ["kvkNummer", "vestigingsnummer", "postcode", "huisnummer", "pagina", "aantal"]);
+ return __awaiter(this, void 0, void 0, function* () {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ if (vestigingsnummer && !KVK.validateVestigingsnummer(vestigingsnummer))
+ throw new Error('KVK: Ongeldig vestigingsnummer.');
+ if ((postcode && !huisnummer) || (huisnummer && !postcode))
+ throw new Error('KVK: Postcode en huisnummer mogen alleen in combinatie met elkaar gebruikt worden.');
+ if (pagina < 1 || pagina > 1000)
+ throw new Error('KVK: Pagina is minimaal 1 en maximaal 1000.');
+ if (aantal < 1 || aantal > 100)
+ throw new Error('KVK: Aantal is minimaal 1 en maximaal 100.');
+ return yield this.request({
+ endpoint: '/v1/zoeken',
+ params: Object.assign({ kvkNummer,
+ vestigingsnummer,
+ postcode,
+ huisnummer,
+ pagina,
+ aantal }, params),
+ });
+ });
+ }
+ zoekenV2(_a) {
+ var { kvkNummer, vestigingsnummer, postcode, huisnummer, pagina = 1, resultatenPerPagina = 15 } = _a, params = __rest(_a, ["kvkNummer", "vestigingsnummer", "postcode", "huisnummer", "pagina", "resultatenPerPagina"]);
+ return __awaiter(this, void 0, void 0, function* () {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ if (vestigingsnummer && !KVK.validateVestigingsnummer(vestigingsnummer))
+ throw new Error('KVK: Ongeldig vestigingsnummer.');
+ if ((postcode && !huisnummer) || (huisnummer && !postcode))
+ throw new Error('KVK: Postcode en huisnummer mogen alleen in combinatie met elkaar gebruikt worden.');
+ if (pagina < 1 || pagina > 1000)
+ throw new Error('KVK: Pagina is minimaal 1 en maximaal 1000.');
+ if (resultatenPerPagina < 1 || resultatenPerPagina > 100)
+ throw new Error('KVK: Aantal is minimaal 1 en maximaal 100.');
+ return yield this.request({
+ endpoint: '/v2/zoeken',
+ params: Object.assign({ kvkNummer,
+ vestigingsnummer,
+ postcode,
+ huisnummer,
+ pagina,
+ resultatenPerPagina }, params),
+ });
+ });
+ }
+ basisprofiel(kvkNummer, geoData) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return yield this.request({
+ endpoint: `/v1/basisprofielen/${kvkNummer}`,
+ params: {
+ geoData,
+ },
+ });
+ });
+ }
+ basisprofielEigenaar(kvkNummer, geoData) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return yield this.request({
+ endpoint: `/v1/basisprofielen/${kvkNummer}/eigenaar`,
+ params: {
+ geoData,
+ },
+ });
+ });
+ }
+ basisprofielHoofdvestiging(kvkNummer, geoData) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return yield this.request({
+ endpoint: `/v1/basisprofielen/${kvkNummer}/hoofdvestiging`,
+ params: {
+ geoData,
+ },
+ });
+ });
+ }
+ basisprofielVestigingen(kvkNummer) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return yield this.request({
+ endpoint: `/v1/basisprofielen/${kvkNummer}/vestigingen`,
+ });
+ });
+ }
+ vestigingsprofiel(vestigingsnummer, geoData) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (vestigingsnummer && !KVK.validateVestigingsnummer(vestigingsnummer))
+ throw new Error('KVK: Ongeldig vestigingsnummer.');
+ return yield this.request({
+ endpoint: `/v1/vestigingsprofielen/${vestigingsnummer}`,
+ params: {
+ geoData,
+ },
+ });
+ });
+ }
+ naamgeving(kvkNummer) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return yield this.request({
+ endpoint: `/v1/naamgevingen/kvkNummer/${kvkNummer}`,
+ });
+ });
+ }
+}
+exports.KVK = KVK;
+exports.default = KVK;
diff --git a/dist/cjs/types/index.d.ts b/dist/cjs/types/index.d.ts
new file mode 100644
index 0000000..aa9a173
--- /dev/null
+++ b/dist/cjs/types/index.d.ts
@@ -0,0 +1,61 @@
+///
+import https from 'node:https';
+export declare class KVK {
+ apiKey: string;
+ baseUrl: string;
+ certificate: string;
+ httpsAgent: https.Agent;
+ constructor(apiKey: string, baseUrl?: string | null, certificate?: string | null, httpsAgent?: https.Agent | null);
+ getCertificate(): string;
+ createHttpsAgent(): https.Agent;
+ static validateKvkNummer(val: string): boolean;
+ static validateVestigingsnummer(val: string): boolean;
+ request({ endpoint, params, headers, }: {
+ endpoint: string;
+ params?: object;
+ headers?: object;
+ }): Promise;
+ /**
+ * @deprecated This function is deprecated and will be removed in a future version.
+ * The KVK api will stop supporting searching on the V1 endpoint starting 29-07-2024
+ * Use [zoekenV2] instead.
+ */
+ zoeken({ kvkNummer, vestigingsnummer, postcode, huisnummer, pagina, aantal, ...params }: {
+ kvkNummer?: string;
+ rsin?: string;
+ vestigingsnummer?: string;
+ handelsnaam?: string;
+ straatnaam?: string;
+ plaats?: string;
+ postcode?: string;
+ huisnummer?: string;
+ huisnummerToevoeging?: string;
+ type?: 'hoofdvestiging' | 'nevenvestiging' | 'rechtspersoon';
+ InclusiefInactieveRegistraties?: boolean;
+ pagina?: number;
+ aantal?: number;
+ }): Promise;
+ zoekenV2({ kvkNummer, vestigingsnummer, postcode, huisnummer, pagina, resultatenPerPagina, ...params }: {
+ kvkNummer?: string;
+ rsin?: string;
+ vestigingsnummer?: string;
+ naam?: string;
+ straatnaam?: string;
+ plaats?: string;
+ postcode?: string;
+ huisnummer?: string;
+ huisletter?: string;
+ type?: 'hoofdvestiging' | 'nevenvestiging' | 'rechtspersoon';
+ InclusiefInactieveRegistraties?: boolean;
+ pagina?: number;
+ resultatenPerPagina?: number;
+ }): Promise;
+ basisprofiel(kvkNummer: string, geoData?: boolean): Promise;
+ basisprofielEigenaar(kvkNummer: string, geoData?: boolean): Promise;
+ basisprofielHoofdvestiging(kvkNummer: string, geoData?: boolean): Promise;
+ basisprofielVestigingen(kvkNummer: string): Promise;
+ vestigingsprofiel(vestigingsnummer: string, geoData?: boolean): Promise;
+ naamgeving(kvkNummer: string): Promise;
+}
+export default KVK;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/dist/cjs/types/index.d.ts.map b/dist/cjs/types/index.d.ts.map
new file mode 100644
index 0000000..8b52b9d
--- /dev/null
+++ b/dist/cjs/types/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,YAAY,CAAA;AAO9B,qBAAa,GAAG;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,KAAK,CAAC,KAAK,CAAA;gBAGrB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,EAC3B,UAAU,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI;IAQjC,cAAc,IAAI,MAAM;IAQxB,gBAAgB,IAAI,KAAK,CAAC,KAAK;IAQ/B,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK9C,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK/C,OAAO,CAAC,EACZ,QAAQ,EACR,MAAW,EACX,OAAY,GACb,EAAE;QACD,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,GAAG,CAAC;IAuBhB;;;;KAIC;IACK,MAAM,CAAC,EACX,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,MAAU,EACV,MAAW,EACX,GAAG,MAAM,EACV,EAAE;QACD,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,oBAAoB,CAAC,EAAE,MAAM,CAAA;QAC7B,IAAI,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,eAAe,CAAA;QAC5D,8BAA8B,CAAC,EAAE,OAAO,CAAA;QACxC,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC,GAAG,CAAC;IAgCV,QAAQ,CAAC,EACb,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,MAAU,EACV,mBAAwB,EACxB,GAAG,MAAM,EACV,EAAE;QACD,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,eAAe,CAAA;QAC5D,8BAA8B,CAAC,EAAE,OAAO,CAAA;QACxC,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAC7B,GAAG,OAAO,CAAC,GAAG,CAAC;IAgCV,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAYhE,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,GAAG,CAAC;IAYT,0BAA0B,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,GAAG,CAAC;IAYT,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IASxD,iBAAiB,CACrB,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,GAAG,CAAC;IAYT,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAQlD;AAED,eAAe,GAAG,CAAA"}
\ No newline at end of file
diff --git a/dist/esm/index.mjs b/dist/esm/index.mjs
new file mode 100644
index 0000000..3c9dccd
--- /dev/null
+++ b/dist/esm/index.mjs
@@ -0,0 +1,168 @@
+import fs from 'node:fs';
+import path from 'node:path';
+import https from 'node:https';
+import crypto from 'node:crypto';
+import fetch from 'node-fetch';
+const BASE_URL = 'https://api.kvk.nl/api';
+const CERTIFICATE_PATH = '../../certs/Private_G1_chain.pem';
+export class KVK {
+ apiKey;
+ baseUrl;
+ certificate;
+ httpsAgent;
+ constructor(apiKey, baseUrl, certificate, httpsAgent) {
+ this.apiKey = apiKey;
+ this.baseUrl = baseUrl || BASE_URL;
+ this.certificate = certificate || this.getCertificate();
+ this.httpsAgent = httpsAgent || this.createHttpsAgent();
+ }
+ getCertificate() {
+ const pathToCertificate = path.join(__dirname, CERTIFICATE_PATH);
+ const certificate = fs.readFileSync(pathToCertificate, {
+ encoding: 'utf-8',
+ });
+ return certificate;
+ }
+ createHttpsAgent() {
+ const httpsAgent = new https.Agent({
+ ca: this.certificate,
+ secureOptions: crypto.constants.SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION,
+ });
+ return httpsAgent;
+ }
+ static validateKvkNummer(val) {
+ if (val.length !== 8)
+ return false;
+ return /^\d+$/.test(val);
+ }
+ static validateVestigingsnummer(val) {
+ if (val.length !== 12)
+ return false;
+ return /^\d+$/.test(val);
+ }
+ async request({ endpoint, params = {}, headers = {}, }) {
+ const query = new URLSearchParams({
+ ...Object.fromEntries(Object.entries(params).filter(([_, v]) => v != null)),
+ }).toString();
+ const url = this.baseUrl + endpoint + (query ? `?${query}` : '');
+ const res = await fetch(url, {
+ method: 'GET',
+ headers: {
+ Accept: 'application/json',
+ apiKey: this.apiKey,
+ ...headers,
+ },
+ agent: this.httpsAgent,
+ });
+ const data = await res.json();
+ return data;
+ }
+ /**
+ * @deprecated This function is deprecated and will be removed in a future version.
+ * The KVK api will stop supporting searching on the V1 endpoint starting 29-07-2024
+ * Use [zoekenV2] instead.
+ */
+ async zoeken({ kvkNummer, vestigingsnummer, postcode, huisnummer, pagina = 1, aantal = 15, ...params }) {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ if (vestigingsnummer && !KVK.validateVestigingsnummer(vestigingsnummer))
+ throw new Error('KVK: Ongeldig vestigingsnummer.');
+ if ((postcode && !huisnummer) || (huisnummer && !postcode))
+ throw new Error('KVK: Postcode en huisnummer mogen alleen in combinatie met elkaar gebruikt worden.');
+ if (pagina < 1 || pagina > 1000)
+ throw new Error('KVK: Pagina is minimaal 1 en maximaal 1000.');
+ if (aantal < 1 || aantal > 100)
+ throw new Error('KVK: Aantal is minimaal 1 en maximaal 100.');
+ return await this.request({
+ endpoint: '/v1/zoeken',
+ params: {
+ kvkNummer,
+ vestigingsnummer,
+ postcode,
+ huisnummer,
+ pagina,
+ aantal,
+ ...params,
+ },
+ });
+ }
+ async zoekenV2({ kvkNummer, vestigingsnummer, postcode, huisnummer, pagina = 1, resultatenPerPagina = 15, ...params }) {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ if (vestigingsnummer && !KVK.validateVestigingsnummer(vestigingsnummer))
+ throw new Error('KVK: Ongeldig vestigingsnummer.');
+ if ((postcode && !huisnummer) || (huisnummer && !postcode))
+ throw new Error('KVK: Postcode en huisnummer mogen alleen in combinatie met elkaar gebruikt worden.');
+ if (pagina < 1 || pagina > 1000)
+ throw new Error('KVK: Pagina is minimaal 1 en maximaal 1000.');
+ if (resultatenPerPagina < 1 || resultatenPerPagina > 100)
+ throw new Error('KVK: Aantal is minimaal 1 en maximaal 100.');
+ return await this.request({
+ endpoint: '/v2/zoeken',
+ params: {
+ kvkNummer,
+ vestigingsnummer,
+ postcode,
+ huisnummer,
+ pagina,
+ resultatenPerPagina,
+ ...params,
+ },
+ });
+ }
+ async basisprofiel(kvkNummer, geoData) {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return await this.request({
+ endpoint: `/v1/basisprofielen/${kvkNummer}`,
+ params: {
+ geoData,
+ },
+ });
+ }
+ async basisprofielEigenaar(kvkNummer, geoData) {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return await this.request({
+ endpoint: `/v1/basisprofielen/${kvkNummer}/eigenaar`,
+ params: {
+ geoData,
+ },
+ });
+ }
+ async basisprofielHoofdvestiging(kvkNummer, geoData) {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return await this.request({
+ endpoint: `/v1/basisprofielen/${kvkNummer}/hoofdvestiging`,
+ params: {
+ geoData,
+ },
+ });
+ }
+ async basisprofielVestigingen(kvkNummer) {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return await this.request({
+ endpoint: `/v1/basisprofielen/${kvkNummer}/vestigingen`,
+ });
+ }
+ async vestigingsprofiel(vestigingsnummer, geoData) {
+ if (vestigingsnummer && !KVK.validateVestigingsnummer(vestigingsnummer))
+ throw new Error('KVK: Ongeldig vestigingsnummer.');
+ return await this.request({
+ endpoint: `/v1/vestigingsprofielen/${vestigingsnummer}`,
+ params: {
+ geoData,
+ },
+ });
+ }
+ async naamgeving(kvkNummer) {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.');
+ return await this.request({
+ endpoint: `/v1/naamgevingen/kvkNummer/${kvkNummer}`,
+ });
+ }
+}
+export default KVK;
diff --git a/dist/esm/types/index.d.ts b/dist/esm/types/index.d.ts
new file mode 100644
index 0000000..aa9a173
--- /dev/null
+++ b/dist/esm/types/index.d.ts
@@ -0,0 +1,61 @@
+///
+import https from 'node:https';
+export declare class KVK {
+ apiKey: string;
+ baseUrl: string;
+ certificate: string;
+ httpsAgent: https.Agent;
+ constructor(apiKey: string, baseUrl?: string | null, certificate?: string | null, httpsAgent?: https.Agent | null);
+ getCertificate(): string;
+ createHttpsAgent(): https.Agent;
+ static validateKvkNummer(val: string): boolean;
+ static validateVestigingsnummer(val: string): boolean;
+ request({ endpoint, params, headers, }: {
+ endpoint: string;
+ params?: object;
+ headers?: object;
+ }): Promise;
+ /**
+ * @deprecated This function is deprecated and will be removed in a future version.
+ * The KVK api will stop supporting searching on the V1 endpoint starting 29-07-2024
+ * Use [zoekenV2] instead.
+ */
+ zoeken({ kvkNummer, vestigingsnummer, postcode, huisnummer, pagina, aantal, ...params }: {
+ kvkNummer?: string;
+ rsin?: string;
+ vestigingsnummer?: string;
+ handelsnaam?: string;
+ straatnaam?: string;
+ plaats?: string;
+ postcode?: string;
+ huisnummer?: string;
+ huisnummerToevoeging?: string;
+ type?: 'hoofdvestiging' | 'nevenvestiging' | 'rechtspersoon';
+ InclusiefInactieveRegistraties?: boolean;
+ pagina?: number;
+ aantal?: number;
+ }): Promise;
+ zoekenV2({ kvkNummer, vestigingsnummer, postcode, huisnummer, pagina, resultatenPerPagina, ...params }: {
+ kvkNummer?: string;
+ rsin?: string;
+ vestigingsnummer?: string;
+ naam?: string;
+ straatnaam?: string;
+ plaats?: string;
+ postcode?: string;
+ huisnummer?: string;
+ huisletter?: string;
+ type?: 'hoofdvestiging' | 'nevenvestiging' | 'rechtspersoon';
+ InclusiefInactieveRegistraties?: boolean;
+ pagina?: number;
+ resultatenPerPagina?: number;
+ }): Promise;
+ basisprofiel(kvkNummer: string, geoData?: boolean): Promise;
+ basisprofielEigenaar(kvkNummer: string, geoData?: boolean): Promise;
+ basisprofielHoofdvestiging(kvkNummer: string, geoData?: boolean): Promise;
+ basisprofielVestigingen(kvkNummer: string): Promise;
+ vestigingsprofiel(vestigingsnummer: string, geoData?: boolean): Promise;
+ naamgeving(kvkNummer: string): Promise;
+}
+export default KVK;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/dist/esm/types/index.d.ts.map b/dist/esm/types/index.d.ts.map
new file mode 100644
index 0000000..8b52b9d
--- /dev/null
+++ b/dist/esm/types/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 440abb3..f336743 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@quantix-ict/kvk",
- "version": "1.1.2",
+ "version": "1.1.5",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@quantix-ict/kvk",
- "version": "1.1.2",
+ "version": "1.1.5",
"license": "ISC",
"dependencies": {
"node-fetch": "^2.6.7"
diff --git a/package.json b/package.json
index 19284a5..56395f5 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@quantix-ict/kvk",
- "version": "1.1.5",
+ "version": "1.2.2",
"description": "Package for KvK (Quantix)",
"exports": {
".": {
diff --git a/src/index.ts b/src/index.ts
index 284eab1..7b256b4 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -4,7 +4,7 @@ import https from 'node:https'
import crypto from 'node:crypto'
import fetch from 'node-fetch'
-const BASE_URL = 'https://api.kvk.nl/api/v1'
+const BASE_URL = 'https://api.kvk.nl/api'
const CERTIFICATE_PATH = '../../certs/Private_G1_chain.pem'
export class KVK {
@@ -15,7 +15,7 @@ export class KVK {
constructor(
apiKey: string,
- baseUrl: string | null,
+ baseUrl?: string | null,
certificate?: string | null,
httpsAgent?: https.Agent | null
) {
@@ -81,7 +81,12 @@ export class KVK {
return data
}
-
+
+ /**
+ * @deprecated This function is deprecated and will be removed in a future version.
+ * The KVK api will stop supporting searching on the V1 endpoint starting 29-07-2024
+ * Use [zoekenV2] instead.
+ */
async zoeken({
kvkNummer,
vestigingsnummer,
@@ -123,7 +128,7 @@ export class KVK {
throw new Error('KVK: Aantal is minimaal 1 en maximaal 100.')
return await this.request({
- endpoint: '/zoeken',
+ endpoint: '/v1/zoeken',
params: {
kvkNummer,
vestigingsnummer,
@@ -136,12 +141,66 @@ export class KVK {
})
}
+ async zoekenV2({
+ kvkNummer,
+ vestigingsnummer,
+ postcode,
+ huisnummer,
+ pagina = 1,
+ resultatenPerPagina = 15,
+ ...params
+ }: {
+ kvkNummer?: string
+ rsin?: string
+ vestigingsnummer?: string
+ naam?: string
+ straatnaam?: string
+ plaats?: string
+ postcode?: string
+ huisnummer?: string
+ huisletter?: string
+ type?: 'hoofdvestiging' | 'nevenvestiging' | 'rechtspersoon'
+ InclusiefInactieveRegistraties?: boolean
+ pagina?: number
+ resultatenPerPagina?: number
+ }): Promise {
+ if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
+ throw new Error('KVK: Ongeldig kvknummer.')
+
+ if (vestigingsnummer && !KVK.validateVestigingsnummer(vestigingsnummer))
+ throw new Error('KVK: Ongeldig vestigingsnummer.')
+
+ if ((postcode && !huisnummer) || (huisnummer && !postcode))
+ throw new Error(
+ 'KVK: Postcode en huisnummer mogen alleen in combinatie met elkaar gebruikt worden.'
+ )
+
+ if (pagina < 1 || pagina > 1000)
+ throw new Error('KVK: Pagina is minimaal 1 en maximaal 1000.')
+
+ if (resultatenPerPagina < 1 || resultatenPerPagina > 100)
+ throw new Error('KVK: Aantal is minimaal 1 en maximaal 100.')
+
+ return await this.request({
+ endpoint: '/v2/zoeken',
+ params: {
+ kvkNummer,
+ vestigingsnummer,
+ postcode,
+ huisnummer,
+ pagina,
+ resultatenPerPagina,
+ ...params,
+ },
+ })
+ }
+
async basisprofiel(kvkNummer: string, geoData?: boolean): Promise {
if (kvkNummer && !KVK.validateKvkNummer(kvkNummer))
throw new Error('KVK: Ongeldig kvknummer.')
return await this.request({
- endpoint: `/basisprofielen/${kvkNummer}`,
+ endpoint: `/v1/basisprofielen/${kvkNummer}`,
params: {
geoData,
},
@@ -156,7 +215,7 @@ export class KVK {
throw new Error('KVK: Ongeldig kvknummer.')
return await this.request({
- endpoint: `/basisprofielen/${kvkNummer}/eigenaar`,
+ endpoint: `/v1/basisprofielen/${kvkNummer}/eigenaar`,
params: {
geoData,
},
@@ -171,7 +230,7 @@ export class KVK {
throw new Error('KVK: Ongeldig kvknummer.')
return await this.request({
- endpoint: `/basisprofielen/${kvkNummer}/hoofdvestiging`,
+ endpoint: `/v1/basisprofielen/${kvkNummer}/hoofdvestiging`,
params: {
geoData,
},
@@ -183,7 +242,7 @@ export class KVK {
throw new Error('KVK: Ongeldig kvknummer.')
return await this.request({
- endpoint: `/basisprofielen/${kvkNummer}/vestigingen`,
+ endpoint: `/v1/basisprofielen/${kvkNummer}/vestigingen`,
})
}
@@ -195,7 +254,7 @@ export class KVK {
throw new Error('KVK: Ongeldig vestigingsnummer.')
return await this.request({
- endpoint: `/vestigingsprofielen/${vestigingsnummer}`,
+ endpoint: `/v1/vestigingsprofielen/${vestigingsnummer}`,
params: {
geoData,
},
@@ -207,7 +266,7 @@ export class KVK {
throw new Error('KVK: Ongeldig kvknummer.')
return await this.request({
- endpoint: `/naamgevingen/kvkNummer/${kvkNummer}`,
+ endpoint: `/v1/naamgevingen/kvkNummer/${kvkNummer}`,
})
}
}