Sending Alerts¶
Raises a security or availability alert as an Alert ticket on a named system. Use it from a SIEM, a cloud security service, a monitoring platform, or any detection pipeline that should put a finding in front of a responder.
Alerts land unassigned and are picked up by the platform's own routing. Escalating an alert to an Incident is a separate, deliberate step taken in the platform; this endpoint never changes a ticket's type.
Before you start: you need a credential for the endpoint's authentication method, a bearer token by default. See Authentication.
Minimal call¶
Only the system and a summary are required.
Fields¶
| Field | Required | Default | Notes |
|---|---|---|---|
site_id / system_name |
one of | - | See Identifying the system |
summary |
on create | existing title | The alert title. Becomes the ticket summary. Omit it on a re-post and the current title is kept |
details |
no | summary |
Body text. HTML accepted |
note |
no | - | Appends a note to the ticket as an analyst action. Additive - every call carrying a note adds one; see Adding a note. HTML accepted |
category |
no | Alerts and Incidents |
Must come from the list below - validated, not trusted |
external_id |
no | generated | Your identifier for the alert. This is the dedup key |
priority |
no | 3 |
1 Critical, 2 High, 3 Medium, 4 Low |
status_id |
no | 1 (New) |
Any valid status id |
detection_source |
no | - | What detected it, e.g. AWS GuardDuty |
internal_indicators |
no | - | Internal indicators of compromise |
external_indicators |
no | - | External indicators of compromise |
mitre_tactics |
no | - | Comma-separated, from the list below |
mitre_techniques |
no | - | Free text, e.g. T1078, T1110 |
mitre_subtechniques |
no | - | Free text, e.g. T1078.004 |
related_cves |
no | - | Free text, e.g. CVE-2026-1234 |
root_cause |
no | - | Usually filled later, during after-action review |
lessons_learned |
no | - | Usually filled later |
corrective_actions |
no | - | Usually filled later |
Compliance attribution (the FedRAMP and CMMC control and requirement fields) is derived automatically from the category. Do not send it.
Send an external_id¶
external_id is your own identifier for the alert, and it is what makes repeat calls safe.
- Send one, and re-posting updates the existing ticket. Retries do not duplicate, and you can enrich an alert with a second call.
- Omit it and every call raises a new ticket. A monitoring system that retries on timeout will flood the queue.
The dedup key is the system plus your external_id, so the same identifier on two different systems correctly produces two tickets.
Enriching an alert later¶
Post a thin alert the moment you detect something, then fill in what you learn:
{
"site_id": 18,
"external_id": "guardduty-a41f9c02",
"root_cause": "Long-lived access key committed to a public repository.",
"corrective_actions": "Key revoked, repository history purged, detection rule added."
}
summary is omitted here, so the alert keeps the title it was raised with. summary is required only when the alert is first created. Every field you omit on an enrichment post keeps its current value, including the ones you set on the first call, so the post will not reset the alert's summary, priority, status, category or details.
Adding a note¶
Send a note and the platform appends it to the ticket as an analyst action, the same kind of note a responder adds by hand. Use it to attach triage context to an alert as it lands, or to record what a later enrichment call found.
Notes are additive: every call that carries a note adds one, with no de-duplication. This lets an alert accumulate a running log, but it also means a note belongs on a call you make once, not on a payload your retry logic re-sends. If your caller retries on timeout with the note still in the body, the same note lands twice.
{
"site_id": 18,
"external_id": "guardduty-a41f9c02",
"note": "Confirmed with the account owner: the sign-in was an authorised break-glass action. Downgrading."
}
The platform renders note as HTML, so it reads a < in plain text as markup. Send HTML deliberately, or escape angle brackets in text you did not intend as markup.
Allowed values¶
category¶
Anything outside this list is rejected. Use > as the separator with no spaces around it, and send the path, never a numeric id.
Alerts and Incidents
Alerts and Incidents>Availability
Alerts and Incidents>Availability>Automation Error
Alerts and Incidents>Availability>Backup Failure
Alerts and Incidents>Availability>KSI
Alerts and Incidents>Availability>Resource Exhaustion
Alerts and Incidents>Availability>Security Functionality
Alerts and Incidents>Availability>System Error
Alerts and Incidents>Availability>System Outage
Alerts and Incidents>Performance
Alerts and Incidents>Performance>Disk Full
Alerts and Incidents>Performance>High Resource Usage
Alerts and Incidents>Performance>Network Latency
Alerts and Incidents>Security
Alerts and Incidents>Security>Audit Log Failure
Alerts and Incidents>Security>Data Exfiltration
Alerts and Incidents>Security>Denial of Service
Alerts and Incidents>Security>Integrity Violation
Alerts and Incidents>Security>Malware
Alerts and Incidents>Security>Phishing
Alerts and Incidents>Security>Policy Violation
Alerts and Incidents>Security>Suspicious Activity
Alerts and Incidents>Security>Unauthorized Access
Alerts and Incidents>Security>Unauthorized Change
Alerts and Incidents>Security>Unauthorized Software
The category drives compliance attribution, so choosing the most specific path that fits gets you better control mapping than defaulting to the top level.
The endpoint validates against your tenant's live category tree, not against this printed list. If your tenant's categories have been customised, the tree is authoritative and this list is a guide.
mitre_tactics¶
Comma-separated. Use values from this list:
Reconnaissance | Resource Development | Initial Access | Execution | Persistence |
Privilege Escalation | Defense Evasion | Credential Access | Discovery |
Lateral Movement | Collection | Command & Control | Exfiltration | Impact
Example: "mitre_tactics": "Initial Access, Persistence"
Send the tactic names exactly as listed. A value that is not one of the fourteen is ignored, and any valid ones in the same call still record, so one unrecognised name will not drop the rest.
priority¶
1 Critical, 2 High, 3 Medium, 4 Low. These are the Incident SLA's tiers, so response and resolution targets follow from your choice. A value outside 1-4 falls back to the ticket's current priority, or to 3 on a new alert.
Rejections¶
| Code | Rejected because |
|---|---|
| 51101 | summary missing on a new alert (a re-post inherits the existing title) |
| 51102 | Neither site_id nor system_name sent |
| 51103 | No system matched |
| 51104 | category is not in the allowed list |
| 51105 | The create step returned no usable ticket id |
| 51106 | A note was supplied but no ticket id was available |
Full example¶
{
"site_id": 18,
"summary": "Root login from unrecognised ASN",
"details": "Console sign-in for the management account from 203.0.113.44 (AS64512), no prior history.",
"category": "Alerts and Incidents>Security>Unauthorized Access",
"external_id": "guardduty-a41f9c02",
"priority": 2,
"detection_source": "AWS GuardDuty",
"external_indicators": "203.0.113.44",
"mitre_tactics": "Initial Access, Privilege Escalation",
"mitre_techniques": "T1078.004"
}
Related¶
- Datadog: routing Datadog monitor and security alerts into the Alert ticket type
- AWS GuardDuty & CloudWatch: a deployable Lambda stack that posts to this endpoint from your own AWS account
- Authentication