A complete Endpoint Protection Platform you can put your own name on — multi-tenant console, cross-platform agent, REST API, and SDKs in five languages. Run it on our cloud, in your own cloud account, or entirely inside an air-gapped network. Nothing your customers see carries our name.
An MSP needs margin and multi-tenancy. A business needs its telemetry inside the tools it already runs. A government agency needs the whole thing inside its own boundary. The platform is shaped so none of those three has to compromise for the other two.
Sell endpoint protection under your own name instead of reselling someone else's logo.
Run protection as internal infrastructure, with the telemetry wired into the tools you already own.
Deploy inside your own boundary, including networks that never touch the public internet.
Five layers. The agent collects and enforces locally, the edge authenticates and normalises, the core detects and decides, and everything above it is a surface you control — your console, your application, your SIEM.
Every step below is available both in the console and through the API, so you can click through it once to learn it and then automate the whole sequence for every customer after that.
One API call creates an isolated customer tenant with its own encryption key, seat limit, data-retention window, and rate budget. Nothing is shared with your other tenants except the code that serves them.
Push a logo, a palette, and a domain. The console, the login page, every notification email, and every generated report pick it up immediately — and your code-signing certificate goes into the installer pipeline.
Download a branded MSI, PKG, DEB, or RPM and ship it through GPO, Intune, Jamf, or the RMM you already run. A scoped enrollment token binds each install to the right tenant and site automatically.
The agent batches process, file, network, and inventory events and ships them over mutually authenticated TLS on a regular check-in. If the link drops, events queue on disk and replay in order when it returns.
The pipeline scores every event against signatures, behavioural rules, and a correlation model, then produces a verdict. The policy assigned to that endpoint decides whether the verdict acts on its own or waits for a human.
Isolate the host, kill the process tree, quarantine the file — then fire a webhook into your PSA so the work becomes a ticket, and roll the month up into a branded report for the customer.
Tenancy is enforced at the data layer, not in the interface. Every query carries a tenant scope derived from the credential that made the request, and every tenant's data is sealed with its own encryption key — so a bug in a filter cannot become a cross-customer leak.
X-EPP-Tenant header before it can read anything at
all. Sites are a grouping and reporting construct inside a tenant — useful for per-location
policy and per-location invoicing, but not a security boundary on their own.
Every event walks the same five stages before anything acts on it. Each stage is inspectable from the API, so when you need to explain a verdict to a customer — or to an auditor — you can show the evidence rather than pointing at a black box.
White-label is not a logo swap on a login page. If your customer can read it, click it, install it, or receive it in their inbox, it belongs to your brand — right down to the name of the service running in Task Manager.
| Surface | What you control | Available on |
|---|---|---|
| Console domain | protect.yourbrand.com — your certificate, your DNS | All tiers |
| API domain | api.yourbrand.com fronting every REST and webhook route | All tiers |
| Logo & colour | Console, login, reports, and emails use your mark and palette | All tiers |
| Agent binary name | yourbrand-agent.exe, signed with your code-signing certificate | All tiers |
| Service name | The Windows service, launchd job, and systemd unit carry your name | All tiers |
| Installers | Branded MSI, PKG, DEB, and RPM generated per tenant on demand | All tiers |
| Notification email | Sent from your domain via your SMTP or SES credentials | All tiers |
| PDF reporting | Executive and compliance reports with your cover page and footer | All tiers |
| Documentation | End-user and admin docs rebuilt under your name and domain | Dedicated + |
| Mobile app | iOS and Android console published under your developer account | Dedicated + |
The agent, the API, and the SDKs are identical across all four models. What changes is who owns the infrastructure underneath — and that is a commercial and compliance decision, not a technical one you have to make on day one. Moving between models later is a supported migration.
| Model | Where data lives | Isolation | Operated by | Stand-up | Best fit |
|---|---|---|---|---|---|
| Shared Cloud Multi-tenant | Our cloud, US regions | Logical — per-tenant encryption keys and row-level scoping | We run it | Same day | MSPs launching a protection line without infrastructure cost |
| Dedicated Cloud Single-tenant | Isolated VPC, region of your choice | Dedicated database and compute per partner | We run it | 3–5 days | Larger MSPs and regulated businesses needing hard isolation |
| Bring Your Own Cloud You host | Your AWS, Azure, or GCP account | Your infrastructure, your network boundary | You run it, we support it | 1–2 weeks | Enterprises with strict data residency requirements |
| On-Premises Air-gap capable | Your datacenter, offline if required | Physically separated, no outbound dependency | You run it, we support it | 2–4 weeks | Government, defense, OT, and classified networks |
Five first-party SDKs wrap the same REST API, with typed models, automatic retry with exponential backoff, cursor pagination handled for you, and streaming helpers for detections. Anything the SDKs do not cover is a plain HTTPS call away.
import { EppClient } from '@yourbrand/epp-sdk';
const epp = new EppClient({
baseUrl: 'https://api.yourbrand.com/v1',
apiKey: process.env.EPP_API_KEY, // sk_live_...
});
// 1. Provision a customer tenant, already branded.
const tenant = await epp.tenants.create({
name: 'Acme Corp',
plan: 'business',
seatLimit: 250,
branding: { logoUrl: 'https://cdn.yourbrand.com/acme.svg',
primaryColor: '#ffd200' },
});
// 2. Mint an enrollment token and hand back a signed installer.
const enroll = await epp.enrollment.createToken({
tenantId: tenant.id,
siteId: 'hq-roswell',
expiresIn: '7d',
});
console.log(enroll.installerUrl.windows); // branded MSI
// 3. React to detections as they land.
for await (const d of epp.detections.stream({ severity: ['high', 'critical'] })) {
if (d.verdict === 'malicious') {
await epp.response.isolate(d.endpointId, { reason: `auto:${d.ruleId}` });
await epp.tickets.create({ psa: 'halo', subject: d.title, body: d.summary });
}
}
import os
from yourbrand_epp import EppClient
epp = EppClient(
base_url="https://api.yourbrand.com/v1",
api_key=os.environ["EPP_API_KEY"],
)
# Nightly posture sweep across every tenant you manage.
for tenant in epp.tenants.list():
posture = epp.reports.posture(tenant_id=tenant.id)
if posture.score < 70:
epp.reports.export(
tenant_id=tenant.id,
format="pdf",
template="executive_summary",
)
# Auto-isolate anything confirmed malicious in the last day.
for det in epp.detections.list(tenant_id=tenant.id,
severity=["critical"],
since="24h"):
if det.verdict == "malicious":
epp.response.isolate(det.endpoint_id,
reason=f"auto:{det.rule_id}")
package main
import (
"context"
"log"
"os"
"time"
epp "github.com/yourbrand/epp-go"
)
func main() {
ctx := context.Background()
client, err := epp.New(epp.Config{
BaseURL: "https://api.yourbrand.com/v1",
APIKey: os.Getenv("EPP_API_KEY"),
})
if err != nil {
log.Fatal(err)
}
dets, err := client.Detections.List(ctx, &epp.DetectionQuery{
Severity: []string{"critical"},
Since: 24 * time.Hour,
})
if err != nil {
log.Fatal(err)
}
for _, d := range dets.Items {
if d.Verdict != "malicious" {
continue
}
if _, err := client.Response.Isolate(ctx, d.EndpointID,
&epp.IsolateOpts{Reason: "auto:" + d.RuleID}); err != nil {
log.Printf("isolate %s: %v", d.EndpointID, err)
}
}
}
Import-Module YourBrand.EPP
Connect-EppPartner -ApiKey $env:EPP_API_KEY `
-BaseUrl 'https://api.yourbrand.com/v1'
# Onboard a new customer and stage their rollout.
$tenant = New-EppTenant -Name 'Acme Corp' -Plan business -SeatLimit 250
$token = New-EppEnrollmentToken -TenantId $tenant.Id `
-SiteId 'hq-roswell' -ExpiresIn 7d
Save-EppInstaller -Token $token.Value -Os windows `
-Path 'C:\Deploy\acme-agent.msi'
# Sweep and isolate anything confirmed malicious today.
Get-EppDetection -TenantId $tenant.Id -Severity Critical -Since 24h |
Where-Object { $_.Verdict -eq 'malicious' } |
ForEach-Object {
Invoke-EppIsolate -EndpointId $_.EndpointId -Reason "auto:$($_.RuleId)"
}
# Create a tenant
curl -sS -X POST https://api.yourbrand.com/v1/tenants \
-H "Authorization: Bearer $EPP_API_KEY" \
-H "Idempotency-Key: 9f1c2e4a-7b33-4d18-9a52-6c0d7e8b1f44" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Corp",
"plan": "business",
"seat_limit": 250
}'
# Query critical detections for that tenant
curl -sS "https://api.yourbrand.com/v1/detections?severity=critical&since=24h" \
-H "Authorization: Bearer $EPP_API_KEY" \
-H "X-EPP-Tenant: ten_8fQ2xKpL"
# Isolate an endpoint
curl -sS -X POST https://api.yourbrand.com/v1/endpoints/ep_3kD9mZ/isolate \
-H "Authorization: Bearer $EPP_API_KEY" \
-H "X-EPP-Tenant: ten_8fQ2xKpL" \
-H "Content-Type: application/json" \
-d '{"reason": "confirmed ransomware canary trip"}'
Retry-After header on a 429, refreshes cursors
through long result sets, and verifies webhook signatures for you. The streaming helpers hold a
websocket open and reconnect on their own, so a long-running automation does not need a babysitter.
There is no private API. The console your operators use is built on exactly the routes below, which means anything a person can do in the interface, your automation can do too — provisioning, policy, response, reporting, and billing data included.
GET /v1/endpoints HTTP/1.1 Host: api.yourbrand.com Authorization: Bearer sk_live_9f1c2e4a7b334d18 X-EPP-Tenant: ten_8fQ2xKpL Accept: application/json
Partner keys can address any tenant but must name one in X-EPP-Tenant.
Tenant keys are permanently bound to a single tenant and ignore that header entirely.
Agents never use these keys — they authenticate with a per-host client certificate issued at enrollment.
{
"id": "det_7Kq2mXf9",
"tenant_id": "ten_8fQ2xKpL",
"endpoint_id": "ep_3kD9mZ",
"severity": "critical",
"verdict": "malicious",
"score": 94,
"rule_id": "beh.ransom.canary_write",
"title": "Rapid encryption pattern on user share",
"observed_at": "2026-09-20T14:02:11Z",
"process": {
"pid": 8812,
"image": "C:\\Users\\jdoe\\AppData\\x.exe",
"sha256": "4a7d1ed414474e4033ac29ccb8653d9b",
"parent": "explorer.exe"
},
"actions_taken": ["isolate", "quarantine"],
"evidence_url": "/v1/detections/det_7Kq2mXf9/evidence"
}
| Convention | How it behaves |
|---|---|
| Versioning | Major version pinned in the path. Additive changes ship in place; breaking changes get a new major, and the previous one is supported for at least twelve months after its successor is announced. |
| Pagination | Cursor-based. Pass ?limit=&cursor= and follow next_cursor until it comes back null. Offsets are not supported, because they drift on live data. |
| Idempotency | Send an Idempotency-Key on any POST. Replays inside 24 hours return the original response instead of creating a duplicate. |
| Rate limits | Per tenant, returned on every response in X-RateLimit-Remaining. A 429 always carries Retry-After; the SDKs honour it without being asked. |
| Errors | Consistent JSON envelope with a stable machine-readable code, a human message, and a request_id to quote in support tickets. |
| Time | Every timestamp is RFC 3339 in UTC. Relative windows like since=24h are accepted on read endpoints as a convenience. |
| Audit | Every mutating call is written to the tenant audit log with the calling key, source IP, and resulting object version — including calls made by your own automation. |
Register an endpoint, pick your events, and the platform delivers signed JSON as things happen — into your PSA, your SIEM, a Slack or Teams channel, or a function you wrote yourself.
detection.created
A new detection crossed the alerting threshold
detection.escalated
Severity was raised by correlation or analyst review
endpoint.enrolled
A new endpoint completed enrollment and first check-in
endpoint.offline
An endpoint missed its expected check-in window
endpoint.isolated
Isolation was applied, automatically or by an operator
policy.violated
An endpoint fell out of compliance with its assigned policy
agent.tamper
Agent service stop, file modification, or uninstall attempt
scan.completed
A scheduled or on-demand scan finished, with findings attached
tenant.limit_reached
A tenant hit its seat, retention, or rate limit
// Header: X-EPP-Signature: t=1758377731,v1=5d41402a...
import crypto from 'node:crypto';
function verify(rawBody, header, secret) {
const parts = Object.fromEntries(
header.split(',').map(kv => kv.split('='))
);
// Reject anything older than five minutes.
const age = Math.floor(Date.now() / 1000) - Number(parts.t);
if (age > 300) return false;
const expected = crypto
.createHmac('sha256', secret)
.update(`${parts.t}.${rawBody}`)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(parts.v1)
);
}
| Signing | HMAC-SHA256 over timestamp.body, using the secret handed to you once at registration. |
| Replay guard | Timestamp is inside the signed payload. Reject anything older than your tolerance — five minutes is the usual choice. |
| Retries | Exponential backoff over 24 hours on any non-2xx. Deliveries are at-least-once, so make your handler idempotent on event.id. |
| Ordering | Not guaranteed across event types. Each payload carries a monotonic sequence per endpoint if you need to reorder. |
| Failure | An endpoint failing for 24 hours straight is auto-disabled and an alert lands in your console. Replay is available from the API for 30 days. |
| Egress | Deliveries originate from a published static IP range, so you can allowlist them at your own perimeter. |
Selling protection means answering hard questions about your own platform. These are the controls we can evidence, and the frameworks the architecture is designed to map onto.
TLS 1.3 in transit, AES-256 at rest, with a distinct data-encryption key per tenant held in a managed KMS.
Every host gets its own client certificate at enrollment. Certificates are short-lived, rotate automatically, and can be revoked individually.
Service stop, binary modification, and uninstall attempts are detected, reported, and optionally blocked outright by policy.
Remote commands are signed server-side and verified by the agent before execution, so a compromised channel cannot inject work.
Role-based access down to the individual action, with separate roles for read-only analysts, responders, and tenant administrators.
SAML 2.0 and OIDC against your identity provider, with enforced MFA and SCIM user provisioning available.
Append-only log of every console and API action, exportable in full and retained independently of the operational data.
Region pinning on dedicated cloud, and complete residency control on bring-your-own-cloud and on-premises deployments.
| Framework | How the platform supports it |
|---|---|
| NIST SP 800-171 | Control mapping provided for the endpoint-protection, audit, and incident-response families, so the platform slots into an existing System Security Plan rather than forcing a rewrite. |
| CMMC | On-premises and air-gapped deployment keeps controlled unclassified information inside your own assessed boundary — the platform never becomes an external service provider in your scope. |
| CJIS | Per-site tenancy lets criminal-justice systems sit in their own scoped compartment, with the audit trail and access controls that review expects. |
| HIPAA | A Business Associate Agreement is available on dedicated cloud and above; self-hosted deployments keep protected health information entirely under your covered entity. |
| SOC 2 / ISO 27001 | Audit export, access reviews, and change history are designed to produce the evidence these audits ask for without a manual collection exercise. |
The sandbox is available on day one, so your developers can start building against the API while the branding and infrastructure work happens in parallel.
Partner account created, sandbox tenant issued, API keys and SDK access delivered.
DNS and certificates for your console and API domains, logo and palette applied, code-signing certificate loaded into the installer pipeline.
Agent rolled out to a pilot group, policies tuned against your real estate, false positives triaged together.
SSO wired to your IdP, webhooks pointed at your PSA and SIEM, billing and reporting automation connected via the SDK.
Full rollout, runbook handover, and your team trained on the console and the response workflow.
You are billed on active endpoints, counted daily and trued up monthly. What you charge your own customers is entirely your business, and the platform never shows them a price.
| Tier | Estate size | Wholesale | Included |
|---|---|---|---|
| Launch | 1 – 250 endpoints | $2.90 per endpoint / month | Shared cloud, full white-label, standard support |
| Growth | 251 – 2,500 endpoints | $2.20 per endpoint / month | Shared or dedicated cloud, priority support |
| Scale | 2,501 – 10,000 endpoints | $1.60 per endpoint / month | Dedicated cloud, named engineer, custom SLA |
| Gov / Ent. | 10,000+ endpoints | Custom contract pricing | BYO-cloud or on-premises, compliance support |
Tell us your estate size, your compliance constraints, and which deployment model you have in mind. We will come back with an architecture, a wholesale number, and sandbox credentials so your team can start building against the API immediately.
Same-day diagnostics, transparent pricing, and a 90-day warranty on every repair. Submit your request now or call us directly.
Tell us about the issue — we'll respond within one business hour.
A technician will reach out within one business hour.