Portal Community

Retry Configuration

{
  "retry": {
    "maxAttempts": 3,
    "backoffType": "exponential",
    "initialDelaySeconds": 2,
    "maxDelaySeconds": 60,
    "retryOnStatusCodes": [429, 500, 502, 503, 504],
    "retryOnNetworkError": true
  }
}

Backoff Types

TypeDelay FormulaExample (initial=2s)
fixedAlways initialDelay2s, 2s, 2s
linearattempt * initialDelay2s, 4s, 6s
exponentialinitialDelay * 2^(attempt-1)2s, 4s, 8s (capped at maxDelay)
jitterExponential + random jitter1.8s, 3.7s, 8.2s (distributed)

Retry Decision Logic

private bool ShouldRetry(HttpResponseMessage? response, Exception? ex, RetryConfig config)
{
    if (ex is HttpRequestException or TaskCanceledException)
        return config.RetryOnNetworkError;

    if (response != null)
        return config.RetryOnStatusCodes.Contains((int)response.StatusCode);

    return false;
}

Retry Attempt Tracking in Output

After all retries, the node output includes retry metadata:

{
  "statusCode": 200,
  "body": { "accepted": true },
  "retryAttempts": 2,
  "totalElapsedMs": 6450
}
Idempotency: Only retry calls to idempotent endpoints. If the external API creates a record on each call, retrying may create duplicates. Use idempotency keys (a unique request ID in the header) to tell the receiver to deduplicate.