Skip to main content
Rinne uses standard HTTP status codes and provides detailed error responses to help you debug issues quickly.

Error response format

All errors follow a consistent structure:

Error fields

  • code: Machine-readable error code
  • message: Human-readable error message
  • status: HTTP status code
  • path: API endpoint that generated the error
  • timestamp: When the error occurred
  • requestId: Unique request identifier for support
  • details: Additional error-specific information

HTTP status codes

Common error codes

VALIDATION_ERROR (400)

Input validation failed. Check the details.issues array for specific field errors.
Solution: Fix the invalid fields and retry the request.
Card credential fields (card_data.number, card_data.cvv, card_data.network_token, card_data.cryptogram, and the 3DS card.number) are accepted only as encrypted values from rinne-js. A plaintext value triggers a per-field VALIDATION_ERROR issue telling you to send the encrypted value from rinne-js instead. The rejected value is never echoed back in the error response.

AUTHENTICATION_ERROR (401)

API key is missing or invalid.
Solution: Verify your API key is correct and included in the x-api-key header.

AUTHORIZATION_ERROR (403)

You don’t have permission to access the resource.
Solution: Check your user roles and permissions, or use an API key with appropriate access.

RESOURCE_NOT_FOUND (404)

The requested resource doesn’t exist.
Solution: Verify the resource ID is correct and belongs to your company.

CONFLICT_ERROR (409)

Resource already exists or operation conflicts with current state.
Solution: Check for existing resources or verify the resource state allows the operation.

INTEGRATION_ERROR (502)

Provider integration failed.
Solution: Retry the request. If the error persists, contact support with the requestId.

Handling validation errors

Validation errors include detailed information about each invalid field:

Idempotency

Use the request_id field to safely retry requests:
This prevents duplicate transactions when retrying failed requests.

Rate limiting

Rinne applies request rate limits to keep the platform stable: 1000 req/s for transaction creation and 3DS session creation and authentication POST requests and 50 req/s for all other requests. Each limit is a shared pool across all matching endpoints, not a per-endpoint allowance. Requests within the limit always succeed; only the excess requests above the limit are rejected, with no account block or penalty. See the Rate limits guide for full details. Rejected requests return a 429 Too Many Requests status code with no response body. The limit details are returned in the response headers instead:
Detect a rate limit rejection from the 429 status code and the x-ratelimit-* headers, not from a response body. Implement exponential backoff when retrying:

Logging and debugging

Request IDs

Every response includes a requestId that you can use when contacting support:
Save request IDs for failed requests to help support diagnose issues.

Error monitoring

Implement error monitoring to track API errors:

Next steps

Webhooks

Handle webhook delivery failures

API Reference

View all error response schemas