Αναφορά
Σφάλματα και όρια ρυθμού
Κάθε σφάλμα REST έχει το ίδιο μικρό σώμα. Διακρίνετε πρώτα με βάση την κατάσταση HTTP, έπειτα με βάση το code, και αναφέρετε το requestId όταν μας ζητάτε βοήθεια.
Το σώμα σφάλματος#
{
"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 θα τη χρησιμοποιήσει, ώστε να αντιστοιχίζετε τα δικά σας αρχεία καταγραφής με τα δικά μας. Συμπεριλάβετέ το κάθε φορά που επικοινωνείτε με την υποστήριξη.
# 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 | Κατάσταση | Πού |
|---|---|---|
BADREQUEST | 400 | Οποιοδήποτε λανθασμένο αίτημα: άγνωστο πεδίο ή τελεστής φίλτρου, άγνωστη γλώσσα, λανθασμένη τιμή richtext, περισσότερα από 10 φίλτρα, captcha που απορρίφθηκε, σώμα που αποτυγχάνει στην επικύρωση, χρονικό διάστημα που μόλις κλείστηκε. |
UNAUTHORIZED | 401 | Περιεχόμενο και GraphQL: χωρίς κλειδί ή με μη έγκυρο ή ανακληθέν κλειδί. |
FORBIDDEN | 403 | Ζητήθηκαν πρόχειρα με κλειδί ck_pub_. |
NOTFOUND | 404 | Άγνωστη συλλογή ή εγγραφή, άγνωστο slug χώρου εργασίας. |
VALIDATION_FAILED | 400 | Φόρμες: τα πεδία δεν πληρούν τους κανόνες της φόρμας· το details είναι [{ field, message }]. |
ORIGIN_NOT_ALLOWED | 403 | Φόρμες: το Origin δεν περιλαμβάνεται στους επιτρεπόμενους ιστοτόπους της φόρμας. |
FORM_UNAVAILABLE | 404 | Φόρμες: η φόρμα δεν είναι ενεργή ή η λειτουργική μονάδα Φόρμες είναι απενεργοποιημένη. |
RATE_LIMITED | 429 | Φόρμες: ξεπεράστηκε το ωριαίο όριο της φόρμας ανά IP ή ανά φόρμα. |
FORMS_PAUSED | 503 | Φόρμες: οι υποβολές έχουν ανασταλεί προσωρινά σε όλη την πλατφόρμα. |
ENTITY_TOO_LARGE | 413 | Το σώμα υπερβαίνει το όριο μεγέθους. |
INTERNAL_SERVER_ERROR | 500 | Ένα απρόσμενο σφάλμα. Δοκιμάστε ξανά αργότερα και αναφέρετε το requestId στην υποστήριξη. |
TOO_MANY_REQUESTS | 429 | Ξεπεράστηκε ένα όριο ρυθμού ανά κλειδί ή ανά IP. Περιμένετε και δοκιμάστε ξανά. (Οι εκδόσεις πριν από τις 24 Σεπτεμβρίου 2026 έστελναν INTERNAL_SERVER_ERROR με κατάσταση 429, οπότε η διάκριση με βάση την κατάσταση λειτουργεί παντού.) |
Σφάλματα επικύρωσης#
Οι φόρμες εξηγούν κάθε πεδίο:
{
"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 και απαριθμούν κάθε πρόβλημα, συμπεριλαμβανομένων των πεδίων που δεν δέχονται:
{
"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 περιεχομένου και GraphQL | 300 αιτήματα ανά λεπτό από προεπιλογή | Κλειδί 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.
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.