API 참조
애플리케이션에 익명화 통합
프로그래밍 방식의 PII 감지 및 익명화를 위한 완전한 REST API입니다.
기본 URL
https://anonymize.today/api모든 API 엔드포인트는 이 기본 URL을 기준으로 합니다. 예를 들어, 분석 엔드포인트는 https://anonymize.today/api/presidio/analyze.
인증
Bearer 토큰을 사용하여 API 요청 인증:
Authorization: Bearer YOUR_API_TOKENAPI 토큰 받기
- anonymize.today 계정에 로그인하세요
- 설정 → 계정 → API 토큰으로 이동하세요
- 새 토큰 생성 클릭
- 토큰을 복사하고 안전하게 저장하세요 (다시 표시되지 않습니다)
보안 주의사항
클라이언트 측 코드나 공개 저장소에 API 토큰을 노출하지 마세요. 환경 변수를 사용하고 서버 측 요청을 이용하세요.
요청의 토큰
TypeScript
const response = await fetch('https://anonymize.today/api/presidio/analyze', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.ANONYMIZE_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ text, entities }),
});Python
import os
import requests
headers = {
"Authorization": f"Bearer {os.environ['ANONYMIZE_API_TOKEN']}",
"Content-Type": "application/json"
}
response = requests.post(
"https://anonymize.today/api/presidio/analyze",
headers=headers,
json={"text": text, "entities": entities}
)cURL
curl -X POST https://anonymize.today/api/presidio/analyze \
-H "Authorization: Bearer $ANONYMIZE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"text": "John Doe works at Acme Corp", "entities": ["PERSON", "ORGANIZATION"]}'요율 제한
| 엔드포인트 유형 | 요율 제한 | 버스트 허용량: 10 요청 |
|---|---|---|
| Authentication | 3 requests/second | 5 requests |
| Analysis & Anonymization | 30 requests/second | 50 requests |
| Presets & Settings | 10 requests/second | 20 requests |
요율 제한 시, API는 429 Too Many Requests와 함께 재시도 가능한 시간을 나타내는 Retry-After 헤더를 반환합니다.
핵심 엔드포인트
텍스트 분석
텍스트에서 PII 엔티티를 감지합니다. 감지된 엔티티의 위치와 유형을 반환합니다.
텍스트 익명화
다양한 연산자를 사용하여 감지된 PII 엔티티를 익명화합니다.
텍스트 복원
같은 암호화 키를 사용하여 암호화된 엔티티를 원래 값으로 복원합니다.
익명화 연산자
| 연산자 | 설명 | 가역적 | 예시 |
|---|---|---|---|
| replace | 자리 표시자로 교체 | No | John → [PERSON] |
| mask | 문자 부분 마스킹 | No | john@email.com → j***@email.com |
| redact | 완전히 제거 | No | John → (empty) |
| hash | 단방향 SHA-256 해시 | No | John → a3f2b1c4... |
| encrypt | AES-256-GCM 암호화 | Yes | John → [ENC:...] |
연산자 구성
// Replace operator
{ "type": "replace", "new_value": "[PERSON]" }
// Mask operator
{
"type": "mask",
"masking_char": "*",
"chars_to_mask": 5,
"from_end": false
}
// Hash operator
{ "type": "hash", "hash_type": "sha256" }
// Encrypt operator (requires encryption key in user settings)
{ "type": "encrypt" }
// Redact operator
{ "type": "redact" }프리셋 API
엔티티 유형
anonymize.today는 10개 카테고리에서 256개 엔티티 유형을 지원합니다:
Personal
PERSON, EMAIL_ADDRESS, PHONE_NUMBER
Financial
CREDIT_CARD, IBAN_CODE, SWIFT_CODE, CRYPTO
Location
LOCATION, ADDRESS, COORDINATES
Government
SSN, PASSPORT, DRIVER_LICENSE, NATIONAL_ID
Contact
URL, DOMAIN_NAME
Technical
IP_ADDRESS, MAC_ADDRESS
Temporal
DATE_TIME, AGE
Organizational
ORGANIZATION, JOB_TITLE
Medical
MEDICAL_LICENSE, HEALTH_ID
Custom
User-defined patterns
프리셋 문서에서 엔티티 유형의 전체 목록을 확인하세요. Presets documentation.
지원되는 언어
API는 PII 인식을 위해 27개 언어를 지원합니다:
| 코드 | 언어 | 엔진 |
|---|---|---|
| en | English | spaCy |
| de | German | spaCy |
| es | Spanish | spaCy |
| fr | French | spaCy |
| it | Italian | spaCy |
| pt | Portuguese | spaCy |
| nl | Dutch | spaCy |
| pl | Polish | spaCy |
| ru | Russian | spaCy |
| ja | Japanese | spaCy |
| zh | Chinese | spaCy |
| ko | Korean | spaCy |
| ar | Arabic | Transformer |
| hi | Hindi | Transformer |
| tr | Turkish | Transformer |
추가 언어: 루마니아어, 그리스어, 크로아티아어, 슬로베니아어, 마케도니아어, 스웨덴어, 덴마크어, 노르웨이어, 핀란드어, 우크라이나어, 리투아니아어, 카탈로니아어
오류 처리
표준 HTTP 상태 코드:
| 상태 | 의미 | 설명 |
|---|---|---|
| 200 | OK | Request succeeded |
| 201 | Created | Resource created successfully |
| 400 | Bad Request | 400 - 잘못된 요청 (잘못된 매개변수) |
| 401 | Unauthorized | 401 - 인증되지 않음 (잘못되었거나 누락된 토큰) |
| 402 | Payment Required | Insufficient tokens |
| 403 | Forbidden | Access denied to resource |
| 404 | Not Found | Resource not found |
| 429 | Too Many Requests | 429 - 요율 제한 (요청이 너무 많음) |
| 500 | Internal Error | 500 - 서버 오류 (지원팀에 문의) |
오류 응답 형식
{
"error": {
"code": "INSUFFICIENT_TOKENS",
"message": "You need 5 tokens but only have 2 remaining",
"details": {
"required": 5,
"available": 2
}
}
}완전한 예제
TypeScript/Node.js
import fetch from 'node-fetch';
const API_BASE = 'https://anonymize.today/api';
const API_TOKEN = process.env.ANONYMIZE_API_TOKEN;
async function analyzeAndAnonymize(text: string) {
// Step 1: Analyze
const analyzeResponse = await fetch(`${API_BASE}/presidio/analyze`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
text,
entities: ['PERSON', 'EMAIL_ADDRESS', 'PHONE_NUMBER'],
language: 'en',
}),
});
const { results } = await analyzeResponse.json();
if (results.length === 0) {
return { text, anonymized: false };
}
// Step 2: Anonymize
const anonymizeResponse = await fetch(`${API_BASE}/presidio/anonymize`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
text,
analyzer_results: results,
anonymizers: {
DEFAULT: { type: 'replace', new_value: '[REDACTED]' },
},
}),
});
return anonymizeResponse.json();
}
// Usage
const result = await analyzeAndAnonymize('Contact John Doe at john@example.com');
console.log(result.text); // "Contact [REDACTED] at [REDACTED]"
Python
import os
import requests
API_BASE = "https://anonymize.today/api"
API_TOKEN = os.environ["ANONYMIZE_API_TOKEN"]
def analyze_and_anonymize(text: str) -> dict:
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
# Step 1: Analyze
analyze_response = requests.post(
f"{API_BASE}/presidio/analyze",
headers=headers,
json={
"text": text,
"entities": ["PERSON", "EMAIL_ADDRESS", "PHONE_NUMBER"],
"language": "en"
}
)
results = analyze_response.json()["results"]
if not results:
return {"text": text, "anonymized": False}
# Step 2: Anonymize
anonymize_response = requests.post(
f"{API_BASE}/presidio/anonymize",
headers=headers,
json={
"text": text,
"analyzer_results": results,
"anonymizers": {
"DEFAULT": {"type": "replace", "new_value": "[REDACTED]"}
}
}
)
return anonymize_response.json()
# Usage
result = analyze_and_anonymize("Contact John Doe at john@example.com")
print(result["text"]) # "Contact [REDACTED] at [REDACTED]"
Related Documentation
마지막 업데이트: 2026년 3월