Erori API — Ce înseamnă fiecare cod și cum să o repari
FastOG returnează coduri de eroare citibile de mașină atunci când o cerere eșuează — o randare de imagine OG semnată sau un apel către una dintre suprafețele administrative din produs. Fiecare răspuns de eroare include:
error— tokenul scurt legacy. Încă prezent la fiecare eșec, astfel încât un client mai vechi să continue să funcționeze.code— același cod de eroare stabil și documentat (tabelul de mai jos), sub numele folosit de API-ul public.message— o descriere de o propoziție a ceea ce a mers greșit.hint— o scurtă descriere în limbaj simplu a ceea ce a mers greșit și cum să o repari.docs_url— un link către această pagină, ancorat la secțiunea pentru acel cod.request_id— corelează acest eșec HTTP cu un rând din tabelul Render Logs din dashboard (returnat și în header-ul răspunsuluiX-Request-ID). O suprafață fără nimic de corelat răspunde cunull, dar cheia este întotdeauna prezentă.
Suprafețele din produs — adminul Shopify, WooCommerce Studio, puntea Wix și demo-ul — răspund
cu același envelope pentru codurile de mai jos, astfel încât un eșec înseamnă același lucru oriunde îl întâlnești. O
suprafață de modul poate păstra statusul HTTP pe care l-a returnat dintotdeauna pentru un cod (de exemplu render_failed
răspunde cu 503 la exportul copertei și cu 502 la API-ul public); codul, mesajul, hint-ul și link-ul către documentație nu se schimbă.
Citirea unui răspuns de eroare
{
"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-..."
}
Dacă primești un răspuns pe care nu îl înțelegi, calea cea mai rapidă este:
- Notează
code. - Verifică-ți constructorul de URL — majoritatea eșecurilor sunt bug-uri de semnare, nu probleme de cont.
- Potrivește codul de mai jos pentru cauza și soluția exactă.
- În dashboard, deschide Render Logs și filtrează după același
error_code— fiecare rând afișează parametrii solicitați, astfel încât să poți reproduce (și confirma cărequest_idcorespunde).
Semnare și autentificare
missing_signature
Cererii tale îi lipsesc parametrii de interogare key și/sau s (semnătura).
Remediu: asigură-te că URL-ul tău include atât key=<api-key>, cât și s=<hmac-signature>. Folosește SDK-ul sau ghidul /docs/hmac-signature-guide pentru a-l construi.
invalid_signature
Valoarea s nu corespunde cu ceea ce produce secretul tău HMAC pentru acest URL.
Remediu: semnătura acoperă fiecare parametru de interogare cu excepția s, cu cheile sortate. Modificarea oricărui parametru — inclusiv reordonarea, diferențele de codificare URL sau adăugarea de spații — invalidează semnătura. Resemnează după fiecare modificare. Confirmă că secretul tău este același afișat la crearea cheii API.
invalid_signature_format
Valoarea s nu este un șir hex de 64 de caractere.
Remediu: semnătura trebuie să fie hex SHA-256 brut (a-f0-9 minuscule). Dacă codezi base64 sau trunchiezi rezultatul, folosește hex simplu.
expired_timestamp
Timestamp-ul t pe care l-ai furnizat are mai mult de 5 minute.
Remediu: regenerează timestamp-ul de fiecare dată când construiești un URL. Acest cod se aplică fluxului legacy cu URL semnat; fluxul actual HMAC v2 nu are timestamp.
invalid_api_key
key pe care l-ai transmis nu există.
Remediu: copiază cheia API completă din dashboard — este identificatorul public care începe cu sk_. Este publică și sigură în URL-uri; secretul (niciodată în URL-uri) este cel care dovedește posesia.
missing_hmac_secret
Cheia API nu are niciun secret HMAC configurat.
Remediu: creează o cheie API nouă în dashboard — secretul HMAC este generat și afișat o singură dată la creare.
Parametru / input
invalid_image_url
O proprietate care conține un URL (image, brand_logo, logo, avatar, background_image, ...) nu este un URL public http(s).
Remediere: transmite un URL https://... accesibil public. Localhost, IP-urile private și căile simple sunt respinse pentru a preveni falsificarea cererilor pe partea de server (server-side request forgery).
Abonament
subscription_required (402)
Cererea a ajuns la Dynamic API, dar contul tău nu are niciun plan activ. Accesul la API este doar pe bază de abonament: planul este condiția de acces și oferă aceeași acoperire și aceeași scară de capabilități pe care le vând aplicațiile FastOG. Randările în sine nu sunt contorizate — nu există o cotă lunară de randări și nicio facturare pentru depășire.
Soluție: alege un plan Dynamic API în dashboard și creează o cheie API. Răspunsul include un top_up_url care indică pagina planurilor.
Serviciul de randare
store_blocked (403)
Randarea pentru magazinul din spatele acestei chei a fost suspendată de FastOG (de exemplu, abuz sau utilizare excesivă). Copertele deja cache-uite la edge pot continua să fie servite până la expirare. Contactează suportul pentru a rezolva situația; nimic din ce poți modifica în cerere nu va rezolva asta.
render_unreachable
Serviciul de randare nu a putut fi contactat (fereastră scurtă de repornire).
Soluție: reîncearcă peste câteva secunde. Randarea nu a fost contorizată pentru această încercare.
render_failed
Serviciul de randare a returnat o eroare pentru cererea ta.
Soluție: verifică proprietățile șablonului — valori lungi/malformate, câmpuri neacceptate sau o imagine upstream inaccesibilă. Răspunsul include status subiacent. Randarea nu a fost contorizată.
Suprafețe de administrare ale magazinului
Aceste coduri răspund din adminul Shopify și din WooCommerce Studio — editoarele încorporate în care
lucrează un comerciant, nu din API-ul semnat. Câteva sunt comune cu API-ul public (invalid_image_url,
render_failed, invalid_signature); acelea păstrează intrarea documentată mai sus.
| Cod | HTTP | Ce înseamnă și ce trebuie să faci |
|---|---|---|
invalid_shop |
422 | Magazinul Shopify nu a putut fi identificat. Reîncarcă aplicația FastOG din adminul tău Shopify, astfel încât cererea încorporată să transporte din nou magazinul, apoi încearcă din nou. |
invalid_shop_or_page |
422 | Magazinul sau tipul de pagină este necunoscut. Deschide aplicația FastOG din adminul tău Shopify și alege un tip de pagină pentru copertă din editor. |
invalid_store |
422 | Magazinul WooCommerce nu a putut fi identificat. Redeschide Studio din adminul tău WordPress, astfel încât tokenul magazinului să fie prezentat din nou, apoi încearcă din nou. |
invalid_store_or_page |
422 | Magazinul sau tipul de pagină este necunoscut. Redeschide Studio din adminul tău WordPress și alege un tip de pagină pentru copertă oferit de editor. |
missing_api_key |
422 | Magazinul nu are o cheie de semnare. Finalizează instalarea pluginului din adminul tău WordPress, astfel încât FastOG să poată emite cheia de semnare pentru magazin. |
store_ownership_unverified |
403 | Site-ul WordPress nu a putut fi verificat. Trebuie să fie accesibil prin HTTPS public, cu REST API activat. |
community_is_free |
422 | Planul Community este gratuit. Este planul implicit gratuit și nu poate fi cumpărat; alege un nivel plătit pentru a face upgrade. |
not_installed |
404 | FastOG nu este instalat pentru acest magazin. Instalează aplicația FastOG din Shopify App Store pentru acest magazin, apoi redeschide-o. |
oauth_required |
409 | Magazinul trebuie să autorizeze din nou FastOG. Rulează din nou instalarea OAuth FastOG din adminul tău Shopify; autorizarea stocată a fost revocată sau scope-urile ei s-au schimbat. |
reconnect_required |
409 | Conexiunea Shopify trebuie restabilită. Folosește butonul Reconnect din aplicația FastOG, astfel încât să fie emis un access token nou. |
token_rejected |
409 | Shopify a emis un access token și apoi l-a refuzat. Reîncearcă reconectarea o dată; dacă Shopify continuă să îl refuze, reinstalează aplicația. |
unauthorized |
401 | Cererea nu conține o sesiune validă pentru această suprafață. Reîncarcă aplicația FastOG din adminul platformei tale, astfel încât să fie atașat un token de sesiune nou, apoi încearcă din nou. |
shop_not_found |
404 | Magazinul nu mai există în FastOG. Reinstalează FastOG din adminul tău Shopify pentru a recrea înregistrarea magazinului. |
invalid_product |
422 | Referința produsului nu este validă. Reîncarcă pagina produsului și redeschide FastOG; id-ul produsului trimis lipsea sau nu era numeric. |
invalid_product_cover |
422 | Payload-ul copertei produsului este malformat. Reîncarcă editorul și salvează din nou; props, style și signals trebuie să fie fiecare câte un obiect. |
product_not_found |
404 | Produsul nu a putut fi citit din magazin. Verifică dacă produsul mai există și este publicat, apoi reîncarcă editorul. |
product_customization_not_on_plan |
403 | Personalizarea copertei per produs nu este inclusă în acest plan. Fă upgrade sau editează în schimb coperta partajată a produsului. |
no_product_handles |
422 | Nu s-au găsit produse de reîmprospătat. Publică cel puțin un produs cu un handle public, apoi încearcă din nou reîmprospătarea share-preview. |
invalid_style |
422 | Blocul de stil nu este utilizabil. Reîncarcă editorul și alege din nou culorile și fonturile; o valoare nu a putut fi normalizată. |
invalid_template |
422 | Șablonul solicitat nu este în catalogul acestei platforme. Alege unul dintre layout-urile oferite de editor. |
invalid_preset |
422 | Numele presetului nu este unul oferit de această platformă. Alege un preset din ecranul de configurare. |
invalid_set |
422 | Payload-ul setului de coperte lipsește sau este malformat. Reîncarcă ecranul de configurare și alege din nou un set. |
preset_not_applyable |
422 | Presetul nu poate fi aplicat pentru fiecare tip de pagină. Alege alt preset; acestuia îi lipsește o copertă pentru cel puțin un tip de pagină. |
template_not_available |
422 | Șablonul nu este în catalogul de randare. Alege un layout oferit de selector. |
template_not_available_on_shopify |
422 | Șablonul nu este disponibil pe magazinele Shopify. Alege un layout oferit de editorul Shopify. |
template_not_available_on_woocommerce |
422 | Șablonul nu este disponibil pe magazinele WooCommerce. Alege un layout oferit de Studio. |
template_unavailable |
422 | Șablonul nu este disponibil pentru acest magazin. Alege un layout oferit de editor; este retras, necunoscut sau peste ceea ce poate desena magazinul. |
template_not_on_plan |
403 | Șablonul necesită un plan superior. Schimbă planul sau alege un layout acoperit de planul actual. Răspunsul indică planul în requires. |
template_requires_higher_plan |
403 | Șablonul necesită un plan superior. Răspunsul indică planul în requires. |
no_rule |
404 | Nu există încă o regulă de copertă pentru acest tip de pagină. Salvează mai întâi o copertă pentru acest tip de pagină în editor. |
cover_not_configured |
404 | Nu a fost salvată încă nicio copertă de produs. Salvează o copertă de produs înainte de a o descărca sau partaja. |
schedule_only_product |
422 | Programarea campaniilor există doar pentru copertele de produs. Elimină data de revenire sau mută campania pe coperta de produs. |
not_dismissible |
422 | Acel anunț nu poate fi închis. Reîncarcă pagina; a fost deja retras sau aparține altui magazin. |
unsupported_locale |
422 | Acea limbă de interfață nu este inclusă pentru această aplicație. Alege una dintre limbile listate de răspuns în supported. |
no_setup_sets |
422 | Nu s-au putut asambla seturi de coperte curatoriate. Reîncearcă ecranul de configurare; dacă rămâne gol, contactează suportul. |
export_unavailable |
403 | Descărcările nu sunt incluse în acest plan. Fă upgrade la Pro sau superior pentru a descărca fișierele de copertă. |
cancellation_failed |
502 | Anularea abonamentului a fost refuzată. Reîncearcă într-un moment; dacă eșuează în continuare, anulează din pagina de facturare Shopify sau contactează suportul. |
logo_override_on_plan |
403 | Suprascrierea logo-ului nu este inclusă în acest plan. Fă upgrade sau elimină suprascrierea logo-ului. |
invalid_logo |
422 | Fișierul logo nu este o imagine acceptată. Încarcă un PNG, JPEG sau WebP sub limita de dimensiune afișată în editor. |
invalid_brand_image |
422 | Imaginea de referință pentru brand nu este utilizabilă. Încarcă o imagine acceptată sub limita de dimensiune sau elimină referința și salvează din nou. |
brand_image_too_large |
422 | Imaginea de referință pentru brand este prea mare. Micșorează fișierul și încarcă-l din nou. |
brand_colors_too_many |
422 | Au fost trimise mai mult de trei culori de brand. Trimite cel mult trei culori hex. |
upload_failed |
500 | Fișierul încărcat nu a putut fi stocat. Reîncearcă; dacă eșuează în continuare, contactează suportul — asset store-ul nu a returnat niciun URL public. |
attachment_upload_failed |
500 | Atașamentul pentru suport nu a putut fi stocat. Trimite mesajul fără atașament, apoi trimite fișierul prin email la suport. |
invalid_webhook |
401 | Semnătura webhook-ului magazinului nu a fost verificată. Verifică dacă secretul webhook-ului din setările FastOG pentru WordPress corespunde celui emis de FastOG. |
not_found |
404 | Acel endpoint nu mai există. Redeschide Studio din adminul tău WordPress. |
meta_refresh_unavailable |
503 | Reîmprospătarea share-preview nu este configurată. Partajează din nou linkul din Facebook. |
theme_write_disabled |
409 | Editarea temei nu este activată pentru această aplicație. Folosește theme app embed în loc de corectarea fișierelor temei. |
scope_required |
403 | FastOG nu are o permisiune Shopify. Aprobă scope-urile solicitate folosind consent_url din răspuns, apoi reîncearcă remedierea. |
Bridge Wix
Bridge-ul Wix este semnat de aplicația Wix, nu de o sesiune de comerciant, așa că eșecurile sale sunt adresate dezvoltatorului aplicației. Fiecare răspuns poartă în continuare code și request_id; id-ul cererii bridge este cel din plicul semnat.
| Cod | HTTP | Ce înseamnă și ce trebuie să faci |
|---|---|---|
invalid_bridge_signature |
401 | Semnătura bridge-ului Wix nu s-a verificat. Regenerează cererea cu secretul partajat, calea exactă și un timestamp mai vechi de cel mult cinci minute. |
invalid_bridge_body |
400 | Corpul plicului bridge este malformat. Trimite body ca obiect JSON și codifică fiecare număr din interior ca șir, astfel încât semnătura canonică să corespundă. |
replayed_bridge_request |
401 | Acea cerere bridge a fost deja folosită. Generează un request_id nou pentru fiecare apel care modifică date. |
wix_site_not_installed |
403 | FastOG nu este instalat pe acest site Wix. Instalează aplicația FastOG pe site, apoi redeschide-o. |
wix_site_not_provisioned |
422 | Site-ul Wix nu are încă credențiale de semnare. Reinstalează aplicația FastOG pentru ca site-ul să fie provisionat cu o cheie API. |
invalid_page_type |
422 | Tipul de pagină nu este unul acoperit de FastOG pe Wix. Trimite unul dintre tipurile de pagină oferite de Studio. |
rule_not_found |
404 | Nu există nicio regulă cu acel id. Reîmprospătează lista; regula a fost ștearsă sau aparține altui site. |
invalid_target_id |
422 | Id-ul țintei Wix nu este valid pentru acest tip de pagină. Trimite id-ul furnizat de aplicația Wix pentru acel tip de pagină. |
invalid_preview |
422 | Payload-ul de previzualizare este malformat. Citește obiectul details pentru câmpul care a eșuat. |
invalid_rule |
422 | Payload-ul regulii de copertă este malformat. Citește obiectul details; template este obligatoriu, iar blocurile opționale trebuie să fie obiecte. |
invalid_sync |
422 | Payload-ul de sincronizare este malformat. Citește obiectul details; target_type și target_id trebuie să corespundă. |
invalid_regenerate_url |
422 | Lipsește URL-ul de regenerat. Trimite URL-ul paginii în url. |
invalid_regenerate_host |
422 | URL-ul nu aparține hostului FastOG. Trimite un URL de copertă fastog.com. |
ai_presets_unsupported |
422 | Seturile de coperți proiectate cu AI nu mai sunt generate. Alege în schimb unul dintre look-urile curatoriate. |
original_tags_required |
422 | Etichetele de metadate originale sunt obligatorii. Trimite original_tags (sau current_tags) pentru ca o dezinstalare să poată restaura metadatele site-ului. |
invalid_restored |
422 | Payload-ul cheilor restaurate este malformat. Trimite restored ca array de chei de metadate. |
invalid_seo_target |
422 | Tipul țintei SEO este necunoscut. Folosește site, pattern sau item în cale. |
invalid_seo_payload |
422 | Payload-ul de metadate SEO este malformat. Trimite target_id, current_tags și fastog_url ca URL absolut http(s). |
sync_failed |
500 | Sincronizarea metadatelor către Wix a eșuat. Reîncearcă; dacă eșuează în continuare, verifică dacă site-ul este accesibil și dacă aplicația este încă instalată. |
invalid_tier |
422 | Acel plan nu este unul pe care FastOG îl vinde pe Wix. Trimite starter, pro sau scale ca nivel. |
Suprafața demo
Demo-ul este consola de vânzări doar pentru proprietar, nu un endpoint pentru comercianți.
| Cod | HTTP | Ce înseamnă și ce trebuie făcut |
|---|---|---|
url_required |
422 | Nu a fost trimis niciun URL. Lipește linkul magazinului sau al produsului înainte de a citi cardul. |
unreadable_url |
422 | Pagina respectivă nu a putut fi citită. Verifică dacă linkul este public și complet; o pagină aflată în spatele unui login nu poate fi citită. |
no_api_key |
422 | Nu este disponibilă nicio cheie API pentru semnarea copertelor. Creează o cheie API (sau introdu una validă); răspunsul conține un link către pagina cheilor API. |
no_presets |
500 | Nu sunt configurate presetări de copertă. Configurează cel puțin o presetare pe server. |
Codurile editorului de reguli cu domeniu de aplicare
Editoarele de reguli cu domeniu de aplicare (adminul Shopify și WooCommerce Studio) traduc singure aceste tokenuri, în limba comerciantului, așa că răspunsurile lor conțin error și code, dar nu hint — o a doua descriere în engleză s-ar abate doar de la cea localizată pe care o vede efectiv comerciantul:
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.
Încă blocat?
- Deschide pagina Render Logs din dashboard — fiecare rezultat (succes + respingere) este listat cu
error_code, statusul HTTP și parametrii solicitați. - Rulează
php artisan og:diagnosepe un URL semnat pentru a parcurge întregul pipeline și a vedea la ce etapă apare eroarea. - Verifică documentația din bara laterală pentru framework-ul pe care îl folosești (Next.js, Express, SvelteKit, ...).