GraphQL API
Pulsar provides a GraphQL API for accessing your monitoring data.
Endpoint
POST https://pulsar.byte8.io/graphql
Authentication
The API uses session-based authentication. See Authentication for details.
Schema Overview
Queries
type Query {
# Current user
me: User
# Sites
sites: [Site!]!
site(id: ID!): Site
# Site pages
sitePages(siteId: ID!): [SitePage!]!
# Third-party dependencies (includes each dependency's latest check status)
siteDependencies(siteId: ID!): [SiteDependency!]!
# Checks
checks(siteId: ID!, limit: Int): [Check!]!
recentActivity(siteId: ID!, limit: Int): [Check!]!
# Alerts
alerts(siteId: ID, unresolvedOnly: Boolean, limit: Int): [Alert!]!
# Statistics
dashboardStats: DashboardStats!
siteStats(siteId: ID!): SiteStats!
uptimeData(siteId: ID!, days: Int): [UptimeDataPoint!]!
responseTimeData(siteId: ID!, days: Int): [ResponseTimeDataPoint!]!
quotaUsage: QuotaInfo!
# Notification channels
notificationChannels: [NotificationChannel!]!
siteNotificationChannels(siteId: ID!): [NotificationChannel!]!
# Magento health monitoring
siteHealth(siteId: ID!): SiteHealth
siteHealthHistory(siteId: ID!, limit: Int): [SiteHealth!]!
siteLogErrors(siteId: ID!): [LogError!]!
# Error patterns (per site or page)
siteErrorPatterns(siteId: ID!): [ErrorPattern!]!
pageErrorPatterns(pageId: ID!): [ErrorPattern!]!
defaultJsIgnorePatterns: [String!]!
}
Mutations
type Mutation {
# Sites
createSite(input: CreateSiteInput!): Site!
updateSite(id: ID!, input: UpdateSiteInput!): Site!
deleteSite(id: ID!): Boolean!
muteSite(id: ID!): Site!
unmuteSite(id: ID!): Site!
# Checkout flow
updateCheckoutFlowConfig(id: ID!, input: CheckoutFlowInput!): Site!
disableCheckoutFlow(id: ID!): Site!
# Consent guard
updateConsentGuardConfig(id: ID!, input: ConsentGuardConfigInput!): Site!
disableConsentGuard(id: ID!): Site!
# DNS monitoring
updateDnsConfig(id: ID!, input: DnsConfigInput!): Site!
disableDnsConfig(id: ID!): Site!
# Magento health endpoint
updateHealthEndpointConfig(id: ID!, input: HealthEndpointConfigInput!): Site!
updateHealthCollectorOverrides(id: ID!, input: [CollectorOverrideInput!]!): Site!
# Checkout flow
detectCheckoutFlowConfig(id: ID!, productPath: String!): SiteDetectionResult!
# Site pages
createSitePage(input: CreateSitePageInput!): SitePage!
updateSitePage(id: ID!, input: UpdateSitePageInput!): SitePage!
deleteSitePage(id: ID!): Boolean!
# Third-party dependencies
createSiteDependency(input: CreateSiteDependencyInput!): SiteDependency!
updateSiteDependency(id: ID!, input: UpdateSiteDependencyInput!): SiteDependency!
deleteSiteDependency(id: ID!): Boolean!
# Alerts & advisories
resolveAlert(id: ID!): Alert!
triggerCheck(siteId: ID!): Boolean!
dismissAdvisory(id: ID!): Boolean!
undismissAdvisory(id: ID!): Boolean!
# Log errors
acknowledgeLogError(id: ID!): Boolean!
acknowledgeAllLogErrors(siteId: ID!): Boolean!
unacknowledgeLogError(id: ID!): Boolean!
deleteLogError(id: ID!): Boolean!
# Notification channels
createNotificationChannel(input: NotificationChannelInput!): NotificationChannel!
updateNotificationChannel(id: ID!, input: NotificationChannelInput!): NotificationChannel!
deleteNotificationChannel(id: ID!): Boolean!
linkSiteChannel(siteId: ID!, channelId: ID!): Boolean!
unlinkSiteChannel(siteId: ID!, channelId: ID!): Boolean!
testNotificationChannel(id: ID!): Boolean!
# Error patterns
createSiteErrorPattern(input: CreateErrorPatternInput!): ErrorPattern!
updateSiteErrorPattern(id: ID!, input: UpdateErrorPatternInput!): ErrorPattern!
deleteSiteErrorPattern(id: ID!): Boolean!
createPageErrorPattern(input: CreateErrorPatternInput!): ErrorPattern!
updatePageErrorPattern(id: ID!, input: UpdateErrorPatternInput!): ErrorPattern!
deletePageErrorPattern(id: ID!): Boolean!
}
note
The live schema is the source of truth — some input-type shapes above are illustrative. Explore the exact types with the GraphQL Playground (see below) when logged in.
Types
Site
type Site {
id: ID!
name: String!
url: String!
status: SiteStatus!
muted: Boolean!
checkIntervalSeconds: Int!
browserChecks: Boolean!
checkoutFlowEnabled: Boolean!
basicAuthUsername: String
createdAt: DateTime!
updatedAt: DateTime!
}
enum SiteStatus {
UP
DOWN
DEGRADED
PAUSED
UNKNOWN
}
SitePage
type SitePage {
id: ID!
siteId: ID!
name: String!
path: String!
checkIntervalSeconds: Int!
browserCheck: Boolean!
enabled: Boolean!
status: SiteStatus!
createdAt: DateTime!
}
Check
type Check {
id: ID!
siteId: ID!
pageId: ID
checkType: CheckType!
status: CheckStatus!
responseTimeMs: Int
statusCode: Int
errorMessage: String
jsErrors: [JsError!]
createdAt: DateTime!
}
# checkType is a string; current values:
# http | browser | flow | dependency | consent_guard | health | dns
enum CheckStatus {
UP
DOWN
DEGRADED
COMPROMISED
}
type JsError {
source: String!
message: String!
stackTrace: String
url: String
line: Int
column: Int
}
Alert
type Alert {
id: ID!
siteId: ID!
alertType: String!
message: String!
isResolved: Boolean!
createdAt: DateTime!
resolvedAt: DateTime
}
# alertType is a string. Current values include:
# site_down, site_degraded, page_down, flow_failed, flow_degraded,
# health_degraded, health_critical, health_compromised,
# consent_guard_violation, consent_guard_degraded,
# dependency_down, dependency_degraded,
# dns_record_change, dns_blocklist, security_advisory,
# log_errors_new, site_flapping, site_slow_flapping
DashboardStats
type DashboardStats {
totalSites: Int!
sitesUp: Int!
sitesDown: Int!
sitesPaused: Int!
totalChecks24h: Int!
avgResponseTimeMs: Float
}
QuotaInfo
type QuotaInfo {
sitesUsed: Int!
sitesLimit: Int!
pagesUsed: Int!
pagesLimit: Int!
browserChecksUsed: Int!
browserChecksLimit: Int!
checkoutFlowsUsed: Int!
checkoutFlowsLimit: Int!
}
NotificationChannel
Notifications are modelled as reusable channels you create once and link to one or more sites (not a single per-account settings object).
type NotificationChannel {
id: ID!
name: String!
channelType: String! # "email" | "slack" | "discord" | "pagerduty"
config: JSON! # channel-specific (recipients, webhook URL, routing key…); secrets are write-only
enabled: Boolean!
alertDeliveryMode: String! # "immediate" | "incidents_instant_rest_daily"
digestHour: Int # local hour the daily digest is sent
siteCount: Int! # how many sites this channel is linked to
createdAt: DateTime!
updatedAt: DateTime!
}
Example Queries
Get All Sites with Status
query {
sites {
id
name
url
status
muted
checkIntervalSeconds
}
}
Get Site with Pages
query GetSiteDetails($siteId: ID!) {
site(id: $siteId) {
id
name
url
status
}
sitePages(siteId: $siteId) {
id
name
path
status
}
}
Get Dashboard Stats
query {
dashboardStats {
totalSites
sitesUp
sitesDown
totalChecks24h
avgResponseTimeMs
}
quotaUsage {
sitesUsed
sitesLimit
browserChecksUsed
browserChecksLimit
}
}
Get Recent Checks
query {
checks(siteId: "uuid-here", limit: 10) {
id
status
responseTimeMs
errorMessage
createdAt
}
}
Example Mutations
Create a Site
mutation {
createSite(input: {
name: "My Store"
url: "https://mystore.com"
checkIntervalSeconds: 60
}) {
id
name
status
}
}
Create a Notification Channel and Link It to a Site
mutation {
createNotificationChannel(input: {
name: "Ops Slack"
channelType: "slack"
config: { webhookUrl: "https://hooks.slack.com/..." }
alertDeliveryMode: "incidents_instant_rest_daily"
}) {
id
name
channelType
}
}
Then link the channel to a site (a channel can serve many sites):
mutation {
linkSiteChannel(siteId: "site-uuid", channelId: "channel-uuid")
}
GraphQL Playground
Explore the API interactively when logged in:
https://pulsar.byte8.io/graphql
Use the GraphQL Playground in your browser's developer tools or a client like Altair.