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: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-256header. Notra recomputes the signature and compares it in constant time, returning400for a missing header and401for 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-Deliveryheader for 24 hours. A redelivery of the same ID returns200with"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.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