API-fouten — Wat elke code betekent en hoe je het oplost
FastOG retourneert machineleesbare foutcodes wanneer een verzoek mislukt — een ondertekende OG-afbeelding renderen, of een aanroep naar een van de admin-oppervlakken in het product. Elke foutrespons bevat:
error— het legacy korte token. Nog steeds aanwezig bij elke fout, zodat een oudere client blijft werken.code— dezelfde stabiele, gedocumenteerde foutcode (tabel hieronder), onder de naam die de publieke API gebruikt.message— een beschrijving van één zin van wat er misging.hint— een korte beschrijving in gewone taal van wat er misging en hoe je het oplost.docs_url— een link naar deze pagina, verankerd op de sectie voor die code.request_id— koppelt deze HTTP-fout aan een rij in de Render Logs-tabel van het dashboard (ook teruggegeven in deX-Request-ID-responsheader). Een oppervlak zonder iets om aan te koppelen antwoordt metnull, maar de sleutel is altijd aanwezig.
De oppervlakken in het product — de Shopify-admin, de WooCommerce Studio, de Wix-bridge en de demo — antwoorden
met dezelfde envelope voor de onderstaande codes, dus een fout betekent hetzelfde waar je die ook tegenkomt. Een
module-oppervlak kan de HTTP-status behouden die het altijd al teruggaf voor een code (bijvoorbeeld render_failed
antwoordt 503 bij de cover-export en 502 bij de publieke API); de code, het bericht, de hint en de docs-link veranderen niet.
Een foutrespons lezen
{
"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-..."
}
Als je een respons krijgt die je niet begrijpt, is dit de snelste route:
- Noteer de
code. - Controleer je URL-builder — de meeste fouten zijn bugs in de signing, geen accountproblemen.
- Zoek de code hieronder op voor de exacte oorzaak en oplossing.
- Open in het dashboard Render Logs en filter op dezelfde
error_code— elke rij toont de opgevraagde params, zodat je het kunt reproduceren (en kunt bevestigen datrequest_idovereenkomt).
Ondertekenen & authenticatie
missing_signature
Je verzoek mist de queryparameters key en/of s (signature).
Oplossing: zorg dat je URL zowel key=<api-key> als s=<hmac-signature> bevat. Gebruik de SDK of de /docs/hmac-signature-guide-walkthrough om hem op te bouwen.
invalid_signature
De waarde van s kwam niet overeen met wat je HMAC-secret voor deze URL oplevert.
Oplossing: de signature dekt elke queryparameter behalve s, met gesorteerde keys. Het wijzigen van welke parameter dan ook — inclusief herordenen, verschillen in URL-encoding of toegevoegde whitespace — maakt de signature ongeldig. Onderteken opnieuw na elke wijziging. Controleer of je secret hetzelfde is als het secret dat werd getoond bij het aanmaken van de API key.
invalid_signature_format
De waarde van s is geen hex-string van 64 tekens.
Oplossing: de signature moet raw SHA-256 hex zijn (kleine letters a-f0-9). Als je de output base64-encodeert of afkapt, gebruik dan gewone hex.
expired_timestamp
De t-timestamp die je hebt opgegeven is ouder dan 5 minuten.
Oplossing: genereer de timestamp opnieuw telkens wanneer je een URL opbouwt. Deze code geldt voor de legacy signed-URL-flow; de huidige HMAC v2-flow heeft geen timestamp.
invalid_api_key
De key die je hebt doorgegeven bestaat niet.
Oplossing: kopieer de volledige API key uit het dashboard — het is de publieke identifier die begint met sk_. Hij is publiek en veilig in URL's; het secret (nooit in URL's) is wat het bezit bewijst.
missing_hmac_secret
Voor de API key is geen HMAC-secret geconfigureerd.
Oplossing: maak een nieuwe API key aan in het dashboard — het HMAC-secret wordt gegenereerd en eenmalig getoond bij het aanmaken.
Parameter / invoer
invalid_image_url
Een prop met een URL (image, brand_logo, logo, avatar, background_image, ...) is geen openbare http(s)-URL.
Oplossing: geef een openbaar op te halen https://... URL door. Localhost, privé-IP's en kale paden worden geweigerd om server-side request forgery te voorkomen.
Abonnement
subscription_required (402)
Het verzoek bereikte de Dynamic API, maar je account heeft geen actief plan. API-toegang is alleen met een abonnement: het plan is de toegangspoort en biedt dezelfde dekking en mogelijkhedenschaal die de FastOG-apps verkopen. Renders zelf worden niet gemeten — er is geen maandelijkse renderc quota en geen facturering voor overschrijding.
Oplossing: kies een Dynamic API-plan in het dashboard en maak een API-sleutel aan. Het antwoord bevat een top_up_url die naar de plannenpagina verwijst.
Render-service
store_blocked (403)
Het renderen voor de store achter deze key is door FastOG gepauzeerd (bijvoorbeeld door misbruik of buitensporig gebruik). Covers die al in de edge-cache staan, kunnen blijven serveren tot ze verlopen. Neem contact op met support om dit op te lossen; niets wat je in het request kunt wijzigen lost dit op.
render_unreachable
De render-service was niet bereikbaar (kort herstartvenster).
Oplossing: probeer het over een paar seconden opnieuw. De render is niet geteld voor deze poging.
render_failed
De render-service gaf een fout terug voor je request.
Oplossing: controleer je template-props — lange of misvormde waarden, niet-ondersteunde velden, of een niet-bereikbare upstream-afbeelding. De response bevat de onderliggende status. De render is niet geteld.
Beheeromgevingen van de winkel
Deze codes antwoorden vanuit de Shopify-admin en de WooCommerce Studio — de ingebedde editors waarin een merchant werkt in plaats van de ondertekende API. Verschillende worden gedeeld met de publieke API (invalid_image_url, render_failed, invalid_signature); die behouden de hierboven gedocumenteerde vermelding.
| Code | HTTP | Wat het betekent en wat je moet doen |
|---|---|---|
invalid_shop |
422 | De Shopify-shop kon niet worden geïdentificeerd. Herlaad de FastOG-app vanuit je Shopify-admin zodat het embedded verzoek de shop weer meestuurt, en probeer het daarna opnieuw. |
invalid_shop_or_page |
422 | De shop of het paginatype is onbekend. Open de FastOG-app vanuit je Shopify-admin en kies een cover-paginatype in de editor. |
invalid_store |
422 | De WooCommerce-store kon niet worden geïdentificeerd. Open de Studio opnieuw vanuit je WordPress-admin zodat het store-token weer wordt meegestuurd, en probeer het daarna opnieuw. |
invalid_store_or_page |
422 | De store of het paginatype is onbekend. Open de Studio opnieuw vanuit je WordPress-admin en kies een cover-paginatype dat de editor aanbiedt. |
missing_api_key |
422 | De store heeft geen signing key. Rond de installatie van de plugin af vanuit je WordPress-admin zodat FastOG de store zijn signing key kan uitgeven. |
store_ownership_unverified |
403 | De WordPress-site kon niet worden geverifieerd. De site moet bereikbaar zijn via publieke HTTPS met een ingeschakelde REST API. |
community_is_free |
422 | Het Community-plan is gratis. Het is het gratis standaardplan en is niet te koop; kies een betaald tier om te upgraden. |
not_installed |
404 | FastOG is niet geïnstalleerd voor deze shop. Installeer de FastOG-app vanuit de Shopify App Store voor deze shop en open hem daarna opnieuw. |
oauth_required |
409 | De shop moet FastOG opnieuw autoriseren. Voer de FastOG OAuth-installatie opnieuw uit vanuit je Shopify-admin; de opgeslagen grant is ingetrokken of de scopes zijn gewijzigd. |
reconnect_required |
409 | De Shopify-verbinding moet opnieuw tot stand worden gebracht. Gebruik de knop Opnieuw verbinden in de FastOG-app zodat er een nieuw access token wordt uitgegeven. |
token_rejected |
409 | Shopify gaf een access token uit en weigerde het daarna. Probeer het opnieuw verbinden één keer opnieuw; als Shopify het blijft weigeren, installeer de app dan opnieuw. |
unauthorized |
401 | Het verzoek bevat geen geldige sessie voor dit oppervlak. Herlaad de FastOG-app vanuit je platform-admin zodat er een nieuw sessietoken wordt meegestuurd, en probeer het daarna opnieuw. |
shop_not_found |
404 | De shop bestaat niet meer in FastOG. Installeer FastOG opnieuw vanuit je Shopify-admin om het shop-record opnieuw aan te maken. |
invalid_product |
422 | De productreferentie is niet geldig. Herlaad de productpagina en open FastOG opnieuw; het meegestuurde product-id ontbrak of was niet numeriek. |
invalid_product_cover |
422 | De product-cover-payload is misvormd. Herlaad de editor en sla opnieuw op; props, style en signals moeten elk een object zijn. |
product_not_found |
404 | Het product kon niet uit de store worden gelezen. Controleer of het product nog bestaat en gepubliceerd is, en herlaad daarna de editor. |
product_customization_not_on_plan |
403 | Cover-aanpassing per product zit niet in dit plan. Upgrade, of bewerk in plaats daarvan de gedeelde product-cover. |
no_product_handles |
422 | Er zijn geen producten gevonden om te verversen. Publiceer minstens één product met een publieke handle en probeer het verversen van de share-preview daarna opnieuw. |
invalid_style |
422 | Het style-blok is niet bruikbaar. Herlaad de editor en kies de kleuren en lettertypen opnieuw; één waarde kon niet worden genormaliseerd. |
invalid_template |
422 | De gevraagde template staat niet in deze platformcatalogus. Kies een van de layouts die de editor aanbiedt. |
invalid_preset |
422 | De presetnaam is er geen die dit platform aanbiedt. Kies een preset op het setup-scherm. |
invalid_set |
422 | De cover-set-payload ontbreekt of is misvormd. Herlaad het setup-scherm en kies opnieuw een set. |
preset_not_applyable |
422 | De preset kan niet op elk paginatype worden toegepast. Kies een andere preset; deze mist een cover voor minstens één paginatype. |
template_not_available |
422 | De template staat niet in de renderbare catalogus. Kies een layout die de picker aanbiedt. |
template_not_available_on_shopify |
422 | De template is niet beschikbaar op Shopify-stores. Kies een layout die de Shopify-editor aanbiedt. |
template_not_available_on_woocommerce |
422 | De template is niet beschikbaar op WooCommerce-stores. Kies een layout die de Studio aanbiedt. |
template_unavailable |
422 | De template is niet beschikbaar voor deze store. Kies een layout die de editor aanbiedt; hij is uitgefaseerd, onbekend, of valt buiten wat de store mag tekenen. |
template_not_on_plan |
403 | De template vereist een hoger plan. Wijzig je plan, of kies een layout die het huidige plan dekt. De response noemt het plan in requires. |
template_requires_higher_plan |
403 | De template vereist een hoger plan. De response noemt het plan in requires. |
no_rule |
404 | Er is nog geen cover-regel voor dit paginatype. Sla eerst een cover voor dit paginatype op in de editor. |
cover_not_configured |
404 | Er is nog geen product-cover opgeslagen. Sla een product-cover op voordat je hem downloadt of deelt. |
schedule_only_product |
422 | Campagne-planning bestaat alleen voor product-covers. Verwijder de revert-datum, of verplaats de campagne naar de product-cover. |
not_dismissible |
422 | Die aankondiging kan niet worden weggeklikt. Herlaad de pagina; hij is al uitgefaseerd of hoort bij een andere shop. |
unsupported_locale |
422 | Die UI-taal is niet meegeleverd voor deze app. Kies een van de talen die de response vermeldt in supported. |
no_setup_sets |
422 | Er konden geen samengestelde cover-sets worden opgebouwd. Probeer het setup-scherm opnieuw; als het leeg blijft, neem contact op met support. |
export_unavailable |
403 | Downloads zitten niet in dit plan. Upgrade naar Pro of hoger om cover-bestanden te downloaden. |
cancellation_failed |
502 | De abonnementsopzegging werd geweigerd. Probeer het zo meteen opnieuw; als het blijft mislukken, zeg dan op via de Shopify-factureringspagina of neem contact op met support. |
logo_override_on_plan |
403 | De logo-override zit niet in dit plan. Upgrade, of wis de logo-override. |
invalid_logo |
422 | Het logo-bestand is geen geaccepteerde afbeelding. Upload een PNG, JPEG of WebP onder de maximale grootte die de editor toont. |
invalid_brand_image |
422 | De merk-referentieafbeelding is niet bruikbaar. Upload een ondersteunde afbeelding onder de maximale grootte, of wis de referentie en sla opnieuw op. |
brand_image_too_large |
422 | De merk-referentieafbeelding is te groot. Verklein het bestand en upload het opnieuw. |
brand_colors_too_many |
422 | Er zijn meer dan drie merk-kleuren opgegeven. Stuur maximaal drie hex-kleuren. |
upload_failed |
500 | Het geüploade bestand kon niet worden opgeslagen. Probeer het opnieuw; als het blijft mislukken, neem contact op met support — de asset store gaf geen publieke URL terug. |
attachment_upload_failed |
500 | De support-bijlage kon niet worden opgeslagen. Stuur het bericht zonder de bijlage en mail het bestand daarna naar support. |
invalid_webhook |
401 | De webhook-signatuur van de store kon niet worden geverifieerd. Controleer of het webhook-secret in je WordPress FastOG-instellingen overeenkomt met het secret dat FastOG heeft uitgegeven. |
not_found |
404 | Dat endpoint bestaat niet meer. Open de Studio opnieuw vanuit je WordPress-admin. |
meta_refresh_unavailable |
503 | Verversen van de share-preview is niet geconfigureerd. Deel de link in plaats daarvan opnieuw via Facebook. |
theme_write_disabled |
409 | Theme-bewerking is niet ingeschakeld voor deze app. Gebruik de theme app embed in plaats van de theme-file-fix. |
scope_required |
403 | FastOG mist een Shopify-permissie. Keur de gevraagde scopes goed met de consent_url in de response en probeer de fix daarna opnieuw. |
Wix-bridge
De Wix-bridge wordt ondertekend door de Wix-app, niet door een merchantsessie, dus de fouten ervan zijn gericht aan de app-ontwikkelaar. Elke response bevat nog steeds code en request_id; het bridge-request-id is dat uit de ondertekende envelope.
| Code | HTTP | Wat het betekent en wat je moet doen |
|---|---|---|
invalid_bridge_signature |
401 | De Wix-bridge-handtekening is niet geverifieerd. Maak het request opnieuw aan met het gedeelde geheim, het exacte pad en een timestamp die minder dan vijf minuten oud is. |
invalid_bridge_body |
400 | De body van de bridge-envelope is misvormd. Stuur body als een JSON-object en codeer elk getal erin als een string, zodat de canonieke handtekening klopt. |
replayed_bridge_request |
401 | Dat bridge-request is al gebruikt. Maak voor elke muterende call een nieuwe request_id aan. |
wix_site_not_installed |
403 | FastOG is niet geïnstalleerd op deze Wix-site. Installeer de FastOG-app op de site en open deze daarna opnieuw. |
wix_site_not_provisioned |
422 | De Wix-site heeft nog geen ondertekeningsgegevens. Herinstalleer de FastOG-app zodat de site wordt voorzien van een API-key. |
invalid_page_type |
422 | Het paginatype wordt niet door FastOG ondersteund op Wix. Stuur een van de paginatypes die de Studio aanbiedt. |
rule_not_found |
404 | Er is geen regel met dat id. Ververs de lijst; de regel is verwijderd of hoort bij een andere site. |
invalid_target_id |
422 | Het Wix-target-id is niet geldig voor dit paginatype. Stuur het id dat de Wix-app voor dat paginatype levert. |
invalid_preview |
422 | De preview-payload is misvormd. Lees het details-object voor het veld dat de fout veroorzaakt. |
invalid_rule |
422 | De payload van de cover-regel is misvormd. Lees het details-object; template is verplicht en de optionele blokken moeten objecten zijn. |
invalid_sync |
422 | De sync-payload is misvormd. Lees het details-object; target_type en target_id moeten overeenkomen. |
invalid_regenerate_url |
422 | De URL die opnieuw gegenereerd moet worden, ontbreekt. Stuur de pagina-URL in url. |
invalid_regenerate_host |
422 | De URL hoort niet bij de FastOG-host. Stuur een fastog.com cover-URL. |
ai_presets_unsupported |
422 | AI-ontworpen coversets worden niet meer gegenereerd. Kies in plaats daarvan een van de samengestelde looks. |
original_tags_required |
422 | De oorspronkelijke metadata-tags zijn verplicht. Stuur original_tags (of current_tags) zodat een uninstall de sitemetadata kan herstellen. |
invalid_restored |
422 | De payload van de herstelde keys is misvormd. Stuur restored als een array van metadata-keys. |
invalid_seo_target |
422 | Het SEO-targettype is onbekend. Gebruik site, pattern of item in het pad. |
invalid_seo_payload |
422 | De SEO-metadata-payload is misvormd. Stuur target_id, current_tags en fastog_url als een absolute http(s)-URL. |
sync_failed |
500 | De metadatasync naar Wix is mislukt. Probeer het opnieuw; als het blijft mislukken, controleer dan of de site bereikbaar is en de app nog steeds is geïnstalleerd. |
invalid_tier |
422 | Dat plan wordt niet door FastOG verkocht op Wix. Stuur starter, pro of scale als tier. |
Demo-omgeving
De demo is de verkoopconsole die alleen voor de eigenaar toegankelijk is, geen merchant-endpoint.
| Code | HTTP | Wat het betekent en wat je moet doen |
|---|---|---|
url_required |
422 | Er is geen URL verzonden. Plak de winkel- of productlink voordat je de kaart leest. |
unreadable_url |
422 | Die pagina kon niet worden gelezen. Controleer of de link openbaar en volledig is; een pagina achter een login kan niet worden gelezen. |
no_api_key |
422 | Er is geen API-sleutel beschikbaar om covers te ondertekenen. Maak een API-sleutel aan (of voer een geldige in); de response linkt naar de pagina met API-sleutels. |
no_presets |
500 | Er zijn geen cover-presets geconfigureerd. Configureer minstens één preset op de server. |
Codes voor de scoped-rule-editor
De scoped-rule-editors (Shopify admin en WooCommerce Studio) vertalen deze tokens zelf, naar de taal van de
merchant, dus hun responses bevatten error en code maar geen hint — een tweede Engelse
beschrijving zou alleen afwijken van de gelokaliseerde versie die de merchant daadwerkelijk ziet:
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.
Loop je nog ergens tegenaan?
- Open de pagina Render Logs in het dashboard — elke uitkomst (geslaagd + afgewezen) staat er met de bijbehorende
error_code, HTTP-status en de opgevraagde params. - Voer
php artisan og:diagnoseuit op een ondertekende URL om de hele pipeline te doorlopen en te zien welke stap faalt. - Bekijk de documentatie in de zijbalk voor het framework dat je gebruikt (Next.js, Express, SvelteKit, ...).