Skip to main content
Notra receives GitHub webhooks and sends signed outbound webhooks. GitHub events let event triggers generate content as soon as someone publishes a release or commits land on the default branch, while outbound subscriptions notify your endpoint about post lifecycle changes, tracked generation jobs and finished GEO scans.
Notra can also send signed outbound webhooks to your own endpoint. You can set them up in Settings, then Webhooks, or through /v1/webhooks, and the GitHub endpoint below only receives events and has nothing to do with outbound subscriptions.

Inbound webhooks from GitHub

GitHub is the only provider with a working webhook setup, while Linear, Slack and the other integrations connect through their APIs and do not use this endpoint.

Payload URL

Each connected repository gets its own payload URL:
The dashboard generates this URL for you, so copy it from the Setup Webhook dialog instead of assembling it by hand. The IDs are internal, and Notra checks the URL against the organization and integration on every delivery.

Set up the webhook

1

Open the repository in Notra

Go to Integrations, then GitHub, then open the repository you connected. Notra also shows the Setup Webhook dialog right after you add a repository.
2

Copy the Payload URL and Secret

The dialog shows three values: the Payload URL, the content type (application/json) and the Secret. Notra generates the secret the first time you open the dialog and masks it until you focus the field, so use the copy buttons to grab each value.
3

Add the webhook on GitHub

In your repository on GitHub, open Settings, then Webhooks, then Add webhook. Paste the Payload URL, set the content type to application/json, paste the Secret and choose Let me select individual events, then select Pushes and Releases.
4

Confirm in Notra

Click I’ve added the webhook. GitHub sends a ping event as soon as you save the webhook, and Notra answers it and writes a log entry so you can confirm the connection worked.
Without an inbound GitHub webhook you can still generate content manually, on a schedule or through POST /v1/posts/generate, because only GitHub event triggers need the inbound webhook.

Rotate the secret

Open the repository page in Notra and use Regenerate in the webhook section. The old secret stops working immediately, so update the webhook on GitHub right after regenerating.

Security

Notra verifies every delivery before reading the payload:
  • Signature. GitHub signs the body with HMAC SHA-256 using your secret and sends it in the X-Hub-Signature-256 header. Notra recomputes the signature and compares it in constant time, returning 400 for a missing header and 401 for a mismatch.
  • Ownership checks. The organization, integration and repository IDs in the URL must match each other. Notra rejects deliveries to a disabled integration, or with IDs that do not belong together, with 403.
  • Deduplication. Notra remembers the X-GitHub-Delivery header for 24 hours. A redelivery of the same ID returns 200 with "duplicate": true, and Notra does not process it again.

Responses

Notra answers every delivery with JSON, and GitHub shows the body under Recent Deliveries in your webhook settings.

Error responses

error
Invalid URL parameters, missing X-GitHub-Event or X-Hub-Signature-256 header, no webhook secret generated for the repository yet or a body that is not valid JSON in the expected shape.
error
The signature does not match the repository’s secret, so regenerate the secret in Notra and update GitHub if the two drifted apart.
error
The integration is disabled, does not belong to the organization in the URL or the repository does not belong to the integration.
error
Someone deleted the integration or repository.
error
Notra could not finish processing the delivery, but GitHub keeps it in its history so you can redeliver it from the webhook settings page.
error
The provider segment in the URL is not github.

Logs

Notra writes every delivery, including rejected ones, to Settings, then Logs in the dashboard. Each entry shows the status, HTTP status code, GitHub delivery ID and payload summary, and Notra keeps entries for 7, 14 or 30 days depending on your plan.

Polling alternatives

Post generation, brand analysis and GEO scans can send outbound events, though you can still poll them for status and progress if you prefer. Outbound subscriptions also cover post creation, edits, deletion, publishing and unpublishing, and new subscriptions only receive future events with no backfill.

Poll post generation

GET /v1/posts/generate/{jobId} returns the job and its event log. Stop polling when job.status is completed, failed or skipped, and read job.postId once the job completes.

Poll brand analysis

GET /v1/brand-identities/generate/{jobId} reports queued, running, completed or failed along with the current step.

Poll GEO scans

POST /v1/projects/{projectId}/geo/scans returns a statusUrl and a Location header, so poll GET /v1/projects/{projectId}/geo/scans/{scanId} until scan.status leaves running.

Stream agent sessions

GET /v2/eve/v1/session/{sessionId}/stream is a durable, replayable newline-delimited JSON stream, and you can pass startIndex to resume from a known position.
Polling counts against the standard per-key rate limits, so ten seconds between checks is enough because generation jobs usually take a few minutes.

Next steps

Event reference

Which GitHub events Notra processes, how they are filtered and what the processed payload looks like

Event triggers

Turn webhook events into generated content
Last modified on October 8, 2026