curl --request GET \
--url 'https://api.noresponse.org/v1/webhooks/whe_01JA2ZD0E1F2G3H4J5K6M7N8P9/deliveries?limit=20' \
--header "Authorization: Bearer $NORESPONSE_API_KEY"
import { NoResponse } from "@noresponse/node";
const noResponse = new NoResponse({
apiKey: process.env["NORESPONSE_API_KEY"] ?? "",
});
async function run() {
const result = await noResponse.webhookEndpoints.listDeliveries({
endpointId: "whe_01JA2ZD0E1F2G3H4J5K6M7N8P9",
});
for await (const page of result) {
console.log(page);
}
}
run();
from noresponse import NoResponse
import os
with NoResponse(
api_key=os.getenv("NORESPONSE_API_KEY", ""),
) as no_response:
res = no_response.webhook_endpoints.list_deliveries(endpoint_id="whe_01JA2ZD0E1F2G3H4J5K6M7N8P9", limit=20)
while res is not None:
# Handle items
res = res.next()
package main
import(
"context"
"os"
noresponse "github.com/noresponsehq/go/v5"
"log"
)
func main() {
ctx := context.Background()
s := noresponse.New(
noresponse.WithSecurity(os.Getenv("NORESPONSE_API_KEY")),
)
res, err := s.WebhookEndpoints.ListDeliveries(ctx, "whe_01JA2ZD0E1F2G3H4J5K6M7N8P9", noresponse.Pointer[int64](20), nil)
if err != nil {
log.Fatal(err)
}
if res != nil {
for {
// handle items
res, err = res.Next()
if err != nil {
// handle error
}
if res == nil {
break
}
}
}
}
package hello.world;
import java.lang.Exception;
import org.noresponse.NoResponse;
import org.noresponse.models.errors.AuthenticationException;
import org.noresponse.models.errors.BadRequestException;
import org.noresponse.models.errors.ConflictException;
import org.noresponse.models.errors.NotFoundException;
import org.noresponse.models.errors.PermissionDeniedException;
import org.noresponse.models.errors.RateLimitException;
import org.noresponse.models.operations.ListWebhookDeliveriesResponse;
public class Application {
public static void main(String[] args) throws Exception {
NoResponse sdk = NoResponse.builder()
.apiKey(System.getenv().getOrDefault("NORESPONSE_API_KEY", ""))
.build();
sdk.webhookEndpoints().listDeliveries()
.endpointId("whe_01JA2ZD0E1F2G3H4J5K6M7N8P9")
.limit(20L)
.callAsStream()
.forEach((ListWebhookDeliveriesResponse item) -> {
// handle page
});
}
}
using NoResponse;
using NoResponse.Models.Operations;
using NoResponse.Models.Shared;
using System;
var sdk = new NoResponseClient(apiKey: Environment.GetEnvironmentVariable("NORESPONSE_API_KEY"));
ListWebhookDeliveriesResponse? res = await sdk.WebhookEndpoints.ListDeliveriesAsync(
endpointId: "whe_01JA2ZD0E1F2G3H4J5K6M7N8P9",
limit: 20
);
while(res != null)
{
// handle items
res = await res.Next!();
}
<?php
declare(strict_types=1);
require 'vendor/autoload.php';
use NoResponse;
$sdk = NoResponse\NoResponseClient::builder()
->setSecurity(
getenv('NORESPONSE_API_KEY') ?: ''
)
->build();
$responses = $sdk->webhookEndpoints->listDeliveries(
endpointId: 'whe_01JA2ZD0E1F2G3H4J5K6M7N8P9',
limit: 20
);
foreach ($responses as $response) {
if ($response->statusCode === 200) {
// handle response
}
}
require 'noresponse'
Models = ::NoResponse::Models
s = ::NoResponse::NoResponseClient.new(
api_key: ENV.fetch('NORESPONSE_API_KEY', '')
)
res = s.webhook_endpoints.list_deliveries(endpoint_id: 'whe_01JA2ZD0E1F2G3H4J5K6M7N8P9', limit: 20)
unless res.nil?
# handle response
end
{
"endpoint_id": "whe_01JA2ZD0E1F2G3H4J5K6M7N8P9",
"items": [
{
"event_id": "evt_01JA2ZD3K4M5N6P7Q8R9S0T1V2",
"event_type": "assessment.updated",
"attempt": 1,
"replay": true,
"status": "delivered",
"response_code": 200,
"latency_ms": 184,
"attempted_at": "2026-10-22T10:15:02.118Z"
},
{
"event_id": "evt_01JA2ZD3K4M5N6P7Q8R9S0T1V2",
"event_type": "assessment.updated",
"attempt": 2,
"replay": false,
"status": "failed",
"response_code": 500,
"failure": "non_2xx",
"latency_ms": 96,
"attempted_at": "2026-10-22T09:00:31.402Z"
},
{
"event_id": "evt_01JA2ZD3K4M5N6P7Q8R9S0T1V2",
"event_type": "assessment.updated",
"attempt": 1,
"replay": false,
"status": "failed",
"failure": "timeout",
"latency_ms": 5000,
"attempted_at": "2026-10-22T09:00:00.951Z"
}
],
"next_cursor": "AQAAAABpG1CXAAYqJ2gK4cQAx1dJ2Hk3Q6CjhYbJ9xU8Pz0qRkL1n3VbW2c"
}{
"type": "<string>",
"title": "<string>",
"status": 400,
"detail": "<string>",
"code": "invalid_request",
"request_id": "<string>",
"instance": "<string>",
"invalid_params": [
{
"field": "<string>",
"reason": "<string>",
"example": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 401,
"detail": "<string>",
"code": "unauthorized",
"request_id": "<string>",
"instance": "<string>",
"invalid_params": [
{
"field": "<string>",
"reason": "<string>",
"example": "<string>"
}
]
}{
"type": "https://docs.noresponse.org/problems/workspace-forbidden",
"title": "Forbidden",
"status": 403,
"detail": "The API key does not carry a scope this operation accepts.",
"code": "workspace_forbidden",
"request_id": "0123456789abcdef0123456789abcdef"
}{
"type": "<string>",
"title": "<string>",
"status": 404,
"detail": "<string>",
"code": "not_found",
"request_id": "<string>",
"instance": "<string>",
"invalid_params": [
{
"field": "<string>",
"reason": "<string>",
"example": "<string>"
}
]
}{
"type": "https://docs.noresponse.org/problems/rate-limited",
"title": "Rate limited",
"status": 429,
"detail": "The tenant's assessment rate is exhausted; retry after the Retry-After interval.",
"code": "rate_limited",
"request_id": "0123456789abcdef0123456789abcdef"
}{
"type": "<string>",
"title": "<string>",
"status": 503,
"detail": "<string>",
"code": "service_unavailable",
"request_id": "<string>",
"instance": "<string>",
"invalid_params": [
{
"field": "<string>",
"reason": "<string>",
"example": "<string>"
}
]
}List delivery attempts
Every POST the endpoint received, newest first: the event_id and event_type, which attempt it was, whether it was a replay, delivered or failed, the response_code, the failure reason and latency_ms.
Attempts are kept for 30 days, or your retention_days when that is shorter, and are deleted with the assessment they carried. Pass next_cursor back unchanged as cursor to read the next page; a changed, foreign or expired cursor answers 400 invalid_cursor.
Read-only and safe to retry. Requires the webhooks scope.
curl --request GET \
--url 'https://api.noresponse.org/v1/webhooks/whe_01JA2ZD0E1F2G3H4J5K6M7N8P9/deliveries?limit=20' \
--header "Authorization: Bearer $NORESPONSE_API_KEY"
import { NoResponse } from "@noresponse/node";
const noResponse = new NoResponse({
apiKey: process.env["NORESPONSE_API_KEY"] ?? "",
});
async function run() {
const result = await noResponse.webhookEndpoints.listDeliveries({
endpointId: "whe_01JA2ZD0E1F2G3H4J5K6M7N8P9",
});
for await (const page of result) {
console.log(page);
}
}
run();
from noresponse import NoResponse
import os
with NoResponse(
api_key=os.getenv("NORESPONSE_API_KEY", ""),
) as no_response:
res = no_response.webhook_endpoints.list_deliveries(endpoint_id="whe_01JA2ZD0E1F2G3H4J5K6M7N8P9", limit=20)
while res is not None:
# Handle items
res = res.next()
package main
import(
"context"
"os"
noresponse "github.com/noresponsehq/go/v5"
"log"
)
func main() {
ctx := context.Background()
s := noresponse.New(
noresponse.WithSecurity(os.Getenv("NORESPONSE_API_KEY")),
)
res, err := s.WebhookEndpoints.ListDeliveries(ctx, "whe_01JA2ZD0E1F2G3H4J5K6M7N8P9", noresponse.Pointer[int64](20), nil)
if err != nil {
log.Fatal(err)
}
if res != nil {
for {
// handle items
res, err = res.Next()
if err != nil {
// handle error
}
if res == nil {
break
}
}
}
}
package hello.world;
import java.lang.Exception;
import org.noresponse.NoResponse;
import org.noresponse.models.errors.AuthenticationException;
import org.noresponse.models.errors.BadRequestException;
import org.noresponse.models.errors.ConflictException;
import org.noresponse.models.errors.NotFoundException;
import org.noresponse.models.errors.PermissionDeniedException;
import org.noresponse.models.errors.RateLimitException;
import org.noresponse.models.operations.ListWebhookDeliveriesResponse;
public class Application {
public static void main(String[] args) throws Exception {
NoResponse sdk = NoResponse.builder()
.apiKey(System.getenv().getOrDefault("NORESPONSE_API_KEY", ""))
.build();
sdk.webhookEndpoints().listDeliveries()
.endpointId("whe_01JA2ZD0E1F2G3H4J5K6M7N8P9")
.limit(20L)
.callAsStream()
.forEach((ListWebhookDeliveriesResponse item) -> {
// handle page
});
}
}
using NoResponse;
using NoResponse.Models.Operations;
using NoResponse.Models.Shared;
using System;
var sdk = new NoResponseClient(apiKey: Environment.GetEnvironmentVariable("NORESPONSE_API_KEY"));
ListWebhookDeliveriesResponse? res = await sdk.WebhookEndpoints.ListDeliveriesAsync(
endpointId: "whe_01JA2ZD0E1F2G3H4J5K6M7N8P9",
limit: 20
);
while(res != null)
{
// handle items
res = await res.Next!();
}
<?php
declare(strict_types=1);
require 'vendor/autoload.php';
use NoResponse;
$sdk = NoResponse\NoResponseClient::builder()
->setSecurity(
getenv('NORESPONSE_API_KEY') ?: ''
)
->build();
$responses = $sdk->webhookEndpoints->listDeliveries(
endpointId: 'whe_01JA2ZD0E1F2G3H4J5K6M7N8P9',
limit: 20
);
foreach ($responses as $response) {
if ($response->statusCode === 200) {
// handle response
}
}
require 'noresponse'
Models = ::NoResponse::Models
s = ::NoResponse::NoResponseClient.new(
api_key: ENV.fetch('NORESPONSE_API_KEY', '')
)
res = s.webhook_endpoints.list_deliveries(endpoint_id: 'whe_01JA2ZD0E1F2G3H4J5K6M7N8P9', limit: 20)
unless res.nil?
# handle response
end
{
"endpoint_id": "whe_01JA2ZD0E1F2G3H4J5K6M7N8P9",
"items": [
{
"event_id": "evt_01JA2ZD3K4M5N6P7Q8R9S0T1V2",
"event_type": "assessment.updated",
"attempt": 1,
"replay": true,
"status": "delivered",
"response_code": 200,
"latency_ms": 184,
"attempted_at": "2026-10-22T10:15:02.118Z"
},
{
"event_id": "evt_01JA2ZD3K4M5N6P7Q8R9S0T1V2",
"event_type": "assessment.updated",
"attempt": 2,
"replay": false,
"status": "failed",
"response_code": 500,
"failure": "non_2xx",
"latency_ms": 96,
"attempted_at": "2026-10-22T09:00:31.402Z"
},
{
"event_id": "evt_01JA2ZD3K4M5N6P7Q8R9S0T1V2",
"event_type": "assessment.updated",
"attempt": 1,
"replay": false,
"status": "failed",
"failure": "timeout",
"latency_ms": 5000,
"attempted_at": "2026-10-22T09:00:00.951Z"
}
],
"next_cursor": "AQAAAABpG1CXAAYqJ2gK4cQAx1dJ2Hk3Q6CjhYbJ9xU8Pz0qRkL1n3VbW2c"
}{
"type": "<string>",
"title": "<string>",
"status": 400,
"detail": "<string>",
"code": "invalid_request",
"request_id": "<string>",
"instance": "<string>",
"invalid_params": [
{
"field": "<string>",
"reason": "<string>",
"example": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 401,
"detail": "<string>",
"code": "unauthorized",
"request_id": "<string>",
"instance": "<string>",
"invalid_params": [
{
"field": "<string>",
"reason": "<string>",
"example": "<string>"
}
]
}{
"type": "https://docs.noresponse.org/problems/workspace-forbidden",
"title": "Forbidden",
"status": 403,
"detail": "The API key does not carry a scope this operation accepts.",
"code": "workspace_forbidden",
"request_id": "0123456789abcdef0123456789abcdef"
}{
"type": "<string>",
"title": "<string>",
"status": 404,
"detail": "<string>",
"code": "not_found",
"request_id": "<string>",
"instance": "<string>",
"invalid_params": [
{
"field": "<string>",
"reason": "<string>",
"example": "<string>"
}
]
}{
"type": "https://docs.noresponse.org/problems/rate-limited",
"title": "Rate limited",
"status": 429,
"detail": "The tenant's assessment rate is exhausted; retry after the Retry-After interval.",
"code": "rate_limited",
"request_id": "0123456789abcdef0123456789abcdef"
}{
"type": "<string>",
"title": "<string>",
"status": 503,
"detail": "<string>",
"code": "service_unavailable",
"request_id": "<string>",
"instance": "<string>",
"invalid_params": [
{
"field": "<string>",
"reason": "<string>",
"example": "<string>"
}
]
}Authorizations
Your API key, sent as Authorization: Bearer <key>. A key is nrk_live_ or nrk_test_, a 26-character key id, _ and a 43-character secret. A key sees only its own environment's data.
Each key has one or more scopes: assess creates and reads assessments, records outcomes and reports key usage; history reads assessments, an account's current risk and an account's history, and erases an account; detailed adds the detailed view; webhooks registers, tests, rotates and deletes webhook endpoints; integrations registers and manages hosted provider integrations. A missing, unknown, revoked or expired key answers 401. A valid key without the scope an operation needs answers 403.
Path Parameters
The endpoint's whe_ id. An id that is unknown, malformed or another workspace's answers 404. Opaque id of the endpoint registration.
^whe_[0-9A-HJKMNP-TV-Z]{26}$Query Parameters
Attempts per page.
1 <= x <= 100next_cursor from the previous page, unchanged.
1 - 256^[A-Za-z0-9_-]+$Response
One page of the endpoint's delivery attempts, newest first.
The 200 answer of GET /v1/webhooks/{endpoint_id}/deliveries: one page of the endpoint's delivery attempts, newest first. Each item is one POST to the endpoint. Attempts are kept for 30 days, or the workspace's retention_days when that is shorter, and are deleted with the assessment they carried. next_cursor is present only when another page exists.
Opaque id of the endpoint registration.
^whe_[0-9A-HJKMNP-TV-Z]{26}$100Show child attributes
Show child attributes
Opaque cursor for the next page, MAC'd by the server and bound to the workspace and endpoint it was issued for. Pass it back unchanged as cursor; a tampered, foreign or expired cursor answers 400 invalid_cursor.
1 - 256^[A-Za-z0-9_-]+$