Jenova - AI 에이전트 플랫폼API 플랫폼

Jenova 에이전트 API 참조

기본 URL: https://api.jenova.ai/v1

인증: Authorization 헤더에 Bearer 토큰 사용


목차


개요

기반 스택을 직접 구성하지 않고도 프로덕션 수준의 AI 에이전트를 구축하고 실행할 수 있습니다. Jenova 에이전트 API는 모든 핵심 기능을 단일 관리형 서비스로 통합합니다:

완전한 에이전트 스택

  • 에이전트 오케스트레이션: 통합 오케스트레이션 레이어가 복잡한 워크플로우 전반에서 모델, 도구, 메모리, 검색을 조율합니다.
  • 메모리 및 컨텍스트: 모든 세션에 무제한 대화 메모리와 컨텍스트가 기본 내장되어 있습니다. 외부 상태 관리가 필요하지 않습니다.
  • 도구 및 MCP: 플랫폼 네이티브 도구와 임의의 원격 MCP 서버에 대해 무제한 도구 통합을 즉시 사용할 수 있습니다.
  • 모든 모델 사용 가능: OpenAI, Anthropic, Google, xAI, Qwen 등 다양한 모델을 하나의 통합으로 에이전트에 활용할 수 있습니다.
  • 완전 관리형 스토리지: 내장 RAG를 갖춘 관리형 관계형 및 벡터 데이터베이스입니다. 인프라를 프로비저닝하거나 확장할 필요가 없습니다.
  • 프로덕션 등급: 수십만 명의 사용자가 사용 중입니다. 완전 관리형 인프라와 안정적인 API로 프로덕션 트래픽에 맞게 구축되었습니다.

빠른 시작

1. API 키 받기

www.jenova.ai/platform의 개발자 대시보드에서 API 키를 생성합니다. 키는 jnv_sk_* 형식을 사용하며 Bearer 토큰으로 전달됩니다.

2. 에이전트 선택 또는 생성

플랫폼에서 사전 구축된 에이전트를 선택하거나, 대시보드에서 지침, 모델 설정, 지식 베이스 파일, 도구, MCP 서버를 지정하여 커스텀 에이전트를 생성합니다.

3. 첫 메시지 보내기

세션을 생성하고 한 번의 호출로 메시지를 보냅니다:

curl -N -X POST https://api.jenova.ai/v1/messages \
  -H "Authorization: Bearer jnv_sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "agent": "my-support-agent",
    "user": "user_12345",
    "content": "What can you help me with?"
  }'

응답은 Server-Sent Events로 스트리밍되어 돌아옵니다:

event: stream_started
data: {"session_id":"ses_xyz789","run_id":"run_abc123","agent":"my-support-agent"}

event: stream_delta
data: {"session_id":"ses_xyz789","run_id":"run_abc123","chunk_content":"I can help you with ","seq":1}

event: stream_ended
data: {"session_id":"ses_xyz789","run_id":"run_abc123","success":true,"stop_reason":"end_run","usage":{"cost":"0.0032"}}

후속 요청을 위해 stream_started에서 session_id를 확보하세요. 동기식 JSON 응답에 대해서는 메시지 보내기를 참조하세요.


핵심 개념

에이전트

API를 통해 상호작용하는 AI 에이전트입니다. 각 에이전트는 API 호출에서 agent 값으로 사용되는 고유한 slug(예: my-support-agent)를 가집니다.

  • 사전 구축: 플랫폼에 있는 기존 에이전트 중에서 선택합니다.
  • 커스텀: 대시보드에서 지침, 모델, 지식 베이스, 도구, MCP 서버를 지정하여 직접 구성합니다.

세션

최종 사용자와 에이전트 간의 독립적인 대화 스레드입니다.

  • 식별자: 접두사가 붙은 ID(예: ses_abc123)
  • 범위: 동일한 에이전트와 최종 사용자에 대해 여러 세션이 존재할 수 있으며, 각 세션은 독립적인 대화 상태를 가집니다
  • 수명 주기: 세션은 API를 통해 삭제되기 전까지 무기한 유지됩니다. 저장이 필요 없는 일회성 작업의 경우 ephemeral: true와 함께 POST /messages를 사용하세요
  • 플랫폼 분리: API 세션은 Jenova 웹 앱의 대화와 별개입니다. 최종 사용자, 세션 기록, 결제는 API와 웹 앱 간에 독립적으로 관리됩니다.

메시지

메시지 엔드포인트가 반환하는 세션 대화 기록의 단일 항목입니다. 각 메시지에는 type("user" 또는 "agent")과 name을 포함하는 구조화된 from 객체와, 메시지 자체의 type이 포함됩니다:

  • external - 채팅 콘텐츠로 표시되도록 의도된 대화 메시지입니다.
  • internal - 실행 중 도구 호출이나 검색과 같은 에이전트 작업 단계를 나타내는 선택적 메시지입니다.

실행

메시지를 보낼 때 생성되는 단일 에이전트 실행입니다. 실행에는 run_id가 있으며, 활성 상태 동안 이벤트를 스트리밍할 수 있고, 하나 이상의 완료된 메시지를 생성합니다. 각 세션은 한 번에 하나의 활성 실행만 가질 수 있습니다.

최종 사용자

user 필드는 세션을 귀하의 애플리케이션 내 최종 사용자 범위로 지정합니다. 내부 사용자 ID나 UUID와 같은 안정적이고 불투명한 ID를 사용하세요. 애플리케이션에서 필요하지 않은 경우 이메일이나 기타 개인식별정보(PII)는 피하세요. 동일한 user 값으로 생성된 세션은 함께 그룹화되어 사용자별 세션 목록 조회가 가능해집니다.

user가 생략되면 세션은 귀하의 개발자 계정 범위로 지정되며, 이후 최종 사용자별로 필터링할 수 없습니다. 프로덕션에서는 user를 전달하세요.

기존 세션에 대한 요청의 경우 user는 선택적인 소유권 확인 용도로 사용됩니다. 값을 제공하는 경우, 세션 생성 시 사용된 user 값과 일치해야 합니다. 그렇지 않으면 API는 404 session_not_owned를 반환합니다. GETDELETE 요청에서는 쿼리 파라미터로, POSTPATCH 요청에서는 JSON 본문에 담아 전달하세요.


인증

모든 요청은 Authorization 헤더에 Bearer 토큰을 포함하여 인증해야 합니다:

Authorization: Bearer jnv_sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

API 키는 개발자 대시보드에서 생성됩니다.

User-Agent는 선택 사항입니다. SDK는 진단 목적으로 이 값을 설정할 수 있지만, API에서 필수로 요구하지는 않습니다.

키 형식: 키는 접두사 jnv_sk_로 시작하며 그 뒤에 base62로 인코딩된 무작위 문자열이 이어집니다.

제한: 개발자 계정당 최대 10개의 활성 API 키를 가질 수 있습니다.


API 엔드포인트

메시지 API

메시지 보내기는 주요 API 경로입니다. 첫 메시지에는 POST /messages를 사용하며, 이 요청은 하나의 요청으로 세션을 생성하고 실행을 시작합니다. 캡처된 session_id로 계속하는 경우에는 POST /sessions/{session_id}/messages를 사용합니다.

메시지 보내기

POST /messages

하나의 원자적 요청으로 영구 세션을 생성하고 첫 메시지를 보냅니다. 저장 없이 스트리밍만 수행하는 단발성 요청을 원한다면 ephemeral: true를 설정합니다. 이 경우 세션이나 메시지 기록이 저장되지 않고, 세션 ID도 반환되지 않으며, 이어서 계속할 수 없습니다.

요청 본문

필드유형필수기본값설명
agentstring필수-에이전트의 슬러그 식별자
contentstring조건부-메시지 텍스트. file_urls가 제공되지 않는 경우 필수
file_urlsstring[]조건부-첨부할 파일의 URL. content가 제공되지 않는 경우 필수
userstring선택-귀하의 외부 최종 사용자 식별자(최대 255자). 생략하면 귀하의 개발자 계정으로 기본 설정됩니다
session_namestring선택-새 세션의 표시 이름(최대 200자)
ephemeralboolean선택false저장 없이 스트리밍만 수행하는 단발성 요청입니다. 세션이나 메시지 기록이 저장되지 않고, 세션 ID도 반환되지 않으며, 이어서 계속할 수 없습니다
streamboolean선택trueSSE 스트리밍의 경우 true, JSON의 경우 false. MCP 인가에는 스트리밍이 필요합니다
modelstring선택-이 요청에 한해 일회성으로 모델을 재지정합니다. claude-sonnet-5와 같은 안정적인 모델 ID를 사용하십시오. 세션의 기본 모델은 변경되지 않습니다

예시 - 스트리밍(기본값)

curl -N -X POST https://api.jenova.ai/v1/messages \
  -H "Authorization: Bearer jnv_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "agent": "my-support-agent",
    "user": "user_12345",
    "content": "Hello, I need help with my account"
  }'

응답은 SSE 스트림입니다(이벤트 형식은 스트리밍 (SSE) 참조). 영구 요청에는 새로운 session_id가 포함되며, ephemeral: true 요청에는 session_id가 포함되지 않고 반드시 스트리밍을 사용해야 합니다.

예시 - JSON(비스트리밍)

curl -X POST https://api.jenova.ai/v1/messages \
  -H "Authorization: Bearer jnv_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "agent": "my-support-agent",
    "user": "user_12345",
    "content": "Hello, I need help with my account",
    "stream": false
  }'

응답

스트리밍 응답은 스트리밍 (SSE)에 문서화된 SSE 이벤트를 발생시킵니다. 비스트리밍 응답은 세션 계속하기에 표시된 JSON 메시지 형태를 반환하며, 완료된 요청에 대한 stop_reasonusage를 포함합니다.

비스트리밍 실행이 90초가 지나도 여전히 처리 중인 경우, API는 status: "processing", session_id, run_id, message와 함께 202 Accepted를 반환합니다. 실행은 응답이 반환되거나 클라이언트 연결이 끊긴 후에도 계속되므로, 세션의 메시지를 확인하거나 더 긴 워크플로에는 스트리밍을 사용하십시오.

오류

상태코드조건
400missing_required_fieldagent는 필수입니다
400invalid_payload잘못된 형식의 JSON이거나 필드의 유형이 유효하지 않습니다
400bad_request유효하지 않은 ephemeral 모드이거나, user/session_name이 최대 길이를 초과했습니다
400content_or_uploaded_files_requiredcontentfile_urls 중 어느 것도 제공되지 않았습니다
400content_too_long메시지 내용이 최대 토큰 길이를 초과했습니다
400exceed_max_upload_files하나의 요청에 10개를 초과하는 파일 URL이 포함되었습니다
400unsupported_file_format파일 URL의 확장자가 지원되지 않습니다
400invalid_file_url파일 URL의 형식이 올바르지 않거나 HTTPS가 아닙니다
400invalid_model_selection재지정한 모델이 유효한 프로덕션 모델이 아닙니다
402insufficient_credits세션을 생성하거나 메시지를 보내기에 크레딧이 충분하지 않습니다
404agent_not_found에이전트가 존재하지 않거나 귀하의 계정에서 접근할 수 없습니다

세션 계속하기

POST /sessions/{session_id}/messages

기존 영속 세션에 메시지를 전송하고 에이전트의 응답을 받습니다. 응답은 기본적으로 SSE를 통해 스트리밍되며, JSON으로 받으려면 stream: false로 설정하세요.

요청 본문

필드유형필수기본값설명
contentstring조건부-메시지 텍스트. file_urls가 제공되지 않는 경우 필수
file_urlsstring[]조건부-첨부할 파일의 URL. content가 제공되지 않는 경우 필수
streamboolean아니오trueSSE 스트리밍의 경우 true, JSON의 경우 false. MCP 인증에는 스트리밍이 필요함
modelstring아니오-이 요청에 한해 일회성으로 모델을 재정의합니다. claude-sonnet-5와 같은 안정적인 모델 ID를 사용하세요. 세션의 기본 모델은 변경되지 않습니다

예시 - 스트리밍(기본값)

curl -N -X POST https://api.jenova.ai/v1/sessions/ses_abc123/messages \
  -H "Authorization: Bearer jnv_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "How do I reset my password?"
  }'

예시 - JSON(비스트리밍)

curl -X POST https://api.jenova.ai/v1/sessions/ses_abc123/messages \
  -H "Authorization: Bearer jnv_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "How do I reset my password?",
    "stream": false
  }'

응답 200 OK

{
  "id": "msg_xyz789",
  "session_id": "ses_abc123",
  "sequence": 4,
  "from": {
    "type": "agent",
    "name": "my-support-agent"
  },
  "type": "external",
  "time": "2026-05-19T10:31:05Z",
  "content": "To reset your password, go to Settings > Security > Change Password...",
  "model": "claude-sonnet-5",
  "files": [],
  "stop_reason": "end_run",
  "usage": {
    "cost": "0.0015"
  }
}

세션에 이미 활성 실행이 있거나 대기 중인 메시지가 있는 경우, API는 status: "queued", session_id, run_id, message_id와 함께 JSON 202 Accepted를 반환합니다. 사용자 메시지는 해당 활성 실행에 의해 처리됩니다.

오류

상태코드조건
400invalid_payloadJSON 형식이 잘못되었거나 필드 유형이 유효하지 않음
400content_or_uploaded_files_requiredcontentfile_urls 중 어느 것도 제공되지 않음
400content_too_long메시지 콘텐츠가 최대 토큰 길이를 초과함
400exceed_max_upload_files단일 요청에 10개를 초과하는 파일 URL이 포함됨
400unsupported_file_format파일 URL에 지원되지 않는 파일 확장자가 사용됨
400invalid_file_url파일 URL 형식이 잘못되었거나 HTTPS가 아님
400invalid_model_selection재정의된 모델이 유효한 프로덕션 모델이 아님
402insufficient_credits메시지를 전송하기에 크레딧이 부족함
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속하거나 지정된 user와 일치하지 않음

멱등성

POST /messagesPOST /sessions/{session_id}/messages는 선택적으로 Idempotency-Key 헤더를 허용합니다. 네트워크 재시도나 중복 제출로 인해 중복된 실행이 생성되지 않도록, 논리적인 사용자 전송마다 고유한 키를 사용하십시오.

curl -N -X POST https://api.jenova.ai/v1/messages \
  -H "Authorization: Bearer jnv_sk_xxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: send-user_12345-2026-05-19T10:30:00Z" \
  -d '{
    "agent": "my-support-agent",
    "user": "user_12345",
    "content": "Hello"
  }'

비스트리밍: 재시도하면 Idempotent-Replayed: true 헤더와 함께 저장된 200 또는 202 응답이 반환됩니다.

스트리밍: 스트림은 재생되지 않습니다. 실행 중이거나 완료된 후에 재시도하면 원본 run_id와, 영속적인 요청의 경우 session_id가 포함된 멱등성 오류가 반환됩니다. 활성 실행을 확인하려면 GET /sessions/{session_id}/runs/{run_id}를 사용하고, 저장된 결과를 가져오려면 GET /sessions/{session_id}/messages를 사용하십시오.

완료된 스트리밍 재시도 예시:

HTTP/1.1 409 Conflict
Content-Type: application/json
{
  "error": {
    "code": "idempotency_key_reused",
    "message": "This Idempotency-Key has already completed. Streaming responses cannot be replayed; use the returned session_id and run_id to retrieve the result."
  },
  "idempotency": {
    "status": "completed",
    "session_id": "ses_abc123",
    "run_id": "run_abc123"
  }
}

멱등성 오류

상태 코드코드조건
409idempotency_key_reused동일한 키가 다른 요청과 함께 사용됨
409idempotency_key_in_use원본 요청이 아직 실행 중임
409idempotency_key_reused원본 스트리밍 요청이 이미 완료되어 재생할 수 없음

메시지 목록 조회

GET /sessions/{session_id}/messages

표시 가능한 대화 메시지의 페이지네이션된 목록을 반환합니다. 첫 번째 페이지에는 가장 최근 메시지가 포함되며, 각 페이지 내에서 메시지는 시간순(오래된 것부터)으로 정렬됩니다. sequence는 세션 내에서 안정적인 정렬 번호입니다.

쿼리 파라미터

파라미터유형기본값최대값설명
limitinteger20100페이지당 메시지 수
cursorstring--페이지네이션 커서

예시

curl "https://api.jenova.ai/v1/sessions/ses_abc123/messages?limit=50" \
  -H "Authorization: Bearer jnv_sk_xxx"

응답 200 OK

{
  "items": [
    {
      "id": "msg_002",
      "session_id": "ses_abc123",
      "sequence": 4,
      "from": {
        "type": "agent",
        "name": "my-support-agent"
      },
      "type": "external",
      "time": "2026-05-19T10:31:05Z",
      "content": "To reset your password, go to Settings > Security...",
      "model": "claude-sonnet-5",
      "files": []
    }
  ],
  "next_cursor": "",
  "has_more": false
}

메시지 객체

필드유형설명
idstring메시지 ID(msg_ 접두사)
session_idstring상위 세션 ID
sequenceinteger세션 내에서 안정적인 정렬 번호
fromobject발신자 객체로, type("user" 또는 "agent")과 name을 포함
typestring메시지 유형으로, 표시 가능한 대화 메시지의 경우 보통 external
timestringISO 8601 타임스탬프
contentstring텍스트 콘텐츠. 외부(external) 메시지에 존재
modelstring응답을 생성한 안정적인 모델 ID. 에이전트 메시지에만 존재
filesarray메시지에 포함된 첨부 또는 생성된 파일. 각 항목은 알려진 경우 file_id, name, url, format, size를 포함
stop_reasonstring완료된 에이전트 메시지에 존재. 현재 값은 end_run
agentstring실행 중인 에이전트 슬러그(가능한 경우)
agent_namestring실행 중인 에이전트 표시 이름(가능한 경우)

파일 객체

필드유형설명
file_idstringJenova 파일 ID(가능한 경우)
namestring파일 이름
urlstring파일 URL(가능한 경우)
formatstring소문자 파일 형식(예: pdf, png, csv)
sizeinteger파일 크기(바이트 단위, 알려진 경우)

오류

상태코드조건
400bad_request잘못된 쿼리 파라미터
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속하거나 지정된 user와 일치하지 않음

메시지 조회

GET /sessions/{session_id}/messages/{message_id}

ID로 표시 가능한 단일 메시지를 조회합니다.

응답 200 OK

목록 응답과 동일한 구조의 단일 메시지 객체를 반환합니다.

오류

상태코드조건
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속하거나 지정된 user와 일치하지 않음
404not_found해당 세션에 메시지가 존재하지 않음

파일 첨부

file_urls 필드에 공개적으로 접근 가능한 HTTPS URL을 전달하십시오.

제한
메시지당 최대 파일 수10
최대 파일 크기파일당 20MB

지원 형식

  • 이미지: JPG, JPEG, PNG, WebP
  • 문서: PDF, DOCX, XLSX, PPTX, TXT, CSV, RTF, MD, HTML, XML, JSON, LOG
  • 코드: JS, TS, TSX, JSX, PY, Java, Go, C, CPP, H, HPP, CS, RB, PHP, RS, Swift, KT, Scala, SQL, CSS, YAML, YML

메시지를 조회할 때 첨부된 파일은 메시지의 files 배열에 나타납니다.


세션 API

세션은 최종 사용자와 에이전트 간의 지속적인 대화입니다. 대부분의 통합에서는 POST /messages를 사용하여 암묵적으로 세션을 생성할 수 있습니다.

세션 생성

POST /sessions

특정 에이전트에 연결된 비어 있는 영구 세션을 생성합니다. 첫 번째 메시지 이전에 세션 ID가 필요한 경우 사용합니다. 그렇지 않은 경우에는 POST /messages를 사용하는 것이 좋습니다.

참고: POST /sessions에서는 ephemeral을 사용할 수 없습니다. 저장이 필요 없는 단발성 요청에는 ephemeral: true와 함께 POST /messages를 사용하세요.

요청 본문

필드유형필수설명
agentstring에이전트의 slug 식별자
userstring아니오귀하의 외부 최종 사용자 식별자(최대 255자). 생략하면 귀하의 개발자 계정으로 기본 설정됩니다
session_namestring아니오세션의 표시 이름(최대 200자)

예시

curl -X POST https://api.jenova.ai/v1/sessions \
  -H "Authorization: Bearer jnv_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "agent": "my-support-agent",
    "user": "user_12345",
    "session_name": "Billing inquiry"
  }'

응답 201 Created

{
  "id": "ses_abc123",
  "session_name": "Billing inquiry",
  "agent": "my-support-agent",
  "user": "user_12345",
  "model": "claude-sonnet-5",
  "created_at": "2026-05-19T10:30:00Z",
  "updated_at": "2026-05-19T10:30:00Z"
}

오류

상태코드조건
400invalid_payloadJSON 형식이 잘못되었거나 필드 유형이 올바르지 않음
400missing_required_fieldagent는 필수입니다
400bad_requestephemeral이 전달되었거나, user/session_name이 최대 길이를 초과함
402insufficient_credits세션을 생성할 크레딧이 부족함
404agent_not_found에이전트가 존재하지 않거나 귀하의 계정에서 접근할 수 없음

세션 목록 조회

GET /sessions

귀하의 세션 목록을 최근 업데이트순으로 페이지네이션하여 반환합니다.

쿼리 파라미터

파라미터유형설명
limitinteger페이지당 항목 수(기본값 20, 최대 100)
cursorstring페이지네이션 커서
userstring최종 사용자 식별자로 필터링(최대 255자)
agentstring에이전트 slug로 필터링

예시

curl "https://api.jenova.ai/v1/sessions?user=user_12345&limit=10" \
  -H "Authorization: Bearer jnv_sk_xxx"

응답 200 OK

{
  "items": [
    {
      "id": "ses_abc123",
      "session_name": "Billing inquiry",
      "agent": "my-support-agent",
      "user": "user_12345",
      "model": "claude-sonnet-5",
      "created_at": "2026-05-19T10:30:00Z",
      "updated_at": "2026-05-19T11:15:00Z"
    }
  ],
  "next_cursor": "eyJ2IjoxLCJrIjoiY3VyXzAxIn0",
  "has_more": true
}

오류

상태코드조건
400bad_request유효하지 않은 쿼리 파라미터

세션 조회

GET /sessions/{session_id}

ID로 단일 세션을 조회합니다.

응답 200 OK

생성 응답과 동일한 구조의 세션 객체를 반환합니다.

오류

상태코드조건
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속하거나 전달된 user와 일치하지 않음

세션 이름 변경

PATCH /sessions/{session_id}

세션의 표시 이름을 업데이트합니다.

요청 본문

필드유형필수설명
session_namestringYes새 표시 이름(최대 200자)

응답 200 OK

업데이트된 세션 객체를 반환합니다.

오류

상태코드조건
400invalid_payloadJSON 형식이 잘못되었거나 필드 유형이 올바르지 않음
400missing_required_fieldsession_name이 필요함
400bad_requestsession_name이 최대 길이를 초과함
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속하거나 제공된 user와 일치하지 않음

세션 삭제

DELETE /sessions/{session_id}

세션과 해당 세션의 모든 메시지를 영구적으로 삭제합니다. 세션에 활성 실행이 없어야 합니다.

응답 204 No Content

오류

상태코드조건
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속하거나 제공된 user와 일치하지 않음
409busy세션에 활성 실행이 있음 - 먼저 취소하십시오

작업

이 엔드포인트들은 영속 세션에 대한 복구 및 편집 제어 기능입니다. 대부분의 통합은 취소(Cancel)만 필요하며, 세션 상태를 의도적으로 변경하거나 복구하고자 할 때만 다른 작업을 사용하십시오. 모든 작업은 최종 사용자에서 설명된 선택적 user 소유권 보호 기능을 지원합니다.

활성 실행 취소

POST /sessions/{session_id}/cancel

현재 진행 중인 에이전트 실행을 취소합니다. 취소 이전에 이미 완료된 메시지는 삭제되지 않습니다.

요청 본문

필드유형필수설명
run_idstringNo선택적 오래된 실행(stale-run) 보호 기능입니다. 제공되었으나 활성 실행과 일치하지 않으면 API는 409 stale_run을 반환합니다

응답 204 No Content

오류

상태코드조건
400cancel_not_allowed취소할 활성 실행이 없거나 취소가 허용되지 않음
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속하거나 제공된 user와 일치하지 않음
409stale_run제공된 run_id가 활성 실행과 일치하지 않음

활성 실행 되돌리기

POST /sessions/{session_id}/undo

활성 실행을 취소하고 중지될 때까지 대기한 후, 해당 실행이 이미 추가한 메시지를 제거합니다. 되돌리기가 실행된 이후에는 추가 출력이 저장되지 않습니다.

요청 본문

필드유형필수설명
run_idstringNo선택적 오래된 실행(stale-run) 보호 기능입니다. 제공되었으나 활성 실행과 일치하지 않으면 API는 409 stale_run을 반환합니다

응답 200 OK

{
  "session_id": "ses_abc123",
  "run_id": "run_abc123",
  "deleted": ["msg_002", "msg_001"]
}

메시지가 완료되기 전에 실행이 취소된 경우, deleted는 빈 배열이 됩니다.

오류

상태코드조건
400cancel_not_allowed되돌릴 활성 실행이 없거나 취소가 허용되지 않음
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속하거나 제공된 user와 일치하지 않음
409stale_run제공된 run_id가 활성 실행과 일치하지 않음
409busy다른 업데이트가 진행 중이어서 세션을 일시적으로 사용할 수 없음

최근 메시지 삭제

POST /sessions/{session_id}/messages/delete

유휴 상태인 세션에서 가장 최근 N개의 메시지를 삭제합니다. 세션에 활성 실행이 없어야 합니다.

요청 본문

필드유형필수설명
countintegerYes끝에서부터 삭제할 최근 메시지 수 (0보다 커야 함)

응답 200 OK

{
  "deleted": ["msg_002", "msg_001"]
}

오류

상태코드조건
400bad_requestcount가 누락, 0 또는 음수인 경우, 또는 삭제할 메시지가 없는 경우
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속해 있거나 제공된 user와 일치하지 않음
409busy세션에 활성 실행이 있음

세션 포크

POST /sessions/{session_id}/fork

원본 세션을 특정 메시지까지 복사하여 새 세션을 생성합니다. 원본 세션에는 활성 실행이 없어야 합니다.

요청 본문

필드유형필수설명
message_idstringNo포크 지점 메시지 ID. 생략하면 마지막 메시지에서 포크됩니다

응답 201 Created

세션 생성과 동일한 구조로 새로 생성된 세션 객체를 반환합니다.

오류

상태코드조건
400bad_requestmessage_id가 유효하지 않음
402insufficient_credits세션을 포크하기에 크레딧이 부족함
404not_found이 세션에 message_id가 존재하지 않음
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속해 있거나 제공된 user와 일치하지 않음
409busy원본 세션에 활성 실행이 있음

실행 상태 조회

GET /sessions/{session_id}/runs/{run_id}

활성 실행의 현재 상태를 반환합니다. SSE 연결이 끊어진 후 또는 run_id를 반환한 멱등성 응답 이후에 사용하십시오. 실행이 완료된 후에는 GET /sessions/{session_id}/messages로 결과를 조회하십시오.

응답 200 OK

{
  "session_id": "ses_abc123",
  "run_id": "run_abc123",
  "status": "streaming",
  "started_at": "2026-05-19T10:30:00Z",
  "updated_at": "2026-05-19T10:30:06Z",
  "content": "Partial visible response text so far"
}

실행이 활성 상태인 동안 응답에는 최근 진행 상황에 대한 힌트가 포함될 수도 있습니다.

오류

상태코드조건
400bad_request세션이 임시(ephemeral) 상태임
404session_not_found세션이 존재하지 않음
404session_not_owned세션이 다른 개발자에게 속해 있거나 제공된 user와 일치하지 않음
404not_found이 세션에 대해 실행이 활성 상태가 아님

크레딧

잔액 조회

GET /credits/balance

귀하의 현재 크레딧 잔액을 반환합니다.

응답 200 OK

{
  "balance": "123.45"
}

에이전트 API

대시보드에서 커스텀 에이전트를 생성하고 편집하십시오. 에이전트 생성 및 편집을 위한 API 지원은 곧 제공될 예정입니다.

예약/백그라운드 워크플로는 현재 API를 통해 지원되지 않습니다. 지원은 곧 제공될 예정입니다.

에이전트 목록 조회

GET /agents

귀하의 API 키에서 사용할 수 있는 에이전트를 반환합니다. 세션을 생성하거나 메시지를 보낼 때 agent 값을 사용하세요.

응답 200 OK

{
  "agents": [
    {
      "agent": "jenova",
      "display_name": "Jenova",
      "description": "General-purpose Jenova agent"
    },
    {
      "agent": "my-support-agent",
      "display_name": "Support Agent",
      "description": "Answers customer questions"
    }
  ]
}
필드유형설명
agentstringagent 값으로 전달할 안정적인 에이전트 슬러그
display_namestring사람이 읽기 쉬운 표시 이름
descriptionstring에이전트 설명

모델

모델 목록 조회

GET /models

메시지를 보낼 때 model 필드에서 사용할 수 있는 모든 모델을 반환합니다.

응답 200 OK

{
  "models": [
    {
      "id": "claude-opus-4-8",
      "name": "Claude Opus 4.8",
      "thinking_variant": "claude-opus-4-8-thinking"
    },
    {
      "id": "claude-opus-4-8-thinking",
      "name": "Claude Opus 4.8 (Thinking)"
    },
    {
      "id": "kimi-k2.6",
      "name": "Kimi K2.6",
      "thinking_variant": "kimi-k2.6-thinking"
    }
  ]
}
필드유형설명
idstring안정적인 모델 식별자. Send Message에서 model 값으로 전달하세요
namestring사람이 읽기 쉬운 표시 이름
thinking_variantstring사고/추론 변형의 모델 ID. 추론을 지원하는 기본 모델에만 존재함

thinking_variant가 있는 모델은 확장 추론을 지원합니다. 이를 활성화하려면 model 필드에 변형 ID를 직접 사용하세요.

메시지를 보낼 때 model을 지정하지 않으면 에이전트의 기본값 모델이 사용됩니다.


문서

GET /docs?lang=en
GET /doc?lang=en

이 참조 문서를 Markdown 형식으로 반환합니다. 언어를 선택하려면 lang을 사용하세요.


스트리밍 (SSE)

stream이 생략되거나 true(기본값)인 경우, 메시지 응답은 Server-Sent Events로 전달됩니다. 가져오거나 렌더링할 준비가 된 메시지를 식별하려면 message_completed 이벤트를 사용하세요.

타임아웃: SSE 연결은 최대 60분까지 유지됩니다. 비스트리밍 요청은 최대 90초까지 대기한 후, 실행이 계속되는 동안 202 Accepted를 반환합니다.

연결 헤더

SSE 응답은 다음 헤더를 설정합니다:

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
X-Accel-Buffering: no
X-Run-Id: run_abc123

X-Run-Id는 첫 SSE 이벤트 이전에 사용할 수 있습니다.

재연결 및 복구

SSE 스트림은 재생되지 않습니다. 연결이 끊어진 경우, 캡처해 둔 session_idrun_id를 사용하여 상태를 복구하세요:

curl "https://api.jenova.ai/v1/sessions/ses_abc123/runs/run_abc123" \
  -H "Authorization: Bearer jnv_sk_xxx"

실행이 아직 활성 상태라면, 현재 상태, 부분 텍스트, 최근 진행 상황이 반환됩니다. 404 not_found가 반환되면 해당 실행은 더 이상 활성 상태가 아니므로, 세션의 메시지를 가져와 완료된 출력을 대조하세요:

curl "https://api.jenova.ai/v1/sessions/ses_abc123/messages?limit=20" \
  -H "Authorization: Bearer jnv_sk_xxx"

프레임 형식

각 SSE 프레임은 다음과 같은 표준 형식을 따릅니다:

event: <event_type>
data: <json_payload>

두 개의 줄바꿈이 각 프레임을 종료합니다.

이벤트 유형

스트림에는 수명 주기, 텍스트 델타, 사고, 진행 상황, 경고, 메시지 완료, MCP 연결, 오류, 최종 및 ping 이벤트가 포함됩니다. 일부 이벤트 유형은 관련이 있을 때만 전송됩니다.

일시적(ephemeral) 요청(ephemeral: true)의 경우, 모든 SSE 이벤트에서 session_id가 생략됩니다. 해당 단일 스트림 내에서 이벤트를 연관시키려면 run_id만 사용하십시오.

영구(persistent) 요청에 대한 최종 조정을 위해서는 stream_ended를 기다린 다음 List Messages를 호출하십시오.

실행 범위 이벤트에 공통되는 필드:

필드설명
session_id세션 ID. 일시적 스트림에서는 생략됩니다. 영구적인 POST /messages를 사용할 때 후속 요청을 위해 stream_started에서 이 값을 캡처하십시오
run_id사용 가능한 경우 현재 실행 ID

stream_started

실행이 시작될 때 한 번 전송됩니다.

필드설명
agent사용 가능한 경우 세션 에이전트 슬러그

stream_delta

에이전트가 표시되는 응답 텍스트를 생성하는 동안 반복적으로 전송됩니다. seq 순서대로 chunk_content 값을 연결하여 스트리밍된 응답을 구성하십시오.

event: stream_delta
data: {"session_id":"ses_abc123","run_id":"run_abc123","chunk_content":"To reset your ","seq":1}
필드설명
chunk_content텍스트 청크
seq스트림 내 단조 증가하는 청크 시퀀스

stream_thinking

에이전트가 사고(thinking) 출력을 내보내는 동안 반복적으로 전송됩니다. 별도의 사고 표시기나 추적 뷰에 사용하십시오. 최종 응답 텍스트에 연결하지 마십시오.

필드설명
content사고 텍스트 청크

stream_progress

문서 읽기, 웹 검색 또는 사용자 작업 대기와 같이 생성 중 사용자에게 표시되는 활동을 보고합니다. 이러한 이벤트는 임시 UI 표시용입니다. 알 수 없는 필드는 무시하세요. 권위 있는 메시지 기록에는 완료된 메시지를 사용하세요.

고급: 메시지 요청은 stream_progress만 생략하기 위해 include_progress: false를 받아들입니다. 라이프사이클 이벤트, ping, message_completed, 오류 및 종료 이벤트는 관련이 있을 경우 여전히 전송됩니다.

필드설명
state라이프사이클 상태: running, in-progress, success, failed, skipped, complete, cancelled 등. 알 수 없는 값도 정상적으로 처리하십시오
label사람이 읽을 수 있는 활동 레이블

일부 진행 상황 이벤트에는 선택적 표시 힌트로 url, file_name, 또는 server_name이 포함될 수 있습니다.

message_completed

메시지가 완료되어 가져오거나 렌더링할 준비가 될 때마다 전송됩니다.

이것은 경계 마커일 뿐, 전체 메시지 객체가 아닙니다. 콘텐츠나 메타데이터가 필요한 경우 메시지를 가져오십시오.

event: message_completed
data: {"session_id":"ses_abc123","run_id":"run_abc123","message_id":"msg_abc123","sequence":4,"from":{"type":"agent","name":"Jenova"},"type":"external"}
필드설명
message_id완료된 메시지 ID
sequence세션 내 안정적인 순서 번호
fromtype(user 또는 agent)과 name을 포함하는 발신자 객체
type메시지 유형: external 또는 internal

mcp_connection

에이전트가 계속하기 전에 최종 사용자가 하나 이상의 MCP 서버를 연결하거나 승인해야 할 때 전송됩니다. 이 이벤트는 스트리밍 모드에서만 사용할 수 있습니다.

필드설명
connection_server_list연결 작업이 필요한 MCP 서버. 각 서버에는 mcp_server_id, mcp_server_name, 선택 사항인 auth_url이 포함됩니다
user_action_deadline_unix연결 사용자 작업이 만료되는 Unix 타임스탬프

mcp_connection_resolved

MCP 연결 사용자 작업이 해결되었거나 만료되었을 때 전송됩니다.

공통 실행 범위 필드 외에 추가 필드는 없습니다.

warning

실행 중 치명적이지 않은 경고에 대해 전송됩니다.

필드설명
message사람이 읽을 수 있는 치명적이지 않은 경고
code선택적 경고 코드

stream_error

실행이 실패했을 때 전송됩니다. 이어서 success:falsestop_reason:"error"가 포함된 최종 stream_ended 이벤트가 뒤따를 수 있습니다.

필드설명
code오류 코드
message사람이 읽을 수 있는 오류 메시지

stream_ended

실행이 종료되면 한 번 전송됩니다. 이는 스트림의 마지막 이벤트입니다.

event: stream_ended
data: {"session_id":"ses_abc123","run_id":"run_abc123","success":true,"stop_reason":"end_run","usage":{"cost":"0.0032"}}

실패 예시:

event: stream_ended
data: {"session_id":"ses_abc123","run_id":"run_abc123","success":false,"stop_reason":"user_cancelled","usage":{"cost":"0.0012"}}
필드설명
success실행이 성공적으로 완료되었는지 여부
stop_reason실행 종료 이유: end_run, user_cancelled, user_action_timeout, 또는 error
usage이 요청에 대한 사용량 객체. 사용 가능한 경우 cost가 포함됩니다

ping

프록시/CDN 타임아웃을 방지하기 위해 15초마다 전송되는 킵얼라이브 프레임입니다. 클라이언트에서는 무시하십시오.


MCP 서버 통합

**Model Context Protocol (MCP)**을 통해 귀하의 에이전트를 외부 도구에 연결하십시오:

  • Jenova 관리형 MCP 서버: 검색, 콘텐츠 검색, 문서 생성 및 기타 기본 제공 기능을 위해 Jenova가 호스팅하는 서버
  • 원격 MCP 서버: 귀하의 에이전트를 위해 구성된 기타 원격 MCP 서버

MCP 서버는 에이전트를 생성하거나 편집할 때 대시보드에서 구성해야 합니다. 자체 MCP 서버를 사용하려면 이를 커스텀 에이전트에 추가한 다음 API를 통해 해당 에이전트를 호출하십시오. API는 에이전트 구성에서 활성화된 도구를 실행하며, API 요청에서 추가 설정이 필요하지 않습니다.

에이전트가 응답 중 MCP 도구를 사용할 때, 진행 이벤트는 발생하는 대로 스트림으로 전송됩니다:

event: stream_progress
data: {"session_id":"ses_...","run_id":"run_...","state":"running","label":"Searching Google"}

실행 중 에이전트가 최종 사용자에게 MCP 서버 연결 또는 승인을 요구하는 경우, 스트리밍 응답에 mcp_connectionmcp_connection_resolved 이벤트가 포함될 수 있습니다. 최종 사용자에게 연결 서버 목록을 표시하고, 제공된 auth_url이 있으면 여세요. 사용자가 서버를 연결하거나 승인하는 동안 SSE 스트림을 열어 두세요.

승인이 완료되면 Jenova가 토큰을 저장하고, 승인 창에는 완료 페이지가 표시되며, 동일한 실행이 자동으로 계속됩니다. 최종 사용자는 메시지를 다시 보낼 필요가 없습니다.

최종 사용자가 user_action_deadline_unix 전에 연결, 승인, 건너뛰기 또는 음소거를 하지 않으면 실행은 stop_reason:"user_action_timeout"으로 종료됩니다. POST /sessions/{session_id}/cancel로 활성 실행을 취소할 수도 있습니다.

auth_url을 클라이언트 측에 저장하세요. 승인 중 클라이언트 연결이 끊어져도 이 URL은 user_action_deadline_unix까지 유효합니다. 지속 요청의 경우 Get Run Status로 다시 연결하거나 실행이 끝난 후 메시지를 가져오세요.

비스트리밍 요청(stream: false)은 MCP 연결 사용자 작업을 지원하지 않습니다. 이 상호작용이 필요할 수 있는 에이전트에는 스트리밍을 사용하세요.

MCP 연결 건너뛰기

POST /sessions/{session_id}/mcp/connection/skip

대기 중인 MCP 연결 사용자 작업을 무시하고 해당 연결 없이 실행을 계속하도록 합니다.

동일한 API 사용자에 대해 한 서버의 향후 연결 프롬프트를 음소거하려면 mcp_server_idmute를 포함하세요. 지원되는 값은 24hforever입니다.

요청 본문

필드유형필수설명
run_idstringmcp_connection 이벤트의 활성 실행 ID
mcp_server_idstring아니요mute 사용 시 필수입니다. 이벤트의 mcp_server_id를 사용하세요
mutestring아니요24h 또는 forever

응답 204 No Content

스트림은 mcp_connection_resolved를 내보낸 다음, 실행은 동일한 run_id로 계속됩니다.

오류

상태코드조건
400bad_requestrun_id가 없거나, 활성 실행이 없거나, 건너뛸 MCP 연결이 없음
400bad_request잘못된 mute, 또는 mute가 설정되었지만 mcp_server_id가 없음
404session_not_found세션이 존재하지 않음
404session_not_owned제공된 user와 일치하지 않음
409stale_runrun_id가 활성 실행과 일치하지 않음

결제

모든 비용은 귀하의 개발자 크레딧 잔액에서 차감됩니다. www.jenova.ai/platform에서 사용량을 확인하고 크레딧을 충전할 수 있습니다.

가격

작업비용
세션 생성지속 세션마다 $0.01 고정 요금(암묵적으로 POST /messages에 의해 생성되는 세션 포함)
세션 포크$0.05 고정
메시지 전송가변 (아래 참조)

메시지 비용은 다음에 따라 결정됩니다:

  • 모델 - 모델마다 토큰당 비용이 다릅니다
  • 컨텍스트 길이 - 세션이 길어질수록 요청당 더 많은 입력 토큰을 소비합니다
  • 워크플로 복잡도 - 워크플로가 길어지고 도구 사용(웹 검색, 파일 생성, 문서 분석)이 늘어나면 전체 토큰 소비량이 증가합니다

실제 비용은 스트리밍 요청의 경우 stream_ended.usage.cost로, 비스트리밍 JSON 요청의 경우 usage.cost로 반환됩니다.

크레딧 보류

각 새 메시지 실행은 실행이 시작되기 전에 귀하의 크레딧 잔액에 $0.50 보류를 설정합니다. 이는 실행을 위한 자금을 예약하는 것입니다. 활성 실행 중 대기 중인 후속 메시지는 추가 보류를 생성하지 않으며, 활성 실행의 사용량은 귀하의 남은 잔액과 대조하여 확인됩니다.

실행이 완료되면 보류는 실제 비용으로 정산되며 차액은 해제됩니다. 취소되거나 실패한 실행은 이미 발생한 사용량에 대해서만 청구됩니다. 요청이 모델에 도달하기 전에 실패하면 전체 보류가 해제됩니다.

이는 진행 중인 요청 동안 귀하의 사용 가능한 잔액이 일시적으로 낮게 표시될 수 있음을 의미합니다. 기존 세션에 메시지를 보내거나 임시 메시지를 보내려면 최소 $0.50의 사용 가능한 잔액이 필요합니다. 최초의 지속 세션 POST /messages 요청은 세션을 생성하며, 메시지 보류 금액과 세션 생성 요금을 충당하기 위해 최소 $0.51이 필요합니다.


속도 제한

모든 개발자 계정은 세 가지 속도 제한 차원의 적용을 받습니다:

차원기본값설명
RPM (분당 요청 수)60분 단위 고정 윈도우
RPD (일일 요청 수)1,000일 단위 고정 윈도우
동시 실행5동시에 진행 중인 요청의 최대 수

GETHEAD 요청은 동시 슬롯을 소비하지 않습니다. cancel, undo, mcp/connection/skip도 동시 슬롯을 소비하지 않으므로 모든 슬롯이 사용 중이어도 이러한 작업은 계속 사용할 수 있습니다. 이러한 요청은 여전히 RPM 및 RPD에 계산됩니다.

응답 헤더

인증된 API 응답에는 속도 제한 헤더가 포함됩니다:

헤더설명
X-RateLimit-Limit귀하의 RPM 제한
X-RateLimit-Remaining현재 1분 윈도우 내 남은 요청 수
X-RateLimit-Reset현재 윈도우가 재설정되는 Unix 타임스탬프
Retry-After재시도 전 대기해야 하는 시간(초, 429에서만 제공)

제한을 초과하면 API는 429 Too Many Requests를 반환합니다:

{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded. Please retry after 12 seconds."
  }
}

오류 처리

즉시 발생하는 HTTP 오류와 스트리밍이 아닌 실행 오류는 일관된 형식을 따릅니다:

{
  "error": {
    "code": "error_code_string",
    "message": "Human-readable description"
  }
}

오류 메시지는 lang 파라미터를 기준으로 현지화됩니다(현지화 참고).

스트리밍 실행 오류는 stream_error 이벤트로 전달됩니다. 실패한 실행이라도 success:falsestop_reason이 설정된 최종 stream_ended 이벤트가 전송될 수 있습니다. 스트리밍이 아닌 실행 오류에는 비용 데이터를 사용할 수 있는 경우 최상위 usage 객체가 포함될 수도 있습니다.

엔드포인트별 오류는 각 엔드포인트 하위에 인라인으로 문서화되어 있습니다.

시작 후 실행 오류

실행 오류는 메시지 실행이 이미 시작된 후에 나타납니다. 스트리밍 모드에서는 stream_error 이벤트로 나타나며, 이후 success:false가 설정된 stream_ended가 이어질 수 있습니다. 스트리밍이 아닌 모드에서는 아래 HTTP 상태와 함께 JSON 오류 응답으로 반환됩니다.

스트리밍이 아닌 경우의 HTTP 상태코드설명
400content_policy_violation모델 제공업체가 콘텐츠 정책 위반을 이유로 요청을 거부함
404session_not_found실행이 실행되기 전에 세션이 삭제됨
409busy실행이 시작되기 전에 세션이 사용 중 상태가 되거나 일시적으로 이용할 수 없게 됨
413total_image_size_exceeded결합된 이미지 페이로드가 모델의 요청당 크기 제한을 초과함
500internal_error예기치 않은 실행 실패
502llm_api_error모델 제공업체 또는 상위 모델 API 오류

페이지네이션

목록 엔드포인트는 커서 기반 페이지네이션을 사용합니다:

{
  "items": [],
  "next_cursor": "eyJ2IjoxLCJrIjoiY3VyXzAyIn0",
  "has_more": true
}
파라미터유형기본값최대값설명
limitinteger20100페이지당 항목 수
cursorstring--이전 next_cursor에서 얻은 불투명 커서

다음 페이지를 가져오려면 next_cursorcursor 쿼리 파라미터로 전달하십시오. has_morefalse이면 더 이상 결과가 없습니다.


현지화

모든 엔드포인트는 오류 메시지 및 현지화된 콘텐츠의 언어를 제어하기 위해 선택적 lang 쿼리 파라미터를 허용합니다.

소스우선순위예시
lang 쿼리 파라미터최고?lang=zh
Accept-Language 헤더대체Accept-Language: ja
기본값최저English (en)

모든 요청 URL에 ?lang=xx를 추가할 수 있습니다:

POST /sessions?lang=zh
GET /sessions/ses_abc123/messages?lang=ja

지원 언어: en, zh, ja, ko, es, fr, de, it, pt, ru, id, th, vi


개인정보 보호 및 데이터

Jenova는 Jenova 모델을 훈련시키기 위해 API 프롬프트, 출력, 대화 기록, 업로드된 파일, 에이전트 지시사항 또는 지식 베이스를 사용하지 않습니다.

Jenova는 제3자 모델 제공업체와 관련하여, 고객 콘텐츠가 제공업체 모델 훈련에 사용되지 않도록 하기 위해 상업용 API 채널, 계정 설정, 계약상 약속 또는 옵트아웃을 활용합니다.

Jenova는 미국 인프라를 사용하여 API 데이터를 저장하고 처리합니다. 제3자 제공업체는 개인정보 보호정책 및 이용약관에 설명된 대로 다른 관할권에서 데이터를 처리할 수 있습니다.

전체 내용은 이용약관, 개인정보 보호정책, 사용 정책을 참조하십시오.


지원