Webhooks

Although you can poll eligibility requests and connections, we recommend registering webhooks, to monitor completion or status of requests.


Create a webhook

mutation {
  createWebhookConfig(
    input: { name: "Test", endpoint: "https://mywebsite/webhook" }
  ) {
    id
    endpoint
    publicKey
  }
}
enum WebhookEventType {
  datasource_connected
  datasource_disconnected
  datasource_waiting_2fa
  eligibility_requested
  eligibility_failed
  eligibility_ok
}

Sample webhook server

const express = require('express');
const { readFileSync } = require('fs');
const crypto = require('crypto');

const app = express();
app.use(express.json());
const port = 3002;
const publicKey = readFileSync(__dirname + '/../public.pem', 'utf8');

app.post('/webhook', (req, res) => {
  const sign = req.header('x-tuuthfairy-signature');
  if (!sign) {
    return res.status(403).send('x-tuuthfairy-signature header is missing');
  }
  const body = req.body;
  
  if (!body) {
    return res.status(403).send('body is missing');
  }

  const rawBody = JSON.stringify(body);

  try {
    const isValid = crypto.verify(
      'SHA256',
      Buffer.from(rawBody),
      publicKey,
      Buffer.from(sign, 'base64')
    );
    if (!isValid) {
      return res.status(403).send('x-tuuthfairy-signature is invalid');
    }
  } catch (error) {
    console.log(error);
    return res.status(403).send('x-tuuthfairy-signature is invalid []');
  }

  // Handle webhook here
  console.log('webhook received');
  console.info(body);

  return res.send('ok');
});

app.listen(port, () => {
  console.log(`Listening on port ${port}`);
});