ThreatFindings Object
Properties
The account, subscription or project the object belongs to. An object with no account cannot be attributed to an environment, so this is always present for objects that live inside an account.
The provider's own category string, verbatim, with no mapping into a shared taxonomy.
When Truto actually read this object from the provider, in UTC ISO 8601 with the offset present. Not when the request was made and not a provider timestamp. Drives consumer staleness rules.
When the alert was raised. Populates the incident timeline, which is the part customers find hardest to reconstruct after the fact.
The provider's own finding identifier.
Truto's stable unified identifier for this object. Opaque; use provider_ref to address the object in the provider's own console or API.
The provider's own type string, unmodified -- for example 'AWS::S3::Bucket', 'aws_iam_role', 'Microsoft.Sql/servers'. Used for display and drill-down.
Which cloud this object was read from.
awsazuregcp
The provider's own unbroken identifier, passed through verbatim -- a full ARN, resource id or self-link. Never truncated, prefixed or normalised. This is the customer-facing key used to find the object in the console.
Severity as the provider expresses it. On AWS GuardDuty this is a raw double with no label field in the API contract; the numeric-to-label banding is documented only in the user guide, so the raw number is carried here and any label is marked derived.
Human-readable title of the alert.
When the alert was last updated by the provider.
Repeat volume for this alert, so that one incident is opened per pattern rather than per event.
Where the object is. A compliance answer in its own right, not metadata. The literal string 'global' is emitted for genuinely global resources (for example IAM, or a GCP VPC network) rather than guessing a region. Never invented: where the provider does not return a location and none can be derived, the collector's queried region is used and that substitution is recorded in unreadable_fields.
Raw data returned from the remote API call.
The affected resource. On AWS there is no single path to this: resource.resourceType discriminates about twenty mutually exclusive sub-objects, some of them arrays, and accessKeyDetails carries no ARN at all. Where one finding affects several resources the primary is carried here and the rest remain in remote_data.
The provider's own type string for the affected resource.
Provider-supplied evidence for the alert. Deliberately typed as a free object: on AWS this is heterogeneous, scattered across several service.action.* shapes and service.detection.*, and is not a structured contract.
Whether the alert is live or has been archived. On AWS there is no state field; this is derived from service.archived, which is itself optional, so unknown is a real outcome.
activearchivedresolvedunknown
Key-value pairs exactly as the customer set them: no case folding, no key or value normalisation, no merging of separate provider concepts. Present on every object because tags are the primary input for environment classification. An empty object means the object carries no tags; tags that could not be read are recorded in unreadable_fields instead.
The provider's own finding type string, for example 'UnauthorizedAccess:EC2/SSHBruteForce'. Also the fallback for title, which is optional on AWS.
Per-object list of the fields that could not be read, and why -- the brief section 8.4 answer, chosen over per-field sentinel values. Each entry is an object with 'field' (the property name on this resource), 'reason' (a reason code) and an optional human-readable 'detail'. Reason codes: not_supported_by_provider, not_configured, permission_denied, not_collected, collection_error, partially_collected. An empty array means every property on this object was read successfully. A property absent from this array and null in the payload means the provider genuinely returned no value, which is different from 'we could not look'.