Fraud

Detect romance scam indicators in conversation

Analyzes text and conversation history for romance scam patterns including love bombing, isolation, fabricated crises, investment lures, identity deception, financial grooming, guilt manipulation, and crypto redirect tactics.

post/api/v1/fraud/romance-scam

Request

  • Base URL: https://api.tuteliq.ai
  • URL: https://api.tuteliq.ai/api/v1/fraud/romance-scam
  • Auth: one of:
    • HTTP bearer
    • API key in header x-api-key

Request body

textstring required

The text content to analyze

support_threshold'low' | 'medium' | 'high' | 'critical'

Top-level alias for options.support_threshold. Minimum severity to show crisis support resources (default: high). Critical always shows.

include_evidenceboolean

Top-level alias for options.include_evidence. When false, the evidence array is omitted from the response. Default: true.

continuation_tokenstring

Opaque, signed token returned by a previous call to this endpoint. Pass it back here to continue the analysis with prior context — no need to re-send prior_messages. The token IS the state; we store nothing.

reset_conversationboolean

When true, discard any continuation_token and treat this call as the first turn of a new conversation.

message_idstring

Optional customer-side identifier for this turn. If provided, evidence pointers in the continuation_token will reference this id so you can map detections back to your own messages. If omitted we use a deterministic short hash of the text.

bypass_cacheboolean

Deprecated, no effect: results are never cached — every request runs a fresh evaluation and nothing derived from the input is stored. The field is still accepted so existing integrations do not break.

external_idstring

Your unique identifier (e.g. message ID, content ID) for correlating Tuteliq results with your own system. Echoed back in the response and included in webhook payloads so you can match alerts to the original content.

customer_idstring

Your end-customer identifier for multi-tenant / B2B2C scenarios. If you serve multiple customers (schools, apps, brands) from a single API key, set this to route webhook alerts to the correct customer. Echoed back in the response and included in webhook payloads as "customerId".

metadataobject

Arbitrary key-value pairs for additional context (e.g. { "channel": "discord", "region": "eu" }). Stored with the detection result, echoed in the response, and included in webhook payloads. Maximum 20 properties.

incident_moderation_enabledboolean

Per-call override of your account incident logging setting. When set, it takes precedence for THIS request: true forces the incident to be persisted, false suppresses persistence. Omit to use your account default (which itself defaults to enabled). Useful to suppress logging for test traffic or to opt specific calls in or out.

Response

Default Response

declared_age_overriddenboolean

True when the caller declared an adult age group but the speaker states a minor age in the message or in the earlier turns sent with it. The declared age was not used. Nothing is escalated by this on its own; the analysis runs as if no age had been sent. Worth investigating at your end: an age check that disagrees with what the user says is what a bypassed age verification looks like. A stated ADULT age never has this effect. Absent unless it applied.

declared_age_overridden_reasonstring

Human-readable explanation. Present only when declared_age_overridden is true.

urgency_keptboolean

True when a declared context.conversation_type would have capped an urgent action to flag_for_review and did not, because the case is acute: the analysis named an acute marker, or a separate reading found a person at risk now with something happening as the text is written. A reading that gave no answer also keeps the urgency. Absent otherwise, and never present together with conversation_type_applied.

urgency_kept_reasonstring

Human-readable explanation. Present only when urgency_kept is true.

conversation_type_appliedstring

Present only when a caller-declared context.conversation_type actually changed routing. Confirms the setting was taken into account, rather than leaving the platform to assume it was.

absence_reason_clearedboolean

romance-scam only. Present when a detection was cleared because the reason given for not appearing on video or in person was a passing obstacle (a router down, out of data, an early start) rather than a standing property of the claimed persona (a deployment, a rig, a clearance), and the only tactics were IDENTITY_FABRICATION / SECRECY_REQUEST / URGENCY_PRESSURE. Before this, an ordinary "no wifi until Thursday" message was told its sender was fabricating an identity (#224). Absent when the gate did not fire.

past_account_clearedboolean

romance-scam only. Present when a result that asked for no action was not reported as a detection, because a separate reading found the message is an account of something that is over, or is about nobody in particular (a warning, a lesson, a story about a relative years ago). Never present when the analysis asked for monitoring or review.

unseen_partner_raisedboolean

Romance scam only. True when the analysis left the result below review and a separate reading found all of: a romantic relationship with someone met online and never met in person; that person has never been seen on video or gives a reason they cannot be seen or checked; talk of love, marriage or keeping it private. The result is raised to flag_for_review. This pattern is complete before any money is asked for.

unseen_partner_raised_reasonstring

Human-readable explanation. Present only when unseen_partner_raised is true.

love_bombing_raisedboolean

Romance scam only. True when the analysis left the result below review and a separate reading found all of: a declaration of lifelong or exclusive devotion to the reader; the message itself showing that the two barely know each other or have not met; and nothing of a shared life in it. The result is raised to review, never higher. This is how a romance scam opens, before anything is asked for, and it can also be sincere, so a moderator decides. Absent otherwise. ADVISORY: for a moderator UI and triage queues. Branch production logic on recommended_action.

love_bombing_raised_reasonstring

Human-readable explanation. Present only when love_bombing_raised is true.

ordinary_shared_finances_cappedboolean

Romance scam only. True when, across a whole conversation (earlier turns submitted, or a conversation pasted into text), a separate reading found that money moves the way it does between people who share a life (a cost split, a sum covered and paid back, a shared expense), with no unmet or unverifiable partner, unusual payment method, crisis, secrecy or promised returns. A result at review or block is then brought down to monitor. Only recommended_action changes; detected, the categories, the level and the score are as the analysis gave them. Never applied to a single message, a declared minor, a kept urgency, or a result another reading cleared or raised. Absent otherwise.

ordinary_shared_finances_capped_reasonstring

Human-readable explanation. Present only when ordinary_shared_finances_capped is true.

protective_speech_cappedboolean

True when an alert was lowered because a separate reading found a text that works AGAINST the harm it describes: explaining it, warning about it, counselling or supporting someone, reporting it or asking what to do. Two outcomes: with nobody at risk in the text and the detector itself reading the speaker as describing someone else, the result is nothing detected at monitor; with a person at risk and a responsible adult in the text already acting, an urgent action becomes flag_for_review and the finding is kept. A text that does the harm, a person at risk with nobody acting, anything happening as the text is written, and any failed reading are never lowered. Absent when not applied.

protective_speech_capped_reasonstring

Human-readable explanation, naming which of the two outcomes applied. Present only when protective_speech_capped is true.

endpointstring

The detection endpoint that produced this result

detectedboolean

A signal was observed at ANY severity (including low / monitor cases). For production branching prefer recommended_action (flag_for_moderator / immediate_intervention indicate action required).

severitynumber

Severity score (0.0-1.0)

confidencenumber

Model confidence in the classification (0.0-1.0)

risk_scorenumber

Age-adjusted risk score (0.0-1.0)

level'none' | 'low' | 'medium' | 'high' | 'critical'

Human-readable severity level

recommended_actionstring

Recommended action to take

rationalestring

Explanation of the detection result

languagestring

Language code used for analysis

language_status'stable' | 'beta'

Language support maturity

credits_usednumber

Credits consumed by this request

processing_time_msnumber

Processing time in milliseconds

continuation_tokenstring

Opaque, signed token carrying derived analysis state. Pass it back on the next call to continue the conversation without re-sending history. Server stores nothing — the token IS the state.

continuation_expires_atstring

ISO 8601 timestamp at which the continuation_token expires (24h default).

state_source'token' | 'fresh' | 'reset'

How the prior analysis state was sourced for this call: "token" (decoded from continuation_token), "fresh" (no prior state), "reset" (reset_conversation forced a fresh start).

external_idstring

Echo of the external_id you provided in the request

customer_idstring

Echo of the customer_id you provided in the request

metadataobject

Echo of the metadata you provided in the request

speaker_stance'deploying' | 'describing_third_party' | 'unclear'

Whether the speaker is running this on the listener, or recounting, reporting, warning about or investigating one run by someone else. A victim disclosing what was done to them is describing_third_party, even though the disclosure necessarily repeats the perpetrator's own vocabulary. DESCRIPTIVE: this never changes detected, severity, level or recommended_action, so read it before acting on them, or a victim report is actioned exactly like the fraud it reports.

Changes

No recorded changes to this operation across all 1 revision of this API.