API Reference
Public-safe REST endpoints for integrating Remllo WatchTower into your application. Use the API to ingest transactions, manage organization settings, review alerts and cases, run CSV imports, configure notification routing, and export reports.
WatchTower uses secure session authentication for console workflows and organization API keys for server-side ingestion.
Most external integrations start with POST /api/v1/transactions.
CSV import, alert review, case notes, attachments, exports, and notification delivery routes are documented here.
Examples use placeholder credentials and sample data only. Keep live API keys server-side, never paste secrets into client code, and request partner-specific contracts through the Remllo team when a private adapter is required.
Remllo WatchTower API
Customer-facing reference for the Remllo WatchTower API. Use this API to authenticate users, ingest transactions, retrieve risk decisions, manage alerts and cases, configure notification routing, run CSV import workflows, and export investigation data. Public examples use placeholders only; do not send secrets in URLs, tickets, or client-side code.
Authentication
Session login, onboarding, invitations, MFA, and password lifecycle.
/api/v1/auth/registerCreate an organization and initial admin
Creates a new organization, provisions the first admin account, and returns a one-time ingestion API key for connecting external transaction sources.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/auth/register" \2 -H "Content-Type: application/json" \3 \4 -d '{5 "organizationName": "...",6 "firstName": "...",7 "lastName": "...",8 "email": "ops@example.com",9 "password": "..."10}'{
"message": {
"type": "string"
},
"apiKey": {
"type": "string",
"description": "Only returned once. Store securely."
},
"organization": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
}
}
},
"user": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"email": {
"type": "string",
"format": "email"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
}
}
}/api/v1/auth/loginCreate an authenticated session
Requires an authenticated WatchTower console session. Session is issued as an HttpOnly cookie after login. If MFA is enabled, this endpoint returns a challenge token instead of a completed session.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/auth/login" \2 -H "Content-Type: application/json" \3 \4 -d '{5 "email": "ops@example.com",6 "password": "..."7}'{
"message": {
"type": "string"
},
"requiresMfa": {
"type": "boolean"
},
"challengeToken": {
"type": "string"
},
"user": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"email": {
"type": "string",
"format": "email"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
}
},
"organization": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"role": {
"type": "string"
}
}
}
}/api/v1/auth/mfa/verify-loginComplete an MFA challenge
Verifies a TOTP code or backup code after password authentication and completes the session login.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/auth/mfa/verify-login" \2 -H "Content-Type: application/json" \3 \4 -d '{5 "challengeToken": "...",6 "code": "..."7}'{
"message": {
"type": "string"
},
"user": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"email": {
"type": "string",
"format": "email"
}
}
},
"organization": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"role": {
"type": "string"
}
}
}
}/api/v1/auth/invitations/{token}Resolve an invitation token
Returns invitation details so the invited user can review the organization and complete password setup.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/auth/invitations/{token}" \2 -H "Content-Type: application/json"{
"email": {
"type": "string",
"format": "email"
},
"firstName": {
"type": "string",
"nullable": true
},
"lastName": {
"type": "string",
"nullable": true
},
"role": {
"type": "string"
},
"invitationPending": {
"type": "boolean"
},
"organization": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
}
}
}
}/api/v1/auth/invitations/acceptAccept an organization invitation
Sets the invited user password, clears the invitation token, signs the user in, and joins the target organization.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/auth/invitations/accept" \2 -H "Content-Type: application/json" \3 \4 -d '{5 "token": "...",6 "password": "...",7 "firstName": "...",8 "lastName": "..."9}'{
"message": {
"type": "string"
},
"user": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"email": {
"type": "string",
"format": "email"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
}
},
"organization": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"role": {
"type": "string"
}
}
}
}/api/v1/auth/password-reset/requestRequest a password reset link
Creates a one-time password reset token and returns a reset link for manual delivery or future email delivery.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/auth/password-reset/request" \2 -H "Content-Type: application/json" \3 \4 -d '{5 "email": "ops@example.com"6}'{
"success": {
"type": "boolean"
},
"resetUrl": {
"type": "string",
"format": "uri",
"nullable": true
}
}/api/v1/auth/password-reset/{token}Validate a password reset token
Checks whether a reset token is still valid and returns the associated email address.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/auth/password-reset/{token}" \2 -H "Content-Type: application/json"{
"email": {
"type": "string",
"format": "email"
}
}/api/v1/auth/password-reset/completeComplete a password reset
Sets a new password using a valid reset token.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/auth/password-reset/complete" \2 -H "Content-Type: application/json" \3 \4 -d '{5 "token": "...",6 "password": "..."7}'{
"message": {
"type": "string"
}
}/api/v1/auth/change-passwordChange the current user password
Requires an authenticated WatchTower console session. Session is issued as an HttpOnly cookie after login.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/auth/change-password" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "currentPassword": "...",7 "newPassword": "..."8}'{
"message": {
"type": "string"
}
}/api/v1/auth/meGet the current authenticated session
Returns the signed-in user and active organization membership.
1curl -X GET "https://api.remllo.com/api/v1/auth/me" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"user": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"email": {
"type": "string",
"format": "email"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"mfaEnabled": {
"type": "boolean"
}
}
},
"organization": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"role": {
"type": "string"
},
"slaConfig": {
"type": "object",
"required": [
"critical",
"high",
"medium",
"low"
],
"properties": {
"critical": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
},
"high": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
},
"medium": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
},
"low": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
}
}
}
}
}
}/api/v1/auth/mfa/setupStart MFA enrollment
Generates a TOTP secret, otpauth URL, and backup codes for the current user. Final activation requires `POST /mfa/verify-setup`.
1curl -X POST "https://api.remllo.com/api/v1/auth/mfa/setup" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"secret": {
"type": "string"
},
"otpauthUrl": {
"type": "string"
},
"backupCodes": {
"type": "array",
"items": {
"type": "string"
}
}
}/api/v1/auth/mfa/verify-setupComplete MFA enrollment
Validates the initial TOTP code and enables MFA on the account.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/auth/mfa/verify-setup" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "code": "..."7}'{
"message": {
"type": "string"
},
"mfaEnabled": {
"type": "boolean"
}
}/api/v1/auth/mfa/disableDisable MFA
Disables MFA using the current password and a valid TOTP or backup code.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/auth/mfa/disable" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "password": "...",7 "code": "..."8}'{
"message": {
"type": "string"
},
"mfaEnabled": {
"type": "boolean"
}
}Organizations
Organization profile, webhook settings, case policy, thresholds, SLA, members, audit logs, and API key lifecycle.
/api/v1/orgs/meGet the active organization profile
Returns organization configuration, SLA, thresholds, membership roster, and API key status for the signed-in organization.
1curl -X GET "https://api.remllo.com/api/v1/orgs/me" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"hasApiKey": {
"type": "boolean"
},
"webhookUrl": {
"type": "string",
"format": "uri",
"nullable": true
},
"allowedMemberEmailDomains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Organization-scoped email domains allowed for team member invites."
},
"highValueTransactionThreshold": {
"type": "number"
},
"riskThresholdLow": {
"type": "number"
},
"riskThresholdMedium": {
"type": "number"
},
"riskThresholdHigh": {
"type": "number"
},
"slaConfig": {
"type": "object",
"required": [
"critical",
"high",
"medium",
"low"
],
"properties": {
"critical": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
},
"high": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
},
"medium": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
},
"low": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
}
}
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"memberships": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"role": {
"type": "string",
"enum": [
"ADMIN",
"RISK_LEAD",
"ANALYST",
"VIEWER"
]
},
"userId": {
"type": "string",
"format": "uuid"
},
"organizationId": {
"type": "string",
"format": "uuid"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"user": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"email": {
"type": "string",
"format": "email"
},
"firstName": {
"type": "string",
"nullable": true
},
"lastName": {
"type": "string",
"nullable": true
},
"invitationPending": {
"type": "boolean"
}
}
}
}
}
}
}/api/v1/orgs/webhookUpdate the organization webhook URL
Sets or clears the outbound webhook destination used for WatchTower notifications and events.
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/orgs/webhook" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "webhookUrl": "..."7}'{
"message": {
"type": "string"
},
"webhookUrl": {
"type": "string",
"nullable": true
}
}/api/v1/orgs/thresholdsUpdate risk thresholds
Updates organization-level high-value and risk bucket thresholds used by the rule engine and dashboards.
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/orgs/thresholds" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "highValueTransactionThreshold": 0,7 "riskThresholdLow": 0,8 "riskThresholdMedium": 0,9 "riskThresholdHigh": 010}'{
"message": {
"type": "string"
},
"data": {
"type": "object",
"additionalProperties": true
}
}/api/v1/orgs/slaUpdate organization SLA policy
Updates SLA targets for each priority band. Admin-only.
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/orgs/sla" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "critical": {7 "triageMinutes": 0,8 "investigationMinutes": 0,9 "escalationMinutes": 010 },11 "high": {12 "triageMinutes": 0,13 "investigationMinutes": 0,14 "escalationMinutes": 015 },16 "medium": {17 "triageMinutes": 0,18 "investigationMinutes": 0,19 "escalationMinutes": 020 },21 "low": {22 "triageMinutes": 0,23 "investigationMinutes": 0,24 "escalationMinutes": 025 }26}'{
"message": {
"type": "string"
},
"slaConfig": {
"type": "object",
"required": [
"critical",
"high",
"medium",
"low"
],
"properties": {
"critical": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
},
"high": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
},
"medium": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
},
"low": {
"type": "object",
"required": [
"triageMinutes",
"investigationMinutes",
"escalationMinutes"
],
"properties": {
"triageMinutes": {
"type": "integer"
},
"investigationMinutes": {
"type": "integer"
},
"escalationMinutes": {
"type": "integer"
}
}
}
}
}
}/api/v1/orgs/membersInvite an organization member
Creates or links a user to the organization, generates an invite link if the user has not set a password yet, and assigns a role. For organizations with an email-domain policy, invited users must match the workspace domain unless a platform-admin support exception applies.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/orgs/members" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "firstName": "...",7 "lastName": "...",8 "email": "ops@example.com",9 "role": "ADMIN"10}'{
"message": {
"type": "string"
},
"membership": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"role": {
"type": "string",
"enum": [
"ADMIN",
"RISK_LEAD",
"ANALYST",
"VIEWER"
]
},
"userId": {
"type": "string",
"format": "uuid"
},
"organizationId": {
"type": "string",
"format": "uuid"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"user": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"email": {
"type": "string",
"format": "email"
},
"firstName": {
"type": "string",
"nullable": true
},
"lastName": {
"type": "string",
"nullable": true
},
"invitationPending": {
"type": "boolean"
}
}
}
}
},
"inviteUrl": {
"type": "string",
"format": "uri",
"nullable": true
}
}/api/v1/orgs/members/{membershipId}Update a member role
Changes the role for an existing organization membership. Admin-only.
Parameters
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/orgs/members/{membershipId}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "role": "ADMIN"7}'{
"message": {
"type": "string"
},
"membership": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"role": {
"type": "string",
"enum": [
"ADMIN",
"RISK_LEAD",
"ANALYST",
"VIEWER"
]
},
"userId": {
"type": "string",
"format": "uuid"
},
"organizationId": {
"type": "string",
"format": "uuid"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"user": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"email": {
"type": "string",
"format": "email"
},
"firstName": {
"type": "string",
"nullable": true
},
"lastName": {
"type": "string",
"nullable": true
},
"invitationPending": {
"type": "boolean"
}
}
}
}
}
}/api/v1/orgs/members/{membershipId}Remove an organization member
Removes organization access for a member while preserving historical records and audit references.
Parameters
1curl -X DELETE "https://api.remllo.com/api/v1/orgs/members/{membershipId}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"message": {
"type": "string"
}
}/api/v1/orgs/audit-logsList organization audit logs
Returns recent audit events for organization configuration, member management, and monitoring actions.
1curl -X GET "https://api.remllo.com/api/v1/orgs/audit-logs" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"data": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}/api/v1/orgs/api-key/generateGenerate an ingestion API key
Creates the first organization ingestion API key and returns the raw value once.
1curl -X POST "https://api.remllo.com/api/v1/orgs/api-key/generate" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"apiKey": {
"type": "string"
},
"message": {
"type": "string"
}
}/api/v1/orgs/api-key/rotateRotate the ingestion API key
Replaces the current organization API key and returns the new raw value once.
1curl -X POST "https://api.remllo.com/api/v1/orgs/api-key/rotate" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"apiKey": {
"type": "string"
},
"message": {
"type": "string"
}
}/api/v1/orgs/api-keyRevoke the ingestion API key
Deletes the current organization ingestion API key.
1curl -X DELETE "https://api.remllo.com/api/v1/orgs/api-key" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"message": {
"type": "string"
}
}/api/v1/orgs/allowed-ipsSet API key IP allowlist
Defines the IP addresses allowed to use the organization API key for transaction ingestion.
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/orgs/allowed-ips" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "allowedIps": [7 "..."8 ]9}'{
"message": {
"type": "string"
},
"allowedIps": {
"type": "array",
"items": {
"type": "string"
}
}
}/api/v1/orgs/webhook/rotate-secretRotate organization webhook secret
Rotates the signing secret used for outbound organization webhooks. Store the new secret securely; it is returned once.
1curl -X POST "https://api.remllo.com/api/v1/orgs/webhook/rotate-secret" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"webhookSecret": {
"type": "string",
"description": "Returned once. Store securely."
}
}/api/v1/orgs/case-creation-policyUpdate case creation policy
Configures when WatchTower should automatically create cases from alerts.
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/orgs/case-creation-policy" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "autoCreateCases": true,7 "minimumSeverity": 08}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"additionalProperties": true
}
}/api/v1/orgs/members/{membershipId}/resend-inviteResend member invite
Sends a new invitation email to a pending organization member.
Parameters
1curl -X POST "https://api.remllo.com/api/v1/orgs/members/{membershipId}/resend-invite" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"inviteUrl": {
"type": "string",
"format": "uri",
"description": "Returned for admin fallback only; email delivery is the primary flow."
}
}Transactions
Transaction ingestion and transaction monitoring retrieval APIs.
/api/v1/transactions/adaptersList available ingestion adapters
Returns the supported source-specific transaction adapters and example payload contracts used to normalize institution payloads into the WatchTower canonical transaction model.
1curl -X GET "https://api.remllo.com/api/v1/transactions/adapters" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"aliases": {
"type": "array",
"items": {
"type": "string"
}
},
"summary": {
"type": "string"
},
"description": {
"type": "string"
},
"supportedCategories": {
"type": "array",
"items": {
"type": "string"
}
},
"examplePayload": {
"type": "object",
"additionalProperties": true
}
}
}
}
}/api/v1/transactionsIngest and screen a transaction
Accepts a canonical transaction payload, evaluates it against active WatchTower controls, and returns the risk decision immediately. Use `x-api-key` for organization-scoped authentication and `idempotency-key` for safe retries.
Parameters
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/transactions" \2 -H "x-api-key: wt_your_org_key" \3 -H "idempotency-key: 8d80a7b3-2e52-4d74-9f7f-f59f14b97f86" \4 -H "Content-Type: application/json" \5 \6 -d '{7 "id": "6ef1b19e-245a-42f7-bbf2-c91f0cbdde27",8 "amount": 0,9 "currency": "NGN",10 "channel": "USSD",11 "transactionType": "DEBIT",12 "transactionCategory": "TRANSFER",13 "timestamp": "2026-03-20T10:15:00.000Z",14 "paymentReference": "...",15 "sessionId": "...",16 "sender": {17 "name": "...",18 "accountNumber": "...",19 "bankCode": "...",20 "bankName": "...",21 "phoneNumber": "...",22 "walletId": "...",23 "bvn": "...",24 "nin": "...",25 "partyType": "BANK_ACCOUNT"26 },27 "receiver": {28 "name": "...",29 "accountNumber": "...",30 "bankCode": "...",31 "bankName": "...",32 "merchantId": "...",33 "terminalId": "...",34 "partyType": "BANK_ACCOUNT"35 },36 "device": {37 "deviceId": "...",38 "ipAddress": "...",39 "deviceType": "mobile",40 "operatingSystem": "...",41 "networkProvider": "...",42 "location": "...",43 "userAgent": "..."44 },45 "behavior": {46 "transactionsLast1Min": 0,47 "transactionsLast5Min": 0,48 "velocityScore": 0,49 "newDeviceDetected": true,50 "newIpDetected": true,51 "accountAgeDays": 052 },53 "metadata": {},54 "senderId": "...",55 "receiverId": "..."56}'{
"transactionId": {
"type": "string",
"format": "uuid"
},
"decision": {
"type": "string",
"enum": [
"ALLOW",
"REVIEW",
"BLOCK"
]
},
"riskScore": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"triggeredRules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ruleId": {
"type": "string"
},
"description": {
"type": "string"
},
"severity": {
"type": "number"
}
}
}
},
"behavioralSignals": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"label": {
"type": "string"
},
"value": {},
"riskPoints": {
"type": "number"
},
"explanation": {
"type": "string"
}
}
}
},
"anomalyScore": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"anomalyReasons": {
"type": "array",
"items": {
"type": "string"
}
},
"watchlistHits": {
"type": "array",
"items": {
"type": "object",
"properties": {
"watchlistId": {
"type": "string"
},
"listType": {
"type": "string"
},
"matchType": {
"type": "string"
},
"matchValue": {
"type": "string"
},
"riskLevel": {
"type": "string"
},
"reason": {
"type": "string"
}
}
}
},
"evaluatedAt": {
"type": "string",
"format": "date-time"
}
}/api/v1/transactionsList organization transactions
Returns paginated transactions for the active organization with attached alert assignment context where available.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/transactions" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"data": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"page": {
"type": "number"
},
"pageSize": {
"type": "number"
},
"total": {
"type": "number"
}
}/api/v1/transactions/adapters/{adapterKey}Ingest a transaction through an adapter
Accepts a source-specific transaction payload and maps it into the WatchTower canonical transaction model before evaluation. Adapter details are published only when safe for customer use.
Parameters
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/transactions/adapters/{adapterKey}" \2 -H "x-api-key: wt_your_org_key" \3 -H "idempotency-key: 8d80a7b3-2e52-4d74-9f7f-f59f14b97f86" \4 -H "Content-Type: application/json" \5{
"adapterKey": {
"type": "string"
},
"externalTransactionId": {
"type": "string"
},
"transactionId": {
"type": "string",
"format": "uuid"
},
"decision": {
"type": "string"
},
"riskScore": {
"type": "number"
}
}/api/v1/transactions/statsGet transaction monitoring stats
Returns 30-day aggregate monitoring metrics for the active organization.
1curl -X GET "https://api.remllo.com/api/v1/transactions/stats" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"totalTransactions": {
"type": "number"
},
"fraudPrevented": {
"type": "number"
},
"flagRate": {
"type": "string"
}
}/api/v1/transactions/{id}/narrativeGet or generate an alert narrative
Returns a stored narrative for a flagged transaction or generates one on demand when possible.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/transactions/{id}/narrative" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"narrative": {
"type": "string"
}
}/api/v1/transactions/{id}/related-activityGet related transaction activity
Returns nearby or related activity tied to the transaction customer, counterparty, device, or account context.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/transactions/{id}/related-activity" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}CSV Imports
Upload, inspect, validate, process, retry, and audit CSV transaction imports.
/api/v1/transactions/imports/mapping-profilesList CSV mapping profiles
Returns saved CSV mapping profiles for the active organization.
1curl -X GET "https://api.remllo.com/api/v1/transactions/imports/mapping-profiles" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"sourceKey": {
"type": "string",
"nullable": true
},
"headerSignature": {
"type": "string"
},
"delimiter": {
"type": "string"
},
"mappings": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"sampleHeaders": {
"type": "array",
"items": {
"type": "string"
}
},
"lastUsedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}
}/api/v1/transactions/imports/mapping-profilesCreate CSV mapping profile
Saves a reusable mapping from source CSV headers into the WatchTower transaction model.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/transactions/imports/mapping-profiles" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "name": "...",7 "headerSignature": "...",8 "delimiter": ",",9 "sourceKey": "...",10 "sampleHeaders": [11 "..."12 ],13 "mappings": {}14}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"sourceKey": {
"type": "string",
"nullable": true
},
"headerSignature": {
"type": "string"
},
"delimiter": {
"type": "string"
},
"mappings": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"sampleHeaders": {
"type": "array",
"items": {
"type": "string"
}
},
"lastUsedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}/api/v1/transactions/imports/mapping-profiles/{id}Update CSV mapping profile
Updates a saved CSV mapping profile.
Parameters
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/transactions/imports/mapping-profiles/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "name": "...",7 "sourceKey": "...",8 "mappings": {}9}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"sourceKey": {
"type": "string",
"nullable": true
},
"headerSignature": {
"type": "string"
},
"delimiter": {
"type": "string"
},
"mappings": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"sampleHeaders": {
"type": "array",
"items": {
"type": "string"
}
},
"lastUsedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}/api/v1/transactions/imports/mapping-profiles/{id}Delete CSV mapping profile
Deletes a saved CSV mapping profile for the active organization.
Parameters
1curl -X DELETE "https://api.remllo.com/api/v1/transactions/imports/mapping-profiles/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
}
}/api/v1/transactions/imports/inspectInspect CSV upload
Uploads a CSV file for header detection, sample parsing, validation preview, and mapping-profile suggestions. The upload token returned by this endpoint is used to validate or create an import run.
Request Body
multipart/form-dataCSV file to inspect.
Optional source label for mapping suggestions.
1curl -X POST "https://api.remllo.com/api/v1/transactions/imports/inspect" \2 -H "Cookie: wt_session=your_session_cookie" \3 -F "file=@/path/to/file.csv" \4 -F "sourceLabel=..." \5 -F "delimiter=,"{
"success": {
"type": "boolean"
},
"uploadToken": {
"type": "string",
"format": "uuid"
},
"headers": {
"type": "array",
"items": {
"type": "string"
}
},
"sampleRows": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"suggestedMappingProfile": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"sourceKey": {
"type": "string",
"nullable": true
},
"headerSignature": {
"type": "string"
},
"delimiter": {
"type": "string"
},
"mappings": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"sampleHeaders": {
"type": "array",
"items": {
"type": "string"
}
},
"lastUsedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}/api/v1/transactions/imports/validateValidate CSV import
Validates a cached CSV upload and mapping without creating transactions.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/transactions/imports/validate" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "uploadToken": "6ef1b19e-245a-42f7-bbf2-c91f0cbdde27",7 "sourceLabel": "...",8 "mappings": {},9 "guardrails": {10 "duplicateHandling": "SKIP_DUPLICATES",11 "maxInvalidRows": 012 }13}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"additionalProperties": true
}
}/api/v1/transactions/imports/runsCreate CSV import run
Creates a CSV import run from a cached upload token. Imported rows are processed through the same monitoring pipeline as API-ingested transactions.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/transactions/imports/runs" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "uploadToken": "6ef1b19e-245a-42f7-bbf2-c91f0cbdde27",7 "sourceLabel": "...",8 "mappingProfileId": "6ef1b19e-245a-42f7-bbf2-c91f0cbdde27",9 "mappings": {},10 "saveMappingProfile": true,11 "mappingProfileName": "..."12}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"sourceLabel": {
"type": "string",
"nullable": true
},
"status": {
"type": "string",
"enum": [
"PENDING",
"VALIDATING",
"PROCESSING",
"COMPLETED",
"FAILED",
"CANCELED"
]
},
"totalRows": {
"type": "integer"
},
"processedRows": {
"type": "integer"
},
"validRows": {
"type": "integer"
},
"invalidRows": {
"type": "integer"
},
"duplicateRows": {
"type": "integer"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"completedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}/api/v1/transactions/importsList CSV import runs
Returns recent CSV import runs for the active organization.
1curl -X GET "https://api.remllo.com/api/v1/transactions/imports" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"sourceLabel": {
"type": "string",
"nullable": true
},
"status": {
"type": "string",
"enum": [
"PENDING",
"VALIDATING",
"PROCESSING",
"COMPLETED",
"FAILED",
"CANCELED"
]
},
"totalRows": {
"type": "integer"
},
"processedRows": {
"type": "integer"
},
"validRows": {
"type": "integer"
},
"invalidRows": {
"type": "integer"
},
"duplicateRows": {
"type": "integer"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"completedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}
}/api/v1/transactions/imports/{id}Get CSV import run
Returns CSV import run details, validation summary, and processing status.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/transactions/imports/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"sourceLabel": {
"type": "string",
"nullable": true
},
"status": {
"type": "string",
"enum": [
"PENDING",
"VALIDATING",
"PROCESSING",
"COMPLETED",
"FAILED",
"CANCELED"
]
},
"totalRows": {
"type": "integer"
},
"processedRows": {
"type": "integer"
},
"validRows": {
"type": "integer"
},
"invalidRows": {
"type": "integer"
},
"duplicateRows": {
"type": "integer"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"completedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}/api/v1/transactions/imports/{id}Delete CSV import run
Deletes an import run record where allowed by its current state.
Parameters
1curl -X DELETE "https://api.remllo.com/api/v1/transactions/imports/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
}
}/api/v1/transactions/imports/{id}/cancelCancel CSV import run
Cancels a pending or processing CSV import run where cancellation is still safe.
Parameters
1curl -X POST "https://api.remllo.com/api/v1/transactions/imports/{id}/cancel" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"sourceLabel": {
"type": "string",
"nullable": true
},
"status": {
"type": "string",
"enum": [
"PENDING",
"VALIDATING",
"PROCESSING",
"COMPLETED",
"FAILED",
"CANCELED"
]
},
"totalRows": {
"type": "integer"
},
"processedRows": {
"type": "integer"
},
"validRows": {
"type": "integer"
},
"invalidRows": {
"type": "integer"
},
"duplicateRows": {
"type": "integer"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"completedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}/api/v1/transactions/imports/{id}/retryRetry CSV import run
Retries a failed or canceled CSV import run after correcting the issue.
Parameters
1curl -X POST "https://api.remllo.com/api/v1/transactions/imports/{id}/retry" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"sourceLabel": {
"type": "string",
"nullable": true
},
"status": {
"type": "string",
"enum": [
"PENDING",
"VALIDATING",
"PROCESSING",
"COMPLETED",
"FAILED",
"CANCELED"
]
},
"totalRows": {
"type": "integer"
},
"processedRows": {
"type": "integer"
},
"validRows": {
"type": "integer"
},
"invalidRows": {
"type": "integer"
},
"duplicateRows": {
"type": "integer"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"completedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}/api/v1/transactions/imports/{id}/purge-payloadPurge CSV import payload
Deletes the stored raw CSV payload for an import run while retaining audit metadata.
Parameters
1curl -X POST "https://api.remllo.com/api/v1/transactions/imports/{id}/purge-payload" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"sourceLabel": {
"type": "string",
"nullable": true
},
"status": {
"type": "string",
"enum": [
"PENDING",
"VALIDATING",
"PROCESSING",
"COMPLETED",
"FAILED",
"CANCELED"
]
},
"totalRows": {
"type": "integer"
},
"processedRows": {
"type": "integer"
},
"validRows": {
"type": "integer"
},
"invalidRows": {
"type": "integer"
},
"duplicateRows": {
"type": "integer"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"completedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}Rules
Monitoring control catalog and custom rule lifecycle.
/api/v1/rules/catalogList built-in monitoring controls
Returns the built-in WatchTower rule catalog grouped by governance tier.
1curl -X GET "https://api.remllo.com/api/v1/rules/catalog" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"additionalProperties": true
}
}/api/v1/rulesList custom organization rules
Returns all organization-specific custom rules across draft, active, and inactive states.
1curl -X GET "https://api.remllo.com/api/v1/rules" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"count": {
"type": "number"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"severity": {
"type": "number"
},
"status": {
"type": "string",
"enum": [
"DRAFT",
"ACTIVE",
"INACTIVE"
]
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"operator": {
"type": "string",
"enum": [
"gt",
"gte",
"lt",
"lte",
"eq",
"neq",
"in",
"not_in",
"contains"
]
},
"value": {}
}
}
},
"velocityCheck": {
"nullable": true,
"type": "object",
"properties": {
"field": {
"type": "string"
},
"windowSeconds": {
"type": "number"
},
"maxCount": {
"type": "number"
}
}
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
}
}/api/v1/rulesCreate a draft rule
Creates a custom monitoring rule in draft state. Rules can later be activated through the rule status endpoint.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/rules" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "name": "...",7 "description": "...",8 "severity": 0,9 "conditions": [10 {11 "field": "...",12 "operator": "gt",13 "value": "..."14 }15 ],16 "velocityCheck": {17 "field": "...",18 "windowSeconds": 0,19 "maxCount": 020 }21}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"severity": {
"type": "number"
},
"status": {
"type": "string",
"enum": [
"DRAFT",
"ACTIVE",
"INACTIVE"
]
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"operator": {
"type": "string",
"enum": [
"gt",
"gte",
"lt",
"lte",
"eq",
"neq",
"in",
"not_in",
"contains"
]
},
"value": {}
}
}
},
"velocityCheck": {
"nullable": true,
"type": "object",
"properties": {
"field": {
"type": "string"
},
"windowSeconds": {
"type": "number"
},
"maxCount": {
"type": "number"
}
}
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
},
"message": {
"type": "string"
}
}/api/v1/rules/{id}/statusChange a rule lifecycle status
Moves a custom rule between draft, active, and inactive and hot-reloads the evaluation cache.
Parameters
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/rules/{id}/status" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "status": "DRAFT"7}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"severity": {
"type": "number"
},
"status": {
"type": "string",
"enum": [
"DRAFT",
"ACTIVE",
"INACTIVE"
]
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"operator": {
"type": "string",
"enum": [
"gt",
"gte",
"lt",
"lte",
"eq",
"neq",
"in",
"not_in",
"contains"
]
},
"value": {}
}
}
},
"velocityCheck": {
"nullable": true,
"type": "object",
"properties": {
"field": {
"type": "string"
},
"windowSeconds": {
"type": "number"
},
"maxCount": {
"type": "number"
}
}
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
},
"message": {
"type": "string"
}
}/api/v1/rules/{id}Delete a custom rule
Removes a custom rule permanently and hot-reloads the rule cache.
Parameters
1curl -X DELETE "https://api.remllo.com/api/v1/rules/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"message": {
"type": "string"
}
}/api/v1/rules/catalog/{id}/overrideOverride catalog control
Enables or disables an organization-specific override for a built-in monitoring control.
Parameters
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/rules/catalog/{id}/override" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "enabled": true,7 "severity": 08}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"additionalProperties": true
}
}Alerts
Alert inbox, status changes, and live alert streaming.
/api/v1/alertsList alerts
Returns the alert inbox for the active organization with transaction enrichment, assignees, and control attribution.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/alerts" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": true
}/api/v1/alerts/{id}Update an alert status or assignee
Resolves, escalates, marks false positive, or reassigns an alert. Linked case workflow is synchronized when a case exists.
Parameters
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/alerts/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "status": "OPEN",7 "notes": "...",8 "assignedToId": "...",9 "outcomeReason": "...",10 "outcomeContext": "..."11}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"status": {
"type": "string",
"enum": [
"OPEN",
"RESOLVED",
"ESCALATED",
"FALSE_POSITIVE"
]
},
"narrative": {
"type": "string",
"nullable": true
},
"assignedToId": {
"type": "string",
"nullable": true
},
"assignedTo": {
"type": "object",
"nullable": true,
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"firstName": {
"type": "string",
"nullable": true
},
"lastName": {
"type": "string",
"nullable": true
},
"email": {
"type": "string",
"format": "email"
}
}
},
"caseId": {
"type": "string",
"nullable": true
},
"primaryControl": {
"type": "string"
},
"ruleFamily": {
"type": "string"
},
"triggeredControls": {
"type": "array",
"items": {
"type": "string"
}
},
"controlCount": {
"type": "number"
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
}/api/v1/alerts/streamingOpen the alert SSE stream
Returns a server-sent events stream of alert updates for the active organization.
1curl -X GET "https://api.remllo.com/api/v1/alerts/streaming" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": true
}/api/v1/alerts/{id}/open-caseOpen a case from an alert
Creates or links an investigation case from a specific alert.
Parameters
1curl -X POST "https://api.remllo.com/api/v1/alerts/{id}/open-case" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"caseReference": "CASE-10DB14A3",
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"primaryCustomer": {
"type": "string"
},
"riskScore": {
"type": "number"
},
"linkedAlerts": {
"type": "number"
},
"totalFlaggedValue": {
"type": "number"
},
"primaryControl": {
"type": "string"
},
"triggeredControls": {
"type": "array",
"items": {
"type": "string"
}
},
"controlCount": {
"type": "number"
},
"status": {
"type": "string",
"enum": [
"OPEN",
"INVESTIGATING",
"ESCALATED",
"REOPENED",
"RESOLVED",
"FALSE_POSITIVE"
]
},
"priority": {
"type": "string",
"enum": [
"Critical",
"High",
"Medium",
"Low"
]
},
"assignee": {
"type": "object",
"nullable": true,
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"firstName": {
"type": "string",
"nullable": true
},
"lastName": {
"type": "string",
"nullable": true
},
"email": {
"type": "string",
"format": "email"
}
}
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
}Cases
Case management, notes, attachments, and exports.
/api/v1/casesList cases
Returns the current case board/list with normalized case data for the active organization.
1curl -X GET "https://api.remllo.com/api/v1/cases" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"caseReference": "CASE-10DB14A3",
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"primaryCustomer": {
"type": "string"
},
"riskScore": {
"type": "number"
},
"linkedAlerts": {
"type": "number"
},
"totalFlaggedValue": {
"type": "number"
},
"primaryControl": {
"type": "string"
},
"triggeredControls": {
"type": "array",
"items": {
"type": "string"
}
},
"controlCount": {
"type": "number"
},
"status": {
"type": "string",
"enum": [
"OPEN",
"INVESTIGATING",
"ESCALATED",
"REOPENED",
"RESOLVED",
"FALSE_POSITIVE"
]
},
"priority": {
"type": "string",
"enum": [
"Critical",
"High",
"Medium",
"Low"
]
},
"assignee": {
"type": "object",
"nullable": true,
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"firstName": {
"type": "string",
"nullable": true
},
"lastName": {
"type": "string",
"nullable": true
},
"email": {
"type": "string",
"format": "email"
}
}
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
}
}/api/v1/cases/{id}Get case detail
Returns an investigation case with alert, transaction, notes, events, and attachment context.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/cases/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"data": {
"type": "object",
"additionalProperties": true
}
}/api/v1/cases/{id}Update a case
Changes case status, assignment, priority, and disposition data. Status transitions are role-aware.
Parameters
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/cases/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "status": "OPEN",7 "priority": "Critical",8 "assignedToId": "...",9 "notes": "...",10 "outcomeReason": "...",11 "outcomeContext": "...",12 "reopenReason": "..."13}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"additionalProperties": true
}
}/api/v1/cases/{id}/notesAdd a case note
Adds a note or threaded reply to a case and optionally mentions other users.
Parameters
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/cases/{id}/notes" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "body": "...",7 "parentId": "6ef1b19e-245a-42f7-bbf2-c91f0cbdde27",8 "mentionedUserIds": [9 "6ef1b19e-245a-42f7-bbf2-c91f0cbdde27"10 ]11}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"additionalProperties": true
}
}/api/v1/cases/{id}/attachmentsAdd a case attachment
Adds metadata for an uploaded case attachment or evidence file.
Parameters
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/cases/{id}/attachments" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "fileName": "...",7 "fileUrl": "...",8 "contentType": "...",9 "notes": "..."10}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"additionalProperties": true
}
}/api/v1/cases/{id}/exportExport a case
Exports a case as JSON, CSV, or PDF depending on the requested format.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/cases/{id}/export" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": true
}/api/v1/cases/{id}/export/goamlExport case in goAML format
Exports a case package formatted for goAML-style regulatory workflows where supported.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/cases/{id}/export/goaml" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": true
}/api/v1/cases/{id}/attachments/{attachmentId}/downloadDownload case attachment
Downloads a case attachment if the current user has access to the case.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/cases/{id}/attachments/{attachmentId}/download" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": true
}/api/v1/cases/{id}/read-stateUpdate case read state
Marks case collaboration activity as seen by the current user.
Parameters
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/cases/{id}/read-state" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "notesSeenAt": "2026-03-20T10:15:00.000Z",7 "evidenceSeenAt": "2026-03-20T10:15:00.000Z"8}'{
"success": {
"type": "boolean"
}
}Reports
Operational reporting and export endpoints.
/api/v1/reports/overviewGet reporting overview
Returns the main operational reporting payload for dashboards, reports, control trends, analyst workload, and SLA views.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/reports/overview" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"summary": {
"type": "object",
"additionalProperties": true
},
"charts": {
"type": "object",
"additionalProperties": true
},
"trendSeries": {
"type": "object",
"properties": {
"daily": {
"type": "array",
"items": {
"type": "object",
"properties": {
"period": {
"type": "string"
},
"transactions": {
"type": "number"
},
"flagged": {
"type": "number"
},
"flaggedValue": {
"type": "number"
}
}
}
},
"weekly": {
"type": "array",
"items": {
"type": "object",
"properties": {
"period": {
"type": "string"
},
"transactions": {
"type": "number"
},
"flagged": {
"type": "number"
},
"flaggedValue": {
"type": "number"
}
}
}
}
}
}
}/api/v1/reports/overview/export.csvExport reporting overview as CSV
Exports the overview report sections as CSV for offline analysis.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/reports/overview/export.csv" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": true
}Notifications
Notification preferences, organization delivery channels, delivery audit, inbox items, and live updates.
/api/v1/notifications/preferencesList current user notification preferences
Returns the current user email delivery preferences for supported WatchTower notification events. Unset preferences default to enabled.
1curl -X GET "https://api.remllo.com/api/v1/notifications/preferences" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"availableEventTypes": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ALERT_CREATED",
"ALERT_ESCALATED",
"CASE_CREATED",
"CASE_ASSIGNED",
"CASE_STATUS_CHANGED",
"CASE_MENTIONED",
"INTEGRATION_FAILED"
]
}
},
"channelType": {
"type": "string",
"enum": [
"EMAIL"
]
},
"preferences": {
"type": "array",
"items": {
"type": "object",
"properties": {
"eventType": {
"type": "string",
"enum": [
"ALERT_CREATED",
"ALERT_ESCALATED",
"CASE_CREATED",
"CASE_ASSIGNED",
"CASE_STATUS_CHANGED",
"CASE_MENTIONED",
"INTEGRATION_FAILED"
]
},
"channelType": {
"type": "string",
"enum": [
"EMAIL"
]
},
"enabled": {
"type": "boolean"
},
"source": {
"type": "string",
"enum": [
"default",
"user"
]
},
"updatedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}
}
}
}/api/v1/notifications/preferencesUpdate current user notification preferences
Updates the current user email opt-in or opt-out settings for one or more WatchTower notification events.
Request Body
application/json1curl -X PUT "https://api.remllo.com/api/v1/notifications/preferences" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "preferences": [7 {8 "eventType": "ALERT_CREATED",9 "enabled": true10 }11 ]12}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"availableEventTypes": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ALERT_CREATED",
"ALERT_ESCALATED",
"CASE_CREATED",
"CASE_ASSIGNED",
"CASE_STATUS_CHANGED",
"CASE_MENTIONED",
"INTEGRATION_FAILED"
]
}
},
"channelType": {
"type": "string",
"enum": [
"EMAIL"
]
},
"preferences": {
"type": "array",
"items": {
"type": "object",
"properties": {
"eventType": {
"type": "string",
"enum": [
"ALERT_CREATED",
"ALERT_ESCALATED",
"CASE_CREATED",
"CASE_ASSIGNED",
"CASE_STATUS_CHANGED",
"CASE_MENTIONED",
"INTEGRATION_FAILED"
]
},
"channelType": {
"type": "string",
"enum": [
"EMAIL"
]
},
"enabled": {
"type": "boolean"
},
"source": {
"type": "string",
"enum": [
"default",
"user"
]
},
"updatedAt": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
}
}
}
}/api/v1/notificationsList notifications
Returns the recent notification inbox for the current user.
1curl -X GET "https://api.remllo.com/api/v1/notifications" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"unreadCount": {
"type": "number"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"message": {
"type": "string"
},
"isRead": {
"type": "boolean"
},
"recipientUserId": {
"type": "string",
"format": "uuid"
},
"actorUser": {
"type": "object",
"nullable": true,
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"firstName": {
"type": "string",
"nullable": true
},
"lastName": {
"type": "string",
"nullable": true
},
"email": {
"type": "string",
"format": "email"
}
}
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
}
}/api/v1/notifications/{id}/readMark a notification as read
Marks a single notification as read for the current user.
Parameters
1curl -X PATCH "https://api.remllo.com/api/v1/notifications/{id}/read" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"message": {
"type": "string"
},
"isRead": {
"type": "boolean"
},
"recipientUserId": {
"type": "string",
"format": "uuid"
},
"actorUser": {
"type": "object",
"nullable": true,
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"firstName": {
"type": "string",
"nullable": true
},
"lastName": {
"type": "string",
"nullable": true
},
"email": {
"type": "string",
"format": "email"
}
}
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
}/api/v1/notifications/read-allMark all notifications as read
Marks all current-user notifications as read in the active organization.
1curl -X POST "https://api.remllo.com/api/v1/notifications/read-all" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
}
}/api/v1/notifications/streamingOpen the workspace SSE stream
Returns a server-sent events stream of workspace changes and notifications relevant to the current user.
1curl -X GET "https://api.remllo.com/api/v1/notifications/streaming" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": true
}/api/v1/notifications/settingsList notification routing settings
Returns organization-level notification channels, subscriptions, and routing settings.
1curl -X GET "https://api.remllo.com/api/v1/notifications/settings" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"additionalProperties": true
}
}/api/v1/notifications/deliveriesList notification deliveries
Returns delivery attempts for notification channels so teams can audit sent, skipped, and failed notifications.
Parameters
1curl -X GET "https://api.remllo.com/api/v1/notifications/deliveries" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"eventType": {
"type": "string"
},
"channelType": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"PENDING",
"SENT",
"FAILED",
"SKIPPED"
]
},
"attemptCount": {
"type": "integer"
},
"lastAttemptAt": {
"type": "string",
"format": "date-time",
"nullable": true
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
}
}/api/v1/notifications/channelsCreate notification channel
Creates an organization-level notification channel such as email, Slack, Teams, or webhook routing.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/notifications/channels" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "type": "EMAIL",7 "name": "...",8 "status": "ACTIVE",9 "routingEnabled": true,10 "minimumSeverity": 0,11 "allowedEventTypes": [12 "..."13 ],14 "config": {},15 "subscriptions": [16 {17 "eventType": "...",18 "role": "...",19 "userId": "6ef1b19e-245a-42f7-bbf2-c91f0cbdde27",20 "enabled": true,21 "minimumSeverity": 022 }23 ]24}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"type": {
"type": "string",
"enum": [
"EMAIL",
"SLACK",
"TEAMS",
"WEBHOOK"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DISABLED"
]
},
"routingEnabled": {
"type": "boolean"
},
"minimumSeverity": {
"type": "integer",
"nullable": true
},
"allowedEventTypes": {
"type": "array",
"items": {
"type": "string"
}
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
}/api/v1/notifications/channels/{id}Update notification channel
Updates channel status, routing, severity, allowed event types, or provider configuration.
Parameters
Request Body
application/json1curl -X PATCH "https://api.remllo.com/api/v1/notifications/channels/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "type": "EMAIL",7 "name": "...",8 "status": "ACTIVE",9 "routingEnabled": true,10 "minimumSeverity": 0,11 "allowedEventTypes": [12 "..."13 ],14 "config": {}15}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"type": {
"type": "string",
"enum": [
"EMAIL",
"SLACK",
"TEAMS",
"WEBHOOK"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DISABLED"
]
},
"routingEnabled": {
"type": "boolean"
},
"minimumSeverity": {
"type": "integer",
"nullable": true
},
"allowedEventTypes": {
"type": "array",
"items": {
"type": "string"
}
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
}/api/v1/notifications/channels/{id}Delete notification channel
Deletes an organization-level notification channel.
Parameters
1curl -X DELETE "https://api.remllo.com/api/v1/notifications/channels/{id}" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie"{
"success": {
"type": "boolean"
}
}/api/v1/notifications/channels/{id}/subscriptionsReplace channel subscriptions
Replaces the event subscriptions for an organization-level notification channel.
Parameters
Request Body
application/json1curl -X PUT "https://api.remllo.com/api/v1/notifications/channels/{id}/subscriptions" \2 -H "Content-Type: application/json" \3 -H "Cookie: wt_session=your_session_cookie" \4 \5 -d '{6 "subscriptions": [7 {8 "eventType": "...",9 "role": "...",10 "userId": "6ef1b19e-245a-42f7-bbf2-c91f0cbdde27",11 "enabled": true,12 "minimumSeverity": 013 }14 ]15}'{
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"type": {
"type": "string",
"enum": [
"EMAIL",
"SLACK",
"TEAMS",
"WEBHOOK"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DISABLED"
]
},
"routingEnabled": {
"type": "boolean"
},
"minimumSeverity": {
"type": "integer",
"nullable": true
},
"allowedEventTypes": {
"type": "array",
"items": {
"type": "string"
}
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
}AI
AI-assisted rule drafting and narrative generation.
/api/v1/ai/rules/buildGenerate a draft rule from natural language
Uses the AI rule builder to translate a natural-language monitoring scenario into a structured draft rule definition.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/ai/rules/build" \2 -H "Content-Type: application/json" \3 \4 -d '{5 "prompt": "..."6}'{
"success": {
"type": "boolean"
},
"rule": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"severity": {
"type": "number"
},
"status": {
"type": "string",
"enum": [
"DRAFT",
"ACTIVE",
"INACTIVE"
]
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"operator": {
"type": "string",
"enum": [
"gt",
"gte",
"lt",
"lte",
"eq",
"neq",
"in",
"not_in",
"contains"
]
},
"value": {}
}
}
},
"velocityCheck": {
"nullable": true,
"type": "object",
"properties": {
"field": {
"type": "string"
},
"windowSeconds": {
"type": "number"
},
"maxCount": {
"type": "number"
}
}
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
},
"message": {
"type": "string"
}
}/api/v1/ai/narrativeGenerate a narrative for a flagged transaction
Uses the AI narrative generator to produce an investigation or compliance narrative from flagged transaction data.
Request Body
application/json1curl -X POST "https://api.remllo.com/api/v1/ai/narrative" \2 -H "Content-Type: application/json" \3 \4 -d '{5 "transactionId": "6ef1b19e-245a-42f7-bbf2-c91f0cbdde27",6 "amount": 0,7 "currency": "...",8 "senderId": "...",9 "receiverId": "...",10 "channel": "...",11 "riskScore": 0,12 "decision": "ALLOW",13 "triggeredRules": [14 {15 "ruleId": "...",16 "description": "...",17 "severity": 018 }19 ],20 "behavioralSignals": [21 {22 "key": "...",23 "explanation": "...",24 "riskPoints": 025 }26 ],27 "anomalyReasons": [28 "..."29 ],30 "location": "...",31 "ipAddress": "...",32 "isSimulation": true33}'{
"success": {
"type": "boolean"
},
"narrative": {
"type": "string"
}
}