HookSniff Elixir SDK

May 18, 2026 ยท View on GitHub

Hex Version Hex Downloads License

Official Elixir SDK for the HookSniff webhook delivery platform.

Installation

# mix.exs
defp deps do
  [
    {:hooksniff, "~> 1.2"}
  ]
end

Quick Start

# Create a client
client = HookSniff.new(api_key: "sk_live_xxx")

# List endpoints
{:ok, %{status: 200, body: endpoints}} = HookSniff.Endpoints.list(client)

# Send a webhook
{:ok, %{status: 200, body: msg}} = HookSniff.Webhooks.send_webhook(client, %{
  event: "user.created",
  payload: %{email: "user@example.com"}
})

# Verify incoming webhook
{:ok, payload} = HookSniff.Webhook.verify(raw_body, headers, "whsec_xxx")

Resources

ResourceModuleDescription
AdminHookSniff.AdminUsers, stats, revenue, settings
AlertsHookSniff.AlertsAlert rules and test
AnalyticsHookSniff.AnalyticsDelivery trend, success rate, latency
API KeysHookSniff.ApiKeysList, create, delete, rotate
ApplicationsHookSniff.ApplicationsApplication CRUD
AuthHookSniff.AuthRegister, login, 2FA, password, GDPR
Audit LogHookSniff.AuditLogAudit trail
Background TasksHookSniff.BackgroundTasksList, get, cancel
BillingHookSniff.BillingSubscription, usage, invoices
ConnectorsHookSniff.ConnectorsConnector management
Custom DomainsHookSniff.CustomDomainsAdd, verify, delete
DevicesHookSniff.DevicesPush device registration
EndpointsHookSniff.EndpointsCRUD, headers, secret rotation
EnvironmentsHookSniff.EnvironmentsEnv vars management
HealthHookSniff.HealthHealth check
InboundHookSniff.InboundInbound webhook configs
IntegrationsHookSniff.IntegrationsIntegration CRUD
Message AttemptsHookSniff.MessageAttemptsDelivery attempts
Message PollerHookSniff.MessagePollerPoll, seek, commit
NotificationsHookSniff.NotificationsList, mark read
Operational WebhooksHookSniff.OperationalWebhooksOps webhook endpoints
PortalHookSniff.PortalCustomer portal config
Rate LimitsHookSniff.RateLimitsPer-endpoint rate limiting
RoutingHookSniff.RoutingEndpoint routing rules
SchemasHookSniff.SchemasSchema registry, validation
SearchHookSniff.SearchDelivery search
Service TokensHookSniff.ServiceTokensToken management
SSOHookSniff.SSOSSO configuration
StreamHookSniff.StreamReal-time streaming
TeamsHookSniff.TeamsTeam members, roles
TemplatesHookSniff.TemplatesWebhook templates
TransformsHookSniff.TransformsPayload transforms
WebhooksHookSniff.WebhooksSend, list, replay

Webhook Verification

alias HookSniff.Webhook

headers = %{
  "hooksniff-id" => "msg_123",
  "hooksniff-timestamp" => "1678900000",
  "hooksniff-signature" => "v1,abc123..."
}

case Webhook.verify(raw_body, headers, "whsec_xxx") do
  {:ok, payload} ->
    # Process the webhook
    IO.inspect(payload)

  {:error, %Webhook.VerificationError{message: reason}} ->
    # Reject the webhook
    IO.puts("Invalid: #{reason}")
end

Configuration

client = HookSniff.new(
  api_key: "sk_live_xxx",
  base_url: "https://your-instance.hooksniff.com",  # optional
  timeout: 30_000,                                    # optional
  num_retries: 2                                      # optional
)

Error Handling

case HookSniff.Endpoints.get(client, "ep_123") do
  {:ok, %{status: 200, body: endpoint}} ->
    IO.inspect(endpoint)

  {:ok, %{status: 404, body: _}} ->
    IO.puts("Not found")

  {:ok, %{status: status, body: body}} ->
    IO.puts("Error #{status}: #{inspect(body)}")

  {:error, reason} ->
    IO.puts("Request failed: #{inspect(reason)}")
end

License

MIT