# Inbound webhooks (/inbound-webhooks)
Inbound webhooks let **your** systems (or a third party) push data **to**
LettrLabs. You configure a webhook in the LettrLabs app, which gives you a
unique endpoint, and your sender posts events to it.
These are **inbound** webhooks — data flowing *into* LettrLabs. LettrLabs does
not currently emit outbound event webhooks; that is planned for a future
release.
## Endpoint [#endpoint]
Post your payload to the webhook's unique URL:
```
POST /v1/webhooks/{guid}
```
`{guid}` is the identifier of the webhook you created in the app. The full
request goes to:
```
https://app.lettrlabs.com/api/v1/webhooks/{guid}
```
## Security: signature verification and API key [#security-signature-verification-and-api-key]
Each webhook can independently require **either, both, or neither** of two
protections, configured per webhook in the app:
### Optional HMAC‑SHA256 signature [#optional-hmacsha256-signature]
When signature verification is enabled, the sender computes an
**HMAC‑SHA256** of the raw request body using the webhook's shared secret and
sends it in a standard signature header. The endpoint accepts any of these four
headers:
* `X-Signature-256`
* `X-Hub-Signature-256`
* `X-Signature`
* `X-Hub-Signature`
The signature value is the lowercase hex digest, prefixed with **`sha256=`**:
```
X-Signature-256: sha256=3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b
```
Compute it over the **exact raw bytes** of the request body (before any
parsing). In Node.js:
```js
import { createHmac } from 'node:crypto';
const signature =
'sha256=' + createHmac('sha256', webhookSecret).update(rawBody).digest('hex');
```
Send the resulting `signature` in one of the four accepted headers (for example
`X-Signature-256`). LettrLabs recomputes the digest over the received body and
rejects the request if it does not match.
### Optional per‑webhook API key [#optional-perwebhook-api-key]
A webhook can also require an API key. When enabled, include your
**`X-API-KEY`** header on the request (see
[Authentication & API keys](/authentication-api-keys)). A webhook may
require the API key, the signature, both, or neither — whatever you configured.
## Example [#example]
```bash
curl -X POST https://app.lettrlabs.com/api/v1/webhooks/your-webhook-guid \
-H "Content-Type: application/json" \
-H "X-Signature-256: sha256=" \
-H "X-API-KEY: your_api_key_here" \
--data-binary @payload.json
```
If verification is enabled and the signature header is missing or wrong, or a
required API key is absent, the request is rejected.