Entity Enricher REST API를 사용하면 엔터티를 강화하고, 스키마를 관리하며, 레코드를 프로그래밍 방식으로 검색할 수 있습니다. 모든 응답은 JSON입니다. 실시간 진행 상황은 Server-Sent Events(SSE)를 사용합니다.
세 단계로 Entity Enricher를 통합합니다:
GET /api/schema/saved저장된 스키마를 나열하거나 샘플 데이터로부터 하나를 생성합니다
POST /api/single/enrich/stream강화를 시작하고 SSE 스트리밍용 작업 ID를 받으세요
GET /api/records/{id}구조화 출력과 함께 전체 enrichment record를 조회합니다
모든 API 엔드포인트(로그인/등록 제외)는 인증이 필요합니다. 조직 액세스 키와 함께 X-API-Key 헤더를 사용하세요:
curl -H "X-API-Key: ent_your_key_here" \
https://your-instance.example.com/api/enrichment/optionsAPI Keys 페이지 또는 POST /api/auth/api-keys를 통해 API key를 생성하세요. key 유형과 권한에 대한 자세한 내용은 API Keys 가이드를 참조하세요.
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/enrichment/options | 사용 가능한 model, 언어 및 전략 |
| POST | /api/single/enrich/stream | 단일 엔터티 강화 시작 (SSE용 job_id 반환) |
| POST | /api/single/enrich/sync | 비 SSE 클라이언트(Make.com, curl)를 위한 블로킹 단일 보강 |
| POST | /api/enrichment/batch/start | 여러 엔터티에 대한 배치 강화 시작 |
| POST | /api/enrichment/batch/fetch | 외부 URL에서 엔터티를 가져옵니다 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/llm/stream/{job_id} | 모든 LLM 작업(강화, 스키마, 융합)을 위한 SSE 스트림 |
| POST | /api/llm/cancel/{job_id} | 실행 중이거나 일시 중지된 작업을 취소합니다 |
| POST | /api/llm/continue/{job_id} | 일시 중지된 작업 재개(예: 분류 불일치 후) |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/schema/saved | 저장된 모든 스키마 목록 표시 |
| POST | /api/schema/saved | 새 schema 생성 |
| POST | /api/schema/generate/stream | 샘플 데이터에서 스키마 생성 (SSE) |
| POST | /api/schema/saved/{id}/prompt/stream | 자연어로 스키마 AI 편집 (SSE) |
| POST | /api/schema/analyze-sample | 샘플 JSON에서 모호한 속성 이름(상위 항목의 맥락에서 여러 가지로 해석되거나 전혀 해석되지 않는 이름)과, 엔티티 정보와 상위 항목별 정보가 섞인 관련 항목을 분석합니다(상태 비저장 보고서, 이름 변경 제안) |
| POST | /api/schema/saved/{id}/analyze | 저장된 스키마에 모호성 및 신원 범위 검사를 실행하고 그 주석(모호한 이름마다 다시 작성한 설명)을 기록합니다 |
| POST | /api/schema/scoping-split | 샘플 세트에 아이덴티티 스코핑 분할을 한 번 적용합니다 — 연관 엔터티 자체의 사실이 별도의 하위 객체로 이동합니다(결정적, 무료, 저장 없음) |
| DELETE | /api/schema/saved/{id}/enrichment-data | schema의 enrichment 데이터 — 레코드와 엔터티 상태 — 를 삭제하고 schema는 유지합니다 (소유자+) |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/records | 페이지네이션 및 필터링으로 레코드 목록 표시 |
| GET | /api/records/{id} | 구조화된 출력으로 전체 레코드 상세 정보 가져오기 |
| POST | /api/records/batch-delete | 여러 레코드 삭제 (최대 100개) |
| POST | /api/fusion/merge | 여러 model의 결과를 fusion합니다 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| POST | /api/attachments | 하나 이상의 파일을 업로드합니다(multipart/form-data) |
| POST | /api/attachments/base64 | JSON base64로 파일 하나를 업로드합니다(multipart를 지원하지 않는 클라이언트용) |
| GET | /api/attachments/{id}/download | 원본 파일 바이트를 다운로드합니다 |
| DELETE | /api/attachments/{id} | 첨부 파일 삭제 (강화 후 정리) |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| POST | /api/schema/saved/{id}/publish | 연결된 스키마의 작업 사본을 보강과 해당 데이터베이스가 따르는 계약으로 게시합니다. 이 작업을 실행하기 전까지는 구조적 변경이 적용되지 않습니다 |
| POST | /api/schema/sample/generate/stream | 단일 엔티티 유형의 샘플 JSON 객체를 1..N개 생성합니다(SSE용 job_id 반환) |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/databases | 조직의 데이터베이스 등록 목록을 대기 중인 델타 수와 함께 표시합니다 |
| POST | /api/databases | 스키마에 데이터베이스 등록 |
| GET | /api/databases/{id}/snapshot | 전체 상태를 .sql 스냅샷으로 다운로드 — 처음부터 새로 구축 |
| GET | /api/databases/{id}/changes | 다음 FIFO 구간의 델타를 가져옵니다. 확인 응답 기반 전달을 위해 델타를 클레임하여 리스를 확보합니다 |
| POST | /api/databases/{id}/ack | 특정 id까지 적용된 델타를 확인 처리합니다 — 리스를 해제합니다 |
| POST | /api/databases/{id}/clear-acked | 전달 및 확인 완료된 델타를 정리합니다 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/semantic-concepts | 개념 어휘를 유형별로 필터링하고 기준 개념과 비교해 점수를 매겨 조회합니다 |
| GET | /api/semantic-concepts/types | 개념 유형을 개수 및 임베딩 모델과 함께 나열합니다 |
| POST | /api/semantic-concepts/probe | 텍스트에 대해 해석 래더를 시험 실행 — 무엇과 얼마나 가깝게 일치하는지 확인 |
| GET | /api/semantic-concepts/duplicates | 병합 임계값 바로 아래에 있는 개념 쌍 |
| POST | /api/semantic-concepts/import | 아이덴티티 텍스트 CSV를 배치로 해석합니다(신규 발급은 소유자 권한이 필요합니다) |
| GET | /api/semantic-concepts/export | 어휘를 CSV로 내보내기 |
| POST | /api/semantic-concepts/delete-impact | concept 삭제 시 영향을 받는 항목 — 사용 횟수와 재동기화 비용 |
| GET | /api/semantic-concepts/migration/status | 임베딩 모델 마이그레이션이 실행 중인 경우 해당 마이그레이션의 상태입니다 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/benchmarks | 벤치마크 시나리오 목록 조회 |
| POST | /api/benchmarks/{id}/run | 여러 모델에 걸쳐 시나리오를 실행합니다 — 각 결과는 자동으로 채점됩니다 |
| POST | /api/benchmarks/{id}/reference | 시나리오 채점의 기준이 되는 골드 레퍼런스를 저장하고 검증합니다 |
| GET | /api/billing/balance | 현재 크레딧 잔액 |
| GET | /api/billing/transactions | 임베딩 사용액을 포함한 크레딧 거래 내역 |
| GET | /api/billing/plans | 이용 가능한 플랜과 제한 사항 |
강화, 스키마 생성 및 융합 작업은 실시간 진행 상황을 위해 Server-Sent Events를 사용합니다. 작업을 시작하고 job_id를 받은 다음 SSE 스트림에 연결합니다:
| 이벤트 | 설명 |
|---|---|
| model_started | 모델 처리가 시작됩니다 |
| expertise_completed | 전문 분야 하나 완료(부분 결과 포함) |
| model_completed | 모델이 result, record_id, cost와 함께 완료되었습니다 |
| fusion_started / fusion_completed | 다중 모델 퓨전 수명 주기 이벤트 |
| entity_started / entity_completed | 배치 전용 엔티티별 이벤트(entity_index 포함) |
| completed | 종료 이벤트 - 연결을 닫습니다 |
| error | 작업 수준 오류가 발생했습니다 |
스키마를 나열하고, 강화를 시작하고, 결과를 스트리밍하고, 최종 레코드를 가져오는 완전한 워크플로:
import httpx
import json
BASE = "https://your-instance.example.com"
KEY = "ent_your_api_key"
HEADERS = {"X-API-Key": KEY, "Content-Type": "application/json"}
# 1. List saved schemas
schemas = httpx.get(f"{BASE}/api/schema/saved", headers=HEADERS).json()
schema_id = schemas["schemas"][0]["id"]
# 2. Start enrichment
resp = httpx.post(f"{BASE}/api/single/enrich/stream", headers=HEADERS, json={
"entity_data": {"name": "Moderna Inc", "country": "US"},
"schema_id": schema_id,
"models": ["anthropic::claude-sonnet-4-5-20250514"],
"strategy": "multi_expertise",
})
job_id = resp.json()["job_id"]
# 3. Stream SSE events
record_id = None
with httpx.stream("GET", f"{BASE}/api/llm/stream/{job_id}", headers=HEADERS) as stream:
for line in stream.iter_lines():
if not line.startswith("data: "):
continue
event = json.loads(line[6:])
if event["type"] == "model_completed" and event.get("record_id"):
record_id = event["record_id"]
elif event["type"] == "completed":
break
# 4. Retrieve the enrichment record
if record_id:
record = httpx.get(f"{BASE}/api/records/{record_id}", headers=HEADERS).json()
print(json.dumps(record["structured_output"], indent=2))두 개의 모델로 배치 강화를 시작하고 결과를 스트리밍하세요:
# Start batch enrichment
JOB_ID=$(curl -s -X POST \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
"$BASE/api/enrichment/batch/start" \
-d '{
"entities": [
{"name": "Pfizer Inc", "country": "US"},
{"name": "Roche", "country": "CH"}
],
"schema_id": "your-schema-uuid",
"models": ["anthropic::claude-sonnet-4-5-20250514", "openai::gpt-4o"],
"strategy": "multi_expertise",
"arbitration_model": "anthropic::claude-sonnet-4-5-20250514"
}' | jq -r '.job_id')
# Stream events
curl -N -H "X-API-Key: $KEY" "$BASE/api/llm/stream/$JOB_ID"
# List resulting records
curl -s -H "X-API-Key: $KEY" \
"$BASE/api/records?type=enrichment&page_size=10" | jq '.records'| 상태 | 의미 | 예시 |
|---|---|---|
| 200 | 성공 | 요청 완료 |
| 400 | 잘못된 요청 | 잘못된 모델 키 또는 누락된 필드 |
| 401 | 권한 없음 | API 키가 없거나 잘못되었습니다 |
| 402 | 결제가 필요합니다 | 요금제 한도 또는 크레딧 잔액 문제입니다 — 할당량 소진, 너무 많은 모델 또는 언어, 요금제에 포함되지 않은 기능. 본문에는 상세 정보와 함께 기계가 읽을 수 있는 코드가 포함됩니다. |
| 403 | 금지됨 | 이 엔드포인트에 대한 권한이 부족합니다 |
| 404 | 찾을 수 없음 | 레코드, 스키마 또는 작업을 찾을 수 없습니다 |
| 500 | 서버 오류 | 내부 오류 |
오류 응답에는 사람이 읽을 수 있는 오류 메시지가 담긴 detail 필드가 포함됩니다. 플랜 및 결제 관련 실패(402)에는 안정적인 code 값(prompt_limit_reached, insufficient_credits, model_limit_exceeded, benchmarks_not_in_plan)과 해당 한도 및 사용량 수치가 담긴 구조화된 본문이 추가로 포함되므로, 클라이언트는 문장을 파싱하지 않고 원인에 따라 분기할 수 있습니다. 스트리밍 도중 오류가 발생하면 SSE 스트림은 error 이벤트 타입을 최종 completed 이벤트보다 먼저 내보냅니다.
모델은 provider_name::model_name 형식의 복합 키로 식별됩니다. 사용 가능한 모델과 해당 키를 나열하려면 GET /api/enrichment/options를 사용하세요.
model 파라미터는 enrichment, schema 생성, 샘플 생성에서 선택 사항입니다: 생략하거나(또는 리터럴 "auto"를 전달하면) 서버가 organization의 기본 model을 선택합니다 — Settings에 설정된 경우 작업별 고정 기본값을, 그렇지 않으면 점수 산정용 benchmark에서 전체 점수가 가장 높은 model을 사용합니다. options 응답의 default_models 필드는 자동이 현재 무엇으로 해석되는지 보여주며, model_auto_selected SSE 이벤트가 모든 작업에서 선택 결과를 알려줍니다. 자동은 항상 단일 model로 해석되며(fusion을 트리거하지 않습니다), 재현 가능한 파이프라인을 위해서는 계속 명시적인 model을 전달하세요.
요청 옵션은 자동 선택을 제한합니다. enable_web_search: true를 사용하면 웹 검색을 지원하는 모델만 고려되며(옵션 응답의 default_models_web_search 필드가 해당 선택을 미리 보여줍니다), 바이너리 첨부파일은 이를 읽을 수 있는 모델(PDF, 비전, 오디오)이 필요합니다. 적합한 모델이 제약 조건을 충족하지 못하면, 옵션을 조용히 무시하는 대신 요청이 HTTP 400 no_capable_default_model으로 실패합니다.
anthropic::claude-sonnet-4-5-20250514openai::gpt-4ogoogle::gemini-2.5-prodeepseek::deepseek-chat애플리케이션에는 요청/응답 예시가 포함된 대화형 API 문서가 있습니다. 접근하려면 관리자 인증이 필요합니다: