Αιτήματα
Ένα αίτημα είναι μία κλήση ενός μοντέλου. Έχει ένα id (req_…), μια κατάσταση, το κόστος του σε πιστώσεις API (1000 = 1 USD) και, όταν ολοκληρωθεί με επιτυχία, τα αρχεία που δημιουργήθηκαν. Το ίδιο αντικείμενο επιστρέφεται από κάθε παρακάτω τελικό σημείο, για κάθε μοντέλο.
Εύρεση μοντέλου
Ο κατάλογος και των 1.496 μοντέλων είναι δημόσιο JSON (δεν απαιτείται κλειδί):
curl "https://api.doitong.com/v1/models?category=text-to-video&lab=Google&limit=20"
| Παράμετρος ερωτήματος | Σημασία |
|---|---|
q |
Λέξεις που πρέπει να εμφανίζονται όλες στο όνομα, το id, τον κατασκευαστή ή τις ετικέτες, για παράδειγμα kling 3. |
category |
Ένα id κατηγορίας, για παράδειγμα text-to-video ή upscale. Το GET https://api.doitong.com/v1/categories παραθέτει και τις 21 με τις μετρήσεις τους. |
lab |
Ο κατασκευαστής του μοντέλου, με όνομα ή id, για παράδειγμα Google ή black-forest-labs. |
family |
Ένα id family από προηγούμενη γραμμή: κάθε παραλλαγή ενός μοντέλου (pro, fast, image-to-video, …). |
mode |
exact (η τιμή υπολογίζεται από την είσοδο), measured (από τη διάρκεια ή το μέγεθος των αρχείων εισόδου), estimate (εκτιμώμενη τιμή ανά εκτέλεση) ή metered (χρέωση βάσει της πραγματικής χρήσης, έως ένα μέγιστο ανά εκτέλεση). |
limit, cursor |
Μέγεθος σελίδας (1 έως 100, προεπιλογή 50) και το next_cursor της προηγούμενης σελίδας. |
Κάθε γραμμή έχει id, name, lab, category, family, summary, tags, output_kind, docs_url και ένα αντικείμενο price (δείτε το Pricing). Το GET https://api.doitong.com/v1/models/{model_id} προσθέτει το πλήρες JSON Schema εισόδου και εξόδου, τα κανονικά ονόματα παραμέτρων, τους κανόνες τιμολόγησης και ένα δείγμα εισόδου. Άγνωστο category ή mode επιστρέφει 400 invalid_parameter.
Εκτέλεση μοντέλου
curl -X POST "https://api.doitong.com/v1/run/{model_id}?wait=20" \
-H "Authorization: Bearer $DOITONG_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1842-cover" \
-d '{"prompt": "..."}'
- Το σώμα είναι η είσοδος του μοντέλου, ένα αντικείμενο JSON. Κάθε σελίδα μοντέλου παραθέτει τις παραμέτρους του.
- Η είσοδος ελέγχεται πριν από οποιαδήποτε χρέωση. Μη έγκυρη είσοδος επιστρέφει
422 invalid_inputμε την προβληματικήparamκαι δεν κοστίζει τίποτα. - Το
?wait=N(έως 20 δευτερόλεπτα) διατηρεί την κλήση ενεργή μέχρι να ολοκληρωθεί το αίτημα ή να λήξει ο χρόνος. - Το
?webhook_url=https://…στέλνει υπογεγραμμένοPOSTσε αυτή τη διεύθυνση όταν ολοκληρωθεί το αίτημα (δείτε το Webhooks). - Το
?storage=permanentή?storage=temporaryεπιλέγει για πόσο διατηρούνται τα αρχεία εξόδου· χωρίς αυτό εφαρμόζεται η ρύθμιση του λογαριασμού (δείτε το Πού βρίσκονται τα αρχεία).
Η απόκριση είναι 202 Accepted όσο το αίτημα βρίσκεται ακόμη σε εξέλιξη και 200 OK όταν ολοκληρώθηκε εντός της αναμονής (ή όταν είναι επανάληψη, δείτε παρακάτω). Οι κεφαλίδες Location και Doitong-Request-Id περιέχουν τη διεύθυνση URL και το id του αιτήματος.
Καταστάσεις
-
queuedΈγινε αποδεκτό και χρεώθηκε, σε αναμονή εργαζομένου -
runningΤο μοντέλο δημιουργεί -
Τελικές καταστάσεις:
succeededΧρεώθηκε η προσφορά· τα outputs[] περιέχουν URL στον χώρο αποθήκευσής μαςfailedΑυτόματη επιστροφή χρημάτων· το σφάλμα εξηγεί την αιτίαcanceledΔιακόπηκε πριν από αποτέλεσμα· έγινε επιστροφή χρημάτων
| Κατάσταση | Σημασία | Τελική |
|---|---|---|
queued |
Έγινε αποδεκτό και χρεώθηκε, σε αναμονή εργαζομένου. Το queue_position μπορεί να εμφανίζει τη θέση στην ουρά. |
όχι |
running |
Το μοντέλο δημιουργεί την έξοδο. | όχι |
succeeded |
Ολοκληρώθηκε. Το outputs παραθέτει τα αρχεία. |
ναι |
failed |
Το μοντέλο ή ένα όριο το σταμάτησε. Το error εξηγεί γιατί. Οι πιστώσεις API επιστρέφονται. |
ναι |
canceled |
Ακυρώθηκε πριν παραγάγει αποτέλεσμα. Οι πιστώσεις API επιστρέφονται. | ναι |
Ένα αίτημα που διαρκεί περισσότερο από το χρονικό του όριο αποτυγχάνει με τον κωδικό timeout και επιστρέφεται: 15 λεπτά για εικόνες, 60 λεπτά για βίντεο, 30 λεπτά για ήχο και οτιδήποτε άλλο.
Το αντικείμενο αιτήματος
{
"id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
"object": "request",
"model": "flux/schnell",
"status": "succeeded",
"created_at": "2026-10-20T12:00:00Z",
"started_at": "2026-10-20T12:00:01Z",
"completed_at": "2026-10-20T12:00:02Z",
"queue_position": null,
"cost": { "credits": 3, "usd": "0.003", "charged": 3, "refunded": 0 },
"input": { "prompt": "..." },
"output": { "images": [ { "url": "https://content.doitong.com/dev-api/…/0-output.jpeg", "width": 1024, "height": 768 } ] },
"outputs": [
{ "type": "image", "url": "https://content.doitong.com/dev-api/…/0-output.jpeg", "content_type": "image/jpeg",
"width": 1024, "height": 768, "file_size": 183920, "stored": true }
],
"error": null,
"metrics": { "inference_seconds": 1.2 },
"storage": { "mode": "permanent", "bytes": 183920, "expires_at": null, "expired": false },
"urls": {
"self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
"cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
}
}
- Το
outputsείναι ίδιο για κάθε μοντέλο: μία καταχώριση ανά αρχείο που δημιουργήθηκε, μεtype(image,video,audio,fileή3d), έναurlστην αποθήκευσή μας,content_typeκαι, όταν είναι γνωστά,file_size,width,height,duration. - Το
outputείναι το αντικείμενο αποτελέσματος του ίδιου του μοντέλου (τα πεδία του παρατίθενται σε κάθε σελίδα μοντέλου), με τις ίδιες διευθύνσεις URL. - Το
storageδηλώνει πώς διατηρούνται τα αρχεία:mode(permanentήtemporary), αποθηκευμέναbytes,expires_at(πότε διαγράφεται ένα προσωρινό αρχείο,nullγια τα μόνιμα) καιexpired(trueμόλις διαγραφούν τα αρχεία). - Το
cost.creditsείναι η τιμή της κλήσης σε πιστώσεις API (cost.usdσε USD), τοcost.chargedό,τι χρεώθηκε από το υπόλοιπο API και τοcost.refundedό,τι επιστράφηκε. Για μοντέλοmetered, τοcost.creditsείναι το μέγιστο ποσό που δεσμεύτηκε στην αρχή (cost.held)· όταν η εκτέλεση ολοκληρωθεί με επιτυχία, τοcost.settledδηλώνει το ποσό της χρήσης και το υπόλοιπο του μέγιστου βρίσκεται στοcost.refunded(δείτε το Χρέωση βάσει χρήσης). - Όταν ένα αίτημα αποτυγχάνει, το
errorείναι{ "type": …, "code": …, "message": … }.
Ανάγνωση αιτήματος
curl "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t?wait=20" \
-H "Authorization: Bearer $DOITONG_API_KEY"
- Το
?wait=N(έως 20 δευτερόλεπτα) κάνει αναμονή μεγάλης διάρκειας: η κλήση επιστρέφει μόλις το αίτημα γίνει τελικό ή μετά από N δευτερόλεπτα με την τρέχουσα κατάσταση. Η επανάληψη αυτής της διαδικασίας είναι ο απλούστερος τρόπος αναμονής αποτελέσματος. - Το
?logs=1προσθέτει τις γραμμές του αρχείου καταγραφής προόδου του μοντέλου (τις τελευταίες 50) ωςlogs.
Μπορείτε να διαβάσετε μόνο αιτήματα του δικού σας λογαριασμού· οποιοδήποτε άλλο id είναι 404 request_not_found.
Λίστα αιτημάτων
curl "https://api.doitong.com/v1/requests?limit=20&status=succeeded&model=flux/schnell" \
-H "Authorization: Bearer $DOITONG_API_KEY"
Πρώτα εμφανίζονται τα νεότερα. Το limit είναι από 1 έως 100 (προεπιλογή 20), ενώ τα status και model λειτουργούν ως φίλτρα. Η απόκριση είναι { "object": "list", "data": [ … ], "has_more": true, "next_cursor": "req_…" }· περάστε cursor=<next_cursor> για την επόμενη σελίδα.
Ακύρωση αιτήματος
curl -X POST "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel" \
-H "Authorization: Bearer $DOITONG_API_KEY"
- Ακυρώθηκε πριν ξεκινήσει το μοντέλο: η κατάσταση γίνεται
canceled, οι πιστώσεις API επιστρέφονται και λαμβάνετε200. - Η δημιουργία έχει ήδη ξεκινήσει: η ακύρωση προωθείται και λαμβάνετε
202με"cancel_requested": true. Αν το μοντέλο ολοκληρωθεί ούτως ή άλλως, το αίτημα ολοκληρώνεται κανονικά και χρεώνεται. - Είναι ήδη τελικό:
409 not_cancelable(ένα αίτημα που είναι ήδηcanceledαπλώς επιστρέφει200).
Διαγραφή των αρχείων αιτήματος
curl -X DELETE "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/files" \
-H "Authorization: Bearer $DOITONG_API_KEY"
Διαγράφει τώρα τα αντίγραφα των αρχείων εξόδου του αιτήματος και σταματά τη χρέωση αποθήκευσής τους. Η απόκριση είναι το αντικείμενο αιτήματος με storage.expired: true· οι διευθύνσεις URL παραμένουν στην εγγραφή αλλά δεν λειτουργούν πλέον. Η επανάληψη της κλήσης δεν αλλάζει τίποτα (200). Ένα αίτημα που είναι ακόμη queued ή running δεν έχει αρχεία: 409 request_active. Απαιτεί models:run.
Idempotency: επανάληψη χωρίς διπλή χρέωση
Τα δίκτυα αποτυγχάνουν. Για ασφαλή επανάληψη μιας εκτέλεσης, στείλτε μια κεφαλίδα Idempotency-Key (οποιαδήποτε συμβολοσειρά έως 255 χαρακτήρες, μοναδική ανά λειτουργία, για παράδειγμα το δικό σας id παραγγελίας):
- Ίδιο κλειδί και ίδιο σώμα όπως πριν: λαμβάνετε το αρχικό αίτημα (
200, κεφαλίδαIdempotent-Replayed: true) και δεν γίνεται νέα χρέωση. - Ίδιο κλειδί και σώμα μετά από εκτέλεση που απέτυχε πριν φτάσει στο μοντέλο (
upstream_errorήinternal_errorκατά την υποβολή,insufficient_credits,budget_exceeded,too_many_inflight): δεν δημιουργήθηκε τίποτα και δεν έγινε χρέωση, επομένως η επανάληψη εκτελεί ξανά το μοντέλο αντί να επιστρέψει την αποτυχία. - Ίδιο κλειδί με διαφορετικό σώμα:
409 idempotency_mismatch. - Τα κλειδιά περιορίζονται στο κλειδί API που τα έστειλε.
Πού βρίσκονται τα αρχεία
Κάθε αρχείο εξόδου αντιγράφεται στην αποθήκευσή μας πριν το αίτημα χαρακτηριστεί succeeded, επομένως οι διευθύνσεις URL στο outputs βρίσκονται στους δικούς μας κεντρικούς υπολογιστές και μπορείτε να συνδέεστε απευθείας σε αυτές. Εσείς επιλέγετε για πόσο παραμένουν:
| Λειτουργία | Διάρκεια | Τιμή |
|---|---|---|
permanent (προεπιλογή) |
Μέχρι να τα διαγράψετε | 100 πιστώσεις API (0,10 $) ανά GB τον μήνα, με ημερήσια χρέωση από το υπόλοιπο API |
temporary |
7 ημέρες και μετά διαγράφονται | Δωρεάν |
- Η ρύθμιση του λογαριασμού αποφασίζει για τα νέα αιτήματα: ο διακόπτης "Διατήρηση αρχείων για πάντα" στον πίνακα ελέγχου ή το
PATCH https://api.doitong.com/v1/account/storageμε{"mode": "temporary"}. ΤοGET https://api.doitong.com/v1/accountτην εμφανίζει στην ενότηταstorage, μαζί με τα byte που διατηρείτε και τη μηνιαία εκτίμηση. - Το
?storage=permanent|temporaryσε μια εκτέλεση (το όρισμαstorageτου εργαλείου MCPrun) την παρακάμπτει για τη συγκεκριμένη εκτέλεση. - Η αλλαγή της ρύθμισης δεν επηρεάζει ποτέ αρχεία που έχετε ήδη· διαγράψτε τα με
DELETE /requests/{id}/files. - Όταν το υπόλοιπο API δεν μπορεί να πληρώσει την αποθήκευση, δεν χρεώνεστε και λαμβάνετε email: φορτίστε το υπόλοιπο εντός 30 ημερών ή τα διατηρούμενα αρχεία θα γίνουν προσωρινά και θα διαγραφούν 7 ημέρες αργότερα.
Στη σπάνια περίπτωση που αποτύχει η αντιγραφή μας, η καταχώριση έχει "stored": false και η διεύθυνση URL είναι η αρχική, βραχύβια διεύθυνση: κατεβάστε το αρχείο σύντομα.