
Security News
OWASP 2025 Top 10 Adds Software Supply Chain Failures, Ranked Top Community Concern
OWASP’s 2025 Top 10 introduces Software Supply Chain Failures as a new category, reflecting rising concern over dependency and build system risks.
@zkp2p/providers
Advanced tools
This repo houses the JSON providers used in ZKP2P PeerAuth Extension and ZKP2P React Native SDK. ZKP2P is live in production at zkp2p.xyz. PeerAuth is a browser extension that allows you to authenticate internet data in a privacy preserving way using web proofs / zkTLS
This package is data-only. Consumers import the JSON templates directly via deep import paths, or read the included manifest.
Install:
npm install @zkp2p/providers
# or
yarn add @zkp2p/providers
CommonJS (Node):
const zelle = require('@zkp2p/providers/citi/transfer_zelle.json');
console.log(zelle.actionType);
ESM (Node with import assertions):
import zelle from '@zkp2p/providers/citi/transfer_zelle.json' assert { type: 'json' };
console.log(zelle.actionType);
Manifest (providers.json):
// CJS
const manifest = require('@zkp2p/providers/providers.json');
for (const p of manifest.providers) console.log(p.id, p.files);
// ESM
import manifest from '@zkp2p/providers/providers.json' assert { type: 'json' };
Notes:
@zkp2p/providers/<provider>/<file>.json are stable entry points.Note: The npm package is data-only. The local dev server described here is for development/testing in this repo and is not included in the published package. To get started building a new provider, you will need to setup a local version of
yarn install and yarn start. App is hosted on http://localhost:8080http://localhost:8080/. Any changes to your JSON will now be reflected in the extension and developer app.localhost:8080/{platform_name}/{provider_name}.jsonThis guide explains how to create and configure provider templates for the ZKP2P PeerAuth extension. Provider configurations define how to extract and verify data from various platforms.
{
"actionType": "transfer_venmo",
"authLink": "https://account.venmo.com/?feed=mine",
"url": "https://account.venmo.com/api/stories?feedType=me&externalId={{SENDER_ID}}",
"method": "GET",
"skipRequestHeaders": [],
"body": "",
"metadata": {
"platform": "venmo",
"urlRegex": "https://account.venmo.com/api/stories\\?feedType=me&externalId=\\S+",
"method": "GET",
"shouldSkipCloseTab": false,
"transactionsExtraction": {
"transactionJsonPathListSelector": "$.stories"
}
},
"paramNames": ["SENDER_ID"],
"paramSelectors": [{
"type": "jsonPath",
"value": "$.stories[{{INDEX}}].title.sender.id",
"source": "responseBody"
}],
"secretHeaders": ["Cookie"],
"responseMatches": [{
"type": "regex",
"value": "\"amount\":\"-\\$(?<amount>[^\"]+)\""
}],
"responseRedactions": [{
"jsonPath": "$.stories[{{INDEX}}].amount",
"xPath": ""
}],
"mobile": {
"includeAdditionalCookieDomains": [],
"useExternalAction": true,
"external": {
"actionLink": "venmo://paycharge?txn=pay&recipients={{RECEIVER_ID}}¬e=cash&amount={{AMOUNT}}",
"appStoreLink": "https://apps.apple.com/us/app/venmo/id351727428",
"playStoreLink": "https://play.google.com/store/apps/details?id=com.venmo"
}
}
}
actionType (required)string"transfer_venmo"authLink (required)string"https://venmo.com/login"url (required)string"https://api.venmo.com/v1/payments"method (required)string"GET", "POST", "PUT", "PATCH""POST"skipRequestHeaders (optional)string[]["User-Agent", "Accept-Language"]body (optional)string"{\"amount\": \"{{AMOUNT}}\", \"recipient\": \"{{RECIPIENT}}\"}""metadata (required)object"metadata": {
"shouldReplayRequestInPage": false,
"shouldSkipCloseTab": false,
"platform": "venmo",
"urlRegex": "https://api\\.venmo\\.com/v1/payments/\\d+",
"method": "GET",
"fallbackUrlRegex": "https://api\\.venmo\\.com/v1/transactions",
"fallbackMethod": "GET",
"preprocessRegex": "window\\.__data\\s*=\\s*({.*?});",
"transactionsExtraction": {
"transactionJsonPathListSelector": "$.data.transactions",
"transactionRegexSelectors": {
"paymentId": "js_transactionItem-([A-Z0-9]+)"
},
"transactionJsonPathSelectors": {
"recipient": "$.target.username",
"amount": "$.amount",
"date": "$.created_time",
"paymentId": "$.id",
"currency": "$.currency"
}
},
"proofMetadataSelectors": [
{
"type": "jsonPath",
"value": "$.data.user.id"
}
]
}
shouldSkipCloseTab (optional)booleanfalsetrue, prevents the extension from automatically closing the authentication tab after successful authentication"shouldSkipCloseTab": trueshouldReplayRequestInPage (optional)booleanfalsetrue, replays the request in the page context instead of making it from the extensionparamNames (required)string[]["transactionId", "amount", "recipient"]paramSelectors (required)ParamSelector[]interface ParamSelector {
type: 'jsonPath' | 'regex';
value: string;
source?: 'url' | 'responseBody' | 'responseHeaders' | 'requestHeaders' | 'requestBody';
}
The source field in paramSelectors specifies where to extract the parameter from:
responseBody (default){
"type": "jsonPath",
"value": "$.data.transactionId",
"source": "responseBody"
}
url{
"type": "regex",
"value": "userId=([^&]+)",
"source": "url"
}
responseHeaders{
"type": "regex",
"value": "X-Transaction-Id: (.+)",
"source": "responseHeaders"
}
requestHeaders{
"type": "regex",
"value": "Authorization: Bearer (.+)",
"source": "requestHeaders"
}
requestBody{
"type": "jsonPath",
"value": "$.payment.amount",
"source": "requestBody"
}
secretHeaders (optional)string[]["Authorization", "Cookie"]responseMatches (required)ResponseMatch[]"responseMatches": [
{
"type": "jsonPath",
"value": "$.data.transactions[{{INDEX}}].id",
"hash": false
},
{
"type": "regex",
"value": "\"status\":\\s*\"completed\"",
"hash": true
}
]
responseRedactions (optional)ResponseRedaction[]"responseRedactions": [
{
"jsonPath": "$.data.user.email",
"xPath": ""
},
{
"jsonPath": "$.data.ssn",
"xPath": ""
}
]
mobile (optional)object"mobile": {
"includeAdditionalCookieDomains": ["additional-domain.com"],
"useExternalAction": true,
"userAgent": {
"android": "Mozilla/5.0 (Linux; Android 13; Pixel 6) ...",
"ios": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) ..."
},
"external": {
"actionLink": "venmo://paycharge?txn=pay&recipients={{RECEIVER_ID}}¬e=cash&amount={{AMOUNT}}",
"appStoreLink": "https://apps.apple.com/us/app/venmo/id351727428",
"playStoreLink": "https://play.google.com/store/apps/details?id=com.venmo"
},
"internal": {
"actionLink": "https://app.provider.com/send",
"actionCompletedUrlRegex": "https://app.provider.com/confirmation/\\S+",
"injectedJavaScript": "/* JavaScript to interact with the webpage */",
"injectedJavaScriptParamNames": ["RECIPIENT_ID", "AMOUNT"]
}
}
Top-level Fields:
includeAdditionalCookieDomains: Array of additional cookie domains to includeuseExternalAction: Boolean to prefer external action when true, otherwise prefer internal actionuserAgent (optional): Custom user agent strings for Android and iOS WebViewsExternal Action Fields (external):
actionLink: Deep link URL for the native mobile app with placeholders for dynamic valuesappStoreLink: iOS App Store URL for the appplayStoreLink: Google Play Store URL for the appInternal Action Fields (internal):
actionLink: Web URL to open in WebView for the actionactionCompletedUrlRegex (optional): Regex pattern to detect when the action is completedinjectedJavaScript (optional): JavaScript code to inject into the WebView to assist with form filling or interactioninjectedJavaScriptParamNames (optional): Array of parameter names used in the injected JavaScriptAction Flow: The mobile SDK will attempt actions based on the configuration:
useExternalAction is true, it will try the external action first (native app), then fall back to internal (WebView)useExternalAction is false or omitted, it will try the internal action first (WebView), then fall back to external (native app)internal and external sections can be provided for maximum flexibilityadditionalClientOptions (optional)object"additionalClientOptions": {
"cipherSuites": ["TLS_AES_128_GCM_SHA256"]
}
additionalProofs (optional)AdditionalProof[]{
"paramNames": ["userId"],
"paramSelectors": [{
"type": "regex",
"value": "/user/([^/]+)/transactions",
"source": "url"
}]
}
{
"paramNames": ["sessionId"],
"paramSelectors": [{
"type": "regex",
"value": "X-Session-Id: ([a-zA-Z0-9]+)",
"source": "responseHeaders"
}]
}
{
"paramNames": ["userId", "transactionId", "amount"],
"paramSelectors": [
{
"type": "regex",
"value": "userId=([^&]+)",
"source": "url"
},
{
"type": "jsonPath",
"value": "$.data.transactions[{{INDEX}}].id",
"source": "responseBody"
},
{
"type": "regex",
"value": "X-Transaction-Amount: ([0-9.]+)",
"source": "responseHeaders"
}
]
}
Use JSONPath expressions for structured data:
{
"type": "jsonPath",
"value": "$.data.transactions[{{INDEX}}].amount"
}
Special features:
{{INDEX}} placeholder for array indexing$.user.profile.email$.items[?(@.status=='active')]Use regular expressions for pattern matching:
{
"type": "regex",
"value": "transactionId\":\\s*\"([^\"]+)\""
}
Notes:
() is used as the extracted value\\. for dots\\s* for flexible whitespace matching\\. for dots() for regex extractionsource when extracting from non-default locations (not responseBody)secretHeadersresponseRedactions to remove PIIresponseMatchestransactionRegexSelectors (optional)object{
"transactionsExtraction": {
"transactionRegexSelectors": {
"amount": "<td class=\"amount\">\\$([\\d,\\.]+)</td>",
"recipient": "<td class=\"recipient\">([^<]+)</td>",
"date": "<td class=\"date\">(\\d{2}/\\d{2}/\\d{4})</td>",
"paymentId": "data-payment-id=\"(\\d+)\""
}
}
}
Note: Use either transactionJsonPathListSelector (for JSON responses) or transactionRegexSelectors (for HTML/text responses), not both.
responseMatches for faster verificationshouldSkipCloseTab: true for flows where when closing the tab results in ending the session token, thus preventing us from replaying the request successfully.source field in your paramSelectors. By default, parameters are extracted from responseBody. If your parameter is in the URL, headers, or request body, you must specify the correct source.We want to make this the largest open source repository of provider templates for global payment platforms. Please open a PR when you have created and tested your template
FAQs
Provider JSON templates for ZKP2P
We found that @zkp2p/providers demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
OWASP’s 2025 Top 10 introduces Software Supply Chain Failures as a new category, reflecting rising concern over dependency and build system risks.

Research
/Security News
Socket researchers discovered nine malicious NuGet packages that use time-delayed payloads to crash applications and corrupt industrial control systems.

Security News
Socket CTO Ahmad Nassri discusses why supply chain attacks now target developer machines and what AI means for the future of enterprise security.