Skip to main content
JSON shapes returned by v1 API resources.

User

Returned on GET /me and nested on some issue responses.
FieldTypeDescription
idintegerUser id
namestringDisplay name
rolestring | nullUser role/title from profile settings
emailstringEmail address
email_verified_atstring | nullISO 8601 when verified

Example

{
  "id": 1,
  "name": "John Doe",
  "role": "Engineering lead",
  "email": "john@example.com",
  "email_verified_at": "2026-05-28T10:00:00+00:00"
}

Team

FieldTypeDescription
idintegerTeam id (use in /teams/{team} paths)
namestringTeam name
personal_teambooleanWhether this is the user’s personal team
owner_idintegerOwner user id
sites_countintegerPresent when counted
members_countintegerMembers including owner, when counted
limitsobjectPlan limits (see below)
created_atstringISO 8601
updated_atstringISO 8601

Team limits object

FieldTypeDescription
planstringPlan key (starter, growth, agency)
sitesobject{ "used", "limit", "remaining" } style summary
seatsobjectSeat usage; may include members, pending_invitations
manual_checksobjectMonthly manual-check usage summary
enabled_checksobject{ "allowed": ["status", ...] } tools available to the team
minimum_check_cadence_minutesinteger | nullFastest allowed automatic cadence
history_retention_daysinteger | nullHow long check history is kept
priority_queuebooleanWhether checks use priority queue

Example

{
  "id": 1,
  "name": "Acme Inc",
  "personal_team": false,
  "owner_id": 1,
  "sites_count": 12,
  "members_count": 5,
  "limits": {
    "plan": "growth",
    "sites": {
      "used": 12,
      "limit": 25,
      "remaining": 13
    },
    "manual_checks": {
      "used": 42,
      "limit": 250,
      "remaining": 208
    },
    "enabled_checks": {
      "allowed": ["status", "ssl", "dns", "broken-links", "performance"]
    },
    "minimum_check_cadence_minutes": 5,
    "history_retention_days": 90,
    "priority_queue": true
  },
  "created_at": "2026-01-15T10:00:00+00:00",
  "updated_at": "2026-05-28T14:30:00+00:00"
}

Team monitoring

Returned under data by GET /teams/{team}/monitoring and PATCH /teams/{team}/monitoring.
FieldTypeDescription
settingsobjectNormalized monitoring settings: tools, quiet_time, and escalation
cadence_presetsarrayAvailable cadence options with minutes, label, and disabled (plan-gated)
minimum_check_cadence_minutesinteger | nullFastest cadence allowed by the team’s plan
allowed_toolsarrayTools the team can configure, with per-tool cadence floors
failure_threshold_presetsarrayStatus failures-to-open presets (instant, conservative, aggressive)
escalation_interval_presetsarrayEscalation reminder options (15m through daily)
dns_record_typesstring[]Supported DNS record types for monitored_record_types

Example

{
  "settings": {
    "tools": {
      "status": {
        "enabled": true,
        "cadence_minutes": 5,
        "settings": {
          "header": { "name": null, "value": null },
          "failures_to_open": 2,
          "successes_to_resolve": 1,
          "confirmation_retry_minutes": 2,
          "incident_follow_up_minutes": 5
        }
      },
      "ssl": {
        "enabled": true,
        "cadence_minutes": 1440,
        "settings": { "expiry_days": 14 }
      },
      "dns": {
        "enabled": true,
        "cadence_minutes": 1440,
        "settings": {
          "hard_failures_only": true,
          "monitored_record_types": ["A", "AAAA", "CNAME", "MX", "NS", "TXT"]
        }
      },
      "broken-links": {
        "enabled": true,
        "cadence_minutes": 1440,
        "settings": {
          "min_broken_count": 5,
          "ignore_paths": []
        }
      },
      "performance": {
        "enabled": true,
        "cadence_minutes": 1440,
        "settings": {
          "url": null,
          "min_score": 50,
          "max_ttfb_ms": 4000
        }
      }
    },
    "quiet_time": { "enabled": false, "starts_at": "22:00", "ends_at": "07:00" },
    "escalation": { "enabled": false, "intervals": [] }
  },
  "minimum_check_cadence_minutes": 5,
  "failure_threshold_presets": [
    { "key": "instant", "label": "Instant", "failures_to_open": 1 }
  ],
  "escalation_interval_presets": [
    { "key": "15m", "label": "15 minutes", "minutes": 15 }
  ],
  "dns_record_types": ["A", "AAAA", "CNAME", "MX", "NS", "TXT"]
}

Site

FieldTypeDescription
uuidstringSite identifier in API paths
team_idintegerOwning team
namestringDisplay name
urlstringCanonical monitored URL
domainstringHostname derived from URL
notesstring | nullTeam notes
js_renderedbooleanUse JS rendering for broken-link crawls
is_pinnedbooleanPinned on sites list
enabled_checksstring[]Enabled tool values
monitoringobjectSee monitoring object below
issue_settingsobjectResolved issue settings for the site
latest_checksobjectLatest check per tool, when loaded
reportsobjectAbsolute URLs to report endpoints
created_atstringISO 8601
updated_atstringISO 8601

Monitoring object

FieldTypeDescription
settingsobjectResolved site monitoring settings. Same shape as team settings, plus snoozed_until when set.

Latest checks object

Keys are tool values (status, ssl, dns, broken-links, performance). Values are Check objects or null if no check exists.

Reports object

FieldType
uptimestring (URL)
performancestring (URL)
These are fully qualified route URLs for the report endpoints on this site.

Issue settings object

Returned as issue_settings on Site resources. The response is resolved for the site, so it includes team defaults plus any per-site overrides.
PATCH requests use monitoring_settings in the request body. The response returns the normalized issue shape as issue_settings.
FieldTypeDescription
enabled_toolsstring[]Tools that can open issues (status, ssl, dns, broken-links, performance)
snoozed_untilstring | nullISO 8601 datetime; issue opening paused until this time
status.failures_to_openintegerFailed status checks before opening an issue
status.successes_to_resolveintegerSuccessful status checks before resolving
status.confirmation_retry_minutesintegerMinutes before confirmation retry (1–5)
status.incident_follow_up_minutesintegerMinutes between incident follow-up checks (1–60)
ssl.expiry_daysintegerDays before expiry to open SSL warning issue
ssl.failures_to_openintegerFailed SSL checks before opening an issue
ssl.confirmation_retry_minutesintegerMinutes before SSL confirmation retry (1–5)
links.min_broken_countintegerMinimum broken URLs to breach threshold
links.consecutive_breaches_to_openintegerConsecutive breached crawls before opening issue
links.ignore_pathsstring[]URL path patterns excluded from broken-link crawls
links.ignore_external_linksbooleanExclude links outside the monitored site host
links.ignore_redirectsbooleanExclude redirect responses from broken-link counts
performance.urlstring | nullPage URL audited instead of the site root
performance.min_scoreintegerMinimum acceptable score (1–100)
performance.max_response_time_msintegerLegacy max response time (ms); normalized with max_ttfb_ms
performance.max_ttfb_msintegerMaximum time to first byte in milliseconds
performance.max_load_time_secondsinteger | nullMaximum Time to Interactive in seconds
performance.consecutive_breaches_to_openintegerConsecutive breached checks before opening issue
dns.hard_failures_onlybooleanOnly open DNS issues on lookup failures when true
dns.failures_to_openintegerFailed DNS checks before opening an issue
dns.confirmation_retry_minutesintegerMinutes before DNS confirmation retry (1–5)
dns.monitored_record_typesstring[]DNS record types to watch for changes
dns.expected_recordsobjectMap of record type → array of expected values
quiet_time.enabledbooleanSuppress outbound issue alerts during a daily window
quiet_time.starts_atstringQuiet time start in H:i format
quiet_time.ends_atstringQuiet time end in H:i format
escalation.enabledbooleanSend follow-up reminders for open issues
escalation.intervalsinteger[]Reminder schedule in minutes (15, 30, 60, 360, 1440)

Example

{
  "uuid" : "9d4e2c8f-1234-5678-9abc-def012345678",
  "team_id": 1,
  "name": "Example Site",
  "url": "https://example.com",
  "domain": "example.com",
  "notes": "Production website",
  "js_rendered": false,
  "is_pinned": true,
  "enabled_checks": ["status", "ssl", "performance"],
  "monitoring": {
    "settings": {
      "tools": {
        "status": {
          "enabled": true,
          "cadence_minutes": 5,
          "settings": {
            "header": { "name": null, "value": null }
          }
        },
        "ssl": {
          "enabled": true,
          "cadence_minutes": 1440,
          "settings": { "expiry_days": 14 }
        },
        "performance": {
          "enabled": true,
          "cadence_minutes": 1440,
          "settings": {
            "url": null,
            "min_score": 50,
            "max_ttfb_ms": 4000
          }
        }
      },
      "quiet_time": { "enabled": false, "starts_at": "22:00", "ends_at": "07:00" },
      "escalation": { "enabled": false, "intervals": [] },
      "snoozed_until": null
    }
  },
  "issue_settings": {
    "enabled_tools": ["status", "ssl", "performance"],
    "snoozed_until": null,
    "status": {
      "failures_to_open": 2,
      "successes_to_resolve": 1,
      "confirmation_retry_minutes": 2,
      "incident_follow_up_minutes": 5
    },
    "ssl": {
      "expiry_days": 14,
      "failures_to_open": 1,
      "confirmation_retry_minutes": 2
    },
    "performance": {
      "url": null,
      "min_score": 50,
      "max_response_time_ms": 4000,
      "max_ttfb_ms": 4000
    },
    "quiet_time": { "enabled": false, "starts_at": "22:00", "ends_at": "07:00" },
    "escalation": { "enabled": false, "intervals": [] }
  },
  "reports": {
    "uptime": "https://app.sitepulse.dev/api/v1/sites/9d4e2c8f.../reports/uptime",
    "performance": "https://app.sitepulse.dev/api/v1/sites/9d4e2c8f.../reports/performance"
  },
  "created_at": "2026-05-20T10:00:00+00:00",
  "updated_at": "2026-05-28T14:30:00+00:00"
}

Check

FieldTypeDescription
uuidstringCheck identifier
typestringTool value
statusstringpending, completed, failed, skipped
automaticbooleanScheduled vs manual run
run_reasonstring | nullscheduled, confirmation_retry, incident_follow_up when set
siteobject | null{ uuid, name, url, domain } when loaded
resultmixedTool-specific payload; see Check results
errormixedError payload when failed
created_atstringISO 8601
updated_atstringISO 8601
completed_atstring | nullISO 8601 when finished

Example

{
  "uuid": "9d4e2c8f-abcd-5678-9abc-def012345678",
  "type": "status",
  "status": "completed",
  "automatic": false,
  "run_reason": null,
  "site": {
    "uuid": "9d4e2c8f-1234-5678-9abc-def012345678",
    "name": "Example Site",
    "url": "https://example.com",
    "domain": "example.com"
  },
  "result": {
    "up": true,
    "code": 200,
    "url": "https://example.com",
    "effective_url": "https://example.com",
    "response_time": 142.37,
    "redirected": false,
    "redirect_count": 0
  },
  "error": null,
  "created_at": "2026-05-28T14:30:00+00:00",
  "updated_at": "2026-05-28T14:30:05+00:00",
  "completed_at": "2026-05-28T14:30:05+00:00"
}

Issue

Issues represent monitoring incidents opened by automatic checks. The API exposes read-only access for integrations that need to correlate webhook notifications or query incident history.
FieldTypeDescription
uuidstringIssue identifier
team_idintegerOwning team
typestringCheck tool that detected the problem
statusstringopen, acknowledged, or resolved
severitystringcritical, warning, info
fingerprintstringStable key for deduplication (e.g. status:down, ssl:expiring)
summarystringHuman-readable summary
contextobject | nullStructured evaluation payload from the check
siteSite | nullAffected site when loaded
checkCheck | nullLatest check tied to the issue
previous_checkCheck | nullPrior check used for comparison when loaded
acknowledged_byUser | nullUser who acknowledged the issue
resolved_byUser | nullUser who resolved the issue (or null when resolved automatically)
timelinearrayLifecycle events (opened, acknowledged, resolved) with timestamps and actors
is_activebooleantrue when status is open or acknowledged
opened_atstringISO 8601
acknowledged_atstring | nullISO 8601
resolved_atstring | nullISO 8601 when recovered
last_evaluated_atstring | nullISO 8601
created_atstringISO 8601
updated_atstringISO 8601

Example

{
  "uuid": "9d4e2c8f-issue-5678-9abc-def012345678",
  "team_id": 1,
  "type": "status",
  "status": "open",
  "severity": "critical",
  "fingerprint": "status:down",
  "summary": "Example is down (HTTP 500)",
  "context": {
    "response_code": 500
  },
  "timeline": [
    { "key": "opened", "timestamp": "2026-05-28T14:00:00+00:00", "user": null }
  ],
  "is_active": true,
  "opened_at": "2026-05-28T14:00:00+00:00",
  "acknowledged_at": null,
  "resolved_at": null,
  "last_evaluated_at": "2026-05-28T14:30:00+00:00",
  "created_at": "2026-05-28T14:00:00+00:00",
  "updated_at": "2026-05-28T14:30:00+00:00"
}

Uptime report

Returned by GET /sites/{site}/reports/uptime.
{
  "data": {
    "days": [
      {
        "date": "2026-05-28T00:00:00+00:00",
        "uptime_percentage": 99.5,
        "total_checks": 288,
        "up_checks": 287
      }
    ],
    "total_uptime_percentage": 99.2
  }
}
  • Based on automatic completed status checks
  • Days without checks have uptime_percentage: null and total_checks: 0
  • Default range: 90 days; override with ?days= (max 365)

Performance report

Returned by GET /sites/{site}/reports/performance.
{
  "data": {
    "days": [
      {
        "date": "2026-05-28T00:00:00+00:00",
        "performance_score": 87.5,
        "response_time": 420,
        "speed": 3.2,
        "total_checks": 24
      }
    ],
    "total_performance_score": 85.1,
    "total_response_time": 450,
    "total_speed": 3.4,
    "total_checks": 720
  }
}
  • Based on automatic completed performance checks
  • Default range: 30 days; override with ?days= (max 365)

Bulk site create response

POST /teams/{team}/sites/bulk returns:
{
  "data": {
    "created": [ /* Site resources */ ],
    "skipped": [],
    "failed": [
      { "url": "https://invalid", "error": "..." }
    ]
  }
}

See also