API 오류 — 각 코드의 의미와 해결 방법
FastOG는 요청이 실패하면 기계가 읽을 수 있는 오류 코드를 반환합니다. 서명된 OG 이미지 렌더링 요청이든, 제품 내 관리자 화면 중 하나에 대한 호출이든 마찬가지입니다. 모든 오류 응답에는 다음이 포함됩니다.
error— 레거시 짧은 토큰입니다. 이전 클라이언트가 계속 동작하도록 모든 실패 응답에 여전히 포함됩니다.code— 동일한 안정적이고 문서화된 오류 코드(아래 표)이며, 공개 API가 사용하는 이름으로 제공됩니다.message— 무엇이 잘못되었는지에 대한 한 문장 설명입니다.hint— 무엇이 잘못되었고 어떻게 해결해야 하는지에 대한 짧고 평이한 설명입니다.docs_url— 해당 코드의 섹션으로 연결되는 이 페이지 링크입니다.request_id— 이 HTTP 실패를 대시보드 Render Logs 표의 행과 연결합니다(X-Request-ID응답 헤더에도 반환됩니다). 연결할 대상이 없는 화면은null로 응답하지만, 이 키는 항상 존재합니다.
제품 내 화면인 Shopify admin, WooCommerce Studio, Wix bridge, 데모는 아래 코드에 대해 동일한 응답 봉투(envelope)로 응답하므로, 어디서 마주치든 실패의 의미는 같습니다. 모듈 화면은 특정 코드에 대해 기존에 반환하던 HTTP 상태를 유지할 수 있습니다(예를 들어 render_failed는 커버 내보내기에서 503, 공개 API에서 502로 응답합니다). 코드, 메시지, 힌트, 문서 링크는 바뀌지 않습니다.
오류 응답 읽기
{
"error": "invalid_signature",
"code": "invalid_signature",
"message": "The signature does not match.",
"hint": "The signature did not match. Re-sign with your HMAC secret after every param change.",
"request_id": "5f2a9c1e-..."
}
이해할 수 없는 응답을 받았다면, 가장 빠른 방법은 다음과 같습니다.
code을 확인합니다.- URL 빌더를 점검합니다 — 대부분의 실패는 계정 문제가 아니라 서명 버그입니다.
- 아래 코드에서 정확한 원인과 해결 방법을 찾습니다.
- 대시보드에서 Render Logs를 열고 동일한
error_code로 필터링합니다 — 각 행에 요청된 파라미터가 표시되므로 재현할 수 있고,request_id이 일치하는지도 확인할 수 있습니다.
서명 및 인증
missing_signature
요청에 key 및/또는 s(서명) 쿼리 파라미터가 누락되었습니다.
해결: URL에 key=<api-key>과 s=<hmac-signature>가 모두 포함되어 있는지 확인하십시오. SDK 또는 /docs/hmac-signature-guide 안내를 사용하여 URL을 구성하십시오.
invalid_signature
s 값이 이 URL에 대해 HMAC 시크릿이 생성한 값과 일치하지 않습니다.
해결: 서명은 s을 제외한 모든 쿼리 파라미터를 키 기준으로 정렬하여 포함합니다. 파라미터를 변경하면 — 순서 변경, URL 인코딩 차이, 공백 추가를 포함하여 — 서명이 무효화됩니다. 변경할 때마다 다시 서명하십시오. 시크릿이 API 키 생성 시 표시된 것과 동일한지 확인하십시오.
invalid_signature_format
s 값이 64자 hex 문자열이 아닙니다.
해결: 서명은 raw SHA-256 hex(소문자 a-f0-9)여야 합니다. 출력을 base64로 인코딩하거나 잘라내고 있다면 일반 hex를 사용하십시오.
expired_timestamp
제공한 t 타임스탬프가 5분을 초과하여 오래되었습니다.
해결: URL을 구성할 때마다 타임스탬프를 다시 생성하십시오. 이 코드는 레거시 서명 URL 흐름에 적용되며, 현재의 HMAC v2 흐름에는 타임스탬프가 없습니다.
invalid_api_key
전달한 key이(가) 존재하지 않습니다.
해결: 대시보드에서 전체 API 키를 복사하십시오. sk_으로 시작하는 공개 식별자입니다. 이 값은 공개되어 있으며 URL에 포함해도 안전합니다. 소유권을 증명하는 것은 URL에 절대 포함되지 않는 시크릿입니다.
missing_hmac_secret
API 키에 HMAC 시크릿이 구성되어 있지 않습니다.
해결: 대시보드에서 새 API 키를 생성하십시오. HMAC 시크릿은 생성 시 한 번만 생성되어 표시됩니다.
매개변수 / 입력
invalid_image_url
URL을 포함하는 prop(image, brand_logo, logo, avatar, background_image, ...)이 공개 http(s) URL이 아닙니다.
수정: 공개적으로 가져올 수 있는 https://... URL을 전달하십시오. 서버 측 요청 위조를 방지하기 위해 localhost, 사설 IP, 그리고 경로만 있는 값은 거부됩니다.
구독
subscription_required (402)
요청이 Dynamic API에 도달했지만 계정에 활성 플랜이 없습니다. API 접근은 구독 전용입니다. 플랜이 게이트 역할을 하며, FastOG 앱에서 판매하는 것과 동일한 커버리지 + 기능 사다리를 제공합니다. 렌더링 자체는 과금되지 않습니다. 월간 렌더 할당량도, 초과 요금도 없습니다.
해결: 대시보드에서 Dynamic API 플랜을 선택하고 API 키를 생성하십시오. 응답에는 플랜 페이지를 가리키는 top_up_url이 포함됩니다.
렌더 서비스
store_blocked (403)
이 키 뒤에 있는 스토어의 렌더링이 FastOG에 의해 일시 중지되었습니다(예: 남용 또는 과도한 사용). 엣지에 이미 캐시된 커버는 만료될 때까지 계속 제공될 수 있습니다. 해결하려면 지원팀에 문의하십시오. 요청에서 변경할 수 있는 사항으로는 이 문제가 해결되지 않습니다.
render_unreachable
렌더 서비스에 연결할 수 없습니다(짧은 재시작 구간).
해결: 몇 초 후에 다시 시도하십시오. 이 시도에 대한 렌더는 집계되지 않았습니다.
render_failed
렌더 서비스가 요청에 대해 오류를 반환했습니다.
해결: 템플릿 props를 확인하십시오. 값이 너무 길거나 형식이 잘못되었거나, 지원되지 않는 필드가 있거나, 업스트림 이미지에 연결할 수 없는 경우입니다. 응답에는 근본 원인이 되는 status이 포함됩니다. 렌더는 집계되지 않았습니다.
스토어 관리자 화면
이 코드들은 Shopify 관리자와 WooCommerce Studio, 즉 판매자가 서명된 API가 아니라 실제로 작업하는 임베디드 편집기에서 응답합니다. 일부는 공개 API와 공유되며(invalid_image_url, render_failed, invalid_signature), 해당 항목은 위에 문서화된 내용을 그대로 유지합니다.
| 코드 | HTTP | 의미와 해결 방법 |
|---|---|---|
invalid_shop |
422 | Shopify 스토어를 식별할 수 없습니다. Shopify 관리자에서 FastOG 앱을 다시 로드하여 임베디드 요청에 스토어 정보가 다시 포함되도록 한 후 재시도합니다. |
invalid_shop_or_page |
422 | 스토어 또는 페이지 유형을 알 수 없습니다. Shopify 관리자에서 FastOG 앱을 열고 편집기에서 커버 페이지 유형을 선택합니다. |
invalid_store |
422 | WooCommerce 스토어를 식별할 수 없습니다. WordPress 관리자에서 Studio를 다시 열어 스토어 토큰이 다시 제시되도록 한 후 재시도합니다. |
invalid_store_or_page |
422 | 스토어 또는 페이지 유형을 알 수 없습니다. WordPress 관리자에서 Studio를 다시 열고 편집기에서 제공하는 커버 페이지 유형을 선택합니다. |
missing_api_key |
422 | 스토어에 서명 키가 없습니다. WordPress 관리자에서 플러그인 설치를 완료하여 FastOG가 스토어에 서명 키를 발급할 수 있도록 합니다. |
store_ownership_unverified |
403 | WordPress 사이트를 확인할 수 없습니다. 사이트는 REST API가 활성화된 상태로 공용 HTTPS를 통해 접근 가능해야 합니다. |
community_is_free |
422 | Community 플랜은 무료입니다. 무료 기본 플랜이며 구매할 수 없으므로, 업그레이드하려면 유료 등급을 선택합니다. |
not_installed |
404 | 이 스토어에 FastOG가 설치되어 있지 않습니다. Shopify App Store에서 이 스토어용 FastOG 앱을 설치한 후 다시 엽니다. |
oauth_required |
409 | 스토어에서 FastOG를 다시 승인해야 합니다. Shopify 관리자에서 FastOG OAuth 설치를 다시 실행합니다. 저장된 권한 부여가 취소되었거나 스코프가 변경되었습니다. |
reconnect_required |
409 | Shopify 연결을 다시 설정해야 합니다. FastOG 앱의 Reconnect 버튼을 사용하여 새 액세스 토큰을 발급받습니다. |
token_rejected |
409 | Shopify가 액세스 토큰을 발급한 후 거부했습니다. 재연결을 한 번 재시도하고, Shopify가 계속 거부하면 앱을 재설치합니다. |
unauthorized |
401 | 요청에 이 화면에 대한 유효한 세션이 없습니다. 플랫폼 관리자에서 FastOG 앱을 다시 로드하여 새 세션 토큰이 첨부되도록 한 후 재시도합니다. |
shop_not_found |
404 | 해당 스토어가 더 이상 FastOG에 존재하지 않습니다. Shopify 관리자에서 FastOG를 재설치하여 스토어 레코드를 다시 생성합니다. |
invalid_product |
422 | 제품 참조가 유효하지 않습니다. 제품 페이지를 다시 로드하고 FastOG를 다시 엽니다. 전송된 제품 id가 누락되었거나 숫자가 아니었습니다. |
invalid_product_cover |
422 | 제품 커버 페이로드의 형식이 잘못되었습니다. 편집기를 다시 로드하고 다시 저장합니다. props, style, signals는 각각 객체여야 합니다. |
product_not_found |
404 | 스토어에서 제품을 읽을 수 없습니다. 제품이 여전히 존재하고 게시되어 있는지 확인한 후 편집기를 다시 로드합니다. |
product_customization_not_on_plan |
403 | 제품별 커버 사용자 지정은 이 플랜에서 제공되지 않습니다. 업그레이드하거나 공유 제품 커버를 대신 편집합니다. |
no_product_handles |
422 | 새로 고칠 제품을 찾을 수 없습니다. 공개 핸들이 있는 제품을 하나 이상 게시한 후 공유 미리보기 새로 고침을 다시 시도합니다. |
invalid_style |
422 | 스타일 블록을 사용할 수 없습니다. 편집기를 다시 로드하고 색상과 글꼴을 다시 선택합니다. 값 하나를 정규화할 수 없었습니다. |
invalid_template |
422 | 요청한 템플릿이 이 플랫폼 카탈로그에 없습니다. 편집기에서 제공하는 레이아웃 중 하나를 선택합니다. |
invalid_preset |
422 | 프리셋 이름이 이 플랫폼에서 제공하는 이름이 아닙니다. 설정 화면에서 프리셋을 선택합니다. |
invalid_set |
422 | 커버 세트 페이로드가 누락되었거나 형식이 잘못되었습니다. 설정 화면을 다시 로드하고 세트를 다시 선택합니다. |
preset_not_applyable |
422 | 이 프리셋을 모든 페이지 유형에 적용할 수 없습니다. 다른 프리셋을 선택합니다. 이 프리셋에는 하나 이상의 페이지 유형에 대한 커버가 없습니다. |
template_not_available |
422 | 템플릿이 렌더링 가능한 카탈로그에 없습니다. 선택기에서 제공하는 레이아웃을 선택합니다. |
template_not_available_on_shopify |
422 | 템플릿을 Shopify 스토어에서 사용할 수 없습니다. Shopify 편집기에서 제공하는 레이아웃을 선택합니다. |
template_not_available_on_woocommerce |
422 | 템플릿을 WooCommerce 스토어에서 사용할 수 없습니다. Studio에서 제공하는 레이아웃을 선택합니다. |
template_unavailable |
422 | 템플릿을 이 스토어에서 사용할 수 없습니다. 편집기에서 제공하는 레이아웃을 선택합니다. 해당 템플릿은 폐기되었거나, 알 수 없거나, 스토어가 그릴 수 있는 범위를 초과합니다. |
template_not_on_plan |
403 | 템플릿에 더 높은 플랜이 필요합니다. 플랜을 변경하거나 현재 플랜에서 지원하는 레이아웃을 선택합니다. 응답의 requires에 플랜 이름이 표시됩니다. |
template_requires_higher_plan |
403 | 템플릿에 더 높은 플랜이 필요합니다. 응답의 requires에 플랜 이름이 표시됩니다. |
no_rule |
404 | 이 페이지 유형에 대한 커버 규칙이 아직 없습니다. 먼저 편집기에서 이 페이지 유형의 커버를 저장합니다. |
cover_not_configured |
404 | 아직 저장된 제품 커버가 없습니다. 제품 커버를 다운로드하거나 공유하기 전에 먼저 저장합니다. |
schedule_only_product |
422 | 캠페인 예약은 제품 커버에만 존재합니다. 되돌림 날짜를 제거하거나 캠페인을 제품 커버로 옮깁니다. |
not_dismissible |
422 | 해당 공지 사항은 닫을 수 없습니다. 페이지를 다시 로드합니다. 이미 폐기되었거나 다른 스토어에 속해 있습니다. |
unsupported_locale |
422 | 해당 UI 언어는 이 앱에 포함되어 있지 않습니다. 응답의 supported에 나열된 언어 중 하나를 선택합니다. |
no_setup_sets |
422 | 큐레이션된 커버 세트를 구성할 수 없습니다. 설정 화면을 다시 시도하고, 계속 비어 있으면 지원팀에 문의합니다. |
export_unavailable |
403 | 다운로드는 이 플랜에서 제공되지 않습니다. 커버 파일을 다운로드하려면 Pro 이상으로 업그레이드합니다. |
cancellation_failed |
502 | 구독 취소가 거부되었습니다. 잠시 후 재시도하고, 계속 실패하면 Shopify 결제 페이지에서 취소하거나 지원팀에 문의합니다. |
logo_override_on_plan |
403 | 로고 재정의는 이 플랜에서 제공되지 않습니다. 업그레이드하거나 로고 재정의를 해제합니다. |
invalid_logo |
422 | 로고 파일이 허용되는 이미지가 아닙니다. 편집기에 표시된 크기 제한 이하의 PNG, JPEG 또는 WebP를 업로드합니다. |
invalid_brand_image |
422 | 브랜드 참조 이미지를 사용할 수 없습니다. 크기 제한 이하의 지원되는 이미지를 업로드하거나 참조를 해제하고 다시 저장합니다. |
brand_image_too_large |
422 | 브랜드 참조 이미지가 너무 큽니다. 파일 크기를 줄이고 다시 업로드합니다. |
brand_colors_too_many |
422 | 브랜드 색상이 세 개를 초과하여 제공되었습니다. 최대 세 개의 hex 색상을 보냅니다. |
upload_failed |
500 | 업로드한 파일을 저장할 수 없습니다. 재시도하고, 계속 실패하면 지원팀에 문의합니다. 에셋 저장소가 공개 URL을 반환하지 않았습니다. |
attachment_upload_failed |
500 | 지원 첨부 파일을 저장할 수 없습니다. 첨부 파일 없이 메시지를 보낸 후 파일을 지원팀에 이메일로 보냅니다. |
invalid_webhook |
401 | 스토어 웹훅 서명을 확인하지 못했습니다. WordPress FastOG 설정의 웹훅 시크릿이 FastOG가 발급한 값과 일치하는지 확인합니다. |
not_found |
404 | 해당 엔드포인트가 더 이상 존재하지 않습니다. WordPress 관리자에서 Studio를 다시 엽니다. |
meta_refresh_unavailable |
503 | 공유 미리보기 새로 고침이 구성되어 있지 않습니다. 대신 Facebook에서 링크를 다시 공유합니다. |
theme_write_disabled |
409 | 이 앱에 대해 테마 편집이 활성화되어 있지 않습니다. 테마 파일 수정 대신 테마 앱 임베드를 사용합니다. |
scope_required |
403 | FastOG에 Shopify 권한이 없습니다. 응답의 consent_url를 사용하여 요청된 스코프를 승인한 후 수정 사항을 다시 시도합니다. |
Wix 브리지
Wix 브리지는 판매자 세션이 아니라 Wix 앱이 서명하므로, 이 브리지의 실패는 앱 개발자에게 귀속됩니다. 모든 응답에는 여전히 code과 request_id이 포함되며, 브리지 요청 id는 서명된 봉투(envelope)의 id입니다.
| 코드 | HTTP | 의미와 대응 방법 |
|---|---|---|
invalid_bridge_signature |
401 | Wix 브리지 서명이 검증되지 않았습니다. 공유 시크릿, 정확한 경로, 5분 이내의 타임스탬프로 요청을 다시 발급하십시오. |
invalid_bridge_body |
400 | 브리지 봉투 본문의 형식이 잘못되었습니다. body을 JSON 객체로 보내고 그 안의 모든 숫자를 문자열로 인코딩하여 정규 서명이 일치하도록 하십시오. |
replayed_bridge_request |
401 | 해당 브리지 요청은 이미 사용되었습니다. 상태를 변경하는 호출마다 새로운 request_id을 발급하십시오. |
wix_site_not_installed |
403 | 이 Wix 사이트에 FastOG가 설치되어 있지 않습니다. 사이트에 FastOG 앱을 설치한 후 다시 여십시오. |
wix_site_not_provisioned |
422 | Wix 사이트에 아직 서명 자격 증명이 없습니다. FastOG 앱을 다시 설치하여 사이트에 API 키가 프로비저닝되도록 하십시오. |
invalid_page_type |
422 | FastOG가 Wix에서 지원하지 않는 페이지 유형입니다. Studio에서 제공하는 페이지 유형 중 하나를 보내십시오. |
rule_not_found |
404 | 해당 id의 규칙이 없습니다. 목록을 새로 고치십시오. 규칙이 삭제되었거나 다른 사이트에 속해 있습니다. |
invalid_target_id |
422 | 이 페이지 유형에 대해 Wix 대상 id가 유효하지 않습니다. 해당 페이지 유형에 대해 Wix 앱이 제공하는 id를 보내십시오. |
invalid_preview |
422 | 미리보기 페이로드의 형식이 잘못되었습니다. 실패한 필드에 대한 details 객체를 확인하십시오. |
invalid_rule |
422 | 커버 규칙 페이로드의 형식이 잘못되었습니다. details 객체를 확인하십시오. template은 필수이며 선택적 블록은 객체여야 합니다. |
invalid_sync |
422 | 동기화 페이로드의 형식이 잘못되었습니다. details 객체를 확인하십시오. target_type과 target_id이 일치해야 합니다. |
invalid_regenerate_url |
422 | 재생성할 URL이 누락되었습니다. url에 페이지 URL을 보내십시오. |
invalid_regenerate_host |
422 | 해당 URL이 FastOG 호스트에 속하지 않습니다. fastog.com 커버 URL을 보내십시오. |
ai_presets_unsupported |
422 | AI가 디자인한 커버 세트는 더 이상 생성되지 않습니다. 대신 큐레이션된 룩 중 하나를 선택하십시오. |
original_tags_required |
422 | 원본 메타데이터 태그가 필요합니다. 제거 시 사이트 메타데이터를 복원할 수 있도록 original_tags(또는 current_tags)을 보내십시오. |
invalid_restored |
422 | 복원된 키 페이로드의 형식이 잘못되었습니다. restored을 메타데이터 키의 배열로 보내십시오. |
invalid_seo_target |
422 | SEO 대상 유형을 알 수 없습니다. 경로에 site, pattern 또는 item을 사용하십시오. |
invalid_seo_payload |
422 | SEO 메타데이터 페이로드의 형식이 잘못되었습니다. target_id, current_tags, fastog_url을 절대 http(s) URL로 보내십시오. |
sync_failed |
500 | Wix로의 메타데이터 동기화에 실패했습니다. 재시도하십시오. 계속 실패하면 사이트에 접근할 수 있는지와 앱이 여전히 설치되어 있는지 확인하십시오. |
invalid_tier |
422 | FastOG가 Wix에서 판매하지 않는 플랜입니다. tier로 starter, pro 또는 scale을 보내십시오. |
데모 표면
데모는 판매자용 엔드포인트가 아니라 소유자 전용 판매 콘솔입니다.
| 코드 | HTTP | 의미와 대처 방법 |
|---|---|---|
url_required |
422 | URL이 전송되지 않았습니다. 카드를 읽기 전에 스토어 또는 상품 링크를 붙여넣으십시오. |
unreadable_url |
422 | 해당 페이지를 읽을 수 없습니다. 링크가 공개되어 있고 완전한지 확인하십시오. 로그인 뒤에 있는 페이지는 읽을 수 없습니다. |
no_api_key |
422 | 커버에 서명할 API key를 사용할 수 없습니다. API key를 생성하거나(또는 유효한 key를 입력하십시오) 응답에 API keys 페이지 링크가 포함됩니다. |
no_presets |
500 | 커버 프리셋이 구성되어 있지 않습니다. 서버에 프리셋을 하나 이상 구성하십시오. |
범위 지정 규칙 편집기 코드
범위 지정 규칙 편집기(Shopify admin 및 WooCommerce Studio)는 이러한 토큰을 판매자의 자체 언어로 직접 번역하므로, 해당 응답에는 error과 code이 포함되지만 hint은 포함되지 않습니다. 두 번째 영어 설명은 판매자가 실제로 보는 현지화된 설명과 어긋나기만 할 뿐입니다:
scope_already_defined, scoped_rule_limit_reached, scoped_rules_not_on_plan,
scope_value_required, scope_value_too_long, unknown_scope_type, base_rule_required,
scoped_rules_product_only, cannot_delete_base_rule.
계속 막혀 있나요?
- 대시보드의 Render Logs 페이지를 여십시오. 모든 결과(성공 + 거부)가 해당
error_code, HTTP 상태, 요청된 파라미터와 함께 나열됩니다. - 서명된 URL에서
php artisan og:diagnose을 실행하여 전체 파이프라인을 따라가며 어느 단계에서 실패하는지 확인하십시오. - 사용 중인 프레임워크(Next.js, Express, SvelteKit, ...)에 대한 문서를 사이드바에서 확인하십시오.