Αναφορά

Σφάλματα και όρια ρυθμού

Κάθε σφάλμα REST έχει το ίδιο μικρό σώμα. Διακρίνετε πρώτα με βάση την κατάσταση HTTP, έπειτα με βάση το code, και αναφέρετε το requestId όταν μας ζητάτε βοήθεια.

Το σώμα σφάλματος#

JSON
{
  "error": {
    "code": "NOTFOUND",
    "message": "Entry not found",
    "requestId": "0f6c1d2e-3b4a-4c5d-8e9f-a0b1c2d3e4f5"
  }
}
Πεδίο
codeΈνας κωδικός για αυτόματη επεξεργασία (παρακάτω).
messageΜια επεξήγηση για ανθρώπους, συνήθως στα αγγλικά· ορισμένα μηνύματα κρατήσεων είναι στα βουλγαρικά, όπως τα βλέπουν οι επισκέπτες. Στην επικύρωση του σώματος αιτήματος είναι μια λίστα μηνυμάτων.
detailsΥπάρχει όταν χρειάζονται περισσότερες πληροφορίες: προβλήματα ανά πεδίο ή η λίστα των μηνυμάτων επικύρωσης.
requestIdΕντοπίζει το αίτημα στα αρχεία καταγραφής του Citron.

Το GraphQL αναφέρει τα σφάλματα ερωτημάτων στον δικό του πίνακα errors· δείτε σφάλματα GraphQL.

Αναγνωριστικά αιτημάτων#

Κάθε σφάλμα περιέχει requestId, όπως και το meta.requestId στις επιτυχείς απαντήσεις επικοινωνίας και κρατήσεων. Στείλτε τη δική σας κεφαλίδα X-Request-Id και το API θα τη χρησιμοποιήσει, ώστε να αντιστοιχίζετε τα δικά σας αρχεία καταγραφής με τα δικά μας. Συμπεριλάβετέ το κάθε φορά που επικοινωνείτε με την υποστήριξη.

curl
# Send your own id and it comes back as requestId (and in the API's logs)
curl https://api.console.citronos.com/v1/content/nope \
  -H "Authorization: Bearer $CITRON_API_KEY" \
  -H "X-Request-Id: my-site-7f3a"
# {"error":{"code":"NOTFOUND","message":"Collection \"nope\" not found","requestId":"my-site-7f3a"}}

Κωδικοί κατάστασης#

ΚατάστασηΣημασίαΝέα προσπάθεια;
200, 201Επιτυχία. Οι εγγραφές απαντούν με 201.
303Μια απλή υποβολή φόρμας HTML έγινε δεκτή· ακολουθήστε την ανακατεύθυνση.
304Χωρίς αλλαγές: το ETag σας στο If-None-Match είναι τρέχον.
400Κάτι στο αίτημα είναι λάθος: μια παράμετρος, ένα φίλτρο, το σώμα, ένα captcha, ένα ήδη κλεισμένο χρονικό διάστημα.Όχι, διορθώστε το αίτημα.
401Το κλειδί API λείπει, είναι άγνωστο ή έχει ανακληθεί.Όχι.
403Το κλειδί δεν επιτρέπεται να το κάνει αυτό (status=draft με κλειδί ck_pub_) ή η προέλευση δεν επιτρέπεται να υποβάλει αυτή τη φόρμα.Όχι.
404Δεν υπάρχει τέτοια συλλογή, εγγραφή, φόρμα ή χώρος εργασίας, ή το GraphQL είναι απενεργοποιημένο για τον χώρο εργασίας.Όχι.
413Το σώμα του αιτήματος είναι πολύ μεγάλο.Όχι.
429Ξεπεράστηκε ένα όριο ρυθμού.Ναι, αργότερα.
500Σφάλμα από την πλευρά μας. Το μήνυμα είναι γενικό· το requestId οδηγεί στις λεπτομέρειες.Ναι, με σταδιακή καθυστέρηση.
503Προσωρινά μη διαθέσιμο, π.χ. οι υποβολές φορμών έχουν ανασταλεί.Ναι, αργότερα.

Κωδικοί σφάλματος#

Τα περισσότερα σφάλματα χρησιμοποιούν έναν γενικό κωδικό που προκύπτει από την κατάσταση. Ορισμένα endpoints προσθέτουν έναν πιο συγκεκριμένο. Συγκρίνετε τους κωδικούς ακριβώς όπως είναι γραμμένοι: οι γενικοί δεν έχουν κάτω παύλα.

codeΚατάστασηΠού
BADREQUEST400Οποιοδήποτε λανθασμένο αίτημα: άγνωστο πεδίο ή τελεστής φίλτρου, άγνωστη γλώσσα, λανθασμένη τιμή richtext, περισσότερα από 10 φίλτρα, captcha που απορρίφθηκε, σώμα που αποτυγχάνει στην επικύρωση, χρονικό διάστημα που μόλις κλείστηκε.
UNAUTHORIZED401Περιεχόμενο και GraphQL: χωρίς κλειδί ή με μη έγκυρο ή ανακληθέν κλειδί.
FORBIDDEN403Ζητήθηκαν πρόχειρα με κλειδί ck_pub_.
NOTFOUND404Άγνωστη συλλογή ή εγγραφή, άγνωστο slug χώρου εργασίας.
VALIDATION_FAILED400Φόρμες: τα πεδία δεν πληρούν τους κανόνες της φόρμας· το details είναι [{ field, message }].
ORIGIN_NOT_ALLOWED403Φόρμες: το Origin δεν περιλαμβάνεται στους επιτρεπόμενους ιστοτόπους της φόρμας.
FORM_UNAVAILABLE404Φόρμες: η φόρμα δεν είναι ενεργή ή η λειτουργική μονάδα Φόρμες είναι απενεργοποιημένη.
RATE_LIMITED429Φόρμες: ξεπεράστηκε το ωριαίο όριο της φόρμας ανά IP ή ανά φόρμα.
FORMS_PAUSED503Φόρμες: οι υποβολές έχουν ανασταλεί προσωρινά σε όλη την πλατφόρμα.
ENTITY_TOO_LARGE413Το σώμα υπερβαίνει το όριο μεγέθους.
INTERNAL_SERVER_ERROR500Ένα απρόσμενο σφάλμα. Δοκιμάστε ξανά αργότερα και αναφέρετε το requestId στην υποστήριξη.
TOO_MANY_REQUESTS429Ξεπεράστηκε ένα όριο ρυθμού ανά κλειδί ή ανά IP. Περιμένετε και δοκιμάστε ξανά. (Οι εκδόσεις πριν από τις 24 Σεπτεμβρίου 2026 έστελναν INTERNAL_SERVER_ERROR με κατάσταση 429, οπότε η διάκριση με βάση την κατάσταση λειτουργεί παντού.)

Σφάλματα επικύρωσης#

Οι φόρμες εξηγούν κάθε πεδίο:

JSON
{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Please check the highlighted fields",
    "details": [{ "field": "email", "message": "Enter a valid email" }],
    "requestId": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f"
  }
}

Τα endpoints επικοινωνίας και κρατήσεων επικυρώνουν αυστηρά το σώμα JSON και απαριθμούν κάθε πρόβλημα, συμπεριλαμβανομένων των πεδίων που δεν δέχονται:

JSON
{
  "error": {
    "code": "BADREQUEST",
    "message": ["mode must be one of the following values: online, in_office"],
    "details": ["mode must be one of the following values: online, in_office"],
    "requestId": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b"
  }
}

Όρια ρυθμού#

ΤιΌριοΜετράται ανά
API περιεχομένου και GraphQL300 αιτήματα ανά λεπτό από προεπιλογήΚλειδί API, σε σταθερά παράθυρα ενός λεπτού. Το REST και το GraphQL το μοιράζονται.
Υποβολή επικοινωνίας, κράτηση, υποβολή φόρμας10 ανά λεπτό και 60 ανά ώρα από προεπιλογήΔιεύθυνση IP του επισκέπτη, ανά endpoint.
Υποβολές φορμών30 ανά IP την ώρα και 500 ανά φόρμα την ώρα από προεπιλογήΟρίζεται για κάθε φόρμα στην κονσόλα.
  • Όταν ξεπεραστεί ένα όριο, η απάντηση είναι 429. Τα όρια ανά IP προσθέτουν Retry-After-short (το παράθυρο του λεπτού) ή Retry-After-long (το παράθυρο της ώρας) με τα δευτερόλεπτα αναμονής. Το όριο ανά κλειδί μηδενίζεται στην αρχή του επόμενου λεπτού.
  • Ο διακομιστής του ιστοτόπου σας συνήθως ανακτά περιεχόμενο από μία IP· το API περιεχομένου περιορίζεται ανά κλειδί και όχι ανά IP, οπότε η απόδοση των σελίδων δεν επιβραδύνεται ποτέ από τους επισκέπτες.
  • Αν προωθείτε τις υποβολές μέσω του διακομιστή σας, μεταβιβάστε το x-forwarded-for ώστε κάθε επισκέπτης να έχει το δικό του όριο.
  • Χρησιμοποιήστε κρυφή μνήμη από την πλευρά σας (ETags, επανεπικύρωση Next.js, webhooks) αντί να ανακτάτε περιεχόμενο σε κάθε προβολή σελίδας.

Στο SDK#

Το SDK μετατρέπει κάθε σώμα σφάλματος σε CitronError και επαναλαμβάνει αυτόματα τα αιτήματα σε 429 και 5xx. Δείτε σφάλματα στο SDK.

TypeScript SDK
import { CitronGraphQLError, isCitronError } from '@citron/sdk';

try {
  await citron.collection('products').get('does-not-exist');
} catch (err) {
  if (err instanceof CitronGraphQLError) {
    console.error(err.errors, err.data); // GraphQL errors and partial data
  } else if (isCitronError(err)) {
    console.error(err.status, err.code, err.message, err.requestId, err.details);
    if (err.isNotFound) { /* render your 404 */ }
    if (err.isRetryable) { /* 0, 408, 429 or 5xx; err.retryAfter when the server said */ }
  } else {
    throw err;
  }
}

Αυτή η αναφορά καλύπτει μόνο το δημόσιο API και ακολουθεί τη σύμβαση συμβατότητας του API: οι δημόσιες αποκρίσεις μόνο αποκτούν νέα πεδία. Η περιγραφή OpenAPI αυτών των διαδρομών βρίσκεται στο /developers/openapi.json.