Skip to main content

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
}
}
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.