πŸ†•Webhook

Webhooks allow you to receive real-time notifications of events happening within your Extracta.ai extractions. This section will guide you through setting up a Node.js server with Express to securely listen for and handle webhook events.


Webhook Payload Structure

Each webhook sent by Extracta.ai will include two primary fields in the request body:

  • event – A string identifying the type of event (e.g., extraction.processed, extraction.failed).

  • result – A list containing files data

Example payload:

{
  "event": "extraction.processed",
  "result": [
    {
      "extractionId": "extractionId",
      "batchId": "batchId",
      "fileId": "fileId",
      "fileName": "fileName",
      "status": "processed",
      "result": {},
      "url": "fileUrl"
    }
  ]
}

See all event types

πŸ†•Webhook Event Types

Prerequisites

  • Node.js installed on your server

  • An Express.js application

  • A secret key obtained from the Extracta.ai dashboard


Step 1: Set Up Your Server

First, ensure you have Express and the necessary packages installed in your project. If not, you can install them using npm:

npm install express body-parser crypto --save

Step 2: Implement Webhook Endpoint

Create a basic HTTP server with Express to listen for webhook POST requests. Use the following code snippet as a starting point:

server.js
const express = require('express');
const crypto = require('crypto');
const bodyParser = require('body-parser');

const app = express();
const port = 4000;

app.use(bodyParser.json());

// Your webhook secret key from the dashboard
const secret = 'secretKey';

// Middleware to validate the webhook signature
function validateSignature(req, res, next) {
    const signatureRequest = req.headers["x-webhook-signature"];

    const resultString = JSON.stringify(req.body.result);
    const signature = crypto.createHmac('sha256', secret.replace('E_AI_K_', '')).update(resultString).digest('base64');

    if (signature !== signatureRequest) {
        return res.status(401).send({
            message: "Webhook is not properly signed"
        });
    }

    return next();
}

// Webhook endpoint
app.post('/webhook', validateSignature, async (req, res) => {
    try {
        let { event, result } = req.body;

        switch (event) {
            case "extraction.processed":
                console.log("extraction.processed", result);
                break;
            case "extraction.edited":
                console.log("extraction.edited", result);
                break;
            case "extraction.confirmed":
                console.log("extraction.confirmed", result);
                break;
            case "extraction.failed":
                console.log("extraction.failed", result);
                break;
            default:
                console.log("unknown event", event);
                break;
        }

        return res.send({
            event: event,
            message: "Webhook received",
            timestamp: new Date().toISOString()
        })
    } catch (error) {
        console.error("Error processing webhook", error);

        return res.status(500).send({
            message: "Error processing webhook",
            error: error.message,
            timestamp: new Date().toISOString()
        });
    }
})

app.listen(port, () => console.log(`Server listening on port ${port}!`))

Step 3: Test Your Webhook Listener

Once your webhook listener is set up, test it by triggering events from Extracta.ai. Confirm that:

  • The signature is validated correctly.

  • The event is identified.

  • The result is handled based on the event type.


By following these steps, you can securely set up your application to receive and process webhook events from Extracta.ai, enabling real-time updates and actions based on the events transmitted to your endpoint.

Last updated

Was this helpful?