Manage signed webhook endpoints, delivery history, and signature verification.

WebhooksClient

Project webhook endpoints, secret rotation, and delivery history.

create

Creates a signed webhook endpoint and reveals its secret once.

ts
create(options: CreateWebhookEndpointOptions): Promise<CreatedWebhookEndpoint>
ParameterTypeRequiredDescription
optionsCreateWebhookEndpointOptionsYesHTTPS destination, subscribed event types, and initial active state.

Returns: Promise<CreatedWebhookEndpoint>

Throws

  • EyeballError when validation, authentication, or executor admission fails.

Example

ts
import { Eyeball } from "@eyeball/sdk";

const eyeball = new Eyeball({
  apiKey: process.env.EYEBALL_API_KEY!,
  baseUrl: process.env.EYEBALL_EXECUTOR_URL!,
});

const endpoint = await eyeball.webhooks.create({
  url: "https://agent.example.com/eyeball",
  events: ["execution.completed", "trigger.slack.message_received"],
});
console.log(endpoint.secret);

delete

Permanently removes one webhook endpoint.

ts
delete(endpointId: string): Promise<void>
ParameterTypeRequiredDescription
endpointIdstringYesProject-scoped webhook endpoint identifier.

Returns: Promise<void>

Throws

  • EyeballError when the endpoint is unavailable or the request fails.

deliveries

Lists delivery attempts for one webhook endpoint.

ts
deliveries(endpointId: string, options?: ListWebhookDeliveriesOptions): Promise<WebhookDeliveryPage>
ParameterTypeRequiredDescription
endpointIdstringYesProject-scoped webhook endpoint identifier.
optionsListWebhookDeliveriesOptionsNoCursor and page-size controls.

Returns: Promise<WebhookDeliveryPage>

Throws

  • EyeballError when pagination is invalid or the executor request fails.

get

Retrieves one webhook endpoint without exposing its signing secret.

ts
get(endpointId: string): Promise<WebhookEndpoint>
ParameterTypeRequiredDescription
endpointIdstringYesProject-scoped webhook endpoint identifier.

Returns: Promise<WebhookEndpoint>

Throws

  • EyeballError when the identifier is invalid, unavailable, or the request fails.

list

Lists webhook endpoints with cursor pagination.

ts
list(options?: ListWebhookEndpointsOptions): Promise<WebhookEndpointPage>
ParameterTypeRequiredDescription
optionsListWebhookEndpointsOptionsNoCursor and page-size controls.

Returns: Promise<WebhookEndpointPage>

Throws

  • EyeballError when pagination is invalid or the executor request fails.

rotateSecret

Invalidates the prior signing secret and reveals its replacement once.

ts
rotateSecret(endpointId: string): Promise<RotatedWebhookSecret>
ParameterTypeRequiredDescription
endpointIdstringYesProject-scoped webhook endpoint identifier.

Returns: Promise<RotatedWebhookSecret>

Throws

  • EyeballError when the endpoint is unavailable or the request fails.

update

Updates at least one mutable webhook endpoint field.

ts
update(endpointId: string, options: UpdateWebhookEndpointOptions): Promise<WebhookEndpoint>
ParameterTypeRequiredDescription
endpointIdstringYesProject-scoped webhook endpoint identifier.
optionsUpdateWebhookEndpointOptionsYesNew URL, event subscriptions, or active state.

Returns: Promise<WebhookEndpoint>

Throws

  • EyeballError when no field changes, a value is invalid, or the executor request fails.

createWebhookSignature

Creates the RFC 001 v1=<hex> signature for an exact raw payload.

ts
createWebhookSignature(options: CreateWebhookSignatureOptions): string
ParameterTypeRequiredDescription
optionsCreateWebhookSignatureOptionsYes

Returns: string

verifyWebhookSignature

Verifies a signed webhook using a constant-time digest comparison and a five-minute replay window. The payload must be the unmodified raw body.

ts
verifyWebhookSignature(options: VerifyWebhookSignatureOptions): boolean
ParameterTypeRequiredDescription
optionsVerifyWebhookSignatureOptionsYes

Returns: boolean

Types

CreateWebhookEndpointOptions

Fields accepted when registering a signed webhook destination.

ts
export interface CreateWebhookEndpointOptions {
  url: string;
  events: readonly WebhookSubscriptionEventType[];
  active?: boolean;
}
PropertyTypeRequiredReadonlyDescription
activebooleanNoNo
eventsreadonly WebhookSubscriptionEventType[]YesNo
urlstringYesNo

UpdateWebhookEndpointOptions

Mutable webhook endpoint fields; at least one must be present.

ts
export interface UpdateWebhookEndpointOptions {
  url?: string;
  events?: readonly WebhookSubscriptionEventType[];
  active?: boolean;
}
PropertyTypeRequiredReadonlyDescription
activebooleanNoNo
eventsreadonly WebhookSubscriptionEventType[]NoNo
urlstringNoNo

ListWebhookEndpointsOptions

Cursor pagination controls for webhook endpoint listing.

ts
export interface ListWebhookEndpointsOptions {
  cursor?: string;
  limit?: number;
}
PropertyTypeRequiredReadonlyDescription
cursorstringNoNo
limitnumberNoNo

ListWebhookDeliveriesOptions

Cursor pagination controls for one endpoint's delivery history.

ts
export interface ListWebhookDeliveriesOptions {
  cursor?: string;
  limit?: number;
}
PropertyTypeRequiredReadonlyDescription
cursorstringNoNo
limitnumberNoNo

CreatedWebhookEndpoint

ts
export interface CreatedWebhookEndpoint extends WebhookEndpoint {
  /** Returned only by endpoint creation. Store this value immediately. */
  secret: string;
}
PropertyTypeRequiredReadonlyDescription
activebooleanYesNo
createdAtstringYesNo
endpointIdstringYesNo
eventsreadonly WebhookSubscriptionEventType[]YesNo
secretstringYesNoReturned only by endpoint creation. Store this value immediately.
secretPrefixstringYesNo
updatedAtstringYesNo
urlstringYesNo

RotatedWebhookSecret

ts
export interface RotatedWebhookSecret {
  endpointId: string;
  secretPrefix: string;
  /** Returned only by secret rotation. Store this value immediately. */
  secret: string;
  rotatedAt: string;
}
PropertyTypeRequiredReadonlyDescription
endpointIdstringYesNo
rotatedAtstringYesNo
secretstringYesNoReturned only by secret rotation. Store this value immediately.
secretPrefixstringYesNo

VerifyWebhookSignatureOptions

ts
export interface VerifyWebhookSignatureOptions {
  /** Exact request bytes. Verify before parsing JSON. */
  payload: string | Uint8Array;
  headers: WebhookHeaderSource;
  secret: string;
  /** Defaults to five minutes. */
  toleranceMs?: number;
  /** Test seam; defaults to the current wall-clock time. */
  now?: number | Date;
}
PropertyTypeRequiredReadonlyDescription
headersWebhookHeaderSourceYesNo
nownumber | DateNoNoTest seam; defaults to the current wall-clock time.
payloadstring | Uint8Array<ArrayBufferLike>YesNoExact request bytes. Verify before parsing JSON.
secretstringYesNo
toleranceMsnumberNoNoDefaults to five minutes.

WebhookDelivery

ts
export interface WebhookDelivery {
  deliveryId: string;
  endpointId: string;
  eventId: string;
  eventType: WebhookEventType;
  status: WebhookDeliveryStatus;
  attempts: readonly WebhookDeliveryAttempt[];
  createdAt: string;
  nextRetryAt?: string;
  completedAt?: string;
}
PropertyTypeRequiredReadonlyDescription
attemptsreadonly WebhookDeliveryAttempt[]YesNo
completedAtstringNoNo
createdAtstringYesNo
deliveryIdstringYesNo
endpointIdstringYesNo
eventIdstringYesNo
eventTypeWebhookEventTypeYesNo
nextRetryAtstringNoNo
statusWebhookDeliveryStatusYesNo

WebhookDeliveryAttempt

ts
export interface WebhookDeliveryAttempt {
  attempt: number;
  attemptedAt: string;
  completedAt: string;
  statusCode?: number;
  error?: string;
}
PropertyTypeRequiredReadonlyDescription
attemptnumberYesNo
attemptedAtstringYesNo
completedAtstringYesNo
errorstringNoNo
statusCodenumberNoNo

WebhookDeliveryPage

ts
export interface WebhookDeliveryPage {
  deliveries: readonly WebhookDelivery[];
  nextCursor?: string;
}
PropertyTypeRequiredReadonlyDescription
deliveriesreadonly WebhookDelivery[]YesNo
nextCursorstringNoNo

WebhookDeliveryStatus

ts
export type WebhookDeliveryStatus =
  | "pending"
  | "delivering"
  | "succeeded"
  | "failed";

WebhookEndpoint

ts
export interface WebhookEndpoint {
  endpointId: string;
  url: string;
  secretPrefix: string;
  events: readonly WebhookSubscriptionEventType[];
  active: boolean;
  createdAt: string;
  updatedAt: string;
}
PropertyTypeRequiredReadonlyDescription
activebooleanYesNo
createdAtstringYesNo
endpointIdstringYesNo
eventsreadonly WebhookSubscriptionEventType[]YesNo
secretPrefixstringYesNo
updatedAtstringYesNo
urlstringYesNo

WebhookEndpointPage

ts
export interface WebhookEndpointPage {
  webhooks: readonly WebhookEndpoint[];
  nextCursor?: string;
}
PropertyTypeRequiredReadonlyDescription
nextCursorstringNoNo
webhooksreadonly WebhookEndpoint[]YesNo

VoiceObserverFailedWebhookData

ts
export interface VoiceObserverFailedWebhookData {
  sessionId: string;
  agentId: string;
  agentRevision: number;
  lastHandledSequence: number;
  attempts: number;
  reason: VoiceObserverFailureReason;
  operation: VoiceObserverFailureOperation;
  error: NormalizedToolError;
}
PropertyTypeRequiredReadonlyDescription
agentIdstringYesNo
agentRevisionnumberYesNo
attemptsnumberYesNo
errorNormalizedToolErrorYesNo
lastHandledSequencenumberYesNo
operationVoiceObserverFailureOperationYesNo
reasonVoiceObserverFailureReasonYesNo
sessionIdstringYesNo

VoiceObserverFailedWebhookEvent

Executor-owned failure signal; it is not part of the worker event sequence.

ts
export interface VoiceObserverFailedWebhookEvent {
  id: string;
  type: "voice.observer.failed";
  createdAt: string;
  projectId: string;
  data: VoiceObserverFailedWebhookData;
}
PropertyTypeRequiredReadonlyDescription
createdAtstringYesNo
dataVoiceObserverFailedWebhookDataYesNo
idstringYesNo
projectIdstringYesNo
type"voice.observer.failed"YesNo

VoiceObserverFailureOperation

ts
export type VoiceObserverFailureOperation =
  | "get_events"
  | "get_session"
  | "publish_event"
  | "publish_transcript"
  | "publish_failure";

VoiceObserverFailureReason

ts
export type VoiceObserverFailureReason = "retry_exhausted" | "non_retryable";

WebhookEvent

ts
export type WebhookEvent =
  | ExecutionWebhookEvent
  | VoiceSessionWebhookEvent
  | VoiceTranscriptWebhookEvent
  | VoiceObserverFailedWebhookEvent
  | TriggerWebhookEvent;

WebhookEventType

ts
export type WebhookEventType =
  | TerminalEventType
  | "voice.session.event"
  | "voice.transcript.ready"
  | "voice.observer.failed"
  | TriggerWebhookEventType;

WebhookSubscriptionEventType

ts
export type WebhookSubscriptionEventType =
  | (typeof WEBHOOK_SUBSCRIPTION_EVENT_TYPES)[number]
  | TriggerWebhookEventType;