Skip to main content
The SitePulse API uses consistent JSON formatting, standard HTTP status codes, and Laravel pagination conventions.

Content type

All requests and responses use JSON:
  • Request bodies: application/json
  • Responses: application/json

Resource wrapping

Single resources

Single resources are wrapped in a data key:
{
  "data": {
    "uuid": "...",
    "name": "Example"
  }
}
Some endpoints (for example GET /me) nest multiple objects inside data:
{
  "data": {
    "user": { "id": 1, "name": "...", "email": "..." },
    "teams": [ ... ]
  }
}

Collections

Collections use Laravel’s paginator format:
{
  "data": [ ... ],
  "links": {
    "first": "...",
    "last": "...",
    "prev": null,
    "next": "..."
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 3,
    "path": "...",
    "per_page": 25,
    "to": 25,
    "total": 62
  }
}
Non-paginated collections (for example GET /teams) return data as an array without links / meta.

Timestamps

All datetime fields are ISO 8601 strings in UTC:
2026-05-28T14:32:10+00:00

Identifiers

Different resources use different identifier types:
ResourceRoute keyFormatExample path
TeamNumeric idInteger/teams/1
SiteuuidUUID string/sites/{uuid}
CheckuuidUUID string/checks/{uuid}
IssueuuidUUID string/issues/{uuid}
UserNumeric idIntegerAppears on nested user objects

Team context

For routes under a team, site, check, or issue, middleware resolves the team and sets it as the token user’s current team for that request. This drives plan-limit checks and policies that depend on currentTeam.
You do not send a separate X-Team-Id header. Scope operations with the team id or site uuid in the path.
For GET /issues, filter to one team with ?team={team_id}. Without team, results include all teams where the user has viewIssues permission.

Pagination

List endpoints accept these query parameters:
QueryTypeDefaultMax
pageinteger ≥ 11
per_pageinteger25100

Example

curl -sS \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  "https://app.sitepulse.dev/api/v1/teams/1/sites?page=2&per_page=50"

HTTP status codes

CodeMeaning
200Success
201Created (site)
202Accepted (check run queued)
204Success, no body (delete)
401Missing or invalid token
402Team subscription inactive
403Missing scope or team permission
404Resource not found or not in your teams
422Validation error
429Rate limit exceeded

Validation errors (422)

Laravel’s standard validation shape:
{
  "message": "The url field is required. (and 1 more error)",
  "errors": {
    "url": ["The url field is required."]
  }
}

Common validation cases

  • Duplicate site URL within a team
  • Plan site limit reached
  • Check tool not allowed on plan or not enabled on site
  • Invalid cadence for plan tier
  • Invalid filter or sort query parameters

Authorization vs not found

Cross-team access to sites, checks, and issues returns 404 Not Found rather than 403, so resource existence is not leaked across tenants.

Rate limits

All API routes use the default api throttle middleware. Check runs are further limited:
POST /sites/{site}/checks10 requests per minute per token/user
When throttled, the API returns 429 Too Many Requests with Retry-After headers where configured.

Enums

Check tools

Tool values in request bodies and responses:
ValueCheck
statusHTTP uptime
sslTLS certificate
dnsDNS records
broken-linksCrawl broken links
performanceLighthouse performance

Check status

ValueDescription
pendingQueued or running
completedFinished successfully
failedFinished with error
skippedNot run (for example plan or config)

Issue status

ValueDescription
openActive incident
acknowledgedAcknowledged by a team member
resolvedProblem has cleared
Filter with status=active to include both open and acknowledged issues.
The API supports read access only. Acknowledge and resolve actions are available in the dashboard Issues page.

Issue severity

Value
critical
warning
info

Example requests

# GET request
curl -sS \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  "https://app.sitepulse.dev/api/v1/teams/1/sites"

# POST request
curl -sS -X POST \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com","name":"Example"}' \
  "https://app.sitepulse.dev/api/v1/teams/1/sites"

# DELETE request
curl -sS -X DELETE \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  "https://app.sitepulse.dev/api/v1/sites/{uuid}"

See also