common.skipToContent

API 참조

애플리케이션에 익명화 통합

프로그래밍 방식의 PII 감지 및 익명화를 위한 완전한 REST API입니다.


기본 URL

https://anonymize.today/api

모든 API 엔드포인트는 이 기본 URL을 기준으로 합니다. 예를 들어, 분석 엔드포인트는 https://anonymize.today/api/presidio/analyze.


인증

Bearer 토큰을 사용하여 API 요청 인증:

Authorization: Bearer YOUR_API_TOKEN

API 토큰 받기

  1. anonymize.today 계정에 로그인하세요
  2. 설정 → 계정 → API 토큰으로 이동하세요
  3. 새 토큰 생성 클릭
  4. 토큰을 복사하고 안전하게 저장하세요 (다시 표시되지 않습니다)

보안 주의사항

클라이언트 측 코드나 공개 저장소에 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 요청
Authentication3 requests/second5 requests
Analysis & Anonymization30 requests/second50 requests
Presets & Settings10 requests/second20 requests

요율 제한 시, API는 429 Too Many Requests와 함께 재시도 가능한 시간을 나타내는 Retry-After 헤더를 반환합니다.


핵심 엔드포인트

텍스트 분석

텍스트에서 PII 엔티티를 감지합니다. 감지된 엔티티의 위치와 유형을 반환합니다.

텍스트 익명화

다양한 연산자를 사용하여 감지된 PII 엔티티를 익명화합니다.

텍스트 복원

같은 암호화 키를 사용하여 암호화된 엔티티를 원래 값으로 복원합니다.


익명화 연산자

연산자설명가역적예시
replace자리 표시자로 교체NoJohn → [PERSON]
mask문자 부분 마스킹Nojohn@email.com → j***@email.com
redact완전히 제거NoJohn → (empty)
hash단방향 SHA-256 해시NoJohn → a3f2b1c4...
encryptAES-256-GCM 암호화YesJohn → [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개 언어를 지원합니다:

코드언어엔진
enEnglishspaCy
deGermanspaCy
esSpanishspaCy
frFrenchspaCy
itItalianspaCy
ptPortuguesespaCy
nlDutchspaCy
plPolishspaCy
ruRussianspaCy
jaJapanesespaCy
zhChinesespaCy
koKoreanspaCy
arArabicTransformer
hiHindiTransformer
trTurkishTransformer

추가 언어: 루마니아어, 그리스어, 크로아티아어, 슬로베니아어, 마케도니아어, 스웨덴어, 덴마크어, 노르웨이어, 핀란드어, 우크라이나어, 리투아니아어, 카탈로니아어


오류 처리

표준 HTTP 상태 코드:

상태의미설명
200OKRequest succeeded
201CreatedResource created successfully
400Bad Request400 - 잘못된 요청 (잘못된 매개변수)
401Unauthorized401 - 인증되지 않음 (잘못되었거나 누락된 토큰)
402Payment RequiredInsufficient tokens
403ForbiddenAccess denied to resource
404Not FoundResource not found
429Too Many Requests429 - 요율 제한 (요청이 너무 많음)
500Internal Error500 - 서버 오류 (지원팀에 문의)

오류 응답 형식

{
  "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월