SubReply

Referentie

Foutcodes

Alle endpoints geven dezelfde codes terug, met dezelfde vorm van body. Deze pagina vertelt wat je met elk ervan doet.

Volledige referentie

CodeBetekenisVeelvoorkomende oorzaakOplossing
400Bad RequestOnleesbare JSON-body, ontbrekende parameter of waarde buiten bereik.Controleer het formaat van de parameters. Het veld error noemt precies welke parameter het probleem geeft.
401UnauthorizedAPI-sleutel ontbreekt, is ongeldig of ingetrokken.Controleer de header Authorization: Bearer sr_live_….
402Payment RequiredOnvoldoende credits: saldo leeg of lager dan de kosten van de gevraagde actie.Vul bij op subreply.io/billing.
422UnprocessableReddit-post vergrendeld, gearchiveerd of verwijderd, of publicatieaccount niet beschikbaar.Kies een recente post waarop gereageerd kan worden. Ongewijzigd opnieuw proberen verandert niets.
500Internal Server ErrorAI-pijplijn of scraping mislukt.Probeer het over 30 s opnieuw; neem contact op met support als de fout aanhoudt.
503Service UnavailablePublicatiedienst 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.