DeepSyte

REST API

Use the DeepSyte HTTP API directly from any programming language.

Base URL

https://api.deepsyte.com

Authentication

Pass your API key in the Authorization header:

Authorization: Bearer sk_live_...

Endpoints

GET /v1/account/balance

Return the authenticated account's current monthly usage, remaining balance, reset date, plan, and quota policy. This endpoint accepts REST API keys and website OAuth sessions. Admin accounts return unlimited: true with limit and remaining set to null, while still reporting the used count for the current month.

curl https://api.deepsyte.com/v1/account/balance \
  -H "Authorization: Bearer sk_live_..."

GET /v1/account/usage is an alias for the same response.

Response

{
  "userId": "user_abc123",
  "plan": "pro",
  "isAdmin": false,
  "unit": "actions",
  "window": {
    "interval": "month",
    "startedAt": "2026-06-01T00:00:00.000Z",
    "resetAt": "2026-07-01T00:00:00.000Z",
    "resetSeconds": 1782864000
  },
  "usage": {
    "used": 42,
    "limit": 10000,
    "remaining": 9958,
    "unlimited": false,
    "percentUsed": 0.42,
    "policy": "plan-limit"
  }
}

For admin users:

{
  "usage": {
    "used": 42,
    "limit": null,
    "remaining": null,
    "unlimited": true,
    "percentUsed": null,
    "policy": "admin-unlimited"
  }
}

POST /v1/screenshot

Enqueue a screenshot job.

curl -X POST https://api.deepsyte.com/v1/screenshot \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com",
    "width": 1280,
    "height": 800,
    "fullPage": false,
    "format": "png",
    "delay": 0,
    "cookieConsent": "auto",
    "waitFor": "main, h1, .hero",
    "waitUntil": "networkidle",
    "timeoutMs": 10000,
    "deviceScaleFactor": 1,
    "preScreenshotJs": "document.querySelectorAll('[class*=intercom]').forEach((el) => el.remove())"
  }'

Request Body

ParameterTypeRequiredDefaultDescription
urlstringYesURL to screenshot
widthnumberNo1280Viewport width in pixels
heightnumberNo800Viewport height in pixels
fullPagebooleanNofalseCapture full scrollable page
formatstringNo"png"png, jpeg, or webp
delaynumberNo0Milliseconds to wait after page load
cookieConsentstringNo"auto"auto dismisses common cookie consent overlays before capture. Use none to preserve banners exactly as shown.
waitForstringNo-CSS selector or selector group to wait for before capture, for example main, h1, .hero. Timeout is best-effort.
waitUntilstringNo"networkidle"Navigation load state: networkidle, load, domcontentloaded, or none.
timeoutMsnumberNo10000Timeout for navigation, waitFor, and clickBefore.
preScreenshotJsstringNo-JavaScript to evaluate after load/waits and immediately before capture. Useful for removing chat widgets, dialogs, smart banners, or app prompts.
deviceScaleFactornumberNo1Browser DPR. Use 2 for retina-quality mobile captures.
clickBeforestringNo-Optional CSS selector to click before waitFor and capture.

Response

{
  "id": "abc123",
  "status": "pending"
}

GET /v1/screenshot/:id

Poll for screenshot status and get the result URL.

curl https://api.deepsyte.com/v1/screenshot/abc123 \
  -H "Authorization: Bearer sk_live_..."

Response

{
  "id": "abc123",
  "status": "done",
  "url": "https://...",
  "error": null,
  "createdAt": "2025-01-01T00:00:00.000Z"
}

Status values: pending, processing, done, failed

Campaign endpoints

Bulk audit campaigns are available through the REST API for authenticated users with an API key. These endpoints are useful when an agent or backend service has already researched targets and needs to add them directly to a campaign.

curl https://api.deepsyte.com/v1/campaigns \
  -H "Authorization: Bearer sk_live_..."
curl -X POST https://api.deepsyte.com/v1/campaigns \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Sydney plumbers",
    "sendAt": "2026-05-12T00:00:00.000Z",
    "timezone": "Australia/Sydney",
    "reportType": "single_page",
    "sendHours": "office",
    "recipients": [
      {
        "websiteUrl": "https://example.com",
        "recipientEmail": "owner@example.com",
        "reportType": "full_site"
      }
    ]
  }'

Set campaign-level reportType to full_site to send full SEO audits to every recipient. Set a recipient reportType to full_site for a one-off full SEO audit row.

Set campaign-level sendHours to office for Monday-Friday 9am-4pm delivery in the campaign timezone, or anytime for every day, 24-hour delivery. The campaign sending-hours rule applies to both Resend report delivery and AgentMail campaign inbox delivery.

EndpointPurpose
GET /v1/campaignsList campaigns for the API key owner
POST /v1/campaignsCreate a campaign and optionally add targets
GET /v1/campaigns/:idGet campaign detail and recipient rows
POST /v1/campaigns/:id/targetsAdd targets to a campaign
POST /v1/campaigns/:id/launchLaunch the campaign for cron processing
GET /v1/campaigns/sender-capacityShow AgentMail sender/domain capacity
POST /v1/campaigns/sender-limitsUpdate sender warmup/manual limits

Campaign sending still runs only through DeepSyte cron. API and MCP calls can add targets and launch campaigns, but they cannot bypass campaign sending hours, daily caps, suppressions, or report quality gates.

Rate Limits

Requests are rate-limited per API key based on your plan. See Authentication for details.

On this page