Referentie
Foutcodes
Alle endpoints geven dezelfde codes terug, met dezelfde vorm van body. Deze pagina vertelt wat je met elk ervan doet.
Volledige referentie
| Code | Betekenis | Veelvoorkomende oorzaak | Oplossing |
|---|---|---|---|
400 | Bad Request | Onleesbare JSON-body, ontbrekende parameter of waarde buiten bereik. | Controleer het formaat van de parameters. Het veld error noemt precies welke parameter het probleem geeft. |
401 | Unauthorized | API-sleutel ontbreekt, is ongeldig of ingetrokken. | Controleer de header Authorization: Bearer sr_live_…. |
402 | Payment Required | Onvoldoende credits: saldo leeg of lager dan de kosten van de gevraagde actie. | Vul bij op subreply.io/billing. |
422 | Unprocessable | Reddit-post vergrendeld, gearchiveerd of verwijderd, of publicatieaccount niet beschikbaar. | Kies een recente post waarop gereageerd kan worden. Ongewijzigd opnieuw proberen verandert niets. |
500 | Internal Server Error | AI-pijplijn of scraping mislukt. | Probeer het over 30 s opnieuw; neem contact op met support als de fout aanhoudt. |
503 | Service Unavailable | Publicatiedienst niet beschikbaar of geen account om mee te publiceren. | Probeer het over 60 s opnieuw. |
202 is geen fout
POST /api/v1/publish kan met 202 antwoorden: de aanvraag is verstuurd, de publicatie is niet bevestigd, er wordt niets afgeschreven. Dat is geen mislukking om opnieuw te proberen — zie een reactie publiceren.Formaat van de fouten
Elk mislukt antwoord bevat een JSON-object met één enkel veld, error, in het Frans en leesbaar voor een mens:
Foutbody
{
"error": "Message explicite en français"
}Er is geen interne foutcode en geen veld details: de HTTP-status draagt de categorie, het bericht draagt het detail. Parse de tekst van het bericht nooit om een beslissing te nemen — tak af op de status.
Foutafhandeling in productie
Drie regels volstaan om een workflow overeind te houden:
- 500 en 503 opnieuw proberen, met een oplopende wachttijd en hooguit twee pogingen. Dit zijn de enige codes die zichzelf oplossen.
- Stoppen bij 402 en waarschuwen: alle volgende aanroepen falen op dezelfde manier zolang het saldo niet is bijgevuld.
- 400, 401 en 422 nooit opnieuw proberen — er valt iets te corrigeren in de aanvraag, de sleutel of de post waar het om gaat.
Client met retry en creditbewaking
type ApiError = { error: string };
// Probeer alleen opnieuw wat dat verdient: 503 (publicatiedienst tijdelijk
// niet beschikbaar) en 500 (AI-pijplijn of scraping mislukt).
// Een 400, een 401 of een 422 lost zichzelf niet op.
const RETRYABLE = new Set([500, 503]);
async function callSubreply<T>(
endpoint: string,
body: unknown,
attempt = 0,
): Promise<T> {
const response = await fetch(`https://subreply.io/api/v1/${endpoint}`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.SUBREPLY_API_KEY}`,
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(180_000),
});
if (response.ok) return (await response.json()) as T;
const { error } = (await response.json()) as ApiError;
// 402: geen credits meer. Aandringen heeft geen zin — stop de keten en
// waarschuw, in plaats van aanroepen te blijven doen die allemaal falen.
if (response.status === 402) {
await notifyOutOfCredits(error);
throw new Error(`Credits op: ${error}`);
}
if (RETRYABLE.has(response.status) && attempt < 2) {
// 30 s en daarna 60 s: de tijd die een dienst nodig heeft om terug te komen.
await new Promise((resolve) => setTimeout(resolve, 30_000 * (attempt + 1)));
return callSubreply<T>(endpoint, body, attempt + 1);
}
throw new Error(`SubReply ${response.status} : ${error}`);
}Herhalingen kosten niets
Genereren en publiceren worden idempotent per post-URL in rekening gebracht: een tweede poging op dezelfde post geeft
credits_used: 0 terug. Een retry na een timeout is dus gratis — controleer bij /publish toch de post voordat je het opnieuw speelt, zodat je er geen twee reacties achterlaat.