{
  "schemaVersion": "1.0",
  "providerVersion": "1.0.0",
  "sourceSha256": "5515e5e002767ed895ea0442003829b0bad8fa9c7a0693ce6cdcbd65969b830f",
  "principles": {
    "officialSourcesOnly": true,
    "secretsNeverEnterUiTelemetryOrLogs": true,
    "providerFactsSeparatedFromKbxPolicy": true,
    "unknownLimitsAreNotInvented": true,
    "readOnlyByDefault": true,
    "domainWritesRequireSeparateIntegrationContract": true,
    "providerErrorNeverBecomesBusinessTruth": true
  },
  "providers": [
    {
      "id": "provider.krx.openapi",
      "title": "KRX Data Marketplace OPEN API",
      "ownerModule": "COMMON",
      "purpose": "market-data-readonly",
      "mutationAllowed": false,
      "officialSources": [
        "https://openapi.krx.co.kr/contents/OPP/INFO/OPPINFO003.jsp",
        "https://openapi.krx.co.kr/contents/OPP/INFO/service/OPPINFO004.cmd"
      ],
      "official": {
        "approvalRequired": true,
        "authentication": {
          "type": "header-api-key",
          "headerName": "AUTH_KEY"
        },
        "serviceUrlPolicy": "service-specific-from-approved-KRX-definition",
        "dataAvailabilityNote": "서비스 목록은 다수 데이터에 대해 2010년 이후 제공범위를 안내함",
        "numericRateLimit": null
      },
      "kbxPolicy": {
        "allowedHostSuffix": ".krx.co.kr",
        "credentialKey": "ExternalProviders:Krx:AuthKey",
        "maxConcurrency": 2,
        "timeoutMs": 5000,
        "retryHttpStatuses": [
          408,
          429,
          500,
          502,
          503,
          504
        ],
        "maxRetryAttempts": 1,
        "serviceDefinitionRequired": true,
        "cacheable": true
      },
      "operations": [
        {
          "id": "krx.approved-service.invoke",
          "method": "provider-defined-read",
          "path": "provider-defined",
          "response": "json-or-xml",
          "notes": "실제 URL/메서드는 KRX에서 승인된 개별 서비스 명세를 구성값으로 등록. 저장소에서 추정하지 않음."
        }
      ]
    },
    {
      "id": "provider.opendart",
      "title": "금융감독원 OPENDART OpenAPI",
      "ownerModule": "COMMON",
      "purpose": "disclosure-data-readonly",
      "mutationAllowed": false,
      "officialSources": [
        "https://opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS001&apiId=2019001",
        "https://opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS001&apiId=2019002",
        "https://opendart.fss.or.kr/guide/detail.do?apiGrpCd=DS001&apiId=2019018"
      ],
      "official": {
        "baseUri": "https://opendart.fss.or.kr/api/",
        "authentication": {
          "type": "query-api-key",
          "parameterName": "crtfc_key",
          "length": 40
        },
        "statusField": "status",
        "messageField": "message",
        "statusCodes": {
          "100": "invalid-field",
          "101": "invalid-access",
          "800": "maintenance",
          "900": "undefined-error",
          "901": "expired-personal-data-retention",
          "000": "success",
          "010": "unregistered-key",
          "011": "disabled-key",
          "012": "forbidden-ip",
          "013": "no-data",
          "014": "file-missing",
          "020": "request-limit-exceeded",
          "021": "company-count-exceeded"
        },
        "rateLimitNote": "020은 일반적으로 20,000건 이상의 요청에서 발생할 수 있으나 서비스별 제한이 다를 수 있음"
      },
      "kbxPolicy": {
        "credentialKey": "ExternalProviders:OpenDart:ApiKey",
        "timeoutMs": 5000,
        "maxConcurrency": 2,
        "retryStatusCodes": [
          "020",
          "800",
          "900"
        ],
        "maxRetryAttempts": 1,
        "noDataStatusCodes": [
          "013"
        ],
        "cacheable": true
      },
      "operations": [
        {
          "id": "opendart.disclosures",
          "method": "GET",
          "path": "list.json",
          "response": "json"
        },
        {
          "id": "opendart.company",
          "method": "GET",
          "path": "company.json",
          "response": "json"
        },
        {
          "id": "opendart.corp-code",
          "method": "GET",
          "path": "corpCode.xml",
          "response": "zip-binary"
        }
      ]
    },
    {
      "id": "provider.kis.market-data",
      "title": "한국투자증권 KIS Open API — 국내주식 시세",
      "ownerModule": "COMMON",
      "purpose": "market-data-readonly",
      "mutationAllowed": false,
      "officialSources": [
        "https://apiportal.koreainvestment.com/apiservice-apiservice",
        "https://apiportal.koreainvestment.com/community/10000000-0000-0011-0000-000000000001/post/d0d1a83f-6f8d-4437-9700-6d26702fd989",
        "https://github.com/koreainvestment/open-trading-api/blob/main/examples_llm/domestic_stock/inquire_price/inquire_price.py",
        "https://github.com/koreainvestment/open-trading-api/blob/main/examples_llm/kis_auth.py"
      ],
      "official": {
        "productionBaseUri": "https://openapi.koreainvestment.com:9443",
        "sandboxBaseUri": "https://openapivts.koreainvestment.com:29443",
        "authentication": {
          "type": "oauth2-client-credentials",
          "tokenPath": "/oauth2/tokenP",
          "bodyFields": [
            "grant_type",
            "appkey",
            "appsecret"
          ],
          "grantType": "client_credentials"
        },
        "tokenValidityHours": 24,
        "tokenRenewalCycleHours": 6,
        "headers": [
          "authorization",
          "appkey",
          "appsecret",
          "tr_id",
          "custtype",
          "tr_cont"
        ],
        "responseSuccess": {
          "field": "rt_cd",
          "value": "0"
        },
        "rateLimitsAsOf": "2026-04-20",
        "productionRequestsPerSecond": 18,
        "sandboxRequestsPerSecond": 1,
        "tokenRequestsPerSecond": 1,
        "concurrentSpacingRecommendationMs": [
          100,
          150
        ]
      },
      "kbxPolicy": {
        "appKeyCredential": "ExternalProviders:Kis:AppKey",
        "appSecretCredential": "ExternalProviders:Kis:AppSecret",
        "environmentKey": "ExternalProviders:Kis:Environment",
        "readOnlyOnly": true,
        "tokenRefreshSkewMinutes": 5,
        "productionMinimumSpacingMs": 100,
        "sandboxMinimumSpacingMs": 1000,
        "timeoutMs": 5000,
        "maxRetryAttempts": 1,
        "retryHttpStatuses": [
          408,
          429,
          500,
          502,
          503,
          504
        ],
        "cacheable": true
      },
      "operations": [
        {
          "id": "kis.oauth.token",
          "method": "POST",
          "path": "/oauth2/tokenP",
          "response": "json",
          "authOperation": true
        },
        {
          "id": "kis.domestic-stock.current-price",
          "method": "GET",
          "path": "/uapi/domestic-stock/v1/quotations/inquire-price",
          "trId": "FHKST01010100",
          "response": "json",
          "query": [
            "FID_COND_MRKT_DIV_CODE",
            "FID_INPUT_ISCD"
          ]
        }
      ]
    }
  ]
}
