API and integrations

Plug Semhack into the tools you already use.

Start audits from a script, pull results into your own dashboards, and get told the moment an audit finishes or a site breaks: as signed JSON to your server, or as a readable message in Slack.
POST https://hooks.example.com/semhackExample

Semhack-Signature: t=1767225600,v1=5257a8…

{
  "id": "evt_3f9c…",
  "type": "monitoring.alert",
  "created_at": "2026-11-06T08:12:40.000Z",
  "data": {
    "alerts": [{
      "type": "noindex",
      "severity": "critical",
      "title": "/wholesale now has a noindex tag",
      …
    }]
  }
}

The payload is shortened here. The full shapes of every event are in the API docs.

REST API

12 endpoints, documented with examples.

JSON over HTTPS under /api/v1, with an OpenAPI description you can load into your own client. Audits started through the API count toward the same plan limits as audits started in the app.

Endpoints of the Semhack REST API
EndpointWhat it doesKey needs
GET/meThe workspace and key you are calling withScope: read
GET/auditsList auditsScope: read
POST/auditsAudit a pageScope: write
GET/audits/{id}Get an audit with its checksScope: read
GET/site-auditsList site auditsScope: read
POST/site-auditsStart a site auditScope: write
GET/site-audits/{id}Get a site audit with its issuesScope: read
GET/websitesList audited websitesScope: read
GET/clientsList clientsScope: read
GET/clients/{id}/performanceSearch Console performance summaryScope: read
GET/findingsThis week's actionsScope: read
PATCH/findings/{id}Change a finding's statusScope: write

Keys

Keys you control.

  • Read or write

    Each key is either read-only or read and write. Owners and admins create them in Settings → API; a workspace can have up to 25 active keys.

  • Shown once

    Keys start with smh_live_ and are shown in full only when you create them. Semhack keeps a hash, not the key, and shows when each one was last used.

  • Revoke any time

    Revoking a key stops it straight away. Each key can make 120 requests a minute, and responses say how many are left.

Webhooks

Events pushed to your server, signed.

Point a webhook at any HTTPS URL. Semhack sends a JSON event when a page audit or site audit finishes or fails, when a finding appears or changes status, and when monitoring raises an alert.
  • Up to 10 endpoints per workspace, each subscribed to the events it needs
  • Every delivery carries a Semhack-Signature header: an HMAC-SHA256 of the timestamp and body, so you can check it came from Semhack and isn’t a replay
  • Failed deliveries are retried up to 6 times over about ten hours; an endpoint that keeps failing (20 deliveries in a row) is paused
  • A delivery log, a “Send test event” button and resending from the log

Webhook events

7 events
  • audit.completedA page audit finished
  • audit.failedA page audit couldn’t finish
  • site_audit.completedA site audit finished
  • site_audit.failedA site audit couldn’t finish
  • finding.createdA new action was found
  • finding.status_changedAn action changed status
  • monitoring.alertMonitoring raised an alert

Slack

Alerts where the team already talks.

  • Paste a Slack webhook URL

    Add a Slack incoming webhook as an endpoint and the same events arrive as readable messages in the channel you picked, with a link back to the app.

  • Pick what’s worth a message

    Choose the events per endpoint: just monitoring alerts for an #alerts channel, for example, and finished audits somewhere quieter.

Honest limits

What it doesn’t do

  • The API covers audits, site audits, websites, clients and their Search Console performance, and findings. Settings, team, branding, briefs and billing are only in the app.
  • There’s no ready-made Zapier, Make or Looker Studio app. Any tool that can call a REST API or receive a webhook works.
  • Mentions and overdue reminders are personal, so they’re never sent to webhooks or Slack.
  • See security for how keys and webhook secrets are stored.

Create a key and make your first call.

Start free, open Settings → API and follow the curl examples in the docs.