PageSpeed API 429, 18번 요청이 모두 막힌 이유
블로그 속도를 숫자로 남기려고 PageSpeed Insights API를 스크립트로 호출했다. 2026년 10월 13일, 홈과 최신 글 2개를 mobile과 desktop으로 나눠 6개 조합을 만들고 조합마다 3번씩, 모두 18번 요청했다. 18번 모두 HTTP 429 RESOURCE_EXHAUSTED였고, 응답에는 quota_limit_value: "0"이 들어 있었다.
이 글은 PageSpeed API에서 429를 받고 "블로그가 문제인가" 하고 멈춘 사람을 위한 판독 순서다. 목표는 응답 필드로 사이트 문제와 측정 도구의 quota 문제를 가르고, 점수를 추정하지 않고 미측정으로 남긴 뒤, 다음 측정 경로를 고르는 것이다.
먼저 범위를 밝힌다. 이 글은 차단을 해결한 기록이 아니다. 이 날 점수는 끝내 얻지 못했고, 아래의 다음 경로도 아직 시도하지 않았다.
무슨 일이 있었나
호출한 것은 PageSpeed Insights API v5의 runPagespeed 메서드였고, 요청 경로는 /pagespeedonline/v5/runPagespeed?url=<인코딩한 URL>&strategy=mobile|desktop 형식이었다. 요청 주소에는 url과 strategy 두 파라미터만 있었다.
스크립트는 429를 받으면 2초, 다시 받으면 4초를 기다렸다가 재시도했다. 조합마다 3번, 6개 조합이라 18번이다. 결과는 하나도 다르지 않았다. 18번 모두 429였고, Lighthouse 점수도, LCP·INP·CLS도, CrUX 실사용 값도 받지 못했다.
같은 날 같은 블로그의 공개 페이지는 정상이었다. Chrome 일반 UA와 Googlebot UA로 표본 11개 URL과 모바일 변형을 요청한 44번이 모두 HTTP 200이었다.
1단계: 응답의 service·reason·quota 필드를 읽는다
받은 응답 하나를 옮긴다. consumer와 project 번호는 지웠고, 반복되는 message와 한도 상향 안내(Help) 블록은 줄였다.
{
"error": {
"code": 429,
"message": "Quota exceeded for quota metric 'Queries' and limit 'Queries per day' of service 'pagespeedonline.googleapis.com' for consumer '<삭제>'.",
"errors": [
{ "message": "(위와 같음)", "domain": "global", "reason": "rateLimitExceeded" }
],
"status": "RESOURCE_EXHAUSTED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "RATE_LIMIT_EXCEEDED",
"domain": "googleapis.com",
"metadata": {
"quota_limit_value": "0",
"quota_limit": "defaultPerDayPerProject",
"consumer": "<삭제>",
"service": "pagespeedonline.googleapis.com",
"quota_location": "global",
"quota_unit": "1/d/{project}",
"quota_metric": "pagespeedonline.googleapis.com/default"
}
}
]
}
}
필드를 하나씩 읽으면 판정이 나온다.
| 필드 | 값 | 읽는 법 |
|---|---|---|
HTTP 상태, error.code | 429 | 요청이 거절됐다. 측정 대상 페이지의 응답 코드가 아니다. |
status | RESOURCE_EXHAUSTED | 호출 쪽 자원(quota)이 바닥났다는 분류다. |
reason | rateLimitExceeded, RATE_LIMIT_EXCEEDED | 한도 초과로 거절했다. |
service | pagespeedonline.googleapis.com | 막힌 것은 PageSpeed API 서비스 사용량이다. 내 블로그 주소가 아니다. |
quota_limit | defaultPerDayPerProject | 프로젝트당 하루 기본 한도에 걸렸다. |
quota_unit | 1/d/{project} | 하루 단위, 프로젝트 단위로 센다. |
quota_limit_value | "0" | 그 하루 한도 값이 0으로 기록돼 있다. |
message | Queries per day | 일일 쿼리 한도 초과라는 같은 내용을 문장으로 다시 적었다. |
판정에서 중요한 것은 consumer와 service다. 오류가 붙은 대상은 요청을 보낸 쪽(consumer)이 쓰는 PageSpeed API 서비스다. 측정하려던 블로그 URL에 대한 판정은 응답 어디에도 없다. 그래서 이 429는 "블로그가 느리다"도 "블로그가 죽었다"도 뜻하지 않는다. 같은 날 공개 페이지 44번이 모두 200이었던 기록도 같은 방향을 가리킨다.
이 consumer의 하루 한도가 왜 0으로 잡혀 있었는지는 이번 기록에 없다. 응답은 한도 상향 요청 안내(Request a higher quota limit.) 링크를 함께 돌려주었지만, 이번 작업에서는 계정을 만들거나 quota를 바꾸지 않았다.
2단계: 점수는 0점이 아니라 '미측정'으로 남긴다
측정이 막히면 보고서 칸을 무엇으로 채울지가 남는다. 이번에는 점수와 Core Web Vitals 칸을 모두 비워 두고 추정값을 적지 않았다.
- 0점으로 적지 않는다. 0점은 측정했더니 나빴다는 뜻이 되기 때문이다.
- 다른 날, 다른 도구의 값을 끌어와 채우지 않는다.
- 이 항목을 사이트 결함이 아니라
med등급의 검증 공백으로 분류했다. 결함 목록에 넣으면 고칠 대상이 블로그 설정처럼 보이지만, Blogger 설정을 바꿔서는 API quota 오류를 고칠 수 없다.
당시 재시도의 한계
2초, 4초 backoff는 결과를 바꾸지 못했다. 응답 필드를 다시 보면 이유가 보인다. 한도는 하루 단위(1/d/{project})이고 그 값이 0이다. 몇 초를 기다린다고 하루 한도가 다시 채워질 수 없고, 한도 자체가 0이면 하루를 기다려도 같은 결과가 나올 가능성이 크다. 이 판단은 필드 값에서 끌어낸 것이고, 다음 날 다시 호출해 확인하지는 않았다.
결국 18번의 요청이 알려 준 것은 "6개 조합 모두 같은 이유로 막혔다"는 것뿐이었다. 지금이라면 첫 429에서 quota_unit과 quota_limit_value를 먼저 읽는다. 하루 단위 한도이고 값이 0이면 그 자리에서 재시도를 멈추고, 결과를 미측정으로 기록한다. 초 단위 backoff는 분·초 단위 한도에 걸렸을 때에나 의미가 있다고 본다. 이 역시 이번에 실험으로 확인한 것은 아니다.
3단계: 다음 확인 경로 (아직 시도하지 않음)
감사 보고서에 적어 둔 재검증 경로는 두 가지다. 둘 다 이 글을 쓰는 시점에는 시도하지 않았고, 성공했다고 말할 수 없다.
- 정상 quota가 있는 API key 또는 project로 같은 API를 다시 호출한다. 이번 요청 주소에는 key 파라미터가 없었다.
- 공개 PageSpeed Insights 웹 화면에서 같은 URL을 실행하고 결과를 기록한다.
어느 쪽으로 점수를 얻든, 그때 비로소 블로그 속도를 이야기할 수 있다. 그 전까지 속도 항목의 상태는 "측정 실패"다.
이 기록으로 답하지 않는 것
- 이 블로그의 실제 Lighthouse 점수나 Core Web Vitals 값.
- 이 consumer의 일일 한도가 0이 된 이유.
- API key를 붙이거나 웹 화면에서 실행하면 실제로 측정이 되는지.
측정 도구가 막혀도 검색 노출을 점검할 기본 항목은 남아 있다. 그 목록은 블로그 SEO 초보 실수 5가지 — GSC 등록부터 내부 링크까지에 정리했다. 도구가 내놓은 결과와 실제 상태를 구분하는 문제는 테스트 113개 다 통과했는데 실제론 0개를 긁었다 — AI가 짠 수집기의 함정에서도 다뤘다.
결론: 429는 측정 도구의 상태다
PageSpeed API의 429 RESOURCE_EXHAUSTED는 블로그가 아니라 호출한 쪽의 PageSpeed API quota가 막혔다는 응답이었다. service, quota_unit, quota_limit_value를 먼저 읽었다면 18번까지 재시도할 이유가 없었다. 점수는 0점이 아니라 미측정으로 남겼고, 다음 경로는 quota가 있는 key나 공개 웹 실행이다. 그 결과를 얻기 전까지 블로그 속도에 대한 결론은 내리지 않는다.
댓글
댓글 쓰기