주제

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로 응답합니다). 코드, 메시지, 힌트, 문서 링크는 바뀌지 않습니다.

오류 응답 읽기

json
{
  "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-..."
}

이해할 수 없는 응답을 받았다면, 가장 빠른 방법은 다음과 같습니다.

  1. code을 확인합니다.
  2. URL 빌더를 점검합니다 — 대부분의 실패는 계정 문제가 아니라 서명 버그입니다.
  3. 아래 코드에서 정확한 원인과 해결 방법을 찾습니다.
  4. 대시보드에서 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, ...)에 대한 문서를 사이드바에서 확인하십시오.

무료로 체험해 보세요 — 가입 불필요

몇 초 만에 동적 OG 이미지를 미리 보고 테스트하세요.

무료 OG 이미지 테스터 열기

A BeCaSimulations site