API 서비스 사용법

  API 키 발급받기
안녕하세요! 블로그차트입니다.   로그인

블로그차트 API

블로그 검색노출 분석을 코드로 조회하세요

API 키 발급받기

일반 정보

  • 모든 요청에 API 키가 필요합니다. 인증 섹션을 참고하세요.
  • API는 블로그 분석 500건, 블로그 분석 1000건, 쿼리형 상품에서만 사용할 수 있습니다.
  • 기본 요청 주소: https://www.blogchart.co.kr/api/v1
  • HTTPS로만 요청할 수 있습니다.
  • 모든 응답은 UTF-8 인코딩의 JSON입니다.
  • 데이터는 매주 월요일 집계 기준으로 갱신됩니다.
  • API 조회 한도는 웹의 블로그 검색노출 분석 한도와 합산되어 함께 차감됩니다.

인증

API 키는 계정의 비밀번호와 같은 취급입니다. API 키를 가진 사람은 그 계정의 한도로 조회할 수 있습니다.

1단계. API 키 발급

로그인 후 API 키 발급 페이지에서 발급받습니다. API 키는 32자리 문자열이고 계정에 1개 부여됩니다.

2단계. 요청에 API 키 첨부

대부분의 공개 API가 쓰는 표준 방식대로 Authorization: Bearer 헤더에 API 키를 넣어 보내면 됩니다.

curl "https://www.blogchart.co.kr/api/v1/account/quota" \
  -H "Authorization: Bearer <발급받은 키>"

3단계. API 키 확인

아래 명령을 실행해 잔여 쿼리가 반환되면 API 키가 정상 작동하는 것입니다.

curl "https://www.blogchart.co.kr/api/v1/account/quota" \
  -H "Authorization: Bearer <발급받은 키>"
fetch("https://www.blogchart.co.kr/api/v1/account/quota", {
  headers: { "Authorization": "Bearer <발급받은 키>" }
})
  .then(function (r) { return r.json(); })
  .then(function (j) { console.log(j); });
import json
from urllib.request import Request, urlopen

req = Request("https://www.blogchart.co.kr/api/v1/account/quota",
              headers={"Authorization": "Bearer <발급받은 키>"})
with urlopen(req) as resp:
    print(json.loads(resp.read().decode("utf-8")))
$ch = curl_init("https://www.blogchart.co.kr/api/v1/account/quota");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer <발급받은 키>"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
API 키는 서버 쪽에만 두세요. 브라우저 JavaScript·앱 소스에 직접 넣으면 노출될 수 있습니다.
유출이 의심되면 발급 페이지에서 즉시 재발급하세요. 재발급하면 기존 API 키는 바로 막힙니다.

제공 기능

엔드포인트간단 설명
GET /v1/blog/rank블로그의 현재 전체·카테고리 순위 확인 — 순위만 주기적으로 확인할 용도
GET /v1/blog/analysis검색노출 분석 요약 — 순위, 키워드 수, 1페이지 노출률, 최고 순위, 활동지역 등 전체 항목
GET /v1/blog/history최근 52주간 주간 순위·키워드 추이 — 웹 화면 변동 추이 그래프에 해당
GET /v1/blog/keyword블로그에 유입된 키워드 목록 (최대 50개)
GET /v1/account/quota남은·사용 쿼리 확인 — 이 호출 자체는 쿼리를 차감하지 않음
아래 조회 기능들은 모두 조회된 블로그 1개당 1 쿼리가 차감되고, 한 번 조회된 블로그는 같은 날 다른 API 엔드포인트나 웹 화면에서 다시 조회해도 차감되지 않습니다. 잔여 쿼리는 /v1/account/quota에서 확인할 수 있습니다.
호출 제한: IP당 초당 15회(최대 20회까지 버퍼 허용)를 넘는 요청은 일시 제한되어 429 응답이 반환됩니다. 제한되면 잠시 후 다시 시도하세요.
GET /v1/blog/rank

블로그의 현재 순위만 가볍게 조회합니다. 전체 분석 항목이 아니어서 순위 주기적으로만 확인하는 용도에 알맞습니다. 한 번에 최대 20개까지 조회할 수 있습니다.

파라미터
url 순위를 볼 블로그 URL (필수, 예: blog.naver.com/계정명) — 여러 개는 반복 전달, 최대 20개
요청
curl "https://www.blogchart.co.kr/api/v1/blog/rank?url=blog.naver.com/haechiseoul" \
  -H "Authorization: Bearer <발급받은 키>"
예제 (테스트 api key 사용)
curl "https://www.blogchart.co.kr/api/v1/blog/rank?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword" \
  -H "Authorization: Bearer deadbeefcafebabe0123456789abcdef"
fetch("https://www.blogchart.co.kr/api/v1/blog/rank?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword", {
  headers: { "Authorization": "Bearer deadbeefcafebabe0123456789abcdef" }
})
  .then(function (r) { return r.json(); })
  .then(function (j) { console.log(j); });
import json
from urllib.request import Request, urlopen

req = Request("https://www.blogchart.co.kr/api/v1/blog/rank?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword",
              headers={"Authorization": "Bearer deadbeefcafebabe0123456789abcdef"})
with urlopen(req) as resp:
    print(json.loads(resp.read().decode("utf-8")))
$ch = curl_init("https://www.blogchart.co.kr/api/v1/blog/rank?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer deadbeefcafebabe0123456789abcdef"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
응답
{
  "status": "success",
  "data": [
    {
      "url": "blog.naver.com/haechiseoul",
      "blog_name": "서울특별시 공식블로그",
      "rank": 184,
      "rank_cate": 2
    },
    {
      "url": "blog.naver.com/luckeyword",
      "blog_name": "네이버 비즈니스 스쿨 공식 블로그",
      "rank": 419734,
      "rank_cate": 0
    }
  ]
}
응답 필드
url 조회한 블로그 주소
blog_name 블로그명 (집계 정보가 없으면 null)
rank 전체 순위 (1이 최고. 작을수록 상위)
rank_cate 카테고리 순위 (같은 카테고리의 블로그 중 순위, 집계 없으면 0)
GET /v1/blog/analysis

블로그 URL로 검색노출 분석 요약을 조회합니다. 웹 화면에서 보는 순위·노출 확률·키워드 통계에 해당합니다. 한 번에 최대 20개까지 조회할 수 있습니다.

파라미터
url 분석할 블로그 URL (필수, 예: blog.naver.com/계정명) — 여러 개는 반복 전달, 최대 20개
요청
curl -G "https://www.blogchart.co.kr/api/v1/blog/analysis" \
  -H "Authorization: Bearer <발급받은 키>" \
  --data-urlencode "url=blog.naver.com/haechiseoul"
예제 (테스트 api key 사용)
curl -G "https://www.blogchart.co.kr/api/v1/blog/analysis" \
  -H "Authorization: Bearer deadbeefcafebabe0123456789abcdef" \
  --data-urlencode "url=blog.naver.com/haechiseoul" \
  --data-urlencode "url=blog.naver.com/luckeyword"
fetch("https://www.blogchart.co.kr/api/v1/blog/analysis?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword", {
  headers: { "Authorization": "Bearer deadbeefcafebabe0123456789abcdef" }
})
  .then(function (r) { return r.json(); })
  .then(function (j) { console.log(j); });
import json
from urllib.request import Request, urlopen

req = Request("https://www.blogchart.co.kr/api/v1/blog/analysis?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword",
              headers={"Authorization": "Bearer deadbeefcafebabe0123456789abcdef"})
with urlopen(req) as resp:
    print(json.loads(resp.read().decode("utf-8")))
$ch = curl_init("https://www.blogchart.co.kr/api/v1/blog/analysis?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer deadbeefcafebabe0123456789abcdef"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
응답
{
  "status": "success",
  "data": [
    {
      "url": "blog.naver.com/haechiseoul",
      "blog_name": "서울특별시 공식블로그",
      "rank": 184,
      "rank_cate": 2,
      "main_category": "스포츠|레저|취미",
      "sub_category": "일상|생활, IT/인터넷",
      "first_collect_date": "2013-02-01",
      "page1_percent": 17.2,
      "keyword_cnt": 838,
      "total_keyword_cnt": 5646,
      "page1_keyword_cnt": 240,
      "avg_keyword_rank": 19,
      "rise_cnt_52w": 24,
      "fall_cnt_52w": 28,
      "max_rank": 128,
      "area_main": "경기"
    },
    {
      "url": "blog.naver.com/luckeyword",
      "blog_name": "네이버 비즈니스 스쿨 공식 블로그",
      "rank": 419734,
      "rank_cate": 0,
      "main_category": "",
      "sub_category": "",
      "first_collect_date": "2013-02-01",
      "page1_percent": 30,
      "keyword_cnt": 2,
      "total_keyword_cnt": 48,
      "page1_keyword_cnt": 1,
      "avg_keyword_rank": 19,
      "rise_cnt_52w": 29,
      "fall_cnt_52w": 23,
      "max_rank": 7704,
      "area_main": "전국"
    }
  ]
}
웹 화면에서 보는 항목 ↔ 응답 필드
블로그명 / 블로그 주소blog_name / url
전체 순위 / 카테고리 순위rank / rank_cate
상위 노출 확률(%)page1_percent
유효키워드 수 / 전체키워드 수keyword_cnt / total_keyword_cnt
평균 노출 순위 / 1페이지 노출 유효키워드 수avg_keyword_rank / page1_keyword_cnt
52주간 상승 횟수 / 하락 횟수 / 최고 랭킹rise_cnt_52w / fall_cnt_52w / max_rank
최초 집계일 / 메인·서브 카테고리first_collect_date / main_category·sub_category
활동지역area_main
GET /v1/blog/history

블로그의 랭킹 및 유효키워드 변동 추이를 주간 단위로 조회합니다. 웹 화면의 변동 추이 그래프에 해당합니다. 최근 52주 이내 지점을 오래된→최신 순으로 돌려줍니다.

파라미터
url 조회할 블로그 URL (필수, 예: blog.naver.com/계정명) — 여러 개는 반복 전달, 최대 20개
요청
curl "https://www.blogchart.co.kr/api/v1/blog/history?url=blog.naver.com/haechiseoul" \
  -H "Authorization: Bearer <발급받은 키>"
예제 (테스트 api key 사용)
curl "https://www.blogchart.co.kr/api/v1/blog/history?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword" \
  -H "Authorization: Bearer deadbeefcafebabe0123456789abcdef"
fetch("https://www.blogchart.co.kr/api/v1/blog/history?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword", {
  headers: { "Authorization": "Bearer deadbeefcafebabe0123456789abcdef" }
})
  .then(function (r) { return r.json(); })
  .then(function (j) { console.log(j); });
import json
from urllib.request import Request, urlopen

req = Request("https://www.blogchart.co.kr/api/v1/blog/history?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword",
              headers={"Authorization": "Bearer deadbeefcafebabe0123456789abcdef"})
with urlopen(req) as resp:
    print(json.loads(resp.read().decode("utf-8")))
$ch = curl_init("https://www.blogchart.co.kr/api/v1/blog/history?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer deadbeefcafebabe0123456789abcdef"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
응답
{
  "status": "success",
  "data": [
    {
      "url": "blog.naver.com/haechiseoul",
      "blog_name": "서울특별시 공식블로그",
      "history": [
        { "date": "2025-10-13", "rank": 16822, "keyword_cnt": 48 },
        { "date": "2025-10-20", "rank": 15885, "keyword_cnt": 52 },
        // ... 주간 데이터가 오래된 → 최신 순으로 계속 됩니다
        { "date": "2026-09-28", "rank": 128, "keyword_cnt": 865 },
        { "date": "2026-10-05", "rank": 184, "keyword_cnt": 838 }
      ]
    },
    {
      "url": "blog.naver.com/luckeyword",
      "blog_name": "네이버 비즈니스 스쿨 공식 블로그",
      "history": [
        { "date": "2025-10-13", "rank": 123508, "keyword_cnt": 9 },
        // ... 주간 데이터가 계속 됩니다
        { "date": "2026-10-05", "rank": 419734, "keyword_cnt": 2 }
      ]
    }
  ]
}
응답 필드
url 조회한 블로그 주소
blog_name 블로그명 (집계 정보가 없으면 null)
history 주간 추이 배열 (최근 52주 이내, 오래된 → 최신 순. 집계 주가 없으면 빈 배열)
date 해당 지점 집계 기준 날짜
rank 해당 주의 전체 순위 (1이 최고)
keyword_cnt 해당 주 유효키워드 수
GET /v1/blog/keyword

블로그에 유입된 키워드 목록을 조회합니다. 웹 화면의 전체키워드 목록에 해당합니다. 최신 수집 순으로 블로그당 최대 50개를 돌려줍니다.

파라미터
url 조회할 블로그 URL (필수, 예: blog.naver.com/계정명) — 여러 개는 반복 전달, 최대 20개
요청
curl "https://www.blogchart.co.kr/api/v1/blog/keyword?url=blog.naver.com/haechiseoul" \
  -H "Authorization: Bearer <발급받은 키>"
예제 (테스트 api key 사용)
curl "https://www.blogchart.co.kr/api/v1/blog/keyword?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword" \
  -H "Authorization: Bearer deadbeefcafebabe0123456789abcdef"
fetch("https://www.blogchart.co.kr/api/v1/blog/keyword?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword", {
  headers: { "Authorization": "Bearer deadbeefcafebabe0123456789abcdef" }
})
  .then(function (r) { return r.json(); })
  .then(function (j) { console.log(j); });
import json
from urllib.request import Request, urlopen

req = Request("https://www.blogchart.co.kr/api/v1/blog/keyword?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword",
              headers={"Authorization": "Bearer deadbeefcafebabe0123456789abcdef"})
with urlopen(req) as resp:
    print(json.loads(resp.read().decode("utf-8")))
$ch = curl_init("https://www.blogchart.co.kr/api/v1/blog/keyword?url=blog.naver.com/haechiseoul&url=blog.naver.com/luckeyword");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer deadbeefcafebabe0123456789abcdef"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
응답
{
  "status": "success",
  "data": [
    {
      "url": "blog.naver.com/haechiseoul",
      "blog_name": "서울특별시 공식블로그",
      "keyword_cnt": 50,
      "keywords": [
        "서울천막",
        "버스조명",
        // ... 키워드가 50개까지 계속 됩니다
      ]
    },
    {
      "url": "blog.naver.com/luckeyword",
      "blog_name": "네이버 비즈니스 스쿨 공식 블로그",
      "keyword_cnt": 50,
      "keywords": [
        "숏클립제작",
        "숏클립",
        "지역브랜드",
        // ... 키워드가 50개까지 계속 됩니다
      ]
    }
  ]
}
응답 필드
url 조회한 블로그 주소
blog_name 블로그명 (집계 정보가 없으면 null)
keyword_cnt 반환한 키워드 수 (최대 50. 50이면 더 많은 키워드가 있다는 뜻)
keywords 블로그에 유입된 키워드 문자열 배열 (최신 수집 순)
GET /v1/account/quota

계정의 남은 쿼리와 사용한 쿼리를 조회합니다. 검색노출 분석 첫 화면에 뜨는 잔여/사용 쿼리와 같은 수치입니다. 이 호출 자체는 쿼리를 차감하지 않습니다.

요청
curl "https://www.blogchart.co.kr/api/v1/account/quota" \
  -H "Authorization: Bearer <발급받은 키>"
예제 (테스트 api key 사용)
curl "https://www.blogchart.co.kr/api/v1/account/quota" \
  -H "Authorization: Bearer deadbeefcafebabe0123456789abcdef"
fetch("https://www.blogchart.co.kr/api/v1/account/quota", {
  headers: { "Authorization": "Bearer deadbeefcafebabe0123456789abcdef" }
})
  .then(function (r) { return r.json(); })
  .then(function (j) { console.log(j); });
import json
from urllib.request import Request, urlopen

req = Request("https://www.blogchart.co.kr/api/v1/account/quota",
              headers={"Authorization": "Bearer deadbeefcafebabe0123456789abcdef"})
with urlopen(req) as resp:
    print(json.loads(resp.read().decode("utf-8")))
$ch = curl_init("https://www.blogchart.co.kr/api/v1/account/quota");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer deadbeefcafebabe0123456789abcdef"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
응답
{
  "status": "success",
  "data": {
    "limit_query_cnt": 1000,
    "query_cnt": 320,
    "today_query_cnt": 12,
    "remain_query_cnt": 680,
    "end_date": "2026-11-30"
  }
}

유효한 상품이 하나도 없으면 remain_query_cnt는 0, end_date는 null로 돌려줍니다. (위의 예제 요청에 쓰는 테스트 키는 계정이 없는 키라 이 기준으로 remain_query_cnt: 0이 반환됩니다.)

조회 한도

API 조회 한도는 블로그 분석 500건·블로그 분석 1000건·쿼리형 상품을 웹에서 쓸 때 쓰는 한도와 합산되어 함께 빠집니다.
예를 들어 한 달 조회 한도가 1,000개인 상품을 쓰고 있다면, 웹 화면에서 500회를 본 뒤 API로 300회를 조회하면 남은 한도는 200회입니다.
같은 날 같은 블로그는 웹·API 어느 쪽에서 조회해도 한 번만 차감됩니다.

API 키를 사용 중지 상태로 바꾸면 로그인 여부와 관계없이 모든 API 호출이 차단됩니다.

에러 코드

상태 코드설명
200조회 성공
400필수 값 누락·잘못된 값 (URL 20개 초과, 잘못된 URL 형식 등)
401API 키가 잘못됐거나 사용 중지 상태
403조회 권한 없음 — 조회 한도 초과, 하루 한도 초과, 조회가 제한된 계정, 테스트 키로 샘플 블로그 외 URL을 요청한 경우
404순위에 없는 블로그 (여러 URL 중 일부면 그 URL만 결과에서 빠지고 나머지는 정상 반환)
429호출 제한 도달 — 짧은 시간에 너무 많은 요청 (잠시 후 다시 시도)
에러 응답 형식

에러도 본문은 항상 아래 JSON 형식이고, error.code가 위의 상태 코드와 같습니다.

{
  "status": "error",
  "error": {
    "code": 401,
    "message": "잘못된 API 키이거나 사용 중지 상태입니다."
  }
}
대표 에러 응답 예시
// 400 — url 파라미터 없음
{ "status": "error", "error": { "code": 400, "message": "url 파라미터가 필요합니다 (예: ?url=blog.naver.com/계정명)." } }

// 401 — API 키 없음
{ "status": "error", "error": { "code": 401, "message": "요청 헤더에 Authorization: Bearer 형태로 API 키를 포함해야 합니다." } }

// 403 — 조회 한도 초과
{ "status": "error", "error": { "code": 403, "message": "조회 한도를 초과했습니다. 남은 한도는 /v1/account/quota에서 확인할 수 있습니다." } }

// 404 — 순위에 없는 블로그
{ "status": "error", "error": { "code": 404, "message": "순위권에 존재하지 않는 블로그입니다." } }

자주 묻는 질문

API 키는 어디에 쓰이나요?

유료 서비스의 조회 한도와 계정을 잇는 인증 수단입니다. API 키가 노출되면 내 한도가 남의 프로그램에 쓰일 수 있으니 서버 쪽에만 두고, 브라우저 JavaScript·앱 소스에 직접 하드코딩 하지 말아 주세요.

API 키는 언제 재발급하나요?

유출이 의심되거나 프로그램을 그만둘 때 재발급하면 됩니다. 재발급하면 기존 API 키는 바로 막히고, 새로 받은 API 키를 프로그램에 다시 등록해야 합니다.

데이터는 언제 갱신되나요?

블로그 순위와 모든 분석 데이터는 매주 월요일 집계됩니다. 주중 조회는 최신 집계 시점 기준 데이터를 돌려줍니다. 추이(history)의 주 단위 지점도 같은 집계 기준입니다.

API 서비스에 대한 문의는 아래 게시판으로 남겨 주세요.

1:1 문의