Event-Driven Workflows

Build event-driven media processing pipelines with AWS EventBridge and Nomad Media.

Event-Driven Workflows

Outbound Notifications to External Systems

Nomad Media does not include a built-in webhook or push notification system for sending real-time events to external systems. Outbound integration — for example, notifying a third-party platform when a new asset is ingested or a record is updated — requires a custom connector built on top of Nomad Media's internal event infrastructure.

Recommended Architecture

A lightweight AWS Lambda function acts as a bridge between Nomad Media's internal event bus and your external system:

  1. The Lambda subscribes to the relevant Nomad Media internal events
  2. On each event, it reads the relevant record data from the Nomad Media API
  3. It then forwards the payload to your external system via whatever mechanism it supports — HTTP webhook callback, Kafka message, SQS queue, or similar

This pattern keeps the integration decoupled from Nomad Media's internals and allows you to transform the payload into whatever shape your external system expects.

Contact Nomad Media to discuss the specific internal events available for your environment and to get help setting up a custom outbound connector.


Nomad Media-to-Customer Sync via Webhook

Nomad Media supports bidirectional synchronization with external systems using Lambda functions and a configuration-driven attribute mapping schema. The same attributes, compliance, and sdkMapping configuration is used across integrations (Monday.com, Smartsheet, etc.).

For full configuration reference, see Third-Party Integrations — Configuration Variables.

Custom Lambda with Nomad Media Authorizer

API Gateways in your AWS account can use the existing Nomad Media Authorizer Lambda to secure custom routes. This gives your Lambda the same authentication and authorization layer as the Nomad Media API itself, using the same bearer token or API key that clients already use.

The authorizer passes 4 Nomad Media-specific attributes to your Lambda:

AttributeTypeValue
isAuthdBooleantrue if the user passed authorization; otherwise false
userIdGUIDThe unique Nomad Media user ID (never changes, even if email changes)
namestringFirst and last name of the user
emailstringEmail address of the user

Setting Up the Authorizer

To add the Nomad Media Authorizer to your own API Gateway, see Setup Nomad Media Authorizer in API Gateway.

HTTP API Gateway — Sample Lambda

exports.handler = async (event, context) => {
    console.log("event:", JSON.stringify(event));
    console.log("context:", JSON.stringify(context));

    try {
        const requestContextObject = event.requestContext;

        const isAuthd = requestContextObject.authorizer.lambda.isAuthd;
        const userId = requestContextObject.authorizer.lambda.userId;
        const name = requestContextObject.authorizer.lambda.name;
        const email = requestContextObject.authorizer.lambda.email;

        console.log(`isAuthd: ${isAuthd}`);
        console.log(`userId: ${userId}`);
        console.log(`name: ${name}`);
        console.log(`email: ${email}`);

        return "OK";
    } catch (error) {
        console.log(`Error: ${error}`);
    }
};

Example output:

INFO isAuthd Parameter: true
INFO userId Parameter: 83f15ca3-7e5c-4232-b4c9-57f5333d618a
INFO name Parameter: Test Account
INFO email Parameter: [email protected]

REST API Gateway — Sample Lambda

If you are using a REST API Gateway, the context object is structured differently:

exports.handler = async (event) => {
    const requestContextObject = event.requestContext;

    const isAuthd = requestContextObject.authorizer.isAuthd;
    const userId = requestContextObject.authorizer.userId;
    const name = requestContextObject.authorizer.name;
    const email = requestContextObject.authorizer.email;

    console.log(`isAuthd: ${isAuthd}`);
    console.log(`userId: ${userId}`);
    console.log(`name: ${name}`);
    console.log(`email: ${email}`);

    return {
        statusCode: 200,
        body: JSON.stringify({ message: "OK" })
    };
};