
Security Reporter
Penetration Testing- Overview
- Setup
- Data & mappings
- Operations & API
- Changelog
Security Reporter is a pentest reporting and collaboration platform published by DongIT. Security teams use it to run offensive-security engagements — assessments against a client's targets — and to record, review, and report the findings those engagements produce. The connector supports customers who use Security Reporter for their offensive-security / pen-testing services.
The connector reads from the tenant's Security Reporter REST API and synchronizes clients, targets,
assessments, pentest findings, finding definitions, and users into Brinqa. Targets are split across
nine asset models according to the vendor's target_type, so each one lands on the UDM model that
fits it.
Data retrieved from Security Reporter
| Connector Object | Required | Maps to Data Model |
|---|---|---|
| Client | Yes | Team |
| Host | Yes | Host |
| Site | Yes | Site |
| Api Endpoint | Yes | Api Endpoint |
| Application | Yes | Application |
| Device | Yes | Device |
| Network | Yes | Network |
| Cloud Resource | Yes | Cloud Resource |
| Code Repository | Yes | Code Repository |
| Other Target | Yes | Host |
| Assessment | Yes | Assessment |
| Pentest Finding | Yes | Pentest Finding |
| Pentest Finding Definition | Yes | Pentest Finding Definition |
| User | Yes | Person |
Model relationships
For detailed steps on how to view the data retrieved from Security Reporter in the Brinqa Platform, see How to view your data.
Security Reporter's Client is the customer an engagement was performed for — the pentest
provider's client, not a technical concept. The Client model, and the
Pentest Finding → Assessment → Client chain on RELATES_TO, are what make it possible to scope
a view to one customer.
Every target model narrows the endpoint server-side, so a target_type the API introduces in
future is claimed by no model and will not sync until it is added to TargetType. This is a
deliberate trade-off: the alternative is an unfiltered full scan of the targets table on every
sync. New enum values are rare and adding one is a one-line change. An integration test pins the
behaviour so it cannot change silently.
Every edge above is emitted by the connector today. Pentest Finding → Assessment → Client is the
chain that makes a client-scoped view possible; the Assessment → Assessment self-edge is
DUPLICATED_FROM, the engagement a retest was copied from. Findings link to their targets through
TARGETS, to their definition through TYPE, and to the reviewing user through REVIEWED_BY.
Connection settings
When setting up a data integration, select Security Reporter from the Connector dropdown and provide the following:
| Setting | Required | Default | Description |
|---|---|---|---|
| API URL | Yes | — | Base URL of your Security Reporter instance, for example https://your-workspace.securityreporter.app |
| API token | Yes | — | Security Reporter API token, generated under your user profile in the Security Reporter portal |
| Page size | No | 100 | Number of records to get per API request. Maximum allowed value 100 |
| Parallel requests | No | min(4, available processors) | Maximum number of parallel API requests |
| Max retries | No | 10 | Maximum number of retries permitted during a request. The default value is 10. |
| Request timeout (secs) | No | 120 | Maximum seconds allotted before a request will time out. Maximum allowed value 1800 |
Authentication
Method
Bearer token (API key). The token is generated in the Security Reporter portal and supplied to the
connector as the apiToken configuration property.
Endpoint
Security Reporter is tenant hosted, so there is no shared API host. Every request goes to the
customer's own instance under the /api/v1 prefix:
| Method | URL |
|---|---|
GET | <url>/api/v1/api-tokens |
There is no separate token-exchange call — the API key is a long-lived credential sent on every request.
Request Headers
| Header | Value |
|---|---|
Authorization | Bearer <apiToken> |
Accept | application/json |
Content-Type | application/json |
Usage
SecurityReporterConnector.setHeaders(...) attaches the three headers above to every outbound
request, and SecurityReporterConnector.get(...) prefixes each relative path with api/v1, so model
code passes bare resource names (clients, assessments, findings).
The connection test issues GET /api/v1/api-tokens?page[number]=1 and fails the test if the response
is not a 2xx. The endpoint is a good probe because it requires nothing but a valid token — a working
token returns its own record, including the abilities it was granted:
{
"data": [
{
"id": 3,
"name": "Brinqa Dev Token",
"abilities": ["api_token:read", "assessment:read", "client:read", "finding:read", "target:read"],
"expires_at": "2027-08-12T19:44:00.000000Z"
}
],
"links": { "first": "...", "last": "...", "prev": null, "next": null },
"meta": { "current_page": 1, "last_page": 1, "per_page": 30, "total": 1 }
}
A rejected token returns 401 with the message the connector surfaces verbatim:
{
"message": "Unauthenticated."
}
Pagination
Every index route is paginated. Records are returned under data, with links and a meta block
carrying current_page, last_page, per_page, and total.
| Parameter | Description |
|---|---|
page[number] | Page to request, 1-based |
page[size] | Records per page — API default 30, maximum 100 |
The connector sends both: page[size] from the configured pageSize (rejected at validation if set
above 100) and page[number] per request. SecurityReporterModel.forEach(...) fetches and handles
page 1 sequentially, reads meta.last_page to learn the page count, then fetches the remaining pages
in parallel (bounded by parallelismLevel). Any page error fails the sync rather than silently
truncating the result set.
Sync Behavior
Every model syncs incrementally. Each one applies the since sync token as
filter[updated_at_after]=<since as ISO-8601 UTC>, so a run after the first fetches only records
changed since the previous run; a run with no token is a full sync. Each model's
#### Sync Duration Parameter below is authoritative for that model.
How to obtain Security Reporter credentials
Obtain the required credentials (url, apiToken) from your Security Reporter administrator or the Security Reporter admin console, then enter them in the connection settings above.
The docs list created_at_after / updated_at_after as allowed filter fields but do not state the
accepted date format. The connector sends ISO-8601 UTC (2026-08-24T19:08:10Z), which is the
Laravel convention and matches the format the API returns — see
SecurityReporterModel.formatFilterInstant(...). If a filter turns out to be rejected the sync
fails loudly; if it is silently ignored the model degrades to a full sync. Worth confirming against
a live instance.
Attribute mappings
Expand the sections below to view the mappings between the source and the Brinqa data model attributes:
Client
| Source Field Name | SDM Attribute |
|---|---|
ClientResource.created_at | SOURCE_CREATED_DATE |
ClientResource.description | DESCRIPTION |
ClientResource.id | UID |
ClientResource.local_short_id | LOCAL_SHORT_ID |
ClientResource.name | NAME |
ClientResource.short_id | SHORT_ID |
ClientResource.tags | TAGS |
ClientResource.updated_at | SOURCE_LAST_MODIFIED |
ClientResource.website | URL |
| sync timestamp | LAST_CAPTURED |
Host
| Source Field Name | SDM Attribute |
|---|---|
derived from TargetResource.target_type | CATEGORIES |
| sync timestamp | LAST_CAPTURED |
TargetResource.assessment_id | RELATES_TO |
TargetResource.business_impact | BUSINESS_IMPACT |
TargetResource.created_at | SOURCE_CREATED_DATE |
TargetResource.description | DESCRIPTION |
TargetResource.description_url | SOURCE_URL |
TargetResource.details | DETAILS |
TargetResource.id | UID |
TargetResource.ip_information | IP_ADDRESSES |
TargetResource.name | NAME |
TargetResource.name_url, falling back to description_url | URL |
TargetResource.order | REPORT_ORDER |
TargetResource.target_type | TARGET_TYPE |
TargetResource.updated_at | SOURCE_LAST_MODIFIED |
| — | STATUS |
Site
| Source Field Name | SDM Attribute |
|---|---|
derived from TargetResource.target_type | CATEGORIES |
| sync timestamp | LAST_CAPTURED |
TargetResource.assessment_id | RELATES_TO |
TargetResource.business_impact | BUSINESS_IMPACT |
TargetResource.created_at | SOURCE_CREATED_DATE |
TargetResource.description | DESCRIPTION |
TargetResource.description_url | SOURCE_URL |
TargetResource.details | DETAILS |
TargetResource.id | UID |
TargetResource.ip_information | IP_ADDRESSES |
TargetResource.name | NAME |
TargetResource.name_url, falling back to description_url | URL |
TargetResource.order | REPORT_ORDER |
TargetResource.target_type | TARGET_TYPE |
TargetResource.updated_at | SOURCE_LAST_MODIFIED |
| — | STATUS |
Api Endpoint
| Source Field Name | SDM Attribute |
|---|---|
derived from TargetResource.target_type | CATEGORIES |
| sync timestamp | LAST_CAPTURED |
TargetResource.assessment_id | RELATES_TO |
TargetResource.business_impact | BUSINESS_IMPACT |
TargetResource.created_at | SOURCE_CREATED_DATE |
TargetResource.description | DESCRIPTION |
TargetResource.description_url | SOURCE_URL |
TargetResource.details | DETAILS |
TargetResource.id | UID |
TargetResource.ip_information | IP_ADDRESSES |
TargetResource.name | NAME |
TargetResource.name_url, falling back to description_url | URL |
TargetResource.order | REPORT_ORDER |
TargetResource.target_type | TARGET_TYPE |
TargetResource.updated_at | SOURCE_LAST_MODIFIED |
| — | STATUS |
Application
| Source Field Name | SDM Attribute |
|---|---|
derived from TargetResource.target_type | CATEGORIES |
| sync timestamp | LAST_CAPTURED |
TargetResource.assessment_id | RELATES_TO |
TargetResource.business_impact | BUSINESS_IMPACT |
TargetResource.created_at | SOURCE_CREATED_DATE |
TargetResource.description | DESCRIPTION |
TargetResource.description_url | SOURCE_URL |
TargetResource.details | DETAILS |
TargetResource.id | UID |
TargetResource.ip_information | IP_ADDRESSES |
TargetResource.name | NAME |
TargetResource.name_url, falling back to description_url | URL |
TargetResource.order | REPORT_ORDER |
TargetResource.target_type | TARGET_TYPE |
TargetResource.updated_at | SOURCE_LAST_MODIFIED |
| — | STATUS |
Device
| Source Field Name | SDM Attribute |
|---|---|
derived from TargetResource.target_type | CATEGORIES |
| sync timestamp | LAST_CAPTURED |
TargetResource.assessment_id | RELATES_TO |
TargetResource.business_impact | BUSINESS_IMPACT |
TargetResource.created_at | SOURCE_CREATED_DATE |
TargetResource.description | DESCRIPTION |
TargetResource.description_url | SOURCE_URL |
TargetResource.details | DETAILS |
TargetResource.id | UID |
TargetResource.ip_information | IP_ADDRESSES |
TargetResource.name | NAME |
TargetResource.name_url, falling back to description_url | URL |
TargetResource.order | REPORT_ORDER |
TargetResource.target_type | TARGET_TYPE |
TargetResource.updated_at | SOURCE_LAST_MODIFIED |
| — | STATUS |
Network
| Source Field Name | SDM Attribute |
|---|---|
derived from TargetResource.target_type | CATEGORIES |
| sync timestamp | LAST_CAPTURED |
TargetResource.assessment_id | RELATES_TO |
TargetResource.business_impact | BUSINESS_IMPACT |
TargetResource.created_at | SOURCE_CREATED_DATE |
TargetResource.description | DESCRIPTION |
TargetResource.description_url | SOURCE_URL |
TargetResource.details | DETAILS |
TargetResource.id | UID |
TargetResource.ip_information | IP_ADDRESSES |
TargetResource.name | NAME |
TargetResource.name_url, falling back to description_url | URL |
TargetResource.order | REPORT_ORDER |
TargetResource.target_type | TARGET_TYPE |
TargetResource.updated_at | SOURCE_LAST_MODIFIED |
| — | STATUS |
Cloud Resource
| Source Field Name | SDM Attribute |
|---|---|
derived from TargetResource.target_type | CATEGORIES |
| sync timestamp | LAST_CAPTURED |
TargetResource.assessment_id | RELATES_TO |
TargetResource.business_impact | BUSINESS_IMPACT |
TargetResource.created_at | SOURCE_CREATED_DATE |
TargetResource.description | DESCRIPTION |
TargetResource.description_url | SOURCE_URL |
TargetResource.details | DETAILS |
TargetResource.id | UID |
TargetResource.ip_information | IP_ADDRESSES |
TargetResource.name | NAME |
TargetResource.name_url, falling back to description_url | URL |
TargetResource.order | REPORT_ORDER |
TargetResource.target_type | TARGET_TYPE |
TargetResource.updated_at | SOURCE_LAST_MODIFIED |
| — | STATUS |
Code Repository
| Source Field Name | SDM Attribute |
|---|---|
derived from TargetResource.target_type | CATEGORIES |
| sync timestamp | LAST_CAPTURED |
TargetResource.assessment_id | RELATES_TO |
TargetResource.business_impact | BUSINESS_IMPACT |
TargetResource.created_at | SOURCE_CREATED_DATE |
TargetResource.description | DESCRIPTION |
TargetResource.description_url | SOURCE_URL |
TargetResource.details | DETAILS |
TargetResource.id | UID |
TargetResource.ip_information | IP_ADDRESSES |
TargetResource.name | NAME |
TargetResource.name_url, falling back to description_url | URL |
TargetResource.order | REPORT_ORDER |
TargetResource.target_type | TARGET_TYPE |
TargetResource.updated_at | SOURCE_LAST_MODIFIED |
| — | STATUS |
Other Target
| Source Field Name | SDM Attribute |
|---|---|
derived from TargetResource.target_type | CATEGORIES |
| sync timestamp | LAST_CAPTURED |
TargetResource.assessment_id | RELATES_TO |
TargetResource.business_impact | BUSINESS_IMPACT |
TargetResource.created_at | SOURCE_CREATED_DATE |
TargetResource.description | DESCRIPTION |
TargetResource.description_url | SOURCE_URL |
TargetResource.details | DETAILS |
TargetResource.id | UID |
TargetResource.ip_information | IP_ADDRESSES |
TargetResource.name | NAME |
TargetResource.name_url, falling back to description_url | URL |
TargetResource.order | REPORT_ORDER |
TargetResource.target_type | TARGET_TYPE |
TargetResource.updated_at | SOURCE_LAST_MODIFIED |
| — | STATUS |
Assessment
| Source Field Name | SDM Attribute |
|---|---|
AssessmentResource.assessment_template_name | ASSESSMENT_TEMPLATE |
AssessmentResource.classifications | CLASSIFICATIONS |
AssessmentResource.client_id | RELATES_TO |
AssessmentResource.completed_date | LAST_ASSESSED |
AssessmentResource.created_at | SOURCE_CREATED_DATE |
AssessmentResource.description | DESCRIPTION |
AssessmentResource.duplicated_from | DUPLICATED_FROM |
AssessmentResource.id | UID |
AssessmentResource.internal_details | INTERNAL_DETAILS |
AssessmentResource.language_id | LANGUAGE |
AssessmentResource.local_short_id | LOCAL_SHORT_ID |
AssessmentResource.next_deadline | NEXT_DEADLINE |
AssessmentResource.on_hold | ON_HOLD |
AssessmentResource.researcher_briefing | RESEARCHER_BRIEFING |
AssessmentResource.researcher_research_hours | RESEARCH_HOURS |
AssessmentResource.restrict_findings_to_users | FINDING_VISIBILITY |
AssessmentResource.scoring_system | SCORING_SYSTEM |
AssessmentResource.shared_information | SHARED_INFORMATION |
AssessmentResource.short_id | SHORT_ID |
AssessmentResource.status | STATUS |
AssessmentResource.tags | TAGS |
AssessmentResource.title | NAME |
AssessmentResource.title_with_date | TITLE_WITH_DATE |
AssessmentResource.total_research_hours | TOTAL_RESEARCH_HOURS |
AssessmentResource.updated_at | SOURCE_LAST_MODIFIED |
derived from AssessmentResource.status | STATUS_CATEGORY |
| sync timestamp | LAST_CAPTURED |
Pentest Finding
| Source Field Name | SDM Attribute |
|---|---|
| derived from severity | SEVERITY |
| derived from SEVERITY | SEVERITY_SCORE |
| derived from SOURCE_STATUS | STATUS |
| derived from status, overridden by severity | SOURCE_STATUS |
FindingResource.action | ACTION |
FindingResource.assessment_id | RELATES_TO |
FindingResource.classification_categories.CAPEC | CAPEC_CATEGORIES |
FindingResource.classification_categories.CWE | CWE_CATEGORIES |
FindingResource.classification_categories.VRT | VRT_CATEGORY |
FindingResource.classifications.CAPEC | CAPEC_IDS |
FindingResource.classifications.CWE | CWE_IDS, WEAKNESSES |
FindingResource.classifications.VRT | VRT_ID |
FindingResource.complexity | COMPLEXITY |
FindingResource.created_at | SOURCE_CREATED_DATE |
FindingResource.description | DESCRIPTION |
FindingResource.finding_template_id, else derived from title | TYPE |
FindingResource.found_at | FIRST_FOUND |
FindingResource.has_todo | HAS_TODO |
FindingResource.id | UID |
FindingResource.is_published | IS_PUBLISHED |
FindingResource.is_vulnerability | IS_VULNERABILITY |
FindingResource.number | FINDING_NUMBER |
FindingResource.original_is_vulnerability | ORIGINAL_IS_VULNERABILITY |
FindingResource.original_severity | ORIGINAL_SEVERITY |
FindingResource.original_severity_metrics.cvss_string | ORIGINAL_CVSS_VECTOR |
FindingResource.original_severity_metrics.scoring_system | ORIGINAL_SCORING_SYSTEM |
FindingResource.original_severity_score | ORIGINAL_SEVERITY_SCORE |
FindingResource.original_status | ORIGINAL_STATUS |
FindingResource.priority | PRIORITY |
FindingResource.proof | PROOF |
FindingResource.published_at | PUBLISHED_DATE |
FindingResource.recommendation | RECOMMENDATION |
FindingResource.references | REFERENCES |
FindingResource.remediation_status | REMEDIATION_STATUS |
FindingResource.resolved_at | LAST_FIXED |
FindingResource.review_status | REVIEW_STATUS |
FindingResource.reviewed_at | REVIEWED_DATE |
FindingResource.reviewed_by_user_id | REVIEWED_BY |
FindingResource.risk | RISK |
FindingResource.severity | SOURCE_SEVERITY |
FindingResource.severity_metrics.cvss_string | CVSS_V2_, CVSS_V3_, CVSS_V4_* |
FindingResource.severity_metrics.impact | OWASP_IMPACT |
FindingResource.severity_metrics.likelihood | OWASP_LIKELIHOOD |
FindingResource.severity_metrics.scoring_system | SCORING_SYSTEM |
FindingResource.severity_score | SOURCE_SEVERITY_SCORE |
FindingResource.short_id | SHORT_ID |
FindingResource.status | PROVIDER_STATUS |
FindingResource.targets[].id | TARGETS |
FindingResource.title | NAME |
FindingResource.updated_at | SOURCE_LAST_MODIFIED |
FindingResource.user_id | OWNER |
| sync timestamp | LAST_CAPTURED |
Pentest Finding Definition
| Source Field Name | SDM Attribute |
|---|---|
derived from classifications.VRT / classification_categories.VRT, else first segment of VRT_ID | VRT_CATEGORY |
| derived from severity | SEVERITY |
| derived from SEVERITY | SEVERITY_SCORE |
FindingTemplateResource.action / FindingResource.action | ACTION |
FindingTemplateResource.classifications.CAPEC / FindingResource.classifications.CAPEC | CAPEC_IDS |
FindingTemplateResource.classifications.CWE / FindingResource.classifications.CWE | CWE_IDS, WEAKNESSES |
FindingTemplateResource.classifications.VRT / FindingResource.classifications.VRT | VRT_ID |
FindingTemplateResource.complexity / FindingResource.complexity | COMPLEXITY |
FindingTemplateResource.created_at / — | SOURCE_CREATED_DATE |
FindingTemplateResource.description / FindingResource.description | DESCRIPTION |
FindingTemplateResource.id / title: + FindingResource.title | UID |
FindingTemplateResource.is_vulnerability / FindingResource.is_vulnerability | IS_VULNERABILITY |
FindingTemplateResource.last_used_at / — | LAST_USED |
FindingTemplateResource.primary_language_id / — | PRIMARY_LANGUAGE |
FindingTemplateResource.priority / FindingResource.priority | PRIORITY |
FindingTemplateResource.proof / — | PROOF |
FindingTemplateResource.recommendation / FindingResource.recommendation | RECOMMENDATION |
FindingTemplateResource.references / FindingResource.references | REFERENCES |
FindingTemplateResource.risk / FindingResource.risk | RISK |
FindingTemplateResource.severity / FindingResource.severity | SOURCE_SEVERITY |
FindingTemplateResource.severity_metrics_all.*.cvss_string / FindingResource.severity_metrics.cvss_string | CVSS_V2_, CVSS_V3_, CVSS_V4_* |
FindingTemplateResource.severity_score / FindingResource.severity_score | SOURCE_SEVERITY_SCORE |
FindingTemplateResource.source / constant Custom | CATEGORIES |
FindingTemplateResource.source / constant Custom | TEMPLATE_SOURCE |
FindingTemplateResource.tags / — | TAGS |
FindingTemplateResource.title / FindingResource.title | NAME |
FindingTemplateResource.updated_at / — | SOURCE_LAST_MODIFIED |
FindingTemplateResource.weight / — | WEIGHT |
| sync timestamp | LAST_CAPTURED |
— / FindingResource.classification_categories.* | CWE_CATEGORIES, CAPEC_CATEGORIES |
— / FindingResource.severity_metrics.impact | OWASP_IMPACT |
— / FindingResource.severity_metrics.likelihood | OWASP_LIKELIHOOD |
— / FindingResource.severity_metrics.scoring_system | SCORING_SYSTEM |
User
| Source Field Name | SDM Attribute |
|---|---|
| sync timestamp | LAST_CAPTURED |
UserResource.created_at | SOURCE_CREATED_DATE |
UserResource.email | |
UserResource.email | EMAILS |
UserResource.first_name | FIRST_NAME |
UserResource.first_name + last_name | NAME |
UserResource.id | UID |
UserResource.job_title | JOB_TITLE |
UserResource.last_name | LAST_NAME |
UserResource.linkedin | |
UserResource.location | LOCATION |
UserResource.phone, mobile | PHONE_NUMBERS |
UserResource.prefix | NAME_PREFIX |
UserResource.schedule_export_enabled | SCHEDULE_EXPORT_ENABLED |
UserResource.status | STATUS |
UserResource.suffix | NAME_SUFFIX |
UserResource.timezone | TIMEZONE |
UserResource.updated_at | SOURCE_LAST_MODIFIED |
Operations & API
Expand each connector object to see its operation options, delta-sync behavior, and the API it uses. See connector operation options for how to apply operation options (keys and values are case-sensitive).
Client
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/clients - Default filters: none
- Records are sorted by
idrather than the API default of-created_at.forEachfetches pages in parallel, so an unstable sort order would shift every subsequent page whenever a record is created mid-sync, duplicating or skipping records.idis immutable, so the ordering holds. CATEGORIESandSTATUSare not mapped. A client is an organizational entity rather than an asset, and the API exposes no status field for it.
A Security Reporter target is any item in the scope of an assessment, and target_type spans subjects
Brinqa models very differently — a Server is a Host, a Website is a Site, Source Code is a
CodeRepository. The connector therefore splits GET /api/v1/targets across the nine models below,
each claiming the target types that map to its own UDM model and narrowing the endpoint with
filter[target_type], which accepts a comma-separated list.
> [!CAUTION]
> Every target model narrows the endpoint server-side, so a target_type the API introduces in
> future is claimed by no model and will not sync until it is added to TargetType. This is a
> deliberate trade-off: the alternative is an unfiltered full scan of the targets table on every
> sync. New enum values are rare and adding one is a one-line change. An integration test pins the
> behaviour so it cannot change silently.
Host
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/targets - Default filters:
filter[target_type]=0,8,9
credentialsis deliberately not synced. The API returns plaintext usernames and passwords for a target when the token has the rights to see them. The field is modelled onTargetResourceso the omission is explicit, but it is never mapped onto an attribute — credentials do not belong in the asset inventory. An integration test asserts no attribute carries the value.URLfalls back todescription_url. The documented home for a target's URL isname_url, but it isnullon every record observed on a live instance, withdescription_urlcarrying the real URL instead. The connector prefersname_urland falls back, soURLis populated either way.- Targets are scoped to a single assessment, so the same real-world asset tested across several
assessments arrives as several targets with distinct
idvalues. OnlyUIDis registered as an identifier, so these are not consolidated.
Site
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/targets - Default filters:
filter[target_type]=1
credentialsis deliberately not synced. The API returns plaintext usernames and passwords for a target when the token has the rights to see them. The field is modelled onTargetResourceso the omission is explicit, but it is never mapped onto an attribute — credentials do not belong in the asset inventory. An integration test asserts no attribute carries the value.URLfalls back todescription_url. The documented home for a target's URL isname_url, but it isnullon every record observed on a live instance, withdescription_urlcarrying the real URL instead. The connector prefersname_urland falls back, soURLis populated either way.- Targets are scoped to a single assessment, so the same real-world asset tested across several
assessments arrives as several targets with distinct
idvalues. OnlyUIDis registered as an identifier, so these are not consolidated.
Api Endpoint
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/targets - Default filters:
filter[target_type]=2
credentialsis deliberately not synced. The API returns plaintext usernames and passwords for a target when the token has the rights to see them. The field is modelled onTargetResourceso the omission is explicit, but it is never mapped onto an attribute — credentials do not belong in the asset inventory. An integration test asserts no attribute carries the value.URLfalls back todescription_url. The documented home for a target's URL isname_url, but it isnullon every record observed on a live instance, withdescription_urlcarrying the real URL instead. The connector prefersname_urland falls back, soURLis populated either way.- Targets are scoped to a single assessment, so the same real-world asset tested across several
assessments arrives as several targets with distinct
idvalues. OnlyUIDis registered as an identifier, so these are not consolidated.
Application
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/targets - Default filters:
filter[target_type]=3,4,24,25,26
credentialsis deliberately not synced. The API returns plaintext usernames and passwords for a target when the token has the rights to see them. The field is modelled onTargetResourceso the omission is explicit, but it is never mapped onto an attribute — credentials do not belong in the asset inventory. An integration test asserts no attribute carries the value.URLfalls back todescription_url. The documented home for a target's URL isname_url, but it isnullon every record observed on a live instance, withdescription_urlcarrying the real URL instead. The connector prefersname_urland falls back, soURLis populated either way.- Targets are scoped to a single assessment, so the same real-world asset tested across several
assessments arrives as several targets with distinct
idvalues. OnlyUIDis registered as an identifier, so these are not consolidated.
Device
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/targets - Default filters:
filter[target_type]=5,10,11,12,13,14,15,16,23
credentialsis deliberately not synced. The API returns plaintext usernames and passwords for a target when the token has the rights to see them. The field is modelled onTargetResourceso the omission is explicit, but it is never mapped onto an attribute — credentials do not belong in the asset inventory. An integration test asserts no attribute carries the value.URLfalls back todescription_url. The documented home for a target's URL isname_url, but it isnullon every record observed on a live instance, withdescription_urlcarrying the real URL instead. The connector prefersname_urland falls back, soURLis populated either way.- Targets are scoped to a single assessment, so the same real-world asset tested across several
assessments arrives as several targets with distinct
idvalues. OnlyUIDis registered as an identifier, so these are not consolidated.
Network
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/targets - Default filters:
filter[target_type]=18,28
credentialsis deliberately not synced. The API returns plaintext usernames and passwords for a target when the token has the rights to see them. The field is modelled onTargetResourceso the omission is explicit, but it is never mapped onto an attribute — credentials do not belong in the asset inventory. An integration test asserts no attribute carries the value.URLfalls back todescription_url. The documented home for a target's URL isname_url, but it isnullon every record observed on a live instance, withdescription_urlcarrying the real URL instead. The connector prefersname_urland falls back, soURLis populated either way.- Targets are scoped to a single assessment, so the same real-world asset tested across several
assessments arrives as several targets with distinct
idvalues. OnlyUIDis registered as an identifier, so these are not consolidated.
Cloud Resource
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/targets - Default filters:
filter[target_type]=17
credentialsis deliberately not synced. The API returns plaintext usernames and passwords for a target when the token has the rights to see them. The field is modelled onTargetResourceso the omission is explicit, but it is never mapped onto an attribute — credentials do not belong in the asset inventory. An integration test asserts no attribute carries the value.URLfalls back todescription_url. The documented home for a target's URL isname_url, but it isnullon every record observed on a live instance, withdescription_urlcarrying the real URL instead. The connector prefersname_urland falls back, soURLis populated either way.- Targets are scoped to a single assessment, so the same real-world asset tested across several
assessments arrives as several targets with distinct
idvalues. OnlyUIDis registered as an identifier, so these are not consolidated.
Code Repository
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/targets - Default filters:
filter[target_type]=27
credentialsis deliberately not synced. The API returns plaintext usernames and passwords for a target when the token has the rights to see them. The field is modelled onTargetResourceso the omission is explicit, but it is never mapped onto an attribute — credentials do not belong in the asset inventory. An integration test asserts no attribute carries the value.URLfalls back todescription_url. The documented home for a target's URL isname_url, but it isnullon every record observed on a live instance, withdescription_urlcarrying the real URL instead. The connector prefersname_urland falls back, soURLis populated either way.- Targets are scoped to a single assessment, so the same real-world asset tested across several
assessments arrives as several targets with distinct
idvalues. OnlyUIDis registered as an identifier, so these are not consolidated.
Other Target
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/targets - Default filters:
filter[target_type]=6,7,19,20,21,22
- These targets are not hosts.
Hostis Brinqa's general-purpose asset model and is used here as the least-bad home for a grab bag of Other, Account, Physical, Company, Department and Organization. Revisit if any of these becomes common enough to deserve its own mapping. credentialsis deliberately not synced. The API returns plaintext usernames and passwords for a target when the token has the rights to see them. The field is modelled onTargetResourceso the omission is explicit, but it is never mapped onto an attribute — credentials do not belong in the asset inventory. An integration test asserts no attribute carries the value.URLfalls back todescription_url. The documented home for a target's URL isname_url, but it isnullon every record observed on a live instance, withdescription_urlcarrying the real URL instead. The connector prefersname_urland falls back, soURLis populated either way.- Targets are scoped to a single assessment, so the same real-world asset tested across several
assessments arrives as several targets with distinct
idvalues. OnlyUIDis registered as an identifier, so these are not consolidated.
Assessment
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/assessments - Default filters: none
researcher_account_detailsis deliberately not synced. Like the targetcredentialsfield it carries plaintext logins. Modelled onAssessmentResourceso the omission is explicit, never mapped, and an integration test asserts no attribute carries the value.- Report-rendering configuration is deliberately not mapped. Roughly fifteen fields — the
show_*andauto_generate_*toggles,schedule_color,theme_id,finding_layout_id,custom_short_id,include_short_id_in_finding_id,finding_number_digitsand the nestedresults_table_options— configure how the PDF report is rendered rather than describing the engagement. They are modelled onAssessmentResourcefor completeness but would add pure styling noise to every assessment in Brinqa. Say the word if any of them is wanted. completed_dateandnext_deadlineare date-only (2020-11-19) and resolve to midnight UTC.- An unrecognised
statuscode is logged and leavesSTATUS/STATUS_CATEGORYunset rather than dropping the assessment. RELATES_TOcarries the client and nothing else.duplicated_fromalso points at a real, synced object — the assessment this one was copied from — but putting both on the same untyped multivalued edge means a traversal from an assessment can land on either aClientor anotherAssessment. It has its ownDUPLICATED_FROMattribute instead, soPentest Finding → Assessment → Clientis unambiguous at every hop and the retest lineage is still captured.client_idis nullable. An assessment can exist with no client, in which case it carries noRELATES_TOat all and neither it nor its targets and findings have any path to a client. Worth knowing before building a report that assumes every record falls inside some client's scope.
Pentest Finding
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/findings - Default filters: none
-
include=targetsis mandatory. The finding object carries no target id of its own; the assets it was raised against arrive only through the include. Without itTARGETSwould be empty and no finding would link to an asset. -
False Positive is a severity in Security Reporter but a status in Brinqa. The
severityenum mixes real severities (Info…Critical) with states — Not Applicable, Unknown, OK, False Positive, Resolved. Those states setSEVERITYtononeso a dismissed finding is never ranked alongside a real one, and a severity ofFalse Positiveadditionally forcesSOURCE_STATUStofalse positive. Without that override a finding explicitly dismissed as a false positive would show as active. -
Status normalization is explicit, not inferred.
FindingUtils.normalizeFindingStatusknows "Unresolved" and "Resolved" but not "Partially Resolved", "Retest Pending" or "Unable to Verify", which would pass through unmapped. Each value therefore carries its BrinqaStatusValueson theFindingStatusenum. -
Every finding gets a
TYPE. Findings created from a template point at the template id. The rest — 15 of 24 on the reference instance — point attitle:<title>, matching the definition the Pentest Finding Definition model synthesizes for that title. -
remediation_statusis a second, client-reported status. Wherestatusis what the tester verified,remediation_statusis how far the client says they have got:Open,Planned,In Progress,On Hold,Accepted Risk,Resolved (Unverified),Retest Requested,Resolved. Codes0–5are set by a user directly;6and7are set by the platform's retest flow. The two axes disagree routinely — the reference instance has a finding the client reportsResolvedthat is stillPartially Resolvedafter retest — so the value is recorded on its own attribute and never promoted to the status, with one exception below. -
Accepted Risk is a remediation status in Security Reporter but a status in Brinqa. The vendor's
statusenum has no value for an accepted risk at all, so a risk the client has formally accepted would stayactiveforever. Aremediation_statusofAccepted Risktherefore forcesSOURCE_STATUStorisk accepted— the same shape of override as False Positive above. It does not apply to a finding the tester has already verified as fixed, which keepsfixed; a tester-verified state outranks a client-reported one. -
CVSS vectors are decomposed, not just stored.
CvssUtils.getCVSSMetrics(...)fromconnectors-modelparses the vector and populates the whole standard family — the vector, base / temporal / environmental / overall scores, the derived severity, and every individual metric (CVSS_V4_AV=NETWORK,CVSS_V4_AC=LOW, and so on, using full identifiers rather than the vector's abbreviations). It selects the attribute family from the vector's own version prefix, so v2, v3.x and v4.0 each land on their own attributes and a record scored under several systems keeps all of them. An unparseable vector is logged and skipped rather than throwing. -
The original CVSS vector is kept whole, not decomposed. Resolution wipes
severity_metricswhile leavingoriginal_severity_metricspopulated, so decomposing the original into the standard CVSS attributes would report a resolved finding as still carrying a live CVSS base score. It goes ontoORIGINAL_CVSS_VECTORas a plain vector instead, alongsideORIGINAL_SCORING_SYSTEM. -
scoring_systemis decoded to its label. The API returns raw codes (cvss_v3_1,owasp);ScoringSystemmaps them to the vendor's own wording (CVSS V3.1,OWASP) so the attribute reads like every other decoded enum in the connector. Unlike the other enums it is keyed by string, and a value the API adds later falls back to the raw code rather than being dropped. -
The parent taxonomy is kept apart from the specific one.
classification_categoriesholds the CWE pillars and CAPEC meta-patterns above the finding's own references — CWE-707 above CWE-89, for example. These are genuine CWE identifiers, but folding them intoCWE_IDSwould make a SQL injection finding also claim to be its whole pillar, diluting finding-to-weakness correlation. They get their own attributes instead, so the hierarchy stays available without costing precision. -
VRT_IDis the specific entry,VRT_CATEGORYthe parent. Security Reporter returns the full dotted VRT path inclassifications.VRTand just its first segment inclassification_categories.VRT; the two attributes mirror that split. The category is taken fromclassification_categorieswhen the API supplies it and otherwise derived from the first segment of the path, which is the same value. That fallback is what covers finding templates: a template carries classifications but noclassification_categoriesobject at all, so its VRT would otherwise have a path and no category. Neither attribute is populated on the reference instance — none of its 24 findings and none of its 410 finding templates carry a VRT key — so this mapping follows the documented example rather than observed data. -
number_digitsis modelled but not mapped — it is report formatting. -
RELATES_TOcarries the assessment and nothing else.assessment_section_idis available on the finding but is not emitted: the connector does not sync assessment sections, so it would be an edge pointing at no object in Brinqa, and the API exposes only the id with no section name to make it useful as a plain value either. Keeping the edge single-purpose also means a traversal from a finding always lands on anAssessment, and from there on itsClient. -
A finding is one object, not one per target.
TARGETSis multivalued and a finding scoped to three assets stays a single record, rather than fanning out into one record per asset the way a scanner connector such as Tenable does. That is deliberate: Security Reporter authors a finding once, with its ownidand report-facingshort_id, one reviewer and one publish state, and fanning out would replace that stable pair of identifiers with a synthesisedfindingId-targetIdcomposite. 21 of the 24 findings on the reference instance have exactly one target, so fan-out would mostly produce identical records. Findings also cross-reference each other by finding id (#finding:bcb0b1c4…), which assumes a one-to-one mapping.Note that an earlier version of this argument claimed fan-out would misattribute host-specific
proofto every target. That did not survive the data: all three multi-target findings on the reference instance are "CSP not implemented", whose proof is a host-agnostic screenshot. Testers scope one finding to several targets precisely when the issue is identical across them. -
The cost of that choice: partial remediation is recorded but not reflected in status. A finding fixed on one of three targets carries
RESOLVED_TARGETSnaming the fixed one, but its singleSOURCE_STATUSstill readsactiveagainst all three, because a Brinqa finding has one status. Revisit if real engagements turn out to involve many multi-target findings with staggered remediation; every finding observed on the reference instance had exactly one target.
Pentest Finding Definition
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/finding-templates - Default filters: none on the library pass;
filter[finding_template_id]=on the synthesis pass, whose empty value acts as an is-null filter so only template-less findings are fetched
- The UID is the template id, not anything derived from the title. Security Reporter already provides a stable identifier, and a finding's title can be edited away from its template's title, which would break the link. Note the id is an integer here, unlike the 32-character hex ids used elsewhere in the API.
- Definitions are also synthesized for findings written by hand. Most findings carry no
finding_template_id— 15 of 24 on the reference instance, collapsing to 5 distinct titles — and without this they would have no definition at all, losing definition-level severity and any grouping by finding type. After syncing the library this model makes a second pass overGET /api/v1/findings?filter[finding_template_id]=, where the empty value acts as an is-null filter so only the template-less findings are fetched, and emits one definition per distinct title. Those definitions usetitle:<title>as their UID — the same derivationPentestFindinguses forTYPE— and are categorisedCustom. The title is the natural key, so it is used directly rather than hashed: the value ends up on every such finding'sTYPE, and a readable one can be traced back to its definition by eye. Thetitle:prefix is what keeps it from colliding with a plain integer template id, which a finding titled410otherwise would. PROOFis not carried onto a synthesized definition. On a template it is a generic illustration and is usually null; on a finding it is the evidence from that specific test — a real request against a real host, session cookies and all. Copying one finding's evidence onto the definition would present it as the general description of the whole finding class.DESCRIPTION,RISKandRECOMMENDATIONare carried over, since they describe the class even when lightly edited for the instance.- Duplicated titles collapse to the most severe. The same title recurs across assessments, so findings are deduplicated by title and the highest severity wins — the definition is the authoritative severity for everything linked to it, and understating it is the worse error. Comparison is on the mapped Brinqa score, not the raw code, because the vendor's severity codes are not ordered by severity (3 is False Positive, 8 is Info).
- On a delta sync only recently-changed findings are seen. A definition's severity therefore reflects the most severe finding in that sync window, not across all time. In the edge case where a low-severity finding changes while a higher-severity one with the same title does not, the definition is briefly understated until the next full sync.
- A template is scored under several systems at once (
severity_metrics_all), so both the CVSS v3.1 and v4.0 vectors are recorded when present. translationsis modelled but not mapped — the response already renders the text fields in the requested language.
User
Operation options
This object does not support any operation options.
Delta sync
Supported. The connector performs an incremental (delta) sync via the since sync token, filtering on updated_at.
API
- Type: REST endpoint · Endpoint:
GET /api/v1/users - Default filters: none
- The
statusenum is only partly documented. The API docs give no value table; the only stated value is2(Blocked), from the note about disabling a user's access, and1is inferred from the example object being an ordinary active user. Any other code is logged and leavesSTATUSunset rather than being guessed at. - Prefix and suffix are kept out of
NAME. They are honorifics rather than part of the identity, soNAMEisfirst_name last_nameand the two are carried on their own attributes. A user with neither name part falls back to their email and then their id, so the object is never nameless. - Sorted by
idrather than the API default offirst_name,last_name, which is unstable whileforEachfetches pages in parallel — a rename mid-sync would shift every subsequent page. - Users cannot be deleted in Security Reporter, only blocked, so a
Personrecord synced once will keep appearing withSTATUSofBlockedrather than disappearing.
Changelog
The Security Reporter connector has undergone the following changes:
| Version | Description | Migration Steps |
|---|---|---|
| 3.0.0 | Overview The Security Reporter connector integrates with Security Reporter, a penetration-test reporting and collaboration platform, to synchronize the customers engagements are run for, the assets in their scope, the engagements themselves, and the findings they produce. Category: Penetration Testing Models | N/A |