Upsert Package Config
Creates a new package config (by :packageType) or updates an existing one. packageType is a free-form identifier chosen by the organization, and customer endpoints can later reference that same key.
PATCH /api/package-configs/:packageType
This endpoint is the source of truth for alerting-related defaults like alertConsecutiveChecks and feature flags like enableEmailAlerts.
Request Body
All fields are optional and can be updated over time.
If you want a human-friendly package label in the UI, set displayName in addition to the technical packageType key.
{
"displayName": "Pro Care",
"maxUrls": 100,
"dataRetentionMonths": 12,
"checkIntervalMinutes": 1,
"checkLocations": 3,
"notificationDelayMinutes": 0,
"reminderDelayMinutes": 10,
"alertConsecutiveChecks": 3,
"alertLocationThreshold": "majority",
"alertLocationThresholdCount": 2,
"alertReminderInterval": 60,
"enableEmailAlerts": true,
"enableSmsAlerts": true,
"enableWebhookAlerts": true,
"enableIntegrationAlerts": true,
"enablePostRequestEscalation": false,
"enableMaintenanceWindows": true,
"enablePdfReports": true,
"monthlyReportsDefault": true,
"allowSelfService": true,
"maxSelfServiceUrls": 10,
"notes": "Default for PRO customers"
}Monitor ownership defaults
allowSelfService (default false) and maxSelfServiceUrls (default 0) are the package-tier defaults for the managed vs. self-service model. Every customer on the package inherits them unless the customer carries its own non-null override (see Update Customer). maxSelfServiceUrls caps a customer's total self-service monitors across all monitor types. The enable* alert flags double as the inherited channel-type policy for the same model.
alertConsecutiveChecks
An integer between 1 and 10 (values outside that range are rejected with 400 and
data.code invalidRequestBody). It is the number of consecutive failing cycles required before
an incident opens, and it also bounds how many consecutive successful cycles are required before
one closes. A very large value therefore does not just delay alerting, it delays recovery: at a
5-minute cadence a value of 999 would keep an incident open for 83 hours of uninterrupted green
checks. The cap matches the one the dashboard has always enforced.
monthlyReportsDefault
monthlyReportsDefault (boolean, default true) is a template, not a live switch: it seeds a new customer's monthlyReportsEnabled at creation time. It never rewrites an existing customer, whose own value always wins once set. To push a changed default onto customers already on this package, call Apply Report Default afterwards.
Example (cURL)
BASE_URL="https://uptimeify.io"
TOKEN="<your-api-token>"
curl -X PATCH "$BASE_URL/api/package-configs/pro" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"displayName":"Pro Care",
"maxUrls":100,
"dataRetentionMonths":12,
"checkIntervalMinutes":1,
"checkLocations":3,
"notificationDelayMinutes":0,
"reminderDelayMinutes":10,
"alertConsecutiveChecks":3,
"alertLocationThreshold":"majority",
"alertLocationThresholdCount":2,
"alertReminderInterval":60,
"enableEmailAlerts":true,
"enableSmsAlerts":true,
"enableWebhookAlerts":true,
"enableIntegrationAlerts":true,
"enableMaintenanceWindows":true,
"enablePdfReports":true,
"monthlyReportsDefault":true,
"notes":"Default for PRO customers"
}'Response
Returns the created/updated package config.
{
"id": 10,
"packageType": "pro",
"displayName": "Pro Care",
"maxUrls": 100,
"dataRetentionMonths": 12,
"checkIntervalMinutes": 1,
"checkLocations": 3,
"notificationDelayMinutes": 0,
"reminderDelayMinutes": 10,
"alertConsecutiveChecks": 3,
"alertLocationThreshold": "majority",
"alertLocationThresholdCount": 2,
"alertReminderInterval": 60,
"enableEmailAlerts": true,
"enableSmsAlerts": true,
"enableWebhookAlerts": true,
"enableIntegrationAlerts": true,
"enableMaintenanceWindows": true,
"enablePdfReports": true,
"monthlyReportsDefault": true,
"notes": "Default for PRO customers",
"createdAt": "2026-02-26T12:00:00.000Z",
"updatedAt": "2026-02-26T12:00:00.000Z"
}Notes:
- The organization is derived automatically from your authenticated session or API token.
- The body-based variant
PATCH /api/package-configsis also supported whenpackageTypeis sent in the request body. - The legacy route
PATCH /api/organizations/:organizationPublicId/package-configs/:packageTyperemains supported for compatibility. - The plural org-less alias
PATCH /api/organizations/package-configs/:packageTypeis also supported. - Global admins need an active organization context in the authenticated session for the org-less route.
Common errors
400 Package type is requiredwhen:packageTypeis missing400 Organization ID is required in the authenticated sessionwhen no organization can be derived from the current session/token400withdata.codeinvalidRequestBodywhenalertConsecutiveChecksis outside 1-10401 Unauthorizedwhen you are not logged in403 Forbiddenwhen you cannot access the organization
Authorization note:
- Write access is required (organization admin or global admin).
Validate VAT ID
Validates the organization's stored VAT identification number against the EU VIES register and persists the verdict. Only a valid VAT ID from another EU member state qualifies the organization for reverse-charge invoicing under AGB § 10.2.
Apply Report Default
Writes a package's monthlyReportsDefault onto every existing customer currently on that package, once.