민감 데이터 검사 기록 목록(List Scan Records) (V2)
특정 검사 구성의 기록을 페이지 단위로 조회합니다. scanConfigurationId는 반복 검사 또는 일회성 검사를 가리키며, 검사한 리소스가 속한 공간의 scopeRid도 필수입니다.
활성 여부 필터와 결과 상태 필터는 별도 매개변수입니다. 둘 다 생략하면 활성 검사와 완료된 검사를 모든 결과 상태에 대해 조회합니다. 첫 페이지에서는 pageToken을 생략하고 다음 응답의 nextPageToken을 쿼리 매개변수로 전달합니다.
이 엔드포인트는 미리보기 기능이며 언제든 변경되거나 제거될 수 있습니다. 사용하려면 preview=true를 지정합니다.
HTTP 요청
GET /api/v2/sds/scanConfigurations/{scanConfigurationId}/records
작업 식별자는 v2.listScanRecords입니다. OAuth2로 호출하는 타사 애플리케이션에는 api:sds-records-read 권한 범위가 필요합니다. 각 요청에 Authorization: Bearer <접근 토큰>을 전달합니다.
경로 매개변수
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
scanConfigurationId | string | 필수 | 검사 구성의 식별자입니다. 반복 검사와 일회성 검사 모두를 가리킬 수 있습니다. | ri.foundry-inference.main.auto-inference-config.7f99a5a0-7692-420f-a79c-53756c3e9259 |
쿼리 매개변수
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
scopeRid | string | 필수 | 검사한 리소스가 속한 공간입니다. | ri.compass.main.folder.833bc64a-f8fb-4ade-834e-6814242613ae |
scanRecordIsActiveFilter | enum | 선택 | 생략하면 활성 검사와 완료된 검사를 모두 반환합니다. 허용값: ALL_SCANS, ACTIVE_SCANS, COMPLETED_SCANS. | ALL_SCANS |
scanResultStatusFilter | enum | 선택 | 생략하면 검사 결과 상태에 관계없이 모든 기록을 반환합니다. 허용값: RUNNING, FAILED, SUCCEEDED_WITH_MATCHES, SUCCEEDED_WITHOUT_MATCHES, CANCELLED, UNPROCESSABLE_SKIPPED, NO_PERMISSION_SKIPPED, NO_NEW_DATA_SKIPPED. | SUCCEEDED_WITH_MATCHES |
pageSize | integer | 선택 | 요청할 페이지 크기입니다. | |
pageToken | string | 선택 | 페이지 조회를 시작할 위치입니다. 첫 요청에서는 생략하고, 다음 요청에서는 직전 응답의 nextPageToken을 pageToken으로 전달합니다. | |
preview | boolean | 선택 | 미리보기 기능 사용을 활성화합니다. | true |
요청 본문
요청 본문을 사용하지 않습니다.
응답
ListScanRecordsResponse는 선택적인 기록 목록 data와 다음 페이지 토큰을 반환합니다. 한 기록의 scanResult는 탐지 조건별 평가 결과입니다. 검출되지 않은 조건, 일치한 데이터셋 열과 미디어 항목 결과를 서로 다른 type으로 구분합니다.
검사 상태와 이 HTTP 요청의 성공 여부는 별개입니다. 예를 들어 NO_PERMISSION_SKIPPED는 기록된 검사의 결과이며 목록 요청의 HTTP 오류 코드가 아닙니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
data | list<ScanRecord> | 선택 | ||
nextPageToken | string | 선택 | 다음 페이지를 요청할 때 pageToken에 전달할 토큰입니다. 다음 토큰이 없으면 마지막 페이지입니다. |
data의 구조
배열 항목은 ScanRecord이며 자료형은 object입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
id | string | 필수 | 검사 기록의 식별자입니다. | a5621a18-0412-4304-8eb8-22de9bbeeffe |
scanConfigurationId | string | 필수 | 검사 구성의 식별자입니다. 반복 검사와 일회성 검사 모두를 가리킬 수 있습니다. | ri.foundry-inference.main.auto-inference-config.7f99a5a0-7692-420f-a79c-53756c3e9259 |
scannedResource | string | 필수 | 검사한 리소스입니다. | ri.foundry.main.dataset.437313ac-11dc-4e23-8c4c-3d510f1b10be |
branchId | string | 필수 | 검사한 브랜치입니다. | master |
transactionRid | string | 선택 | ||
startTime | string (date-time) | 필수 | 검사를 시작한 시각입니다. | 2026-03-16T18:51:00.527Z |
completedTime | string (date-time) | 선택 | 검사를 완료한 시각입니다. | 2026-03-16T18:51:04.218Z |
matchConditionRids | list<MatchConditionRid> | 선택 | ||
matchActionRids | list<MatchActionRid> | 선택 | ||
buildRid | string | 선택 | ||
status | enum | 필수 | 민감 데이터 검사의 결과 상태입니다. 허용값: RUNNING, FAILED, SUCCEEDED_WITH_MATCHES, SUCCEEDED_WITHOUT_MATCHES, CANCELLED, UNPROCESSABLE_SKIPPED, NO_PERMISSION_SKIPPED, NO_NEW_DATA_SKIPPED. | SUCCEEDED_WITH_MATCHES |
scanResult | list<MatchConditionOutcome> | 선택 | 응답 예시 참조 |
matchConditionRids의 구조
배열 항목은 MatchConditionRid이며 자료형은 string입니다.
탐지 조건의 RID입니다.
matchActionRids의 구조
배열 항목은 MatchActionRid이며 자료형은 string입니다.
탐지 대응의 RID입니다.
scanResult의 구조
배열 항목은 MatchConditionOutcome이며 자료형은 object입니다.
특정 탐지 조건을 평가한 결과입니다. 검사한 행 수와 검사 결과를 포함합니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
matchConditionRid | string | 필수 | 탐지 조건의 RID입니다. | ri.foundry-inference.main.match-condition.c12f6d47-197a-3f9a-ba1e-e1331133fa9e |
numberOfScannedRows | long | 필수 | ||
result | union<noMatch, datasetMatch, mediasetMatch> | 필수 | 특정 일치 조건의 검사 결과입니다. |
result의 구조
분기 noMatch
검사한 데이터에서 해당 조건이 검출되지 않았습니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 허용값: noMatch. | noMatch |
분기 datasetMatch
검사한 조건에 일치하는 항목을 찾았습니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 허용값: datasetMatch. | datasetMatch |
matchedColumns | list<ColumnMatch> | 선택 |
matchedColumns의 구조
배열 항목은 ColumnMatch이며 자료형은 object입니다.
검사 조건과 일치하는 행이 있는 열입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
columnName | string | 필수 | ||
numberOfMatchedRows | long | 필수 |
분기 mediasetMatch
검사 조건과 일치하는 미디어 항목이 있는 미디어 집합입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 허용값: mediasetMatch. | mediasetMatch |
numberOfMatchedMediaItems | long | 필수 | ||
examples | list<MediaMatchExample> | 선택 |
examples의 구조
배열 항목은 MediaMatchExample이며 자료형은 union<mediaItemExample>입니다.
검사 조건과 일치한 미디어 항목의 예시입니다.
분기 mediaItemExample
검사 조건과 일치한 미디어 항목의 예시입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
type | enum | 필수 | 허용값: mediaItemExample. | mediaItemExample |
mediaItemRid | string | 필수 |
가상 민감 데이터 검사 기록의 응답 예시입니다.
{
"data": [
{
"branchId": "master",
"matchActionRids": [
"ri.foundry-inference.main.inference-action.a3cff674-6303-4900-a0f6-3d3ea44bcdcc"
],
"completedTime": "2026-03-16T18:51:04.218Z",
"matchConditionRids": [
"ri.foundry-inference.main.match-condition.c12f6d47-197a-3f9a-ba1e-e1331133fa9e"
],
"startTime": "2026-03-16T18:51:00.527Z",
"id": "a5621a18-0412-4304-8eb8-22de9bbeeffe",
"scanResult": [
{
"matchConditionRid": "ri.foundry-inference.main.match-condition.c12f6d47-197a-3f9a-ba1e-e1331133fa9e",
"numberOfScannedRows": 15000,
"result": {
"type": "datasetMatch",
"matchedColumns": [
{
"columnName": "email_address",
"numberOfMatchedRows": 120
},
{
"columnName": "phone_number",
"numberOfMatchedRows": 45
}
]
}
},
{
"matchConditionRid": "ri.foundry-inference.main.match-condition.a1b2c3d4-5678-9abc-def0-1234567890ab",
"numberOfScannedRows": 15000,
"result": {
"type": "noMatch"
}
}
],
"scannedResource": "ri.foundry.main.dataset.437313ac-11dc-4e23-8c4c-3d510f1b10be",
"scanConfigurationId": "ri.foundry-inference.main.auto-inference-config.7f99a5a0-7692-420f-a79c-53756c3e9259",
"status": "SUCCEEDED_WITH_MATCHES"
}
],
"nextPageToken": "v1.QnVpbGQgdGhlIEZ1dHVyZTogaHR0cHM6Ly93d3cucGFsYW50aXIuY29tL2NhcmVlcnMvP2xldmVyLXNvdXJjZSU1YiU1ZD1BUElEb2NzI29wZW4tcG9zaXRpb25z"
}
개별 오류
| 오류 이름 | 오류 코드 | HTTP | 의미와 조건 | 추가 매개변수 |
|---|---|---|---|---|
ScanConfigurationNotFound | NOT_FOUND | 404 | 검사 구성을 찾을 수 없습니다. | scanConfigurationId |
요청 예제
FOUNDRY_HOST에는 https://를 제외한 Foundry 호스트를, FOUNDRY_TOKEN에는 유효한 토큰을 환경 변수로 제공합니다. 예시 식별자와 매개변수 값은 실제 작업 대상에 맞게 바꿉니다.
가상 검사 구성과 공간 범위를 사용하여 SUCCEEDED_WITH_MATCHES 기록을 조회하는 첫 페이지 예제입니다. 식별자와 필요한 상태 조건을 실제 대상에 맞게 바꿉니다.
cURL
curl \
-H "Authorization: Bearer ${FOUNDRY_TOKEN}" \
"https://${FOUNDRY_HOST}/api/v2/sds/scanConfigurations/ri.foundry-inference.main.auto-inference-config.7f99a5a0-7692-420f-a79c-53756c3e9259/records?scopeRid=ri.compass.main.folder.833bc64a-f8fb-4ade-834e-6814242613ae&scanRecordIsActiveFilter=ALL_SCANS&scanResultStatusFilter=SUCCEEDED_WITH_MATCHES&preview=true"
Python
Requests 라이브러리가 설치된 Python 환경에서 사용합니다.
import os
import requests
HOSTNAME = os.environ["FOUNDRY_HOST"]
TOKEN = os.environ["FOUNDRY_TOKEN"]
headers = {
"authorization": "Bearer {}".format(TOKEN)
}
response = requests.get('https://{}/api/v2/sds/scanConfigurations/ri.foundry-inference.main.auto-inference-config.7f99a5a0-7692-420f-a79c-53756c3e9259/records?scopeRid=ri.compass.main.folder.833bc64a-f8fb-4ade-834e-6814242613ae&scanRecordIsActiveFilter=ALL_SCANS&scanResultStatusFilter=SUCCEEDED_WITH_MATCHES&preview=true'.format(HOSTNAME), headers=headers)
print(response)
Java
Apache HttpClient 4.5 API와 try-with-resources를 사용합니다. 클래스 이름에 맞는 ListScanRecordsExample.java 파일에서 사용합니다.
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
public class ListScanRecordsExample {
public static void main(String[] args) throws Exception {
String HOSTNAME = System.getenv("FOUNDRY_HOST");
String TOKEN = System.getenv("FOUNDRY_TOKEN");
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpGet request = new HttpGet("https://" + HOSTNAME + "/api/v2/sds/scanConfigurations/ri.foundry-inference.main.auto-inference-config.7f99a5a0-7692-420f-a79c-53756c3e9259/records?scopeRid=ri.compass.main.folder.833bc64a-f8fb-4ade-834e-6814242613ae&scanRecordIsActiveFilter=ALL_SCANS&scanResultStatusFilter=SUCCEEDED_WITH_MATCHES&preview=true");
request.addHeader("authorization", String.format("Bearer %s", TOKEN));
try (CloseableHttpResponse response = httpClient.execute(request)) {
System.out.println(response);
}
}
}
}
JavaScript
fetch를 제공하는 Node.js 환경에서 사용합니다. 서비스 사용자 토큰을 브라우저로 전달하지 않습니다.
const HOSTNAME = process.env.FOUNDRY_HOST;
const TOKEN = process.env.FOUNDRY_TOKEN;
fetch(`https://${HOSTNAME}/api/v2/sds/scanConfigurations/ri.foundry-inference.main.auto-inference-config.7f99a5a0-7692-420f-a79c-53756c3e9259/records?scopeRid=ri.compass.main.folder.833bc64a-f8fb-4ade-834e-6814242613ae&scanRecordIsActiveFilter=ALL_SCANS&scanResultStatusFilter=SUCCEEDED_WITH_MATCHES&preview=true`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${TOKEN}`,
}
}).then((response) => {
console.log(response)
});
PowerShell
$ErrorActionPreference = 'Stop'
$TOKEN = $env:FOUNDRY_TOKEN
$HOSTNAME = $env:FOUNDRY_HOST
$headers = @{
"authorization" = "Bearer $TOKEN"
}
$response = Invoke-WebRequest -Uri "https://$HOSTNAME/api/v2/sds/scanConfigurations/ri.foundry-inference.main.auto-inference-config.7f99a5a0-7692-420f-a79c-53756c3e9259/records?scopeRid=ri.compass.main.folder.833bc64a-f8fb-4ade-834e-6814242613ae&scanRecordIsActiveFilter=ALL_SCANS&scanResultStatusFilter=SUCCEEDED_WITH_MATCHES&preview=true" `
-Headers $headers
$response.content