Skip to main content

Overview

Ocean’s SIEM/SOAR integration forwards email security events from your tenant to an external destination. Events are delivered as structured JSON over HTTPS, near real time, so you can power SIEM dashboards, alerting, and SOC investigation workflows alongside the rest of your telemetry. You configure destinations in the Ocean Portal. Each destination subscribes to one or more event scopes, runs on a per-destination schedule, and reports its delivery health back to the Portal.

What gets forwarded

When you set up a destination, you choose which events to forward. Pick only what your SOC needs:
EventWhat you get
Inbound Protection — malicious casesInbound emails Ocean classified as malicious.
Inbound Protection — spam casesInbound emails Ocean classified as spam.
AI Response — report phishingUser-reported phishing emails after Ocean’s AI Response has triaged them.
AI Response — quarantine releaseQuarantine release decisions — released, denied, or reviewed.
Audit LogsUser and admin actions in the Ocean Portal and API — logins, email access, searches, verdict changes, settings and integration changes, and more.

Delivery

  • Events are forwarded near real time in small batches.
  • A failed batch is retried automatically; Ocean only advances once the destination confirms receipt, so no events are dropped.
  • If your SIEM is unreachable for a while, Ocean catches up automatically once it’s back.
  • Each destination is independent — an issue with one does not affect the others.

Event payload reference

All timestamps are in UTC (ISO 8601). Optional fields are omitted when they don’t apply — they aren’t sent as null or empty strings, so your parsers can rely on the field’s presence as a signal.

inbound_protection

Emitted when Ocean finishes processing an inbound message.
{
  "event_type": "inbound_protection",
  "message": {
    "id": "AAMkAGI2...",
    "internet_message_id": "<CAJ8...@mail.gmail.com>"
  },
  "sender": {
    "address": "alice@example.com",
    "name": "Alice Example"
  },
  "recipient": {
    "address": "user@your-org.com",
    "name": "User Name",
    "user_id": "u-1234"
  },
  "subject": "URGENT: Wire transfer",
  "received_at": "2026-05-21T14:20:00.000000000Z",
  "processed_at": "2026-05-21T14:20:03.421000000Z",
  "verdict": "malicious",
  "is_remediated": true,
  "remediation_action": "quarantine",
  "attack_type": "Phishing for Credential Theft",
  "addressed_to": {
    "to": ["user@your-org.com", "user2@your-org.com"],
    "cc": ["cc@your-org.com"]
  },
  "has_attachments": true
}
FieldTypeRequiredDescription
event_typestringyesAlways inbound_protection.
message.idstringyesProvider message ID (Microsoft Graph or Gmail ID).
message.internet_message_idstringyesRFC 5322 Message-Id header value.
sender.addressstringyesEnvelope sender address.
sender.namestringoptionalDisplay name, if present in the message.
recipient.addressstringyesPrimary recipient address (the mailbox Ocean processed).
recipient.namestringoptionalDisplay name.
recipient.user_idstringoptionalInternal user ID for the recipient mailbox.
subjectstringyesEmail subject.
received_atstringyesWhen the message arrived in the mailbox.
processed_atstringyesWhen Ocean finished analysis.
verdictstringyesFinal Ocean verdict (e.g. malicious, spam).
is_remediatedboolyestrue when Ocean took a remediation action on the message.
remediation_actionstringoptionalThe action taken — one of trash, spam, quarantine. Omitted when no action was taken.
attack_typestringoptionalThreat category Ocean assigned — e.g. Phishing for Credential Theft, Business Email Compromise, Domain Impersonation. Omitted when not applicable.
addressed_to.tostring[]optionalAll To: recipients on the original message.
addressed_to.ccstring[]optionalAll Cc: recipients.
addressed_to.bccstring[]optionalAll Bcc: recipients visible to Ocean.
has_attachmentsboolyesWhether the email has one or more attachments.
Use is_remediated to drive dashboards and alerting — it is always present, while remediation_action is only sent when a concrete action was taken.

report_phishing

Emitted when Ocean’s AI Response processes a user-reported phishing email.
{
  "event_type": "report_phishing",
  "report": {
    "id": "rp-abc123",
    "received_at": "2026-05-21T14:21:00.000000000Z",
    "reporting_method": "AdaptiveDetector",
    "received_via_mailbox": "abuse@your-org.com"
  },
  "reporter": {
    "address": "user@your-org.com",
    "name": "Reporting User"
  },
  "original_email": {
    "message_id": "AAMkAGI2...",
    "internet_message_id": "<CAJ8...@mail.gmail.com>",
    "sender_address": "phisher@malicious.example",
    "sender_name": "IT Helpdesk",
    "subject": "Action required: password reset",
    "received_at": "2026-05-21T13:55:00.000000000Z",
    "to": ["user@your-org.com"],
    "cc": [],
    "bcc": []
  },
  "analysis": {
    "verdict": "malicious",
    "analysis_reasoning": "Sender domain spoof of internal IT; credential harvest link."
  },
  "action": {
    "sent": true,
    "sent_at": "2026-05-21T14:21:45.000000000Z",
    "sent_to": ["user@your-org.com"],
    "auto_triage_triggered": true
  }
}
FieldTypeRequiredDescription
event_typestringyesAlways report_phishing.
report.idstringyesOcean-internal report ID.
report.received_atstringyesWhen the report was received by Ocean.
report.reporting_methodstringoptionalHow the report was detected — one of MicrosoftNativeDetector, AdaptiveDetector, KnowBe4Detector, CofenseDetector.
report.received_via_mailboxstringoptionalMailbox the report arrived in, when applicable.
reporter.addressstringyesAddress of the user who reported.
reporter.namestringoptionalDisplay name.
original_email.message_idstringyesProvider message ID of the reported email.
original_email.internet_message_idstringoptionalRFC 5322 Message-Id header.
original_email.sender_addressstringyesSender of the reported email.
original_email.sender_namestringoptionalDisplay name.
original_email.subjectstringyesSubject of the reported email.
original_email.received_atstringyesWhen the original email was received.
original_email.to / .cc / .bccstring[]optionalRecipient lists from the reported email.
analysis.verdictstringyesOcean’s analysis verdict (malicious, safe, unknown, etc.).
analysis.analysis_reasoningstringoptionalShort reasoning for the verdict.
action.sentboolyesWhether Ocean sent an automated reply to the reporter.
action.sent_atstringoptionalWhen the reply was sent.
action.sent_tostring[]optionalRecipients of the reply.
action.auto_triage_triggeredboolyesWhether auto-triage logic ran for this report.

quarantine_release

Emitted when a quarantine release request is processed (released, denied, or reviewed).
{
  "event_type": "quarantine_release",
  "quarantine": {
    "id": "q-456",
    "source": "Microsoft",
    "created_at": "2026-05-21T13:00:00.000000000Z"
  },
  "email": {
    "message_id": "AAMkAGI2...",
    "sender_address": "marketing@example.com",
    "subject": "Newsletter",
    "received_at": "2026-05-21T12:50:00.000000000Z",
    "recipients": ["user@your-org.com"]
  },
  "analysis": {
    "verdict": "safe",
    "analysis_reasoning": "Legitimate marketing sender; bulk newsletter.",
    "completed_at": "2026-05-21T13:00:30.000000000Z"
  },
  "action": {
    "released": true,
    "released_at": "2026-05-21T13:05:00.000000000Z",
    "released_to": ["user@your-org.com"],
    "reply_sent": true,
    "quarantined_users": ["user@your-org.com"]
  },
  "review_details": {
    "reviewer_type": "admin",
    "decision": "release",
    "reviewer_verdict": "safe",
    "reviewer_id": "admin-1",
    "reviewer_name": "Security Admin",
    "completed_at": "2026-05-21T13:04:50.000000000Z"
  }
}
FieldTypeRequiredDescription
event_typestringyesAlways quarantine_release.
quarantine.idstringyesOcean’s quarantine record ID.
quarantine.sourcestringyesWhere the quarantine originated (e.g. Microsoft).
quarantine.created_atstringyesWhen the quarantine record was created.
email.message_idstringyesProvider message ID of the quarantined email.
email.sender_addressstringyesSender of the quarantined email.
email.subjectstringyesSubject.
email.received_atstringyesWhen the email was originally received.
email.recipientsstring[]optionalRecipients of the quarantined email.
analysis.verdictstringyesOcean’s analysis verdict.
analysis.analysis_reasoningstringoptionalReasoning for the verdict.
analysis.completed_atstringoptionalWhen analysis finished.
action.releasedboolyesWhether the email was released from quarantine.
action.released_atstringoptionalWhen release happened. Only present if released is true.
action.released_tostring[]optionalRecipients the email was released to. Only present if released is true.
action.reply_sentboolyesWhether a reply was sent to the requesting user.
action.quarantined_usersstring[]yesUsers whose quarantine the email was in.
review_detailsobjectoptionalPresent when a human reviewer acted on the request.
review_details.reviewer_typestringoptionalType of reviewer (e.g. admin, analyst).
review_details.decisionstringoptionalReviewer’s decision.
review_details.reviewer_verdictstringoptionalReviewer’s verdict.
review_details.reviewer_idstringoptionalReviewer ID.
review_details.reviewer_namestringoptionalReviewer display name.
review_details.completed_atstringoptionalWhen the review finished.
errorstringoptionalError message if the release request failed.

audit_log

Emitted when a user or admin performs an audited action in the Ocean Portal or API — for compliance, access review, and security monitoring.
{
  "event_type": "audit_log",
  "event_id": "8abf8590-3021-4b68-986b-36ded685785d",
  "created_at": "2026-06-02T14:48:11.233015Z",
  "user_email": "analyst@your-org.com",
  "user_roles": ["Admin"],
  "action_category": "verdict",
  "action_type": "change_verdict",
  "resource_type": "email",
  "resource_id": "<CAJ8...@mail.gmail.com>",
  "resource_before": {
    "internetMessageId": "<CAJ8...@mail.gmail.com>",
    "oldVerdict": "spam"
  },
  "resource_after": {
    "internetMessageId": "<CAJ8...@mail.gmail.com>",
    "newVerdict": "safe"
  },
  "source": "Decision Center",
  "ip_address": "203.0.113.7"
}
FieldTypeRequiredDescription
event_typestringyesAlways audit_log.
event_idstringyesUnique ID for this audit entry.
created_atstringyesWhen the action occurred.
user_emailstringyesEmail of the user who performed the action.
user_rolesstring[]yesThe user’s roles at the time of the action — one or more of Admin, Analyst, AnalystReadOnly. Always present — an empty array when the user has no roles.
action_categorystringyesHigh-level category of the action — one of authentication, email_access, search, verdict, settings, security.
action_typestringyesThe specific action — e.g. login, logout, view_email_content, view_email_attachment, download_email, search_query, change_verdict, bulk_verdict_change, change_settings, api_key_created, api_key_revoked, unauthorized_access_attempt.
resource_typestringoptionalType of resource the action affected — one of email, user, remediation, graymail, ai_phishing, ai_response, quarantine, api_key, integration, allow_deny_list. Omitted when not applicable.
resource_idstringoptionalID of the affected resource. Omitted when not applicable.
resource_beforeobjectoptionalStructured snapshot of the resource before the change. Omitted when not applicable.
resource_afterobjectoptionalStructured snapshot of the resource after the change. Omitted when not applicable.
detailsobjectoptionalAdditional structured context about the action. Omitted when empty.
sourcestringyesThe Portal area the action originated from — one of Authentication, Settings, Threats, Decision Center, Integrations, Phishing Reports, Quarantine Release Requests, API.
ip_addressstringyesClient IP address the action came from.
resource_before, resource_after, and details are nested JSON objects (not escaped strings), and their keys are emitted as-is by the originating service — often camelCase, unlike the snake_case top-level fields. Their shape varies by action_type, so treat them as free-form context rather than a fixed schema. For example:
  • change_verdictresource_before: { "internetMessageId": "<…>", "oldVerdict": "spam" }, resource_after: { "internetMessageId": "<…>", "newVerdict": "safe" }
  • logindetails: { "method": "otp" }
  • search_querydetails: { "search_query": { "PageSize": 20, "Start": "2026-05-21T21:00:00Z" } }

Set up a destination

To start forwarding, configure a destination in the Ocean Portal:
1

Open the Integrations page

In the Ocean Portal, navigate to Integrations and find the SIEM section.
2

Pick a vendor

Click Connect on the relevant vendor card to open the configuration drawer.
3

Configure the destination

4

Save

Save the destination to start forwarding. The first events arrive within a few minutes.

Monitoring & troubleshooting

Each destination shows a health indicator on the SIEM page:
IndicatorMeaning
All recent runs healthyMost recent exports succeeded.
Latest run failedThe last export attempt failed — see the error category for guidance.
Awaiting first runThe destination was just created; the first export has not run yet.
Status unavailableOcean does not have recent run data for this destination.
When a run fails, Ocean classifies the failure and surfaces a category:
CategoryWhat it meansWhat to do
Authentication failedThe credentials are invalid or expired.Re-issue the HEC token (Splunk) or the source URL (Sumo Logic) and update the destination.
Permission deniedThe destination rejected the request because the credentials lack required permissions.Check the HEC token scopes / source permissions.
Endpoint unreachableOcean could not reach the destination URL.Confirm the URL is correct and reachable from the public internet.
Rate limitedThe destination is throttling requests.No action required — Ocean retries automatically.
Invalid requestThe destination rejected the event format.Contact Ocean support.

Allowlisting Ocean’s egress IPs

All production outbound traffic to your destination comes from a small set of stable, reserved IP addresses. If your SIEM receiver sits behind a firewall, IP allowlist, or network ACL, add these addresses so Ocean can reach it:
Egress IP
34.173.28.0
34.10.169.199
34.30.170.32
34.27.172.202
These IPs are stable and reserved — they won’t change without advance notice. Allow inbound HTTPS (port 443) from all of them, since any export may originate from any address in the set.
If a destination shows Endpoint unreachable, confirm these egress IPs are allowed on your receiver’s firewall in addition to checking the URL.

Security

  • Secrets (HEC tokens, Sumo source URLs) are stored encrypted and are never displayed once saved.
  • All traffic to your destination uses TLS.