Tutorial: Testing Webhook Integration on Staging

This demo acts as a reference to test Webhook responses in the Staging Environment.

Step 1: Creating a Sample Playground: First, we need to set up a specific URL for your application to send its Webhook Events. We will use webhook.site,https://webhook.site/ a platform that allows us to create unique URLs and email addresses for free, and instantly view all the data sent to these addresses.


In the screenshot above, you can see the test URL: https://webhook.site/eeadafbf-e654-40c8-af9e-35b5773fc463. This is the link where we'll set up your Webhook Events.


Step 2: Configuring the Webhook URL: To update your Webhook URL, you'll need to provide the Webhook URL in the body parameters and access-token in the headers. You can obtain your access token by visiting the Refresh Access Token - Transak API Documentation.

After obtaining both your Webhook URL from webhook.site and your access token, navigate to the https://docs.transak.com/reference/update-webhook page. Make a request to update your Webhook URL.

Upon successful submission, the response will resemble the following:

{
  "meta": {
    "success": true
  },
  "data": {
    "message": "Your request to update webhook url is successfully processed."
  }
}

To verify the currently configured Webhook URL in your environment, please visit the https://docs.transak.com/reference/test-webhook page in the API Documentation.

If your Webhook has been configured correctly, you should see the following response:

{
  "meta": {
    "success": true,
    "webhookURL": "https://webhook.site/eeadafbf-e654-40c8-af9e-35b5773fc463"
  }
}

Step 3: Testing the configuration: After configuring, the default event is triggered and the responses look like:

The JSON data displayed in the Raw Content block is encrypted. We will use the jsonwebtoken package to decrypt this data.

  1. Performing a Sample Transaction: When performing a test transaction on the staging environment at https://global-stg.transak.com?apiKey=<YOUR_STAGING_API_KEY>, it is important to note that multiple events may be triggered. These events will be instantly displayed in the left side navigation of the screen.

In this scenario, upon the successful completion of a staging transaction, the following four events were triggered and successfully captured by the Webhook.

  1. Decrypting the Webhook Data: To decrypt the Webhook data, you can use the following code snippet in your Node.js environment. To execute this, run the command "node ./.js". This example uses only one package, which is jsonwebtoken.
import jwt from "jsonwebtoken";

const webhookData = "eyJhbGciOiJIUzI1NiJ9.eyJ3ZWJob29rRGF0YSI6eyJpZCI6ImUxOTNkNGQ0LTYzOWUtNDYwYS04YmFmLWQyN2Y0YjY4Yjg4MSIsIndhbGxldEFkZHJlc3MiOiIweEQ5MDJkN2VCRjdiYzVlQ2E5RUVBMjJhNkVlOUYxQTMwRUJlQkVGZUUiLCJjcmVhdGVkQXQiOiIyMDI0LTA1LTA3VDExOjA5OjIwLjIxM1oiLCJzdGF0dXMiOiJBV0FJVElOR19QQVlNRU5UX0ZST01fVVNFUiIsImZpYXRDdXJyZW5jeSI6IkdCUCIsInVzZXJJZCI6IjcyNmQ5MTQ0LWRjOTctNDUxZS05YjkxLTk4ZWE0YzE0MGU1YyIsImNyeXB0b0N1cnJlbmN5IjoiRVRIIiwiaXNCdXlPclNlbGwiOiJCVVkiLCJmaWF0QW1vdW50Ijo1MywiaXBBZGRyZXNzIjoiMzUuMTc3LjE1OC45IiwiYW1vdW50UGFpZCI6MCwicGF5bWVudE9wdGlvbklkIjoiZ2JwX2JhbmtfdHJhbnNmZXIiLCJ3YWxsZXRMaW5rIjoiaHR0cHM6Ly9zZXBvbGlhLmV0aGVyc2Nhbi5pby9hZGRyZXNzLzB4RDkwMmQ3ZUJGN2JjNWVDYTlFRUEyMmE2RWU5RjFBMzBFQmVCRUZlRSIsInF1b3RlSWQiOiI4MDNhNzY2OS00YWNlLTRhNGYtYTM3My05Y2QzOWYwOGQzNzMiLCJvcmRlclByb2Nlc3NpbmdUeXBlIjoiTk9STUFMIiwiYWRkcmVzc0FkZGl0aW9uYWxEYXRhIjpmYWxzZSwibmV0d29yayI6ImV0aGVyZXVtIiwiY29udmVyc2lvblByaWNlIjowLjAwMDQwMjcxNTMwNTcwMzc1NywiY3J5cHRvQW1vdW50IjowLjAxOTAyMDI0LCJ0b3RhbEZlZUluRmlhdCI6NS43NywiZmlhdEFtb3VudEluVXNkIjo2Ni40NSwiY291bnRyeUNvZGUiOiJGUiIsInN0YXRlQ29kZSI6IkZyYW5jZSIsInVzZXJLeWNUeXBlIjoiU1RBTkRBUkQiLCJjYXJkUGF5bWVudERhdGEiOnsib3JkZXJJZCI6ImUxOTNkNGQ0LTYzOWUtNDYwYS04YmFmLWQyN2Y0YjY4Yjg4MSIsInBheW1lbnRJZCI6IjY2M2EwYmUxOTIwMTE4NmFjYjYyY2ZhMCIsInBnRGF0YSI6eyJwYXltZW50T3B0aW9ucyI6W3siY3VycmVuY3kiOiJHQlAiLCJpZCI6ImdicF9iYW5rX3RyYW5zZmVyIiwibmFtZSI6IkJhbmsgVHJhbnNmZXIgRGV0YWlscyIsImZpZWxkcyI6W3sibmFtZSI6Ik5hbWUiLCJ2YWx1ZSI6IlRyYW5zYWsgTGltaXRlZCJ9LHsibmFtZSI6IkFjY291bnQgIyIsInZhbHVlIjoiMDM3NjU4MzEifSx7Im5hbWUiOiJTb3J0IENvZGUiLCJ2YWx1ZSI6IjAwMDAwMCJ9LHsibmFtZSI6IkJhbmsiLCJ2YWx1ZSI6Ik1vZHVsciJ9LHsibmFtZSI6IkFkZHJlc3MiLCJ2YWx1ZSI6IlNjYWxlIFNwYWNlLCA1OCBXb29kIExhbmUsIExvbmRvbiwgVzEyIDdSWiJ9XX1dLCJsaXF1aWRpdHlQcm92aWRlciI6Ik1PRFVMUiIsInN0YXR1cyI6IkNSRUFURUQifSwibGlxdWlkaXR5UHJvdmlkZXIiOiJNT0RVTFIiLCJ1cGRhdGVkQXQiOiIyMDI0LTA1LTA3VDExOjA5OjIyLjA0MloifSwiY29udmVyc2lvblByaWNlRGF0YSI6eyJfaWQiOiI0OGFjY2Y1YS0wNzIyLTQxNDEtYTNjMi05OThiYWY4NTI5YjciLCJpZCI6IjQ4YWNjZjVhLTA3MjItNDE0MS1hM2MyLTk5OGJhZjg1MjliNyIsImNyZWF0ZWRBdCI6IjIwMjQtMDUtMDdUMTE6MDk6MjAuMTgzWiIsImZpYXRDdXJyZW5jeSI6IkdCUCIsImNyeXB0b0N1cnJlbmN5IjoiRVRIIiwicGF5bWVudE1ldGhvZCI6ImdicF9iYW5rX3RyYW5zZmVyIiwiZmlhdEFtb3VudCI6NTMsIm5ldHdvcmsiOiJldGhlcmV1bSIsImNyeXB0b0Ftb3VudCI6MC4wMTkwMjAyNCwiaXNCdXlPclNlbGwiOiJCVVkiLCJjb252ZXJzaW9uUHJpY2UiOjAuMDAwNDAyNzE1MzA1NzAzNzU3LCJtYXJrZXRDb252ZXJzaW9uUHJpY2UiOjAuMDAwNDA0NzgzNzI5ODc5MTk4LCJzbGlwcGFnZSI6MC41MSwiY3J5cHRvTGlxdWlkaXR5UHJvdmlkZXIiOiJ0cmFuc2FrIiwiZmlhdExpcXVpZGl0eVByb3ZpZGVyIjoiY29pbmJhc2UiLCJwYXJ0bmVyQXBpS2V5IjoiZDc5NjcxYTQtYjAyMS00YTRmLWE0NDQtNjg2MmE2ODBhOTRiIiwic291cmNlVG9rZW5BbW91bnQiOjAuMDE5MDIwMjQzODg4Mzg4NDQ1LCJzb3VyY2VUb2tlbiI6IkVUSCIsIm5vdGVzIjpbXSwiZmlhdEZlZUFtb3VudCI6NS43NywiZmVlRGVjaW1hbCI6MC4xMDg4Njc5MjQ1MjgzMDE4OCwic3dhcHMiOlt7InNvdXJjZUN1cnJlbmN5IjoiR0JQIiwiZGVzdGluYXRpb25DdXJyZW5jeSI6IlVTRFQiLCJzb3VyY2VBbW91bnQiOjUzLCJkZXN0aW5hdGlvbkFtb3VudCI6NjYuNDUzNTk5MjU3MzQyMTgsInBheW1lbnRNZXRob2QiOiJnYnBfYmFua190cmFuc2ZlciIsImxpcXVpZGl0eVByb3ZpZGVyIjoiY29pbmJhc2UiLCJjb252ZXJzaW9uUHJpY2UiOjEuMjUzODQxNDk1NDIxNTUwNCwiZmVlSW5Tb3VyY2VBbW91bnQiOjAsIm5ldHdvcmtGZWVJblNvdXJjZUFtb3VudCI6MCwibWFya2V0Q29udmVyc2lvblByaWNlIjoxLjI1Mzg0MTQ5NTQyMTU1MDQsImlzTm9uQ3VzdG9kaWFsIjpmYWxzZSwiaXNGaWF0bGlxdWlkaXR5UHJvdmlkZXIiOnRydWUsImlzRmlhdFBhcnRuZXJEaXJlY3RDcnlwdG9EZXBvc2l0IjpmYWxzZSwiaXNGaWF0UGFydG5lckFjY291bnRXYWxsZXREZXBvc2l0IjpmYWxzZSwibGlxdWlkaXR5UHJvdmlkZXJEYXRhIjpmYWxzZSwib3JpZ2luYWxEZXN0aW5hdGlvbkFtb3VudCI6NjYuNDUzNTk5MjU3MzQyMTh9LHsic291cmNlQ3VycmVuY3kiOiJVU0RUIiwiZGVzdGluYXRpb25DdXJyZW5jeSI6IkVUSCIsInNvdXJjZUFtb3VudCI6NjYuNDUzNTk5MjU3MzQyMTgsImRlc3RpbmF0aW9uQW1vdW50IjowLjAyMTM0MzkxMTIwMjI5OTEyMiwibGlxdWlkaXR5UHJvdmlkZXIiOiJ0cmFuc2FrIiwiY29udmVyc2lvblByaWNlIjowLjAwMDMyMTE4NTE3OTQ0NTk1NjQsIm5ldHdvcmtGZWVJblNvdXJjZUFtb3VudCI6MCwibmV0d29ya0ZlZUluRGVzdGluYXRpb25BbW91bnQiOjAsIm1hcmtldENvbnZlcnNpb25QcmljZSI6MC4wMDAzMjExODUxNzk0NDU5NTY0LCJsaXF1aWRpdHlQcm92aWRlckRhdGEiOmZhbHNlLCJpc05vbkN1c3RvZGlhbCI6ZmFsc2V9LHsic291cmNlQ3VycmVuY3kiOiJFVEgiLCJkZXN0aW5hdGlvbkN1cnJlbmN5IjoiRVRIIiwic291cmNlQW1vdW50IjowLjAyMTM0MzkxMTIwMjI5OTEyMiwiZGVzdGluYXRpb25BbW91bnQiOjAuMDIxMzQzOTExMjAyMjk5MTIyLCJsaXF1aWRpdHlQcm92aWRlciI6InRyYW5zYWsiLCJjb252ZXJzaW9uUHJpY2UiOjEsImlzQ3J5cHRvbGlxdWlkaXR5UHJvdmlkZXIiOnRydWUsIm5ldHdvcmtGZWVJblNvdXJjZUFtb3VudCI6MC4wMDE0OTIzNSwibmV0d29ya0ZlZUluRGVzdGluYXRpb25BbW91bnQiOjAuMDAxNDkyMzUsIm1hcmtldENvbnZlcnNpb25QcmljZSI6MSwibGlxdWlkaXR5UHJvdmlkZXJEYXRhIjpmYWxzZSwiaXNGaWF0UGFydG5lckFjY291bnRXYWxsZXREZXBvc2l0IjpmYWxzZX1dLCJmZWVzIjpbeyJuYW1lIjoiTmV0d29yay9FeGNoYW5nZSBmZWUiLCJ2YWx1ZSI6My43MSwiaWQiOiJuZXR3b3JrX2ZlZSIsImlkcyI6WyJuZXR3b3JrX2ZlZSJdfSx7Im5hbWUiOiJUcmFuc2FrIGZlZSIsInZhbHVlIjoyLjA2LCJpZCI6InRyYW5zYWtfZmVlIiwiaWRzIjpbInRyYW5zYWtfZmVlIiwicGFydG5lcl9mZWUiXX1dLCJmaWF0QW1vdW50SW5Vc2QiOjY2LjQ1LCJpbnRlcm5hbEZlZXMiOlt7Im5hbWUiOiJOZXR3b3JrL0V4Y2hhbmdlIGZlZSIsImlkIjoibmV0d29ya19mZWUiLCJ2YWx1ZSI6My43MX0seyJuYW1lIjoiVHJhbnNhayBmZWUiLCJpZCI6InRyYW5zYWtfZmVlIiwidmFsdWUiOjF9LHsibmFtZSI6IlRyYW5zYWsgZmVlIiwiaWQiOiJwYXJ0bmVyX2ZlZSIsInZhbHVlIjoxLjA2fV0sImNvc3QiOnsiZXRoUHJpY2VJbkxvY2FsQ3VycmVuY3kiOjI0NzAuNDU1MDI2MTksImdhc0Nvc3RpbkxvY2FsQ3VycmVuY3kiOjMuNzA1NjgyNTM5Mjg0OTk5NywidHJhbnNha01pbmltdW1GZWUiOjEsInRyYW5zYWtGZWVBbW91bnQiOjEsImZpYXRMaXF1aWRpdHlQcm92aWRlckZlZSI6MCwiZ2FzQ29zdGluTG9jYWxDdXJyZW5jeUJ5RmlhdFBhcnRuZXIiOjAsImdhc0Nvc3RpbkxvY2FsQ3VycmVuY3lCeUNyeXB0b1BhcnRuZXIiOjAsInBhcnRuZXJGZWVEZWNpbWFsIjowLjAyLCJwYXJ0bmVyRmVlSW5Mb2NhbEN1cnJlbmN5IjoxLjA2LCJ0b3RhbEZlZURlY2ltYWwiOjAuMTA4ODY3OTI0NTI4MzAxODgsInRvdGFsRmVlQW1vdW50Ijo1Ljc3LCJnYXNDdXJyZW5jeSI6IkVUSCIsImdhc0luTmF0aXZlVG9rZW4iOjAuMDAxNSwiZ2FzQ3VycmVuY3lSYXRlSW5Vc2QiOjAuMDAwMzIyODMxNjIwNzExNTg1NDcsInRvdGFsQW1vdW50Q2hhcmdlZEJ5VHJhbnNhayI6NS43NjU2ODI1MzkyODUwMDF9fSwicGFydG5lckZlZUluTG9jYWxDdXJyZW5jeSI6MS4wNiwic3RhdHVzSGlzdG9yaWVzIjpbXX0sImV2ZW50SUQiOiJPUkRFUl9DUkVBVEVEIiwiY3JlYXRlZEF0IjoiMjAyNC0wNS0wN1QxMTowOToyMi4wOTFaIn0.W07qJG6jlyzid-JrnY7G4CsUOqk8wtcvfrdygGzt5N4";

const accessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBUElfS0VZIjoiZDc5NjcxYTQtYjAyMS00YTRmLWE0NDQtNjg2MmE2ODBhOTRiIiwiaWF0IjoxNzE1MDgxMzI1LCJleHAiOjE3MTU2ODYxMjV9.NJw7DRIpYZnT2N5pLDkGzd1jybIim_1VWtu930xba7s";
    
const decodedData = jwt.verify(webhookData, accessToken);

console.log(decodedData);

The sample log after execution looks like:

{
  webhookData: {
    id: 'ecc5eeed-897e-4d72-9142-a8e75bb3d5ab',
    walletAddress: '0xD902d7eBF7bc5eCa9EEA22a6Ee9F1A30EBeBEFeE',
    createdAt: '2024-05-07T11:36:19.241Z',
    status: 'COMPLETED',
    fiatCurrency: 'GBP',
    userId: '726d9144-dc97-451e-9b91-98ea4c140e5c',
    cryptoCurrency: 'ETH',
    isBuyOrSell: 'BUY',
    fiatAmount: 55,
    ipAddress: '35.177.158.9',
    amountPaid: 55,
    paymentOptionId: 'gbp_bank_transfer',
    walletLink: 'https://sepolia.etherscan.io/address/0xD902d7eBF7bc5eCa9EEA22a6Ee9F1A30EBeBEFeE',
    quoteId: '5cb7c46f-bede-49d1-a61c-01fe28cf3f60',
    orderProcessingType: 'NORMAL',
    addressAdditionalData: false,
    network: 'ethereum',
    conversionPrice: 0.0004031626016260162,
    cryptoAmount: 0.0198356,
    totalFeeInFiat: 5.8,
    fiatAmountInUsd: 68.99,
    countryCode: 'FR',
    stateCode: 'France',
    userKycType: 'STANDARD',
    cardPaymentData: {
      orderId: 'ecc5eeed-897e-4d72-9142-a8e75bb3d5ab',
      paymentId: '663a1233920118f25d62d574',
      pgData: [Object],
      liquidityProvider: 'MODULR',
      updatedAt: '2024-05-07T11:36:24.563Z',
      status: 'CAPTURED',
      processedOn: '2024-05-07T11:36:23.000Z'
    },
    statusHistories: [ [Object] ],
    isFirstOrder: false,
    updatedAt: '2024-05-07T11:36:34.605Z',
    completedAt: '2024-05-07T11:36:40.917Z',
    transactionHash: 'DUMMY_TX_ID',
    transactionLink: 'https://sepolia.etherscan.io/tx/DUMMY_TX_ID',
    conversionPriceData: {
      _id: '39022614-a74e-4b20-90fe-1e40c0c9ba88',
      id: '39022614-a74e-4b20-90fe-1e40c0c9ba88',
      createdAt: '2024-05-07T11:36:34.581Z',
      fiatCurrency: 'GBP',
      cryptoCurrency: 'ETH',
      paymentMethod: 'gbp_bank_transfer',
      fiatAmount: 55,
      network: 'ethereum',
      cryptoAmount: 0.0198356,
      isBuyOrSell: 'BUY',
      conversionPrice: 0.00040316250225966543,
      marketConversionPrice: 0.0004052291710319282,
      slippage: 0.51,
      cryptoLiquidityProvider: 'transak',
      fiatLiquidityProvider: 'coinbase',
      partnerApiKey: 'd79671a4-b021-4a4f-a444-6862a680a94b',
      sourceTokenAmount: 0.019835595111175542,
      sourceToken: 'ETH',
      notes: [],
      fiatFeeAmount: 5.8,
      feeDecimal: 0.10545454545454545,
      swaps: [Array],
      fees: [Array],
      fiatAmountInUsd: 68.99,
      internalFees: [Array],
      cost: [Object]
    },
    partnerFeeInLocalCurrency: 1.1
  },
  eventID: 'ORDER_COMPLETED',
  createdAt: '2024-05-07T11:36:41.534Z'
}