Your first event

Connect the SDK and see a live event reach your handler.

By the end of this page you’ll have a running process connected to Nevo, an event hitting your handler, and — if the event is an email — a reply going back.

This page uses the Python SDK. The same flow works in TypeScript (quickstart) and Go (quickstart) — every SDK has feature parity.

What you’ll have

A working handle(event) function that runs once per inbound event your project receives, whatever the source.

Install the SDK

pip install nevo-sdk

Requires Python 3.10+.

Write the handler

import asyncio, os
from nevo import Nevo

async def main():
    async with Nevo(token=os.environ["NEVO_API_KEY"]) as client:
        @client.on_event()
        async def handle(event):
            print(f"[{event.type}] {event.id}")
            if event.email:
                print("from:", event.email.from_, "|", event.email.subject)
            elif event.webhook:
                print(event.webhook.method, event.webhook.path)

        await client.run()

asyncio.run(main())

client.run() opens a connection to Nevo, streams events in, and reconnects silently on network blips. Your handler runs once per event.

Run it

export NEVO_API_KEY=nvo_live_...
python handler.py

You’ll see:

connected to nevo (project=11111111-…, conn=44444444-…)

Trigger an event

Four easy options:

  1. Send a test webhook. From the dashboard, open your webhook channel and click Send test event — a synthetic webhook.received lands in your process within a second.
  2. Forward a real email. Forward any message to <channel-id>@in.nevo.sh and an email.received event appears.
  3. Install the Slack app. New channel → slack → install. Invite the bot to any channel and @mention it — a slack.event event arrives.
  4. Set up a cron schedule. New channel → cron → pick a preset or enter */5 * * * *. The next firing produces a cron.fired event within a minute of the scheduled time.

Whichever you pick, your handler prints the event id, type, and details. Every event also shows up in the dashboard under Projects → your project → Events, where you can inspect the raw payload, delivery history, and any replies.

Reply

@client.on_event()
async def handle(event):
    if event.type == "email.received":
        await event.reply(
            text=f"Got your message: '{event.email.subject}'. We're on it."
        )
    elif event.type == "slack.event":
        await event.reply(text="👀 On it.")

Email replies land in the original sender’s inbox, threaded into the same conversation. Slack replies post back into the same channel, threaded under the originating @mention. See Python SDK: replies for what event.reply() can take on each channel type.

From here, handle() is where the real work happens — call your existing service, enqueue a job, route to an LLM, whatever. The inbound side is done.

Next