status: "failed" के साथ समाप्त किया जा सकता है। विफल और रद्द किए गए जॉब्स के लिए शुल्क नहीं लिया जाता। आप केवल पूरे हुए जॉब्स के लिए भुगतान करते हैं। नोड ऐप में, ऐप के अपने जॉब के लिए कभी शुल्क नहीं लिया जाता। हर जनरेशन या LLM नोड के लिए तब शुल्क लिया जाता है जब उसका अपना जॉब पूरा होता है। कोई विफलता समानांतर नोड्स या अन्य शाखाओं को रद्द नहीं करती, इसलिए जो नोड ऐप के विफल होने के बाद पूरा होता है, उसके लिए भी शुल्क लिया जाता है, और ये शुल्क वापस नहीं किए जाते। जो नोड विफल होता है, रद्द होता है, या कभी शुरू नहीं होता, उसके लिए शुल्क नहीं लिया जाता। API keys और बिलिंग देखें।
अनुरोध के समय की त्रुटियाँ और विफल जॉब्स
अनुरोध के समय की त्रुटियाँ4xx या 5xx स्टेटस लौटाती हैं। कोई जॉब नहीं बनता। बॉडी को नीचे बताए अनुसार पढ़ें।
विफल जॉब्स सबमिट के समय सफलता स्टेटस लौटाते हैं। GET /jobs/{id} को पोल करें या किसी वेबहुक की प्रतीक्षा करें। जब जॉब समाप्त होता है, तो status "failed" होता है और विफलता शीर्ष-स्तरीय error ऑब्जेक्ट में होती है। विफल जॉब पर result न पढ़ें: वह छोड़ दिया जाता है (या null होता है)। इसमें आउटपुट केवल तभी होता है जब status "completed" हो। cancelled जॉब में न result होता है, न error।
error.code के आधार पर ब्रांच करें। message छोड़ा जा सकता है, और provider_error तथा internal के लिए यह प्रदाता का मुक्त-रूप टेक्स्ट होता है। message को पार्स न करें।
प्रतिक्रिया बॉडी
generate, jobs, assets, styles, और node apps पर, जब बॉडी JSON हो तोmessage ?? error पढ़ें। इन दोनों में से एक फ़ील्ड में सारांश होता है। कुछ 5xx बॉडी JSON नहीं होतीं, जिनमें वह 502 भी शामिल है जिसकी बॉडी सादा टेक्स्ट error code: 502 होती है। सावधानी से पार्स करें: यदि बॉडी JSON नहीं है, तो HTTP स्टेटस के आधार पर ब्रांच करें।
अधिकांश विफलताएँ { "message": "..." } का उपयोग करती हैं, कभी-कभी अतिरिक्त फ़ील्ड्स (limit, jobType, modelAccessDenial) के साथ। अमान्य JSON और नीचे दिए गए कुछ हैंडलर इसके बजाय { "error": "..." } का उपयोग करते हैं।
/mcp जैसे MCP एंडपॉइंट्स JSON-RPC त्रुटियाँ लौटाते हैं, { "jsonrpc", "id", "error": { "code", "message" } }, न कि इस पेज पर दी गई HTTP बॉडी।
Accept: application/json भेजें
{ "message" } त्रुटियाँ, जिनमें 401 और 404 शामिल हैं, तब JSON होती हैं जब Accept application/json या */* हो। जब Accept मौजूद न हो, या text/html हो, तो ये स्टेटस एक HTML पेज (Content-Type: text/html) होते हैं और JSON पार्सर विफल हो जाएगा।
यह उन क्लाइंट्स के लिए मायने रखता है जो कोई Accept हेडर नहीं भेजते। Python का urllib उनमें से एक है। curl डिफ़ॉल्ट रूप से Accept: */* भेजता है, और Node का fetch भी, इसलिए दोनों JSON प्राप्त करते हैं जब तक आप Accept को ओवरराइड न करें।
बिना प्रमाणीकरण वाले POST /generate/..., GET /jobs/{id}, GET /styles, और GET /assets, */* और application/json के लिए 401 {"message":"Unauthorized"} लौटाते हैं, और Accept न होने या text/html होने पर एक HTML पेज। किसी अज्ञात id के लिए प्रमाणीकृत GET /jobs/{id} स्टेटस के साथ यही करता है: जब Accept JSON माँगता है तो 404 JSON {"message":"Job not found or unauthorized"}, और जब Accept मौजूद न हो तो 404 text/html।
अमान्य JSON (400) और वैलिडेशन (422) { "error" } का उपयोग करते हैं और Accept न होने पर भी JSON ही रहते हैं। यही बात removed-field 422, सनसेट 410, Zero Data Retention 402, नोड-ऐप { "error" } प्रतिक्रियाओं, और मैप की गई Agent ऑपरेशन API त्रुटियों पर भी लागू होती है। POST /generate/... जॉब को स्वीकार करते समय आने वाले 402 और 429 भी JSON होते हैं, ब्राउज़र Accept के लिए भी।
413 और 500 { "message" } का उपयोग करते हैं और 401 तथा 404 की तरह Accept का पालन करते हैं।
वैलिडेशन (422)
details हर समस्या को सूचीबद्ध करता है। field . से जोड़ा गया पाथ है ("image_style_references.0.url")। ऑब्जेक्ट-स्तर की त्रुटियाँ खाली स्ट्रिंग का उपयोग करती हैं, जैसे ऊपर की अज्ञात key के मामले में। कई अज्ञात keys Unrecognized keys: ... और वही खाली field उत्पन्न करती हैं। expected केवल तभी जोड़ा जाता है जब code "invalid_type" हो।
अमान्य X-Webhook-URL हेडर भी इसी 422 का उपयोग करता है।
अमान्य क्वेरी पैरामीटर्स के साथ GET /jobs भी यही 422 लौटाता है। यह 400 नहीं है।
टूल के भीतर विफल होने वाली Zero Data Retention इनपुट जाँच message में स्पष्टीकरण के साथ 422 लौटाती है ({ "message" } संरचना, इसलिए Accept मायने रखता है)। Zero Data Retention देखें।
हटाए गए और डिप्रिकेटेड फ़ील्ड्स (422)
हटाया गया batchSize / batch_size फ़ील्ड एक अलग 422 का उपयोग करता है। इसमें कोई details array नहीं होता:
batch_size भी इसी तरह हटाया गया है। field वही नाम होता है जो आपने भेजा।
डिप्रिकेटेड फ़ील्ड alias reason "deprecated_field" या "conflicting_fields" का उपयोग करता है, और लागू होने पर replacement, sunset_date, और migration_url भी। error और reason के आधार पर ब्रांच करें। किसी व्यक्ति को दिखाने वाला वाक्य message है।
सनसेट मॉडल (410)
अपनी सनसेट तिथि पार कर चुका मॉडल Deprecation: true और एक Sunset हेडर (RFC 1123 तिथि) के साथ 410 लौटाता है:
error स्थिर मान "model_unavailable" है। जब कोई अनुशंसित प्रतिस्थापन नहीं होता, तो replacement और migration_url छोड़ दिए जाते हैं। उसी मॉडल पर रिट्राई करने से 410 ही लौटता रहेगा। replacement सेट होने पर उस पर स्विच करें, और डिप्रिकेशन देखें।
जो मॉडल डिप्रिकेटेड है लेकिन अभी भी चालू है, वह त्रुटियों सहित हर प्रतिक्रिया पर Deprecation और Sunset भेजता है। डिप्रिकेटेड फ़ील्ड alias का उपयोग करने पर भी यही होता है, उसके अपने 422 पर भी। जब कोई माइग्रेशन गाइड मौजूद हो, तो एक Link: <migration_url>; rel="deprecation" हेडर भी भेजा जाता है।
स्टेटस कोड
400
generate पर अमान्य JSON हमेशा JSON होता है, किसी Accept हेडर की आवश्यकता नहीं:
{ "error" } का उपयोग करता है: Invalid URL for input "<key>", या Failed to download URL for <key>: …। डाउनलोड संदेश अस्थायी विफलताओं को भी कवर करता है, इसलिए generate के विपरीत (इनपुट डाउनलोड देखें) नोड-ऐप डाउनलोड विफलता हमेशा 400 होती है। यदि URL मान्य है तो एक बार रिट्राई करें।
POST /node-apps/{id}/execute पर अमान्य JSON ऊपर वाला generate 400 नहीं है। यह 500 { "message": "Internal Error" } बन जाता है, बिना किसी exception टेक्स्ट के, और यह Accept का पालन करता है।
assets और node apps पर अन्य 400 प्रतिक्रियाएँ एक छोटे स्पष्टीकरण के साथ { "message": "..." } होती हैं, उदाहरण के लिए presigned अपलोड पर No file provided या नोड-ऐप versions पर Invalid pagination parameters। विफल asset अपलोड, अपलोड सर्विस का स्टेटस (400, 401, 404, या 500) आगे भेजता है और उसका प्रतिक्रिया टेक्स्ट message में रख सकता है। वह टेक्स्ट कभी-कभी JSON स्ट्रिंग होता है। GET /jobs पर अमान्य क्वेरी पैरामीटर्स 422 होते हैं, 400 नहीं।
401
generate, jobs, assets, styles, और node apps:
{ "message": "Presigned upload URL expired" } या { "message": "Invalid presigned upload URL" } लौटाते हैं।
402 भुगतान आवश्यक
API-बिल्ड क्लाइंट (API key, या API key का उपयोग करने वाला MCP) के लिए, जिसका API बैलेंस जॉब को कवर नहीं करता:
402 message मान:
जिस वर्कस्पेस में Zero Data Retention सक्षम नहीं है, वहाँ Zero Data Retention के साथ generate कॉल यह बॉडी लौटाती है, हमेशा JSON:
402 बॉडी का उपयोग करती है। वे API बैलेंस से नहीं, बल्कि वर्कस्पेस कंप्यूट बैलेंस से लेती हैं।
403
404
हर 404 { "message" } होता है, उदाहरण के लिए अज्ञात जॉब id:
Accept हेडर न होने पर ये HTML बन जाते हैं, सिवाय उस Endpoint not found के जो ऐसे मॉडल के लिए आता है जिसका उपयोग आपकी key या प्लान नहीं कर सकता; वह हमेशा JSON होता है। बिना Accept के किसी अज्ञात id के लिए प्रमाणीकृत GET /jobs/{id} 404 text/html होता है।
अज्ञात Agent ऑपरेशन भी
404 { "message": "Endpoint not found" } होता है, Agent की { "error", "code" } संरचना नहीं।
405
बॉडी सादा टेक्स्ट होती है, बिना Content-Type हेडर के, JSON नहीं, तब भी जब Accept application/json हो। टेक्स्ट मेथड के बाद method not allowed होता है, उदाहरण के लिए GET method not allowed। एक Allow हेडर उन मेथड्स को सूचीबद्ध करता है जिन्हें पाथ स्वीकार करता है।
413 पेलोड बहुत बड़ा
बहुत बड़ी अनुरोध बॉडी 413 के साथ अस्वीकार कर दी जाती है। API से आने पर बॉडी Accept का पालन करती है:
413 पेज के साथ अस्वीकार की जा सकती है। फ़ाइलें इनलाइन न भेजें। फ़ाइल को POST /assets से अपलोड करें और लौटाए गए URL को generate अनुरोध में पास करें।
इनपुट डाउनलोड
जो होस्ट404 या 410 लौटाता है, वह स्थायी 422 होता है। बॉडी JSON होती है, और Accept मायने रखता है:
410 वही वाक्य 410 के साथ उपयोग करता है। अन्य स्थायी अस्वीकृतियाँ Input file rejected: … का उपयोग करती हैं।
रिट्राई योग्य डाउनलोड विफलता 502 या 504 होती है। बॉडी के नहीं, बल्कि स्टेटस कोड के आधार पर ब्रांच करें, और रिट्राई करें।
यदि एक ही URL के लिए
502 बार-बार आता रहे, तो संभवतः URL ब्लॉक है या टूटा हुआ है। URL बदलें।
3D export रूपांतरण विफलताएँ भी 502 होती हैं। उस पाथ का लाइव परीक्षण नहीं किया गया था, इसलिए बॉडी भी Cloudflare के सादे टेक्स्ट error code: 502 के रूप में आ सकती है। स्टेटस कोड के आधार पर ब्रांच करें और रिट्राई करें। यदि एक ही मॉडल URL के लिए 502 बार-बार आता रहे, तो संभवतः URL ब्लॉक है या टूटा हुआ है।
429 कॉन्करेंसी
जब जॉब को बैकलॉग नहीं किया जा सकता, तो कॉन्करेंसी सीमा से ऊपर का अनुरोध 429 और Content-Type: application/json के साथ अस्वीकार किया जा सकता है:
limit इस प्रकार के जॉब के लिए आपकी कॉन्करेंसी सीमा है। इसे प्रति उपयोगकर्ता गिना जाता है, प्रति वर्कस्पेस नहीं। यह अनुमानित है: एक छोटा बर्स्ट इसके ऊपर भी स्वीकार किया जा सकता है, इसलिए यह न मानें कि अनुरोध संख्या limit + 1 ही विफल होगा। jobType एक आंतरिक जॉब श्रेणी है, सार्वजनिक मॉडल पाथ नहीं। इसके आधार पर ब्रांच न करें।
Krea 2 अपनी साझा कतार भर जाने पर केवल { "message": "CONCURRENCY_LIMIT_REACHED" } भी लौटा सकता है, बिना limit या jobType के। यह आपकी सीमा नहीं है। रुकें और रिट्राई करें।
बैकलॉगिंग केवल तभी चालू होती है जब प्लान में यह शामिल हो (Pro और उससे ऊपर), मॉडल इसका समर्थन करता हो, और अनुरोध Zero Data Retention न हो। Krea 2 अनुरोध फ़िलहाल किसी भी प्लान पर बैकलॉग नहीं किए जाते, इसलिए सीमा पार होने पर वे 429 लौटाते हैं। जब यह चालू होती है, तो अतिरिक्त जॉब status: "backlogged" के साथ स्वीकार किया जाता है और स्लॉट खाली होते ही शुरू हो जाता है। बैकलॉग की कोई अलग सीमा नहीं है। रेट लिमिट्स देखें।
API Retry-After या X-RateLimit-* नहीं भेजती। प्रतिक्रिया में cf-ray शामिल होता है। 429 पर, चालू जॉब्स पूरे होने के बाद एक्सपोनेंशियल बैकऑफ़ के साथ रिट्राई करें (GET /jobs/{id} को पोल करें, या वेबहुक का उपयोग करें)।
यदि बाद में पूरा होने वाला कोई जॉब बैलेंस समाप्त कर देता है, तो बैकलॉग में अभी भी पड़े जॉब्स error.code "insufficient_balance" के साथ विफल हो जाते हैं। यह एक विफल जॉब है, HTTP 402 नहीं। ये जॉब्स वेबहुक नहीं भेजते, इसलिए बैकलॉग किए गए जॉब्स के लिए GET /jobs/{id} को पोल करें।
Agent ऑपरेशन API
POST /agent/{operation} और GET /agent/session/{sessionId} { "error", "code"?, "allowedModels"? } लौटाते हैं। केवल error आवश्यक है। allowedModels camelCase में है। जो टर्न स्वीकार किए जाने के बाद विफल होता है, वह सेशन पर status: "failed" के रूप में दिखाई देता है, इन HTTP त्रुटियों में से किसी के रूप में नहीं। Agent देखें।
अपरिचित Agent त्रुटि कोड भी
{ "error", "code" } के साथ 422 ही होता है। अज्ञात-ऑपरेशन 404 और अनहैंडल्ड 500 { "message" } का उपयोग करते हैं और Accept का पालन करते हैं।
विफल जॉब का error.code
GET /jobs और GET /jobs/{id} केवल तभी error सेट करते हैं जब status "failed" हो। कोई उपयोगी result नहीं होता:
विफल जॉब के लिए वेबहुक डिलीवरी उसी जॉब ऑब्जेक्ट का उपयोग करती है,
error सहित। रद्द किए गए जॉब की डिलीवरी में कोई error नहीं होता। 256 KiB से बड़ा पेलोड नहीं भेजा जाता, और उस जॉब के लिए आगे कोई डिलीवरी नहीं की जाती, इसलिए इसके बजाय GET /jobs/{id} को पोल करें। बॉडी पर भरोसा करने से पहले सिग्नेचर सत्यापित करें। वेबहुक देखें।
डीबगिंग
Krea का कोई request-id हेडर नहीं है। हर प्रतिक्रिया में Cloudflare काcf-ray हेडर शामिल होता है। कोई Retry-After या X-RateLimit-* हेडर नहीं भेजा जाता।
जब आप support@krea.ai पर लिखें, तो शामिल करें:
job_id, जब कॉल ने कोई जॉब बनाया हो या किसी जॉब को संबोधित किया हो- समय और एंडपॉइंट
- अनुरोध के समय की त्रुटि के लिए,
cf-rayमान
Access-Control-Allow-Origin * है। generate, jobs, assets, styles, और node apps पर Access-Control-Expose-Headers सेट नहीं है, इसलिए ब्राउज़र fetch cf-ray, Deprecation, या Sunset नहीं पढ़ सकता। cf-ray को नेटवर्क लॉग से, या किसी सर्वर-साइड क्लाइंट से कॉपी करें।
किसी भी प्रतिक्रिया पर, मॉडल के कॉल स्वीकार करना बंद करने से पहले Deprecation और Sunset जाँचें। डिप्रिकेशन देखें।
अगले चरण
जॉब लाइफ़साइकिल
जॉब के पूरा, विफल या रद्द होने तक स्टेटस पोल करें
वेबहुक
विफल जॉब की डिलीवरी पर सिग्नेचर सत्यापित करें
रेट लिमिट्स
अतिरिक्त जॉब्स कब बैकलॉग होते हैं और कब वे 429 लौटाते हैं
API Keys & Billing
402 के बाद API बैलेंस टॉप अप करें