यह पृष्ठ अंग्रेज़ी से अनूदित है। अंग्रेज़ी संस्करण आधिकारिक है — यदि कुछ गलत लगे, तो अंग्रेज़ी संस्करण देखें। EN

API कुंजियाँ और प्रोग्रामैटिक एक्सेस

वर्कस्पेस-स्कोप वाली API कुंजियों के साथ अपने स्वयं के बैकएंड से फॉर्म बनाएँ, उन्हें क्लोन करें और क्लाइंट इनटेक लिंक जनरेट करें।

यदि आप पहले से ही CRM, केस-मैनेजमेंट सिस्टम या आंतरिक पोर्टल चला रहे हैं, तो आपको हर फॉर्म बनाने के लिए डैशबोर्ड में क्लिक करने की आवश्यकता नहीं है। API कुंजियाँ आपके बैकएंड को DS160.io v1 API सीधे कॉल करने देती हैं — अपनी अनुसूची पर फॉर्म बनाना, उन्हें क्लोन करना और क्लाइंट इनटेक लिंक जनरेट करना।

API कुंजियाँ Business वर्कस्पेस पर उपलब्ध हैं। प्रत्येक कुंजी एक वर्कस्पेस से बंधी होती है और केवल उसी के भीतर कार्य कर सकती है।

API बेस URL

सभी v1 एंडपॉइंट्स की जड़ है:

https://ds160.io/api/v1

ये दस्तावेज़ आपकी एजेंसी के व्हाइट-लेबल डोमेन पर होस्ट हो सकते हैं, परन्तु API कॉल हमेशा ds160.io पर ही जाती हैं। इस पृष्ठ के सभी कोड नमूने पूर्ण URL का उपयोग करते हैं ताकि आप बिना पुनर्लेखन के कॉपी-पेस्ट कर सकें।

एंडपॉइंट संदर्भ

/v1 स्थिर है — पथ और फ़ील्ड नाम बिना /v2 मेजर वर्ज़न के नहीं बदलेंगे (देखें संस्करण और सहायता)। नीचे की तालिका के पथ workspace उपसर्ग /workspaces/:workspaceId/ के सापेक्ष दिखाए गए हैं; पूर्ण अनुरोध और प्रतिक्रिया आकार प्रत्येक एंडपॉइंट की सेक्शन में दर्ज हैं।

विधिपथScopeअनुरोध बॉडी
POST/formsforms:writename?
POST/forms/:formId/cloneforms:clonedisabledSections?
POST/forms/:formId/client-linksclient-links:writeexpiresInDays, defaultLanguage, hideBranding?
GET/formsforms:read / forms:writequery: limit?, cursor?
GET/forms/:formIdforms:read / forms:write

सभी अनुरोध बॉडी और प्रतिक्रियाएँ JSON हैं। forms:read scope फॉर्म मेटाडेटा पर केवल पठन की पहुँच देता है; forms:write दोनों — पठन और लेखन — देता है, इसलिए केवल लिखने वाली कुंजी को भी पठन निःशुल्क मिलता है।

1. एक API कुंजी बनाएँ

कार्यक्षेत्र सेटिंग्स → API कुंजियाँ खोलें और API कुंजी बनाएँ पर क्लिक करें। एक वर्णनात्मक नाम चुनें (हम प्रति इंटीग्रेशन एक कुंजी की अनुशंसा करते हैं, जैसे Production CRM या Staging webhook handler), फिर इंटीग्रेशन को आवश्यक scope चुनें:

  • forms:read — केवल फॉर्म मेटाडेटा पढ़ें (सूची / प्राप्त करें)
  • forms:write — फॉर्म बनाएँ; पठन भी देता है
  • forms:clone — मौजूदा फॉर्म की प्रतिलिपि बनाएँ
  • client-links:write — क्लाइंट इनटेक लिंक जनरेट करें

केवल वर्कस्पेस के स्वामी और एडमिन ही कुंजियाँ बना सकते हैं।

जब आप कुंजी बनाएँ पर क्लिक करते हैं, प्लेटफ़ॉर्म पूरा सीक्रेट केवल एक बार दिखाता है। उसे तुरंत अपने सीक्रेट मैनेजर में कॉपी कर लें — मॉडल बंद होने के बाद केवल अंतिम चार अक्षर ही दिखेंगे। यदि कुंजी खो जाए, उसे निरस्त करें और नई बनाएँ।

2. प्रमाणीकरण

सभी v1 एंडपॉइंट Authorization: Bearer <secret> हेडर अपेक्षित करते हैं।

export DS160_KEY="...the secret you just copied..."
export DS160_WORKSPACE="your-workspace-id"

curl https://ds160.io/api/v1/workspaces/$DS160_WORKSPACE/forms \
  -H "Authorization: Bearer $DS160_KEY"

वर्कस्पेस आईडी हर डैशबोर्ड पृष्ठ के URL में दिखाई देती है (/workspaces/<workspaceId>/...)। कुंजी का वर्कस्पेस सर्वर साइड बंधा होता है — गलत कुंजी से किसी अन्य वर्कस्पेस का एंडपॉइंट कॉल करने पर 403 Forbidden लौटता है।

सुझाव: इस पृष्ठ के सभी स्निपेट्स पर भाषा टैब समकालिक हैं। एक बार भाषा चुनें और पूरा पृष्ठ उसका अनुसरण करेगा।

3. एक फॉर्म बनाएँ

curl -X POST https://ds160.io/api/v1/workspaces/$DS160_WORKSPACE/forms \
  -H "Authorization: Bearer $DS160_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Smith / B1 — 2026-05" }'
# → { "formId": "65f2…" }

प्रत्येक कॉल आपके बिलिंग प्लान से एक फॉर्म क्रेडिट खर्च करती है (डैशबोर्ड से फॉर्म बनाने जैसा ही)। यदि आपके वर्कस्पेस में क्रेडिट नहीं बचा, कॉल 402 Payment Required लौटाएगी — पुनः प्रयास से पहले टॉप-अप करें।

वैकल्पिक name फ़ील्ड फॉर्म के लिए मानव-पठनीय लेबल सेट करती है (अधिकतम 200 वर्ण)। इसे छोड़ने पर स्वतः-जनित नाम मिलेगा — किसी भी स्थिति में, आप बाद में डैशबोर्ड से फॉर्म का नाम बदल सकते हैं।

4. मौजूदा फॉर्म को क्लोन करें

यदि आपके पास एक टेम्पलेट फॉर्म है जिसे आप बार-बार पुनः जारी करते हैं (जैसे एक ही नियोक्ता का J-1 कार्यक्रम), तो शून्य से शुरू करने के बजाय उसे क्लोन करें। वैकल्पिक रूप से, विशिष्ट पृष्ठों को छोड़ने के लिए disabledSections पास करें — सूचीबद्ध कोई भी अनुभाग नए फॉर्म में रिक्त फ़ील्डों से बदला जाता है, ताकि क्लाइंट उसे नए सिरे से भरें:

curl -X POST https://ds160.io/api/v1/workspaces/$DS160_WORKSPACE/forms/$SOURCE_FORM_ID/clone \
  -H "Authorization: Bearer $DS160_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "disabledSections": ["spouse-info-page", "security-background-page-5"] }'
# → { "formId": "65f3…" }

क्लोनिंग एक नए फॉर्म की तरह ही एक फॉर्म क्रेडिट खर्च करती है।

disabledSections के मान्य मान

सभी पृष्ठ कॉपी करने के लिए एक खाली array पास करें (या फ़ील्ड पूरी तरह छोड़ दें)। अन्यथा, नीचे दिए गए पहचानकर्ताओं का कोई भी संयोजन उपयोग करें — कोई भी अन्य मान 400 Bad Request लौटाएगा।

पहचानकर्तापृष्ठ
personal-info-page-1Personal Information - Part 1
personal-info-page-2Personal Information - Part 2
visa-purpose-pagePurpose of Visa
travel-companions-pageTravel Companions
previous-us-travel-pagePrevious U.S. Travel History
address-and-phone-pageAddress and Phone Details
passport-pagePassport Information
contact-info-pageContact Information
family-info-pageFamily Information
spouse-info-pageSpouse Information
deceased-spouse-info-pageDeceased Spouse Information
former-spouse-info-pageFormer Spouse Information
present-occupation-pageCurrent Occupation
previous-occuptation-pagePrevious Occupation
additional-occuptation-pageAdditional Occupation Details
security-background-page-1Security Background - Part 1
security-background-page-2Security Background - Part 2
security-background-page-3Security Background - Part 3
security-background-page-4Security Background - Part 4
security-background-page-5Security Background - Part 5
student-visa-page-1Student Visa Details - Part 1
student-visa-page-2Student Visa Details - Part 2
temporary-visa-pageTemporary Visa Information
crew-visa-pageCrew Visa Information

केवल फॉर्म की वीज़ा श्रेणी से संबंधित अनुभाग ही वास्तव में मौजूद होते हैं; स्रोत फॉर्म में न मौजूद पृष्ठ को सूचीबद्ध करने का कोई प्रभाव नहीं होता।

5. क्लाइंट इनटेक लिंक जनरेट करें

जब कोई फॉर्म मौजूद हो, क्लाइंट उसे भरने के लिए जिसका उपयोग कर सके, ऐसा टोकन वाला URL जनरेट करें:

curl -X POST https://ds160.io/api/v1/workspaces/$DS160_WORKSPACE/forms/$FORM_ID/client-links \
  -H "Authorization: Bearer $DS160_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "expiresInDays": 7, "defaultLanguage": "en" }'

अनुरोध बॉडी

फ़ील्डआवश्यकटिप्पणी
expiresInDaysहाँपूर्णांक 1–365। कोई डिफ़ॉल्ट नहीं — छोड़ने पर 400 Bad Request लौटता है। लिंक का expiresAt now + expiresInDays के रूप में परिकलित होता है और अंतर्निहित टोकन रिकॉर्ड उसी क्षण स्वचालित रूप से हट जाता है।
defaultLanguageहाँdefaultLanguage के मान्य मान में से कोई एक कोड। लौटाए गए url का locale उपसर्ग और फॉर्म खुलने की भाषा निर्धारित करता है।
hideBrandingनहींबूलियन। true होने पर फॉर्म बिना ब्रांडिंग दिखाया जाता है — इस लिंक के लिए एजेंसी का whitelabel लोगो और थीम छिपा दिया जाता है। डिफ़ॉल्ट false (कॉन्फ़िगर्ड होने पर workspace की whitelabel ब्रांडिंग दिखती है)।

उदाहरण प्रतिक्रिया (200 OK)

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI2NmMxYmQ0ZjZmNGFkNTQwMzMxNDhmYmEiLCJmb3JtSWQiOiI2NWYyYTkxMTNkZjAxYzAwMTI3YjY4MmEiLCJ3b3Jrc3BhY2VJZCI6IjY1ZjJhOTAwM2RmMDFjMDAxMjdiNjgwYSIsImV4cCI6MTc0ODA0ODI0NywiaWF0IjoxNzQ3NDQzNDQ3LCJkZWZhdWx0TGFuZ3VhZ2UiOiJlbiIsImhpZGVCcmFuZGluZyI6ZmFsc2V9.SiGNATuRe",
    "url": "https://intake.your-agency.com/client-intake/65f2a9113df01c00127b682a?token=eyJhbGciOi…",
    "expiresAt": "2026-05-24T01:50:46.000Z"
}
फ़ील्डटिप्पणी
tokenवही JWT जो url में भी समाहित है। सामान्यतः आपको इसे सीधे उपयोग करने की आवश्यकता नहीं — क्लाइंट url खोलते हैं और सर्वर समाहित टोकन सत्यापित करता है। टोकन का jti claim लिंक का अद्वितीय ID है; यदि बाद में इस विशिष्ट लिंक को निरस्त करना संभव हो तो इसे अपने सिस्टम में सहेजें (देखें क्लाइंट इनटेक लिंक निरस्त करना)।
urlसाझा करने योग्य लिंक। यदि वर्कस्पेस के लिए कस्टम डोमेन सत्यापित और SSL-प्रोविजन्ड है तो उसका उपयोग करता है; अन्यथा ds160.io पर वापस लौटता है। पथ का locale उपसर्ग (/es, /cn, …) defaultLanguage के आधार पर सेट होता है।
expiresAtISO-8601 टाइमस्टैम्प। उस क्षण संबंधित रिकॉर्ड स्वचालित रूप से हटा दिया जाता है, इसलिए समाप्ति के बाद लिंक का पुन: उपयोग नहीं किया जा सकता।

url अपने क्लाइंट को भेजें। URL में टोकन एकल-उद्देश्य है और expiresAt पर समाप्त होता है — क्लाइंट को भरने के लिए कोई अतिरिक्त प्रमाणीकरण आवश्यक नहीं।

क्लाइंट इनटेक लिंक निरस्त करना

जारी किए गए क्लाइंट लिंक को निरस्त करने के लिए कोई v1 एंडपॉइंट नहीं है — डैशबोर्ड से निरस्त करें (वर्कस्पेस → फॉर्म → साझाकरण → लिंक निरस्त करें)। निरस्तीकरण तत्काल और स्थायी है: लिंक का अगला अनुरोध 401 लौटाएगा। यदि रिसाव की आशंका हो और UI से निरस्त करने वाला कोई उपलब्ध न हो, सबसे सुरक्षित विकल्प है लिंक को समाप्त होने देना (expiresInDays को उसी अनुसार सीमित करें)।

defaultLanguage के मान्य मान

defaultLanguage तय करता है कि प्राप्तकर्ता द्वारा पहली बार लिंक खोलने पर इनटेक UI किस भाषा में दिखे। नीचे दिए गए किसी भी कोड का उपयोग करें — कोई भी अन्य मान 400 Bad Request लौटाएगा। संक्षिप्त कोड (en, cn, …) DS160.io के आंतरिक locale पहचानकर्ता हैं; BCP-47 कॉलम दिखाता है कि हम <html lang>, hreflang और Intl.* APIs में क्या भेजते हैं। API अनुरोधों में संक्षिप्त कोड का उपयोग करें; BCP-47 रूप जानकारी के लिए है।

कोडभाषामूल नामBCP-47
enEnglishEnglishen-US
ruRussianРусскийru-RU
roRomanianRomânăro-RO
esSpanishEspañoles-ES
cnChinese中文zh-CN
viVietnameseTiếng Việtvi-VN
hiHindiहिन्दीhi-IN
nlDutchNederlandsnl-NL

क्लाइंट लिंक को पासवर्ड की तरह मानें

url एक bearer क्रेडेंशियल है — जिसके पास भी वह है, वह समाप्ति तक फॉर्म भर सकता है, बिना दूसरे कारक के।

  • एक भरोसेमंद चैनल पर भेजें; जहाँ रिसाव हो सकता हो वहाँ पोस्ट न करें (सार्वजनिक चैट, खोज-इंडेक्स्ड पृष्ठ, साझा संग्रह)।
  • लॉग में ?token= को छिपाएँ। केवल jti claim को लॉग करना सुरक्षित है।
  • रिसाव के संदेह पर निरस्त करें — निरस्तीकरण तत्काल और स्थायी है।
  • expiresInDays एक संतुलन है: छोटा = कम रिसाव विंडो, बड़ा = पुनः जारी करने में कम बाधा।

6. फॉर्म सूचीबद्ध या प्राप्त करें

# All forms in the workspace
curl https://ds160.io/api/v1/workspaces/$DS160_WORKSPACE/forms \
  -H "Authorization: Bearer $DS160_KEY"

# A single form by id
curl https://ds160.io/api/v1/workspaces/$DS160_WORKSPACE/forms/$FORM_ID \
  -H "Authorization: Bearer $DS160_KEY"

ये पठन एंडपॉइंट forms:read scope (केवल पठन) या forms:write (जो पठन भी देता है) स्वीकार करते हैं।

पेजिनेशन

GET /v1/workspaces/:workspaceId/forms पेजिनेटेड है। परिणामों के बीच चलने के लिए ?limit= और ?cursor= क्वेरी पैरामीटर पास करें:

पैरामीटरअर्थ
limitइस पेज पर लौटाने वाले अधिकतम फॉर्म। डिफ़ॉल्ट 50, अधिकतम सीमा 200
cursorपिछले पेज के nextCursor से फॉर्म का id। पहले अनुरोध में छोड़ दें ताकि सबसे नए फॉर्म से शुरू हो।

हर प्रतिक्रिया में nextCursor फ़ील्ड होती है। जब और पेज नहीं होते, nextCursor null होती है। उदाहरण:

{
    "forms": [
        { "id": "65f2a911…", "name": "Smith / B1", "status": "in_progress", "workspaceId": "65f2a900…", "userId": "65f2a8f0…", "preferredConsulate": null, "createdAt": "2026-05-14T09:12:33.000Z", "archivedAt": null },
        { "id": "65f2a8a3…", "name": "Garcia / F1", "status": "completed", "workspaceId": "65f2a900…", "userId": "65f2a8f0…", "preferredConsulate": "MAD", "createdAt": "2026-05-13T18:01:09.000Z", "archivedAt": null }
    ],
    "nextCursor": "65f2a8a3…"
}

अगले अनुरोध में ?cursor=65f2a8a3…&limit=50 भेजकर आगे बढ़ें। फॉर्म id के अनुसार नवीनतम-पहले क्रमित होते हैं, इसलिए दो कॉल के बीच नए फॉर्म बनने पर भी cursor आपकी पढ़ने की स्थिति को स्थिर रखता है — आपको डुप्लिकेट नहीं दिखेंगे और आप उन फॉर्म से कुछ नहीं चूकेंगे जो पेजिनेशन शुरू करते समय मौजूद थे।

फॉर्म status मान

प्रत्येक फॉर्म मेटाडेटा प्रतिक्रिया में status फ़ील्ड इनमें से एक है:

मानकब लागू होता है
not_startedफॉर्म बनाया गया (API या डैशबोर्ड से) पर अभी कोई फ़ील्ड नहीं भरी गई।
in_progressकम से कम एक फ़ील्ड भरी गई है। अधिकांश फॉर्म अपने जीवनकाल का अधिकांश समय इसी स्थिति में बिताते हैं।
completedआवेदक ने इनटेक पूरा कर सबमिट कर दिया; एजेंसी अब DS-160 PDF डाउनलोड/जमा कर सकती है।
archivedफॉर्म डैशबोर्ड से संग्रहीत किया गया। डिफ़ॉल्ट लिस्ट परिणामों से बाहर — जब तक स्पष्ट रूप से संग्रहीत आइटम न माँगा जाए।

वायर फ़ॉर्मेट में अंडरस्कोर का उपयोग होता है (in_progress, न कि in-progress)। ऊपर दी गई स्ट्रिंग्स से सीधा मिलान हमेशा काम करेगा।

API के माध्यम से PII पहुँच

v1 फॉर्म मेटाडेटा एंडपॉइंट्स (GET /workspaces/:workspaceId/forms और GET /workspaces/:workspaceId/forms/:formId) केवल परिचालन मेटाडेटा लौटाते हैं: id, name, status, workspaceId, userId, preferredConsulate, createdAt, archivedAt। ये आवेदक के उत्तरों को उजागर नहीं करते/v1 के माध्यम से कोई भी नाम, जन्मतिथि, पासपोर्ट संख्या, यात्रा इतिहास या अन्य DS-160 फ़ील्ड उपलब्ध नहीं है।

पूर्ण DS-160 PDFs और संपूर्ण फ़ील्ड डेटा केवल डैशबोर्ड से, ऑडिट-लॉग्ड आवेदक स्वामी के तहत, सुलभ हैं। यदि आपके इंटीग्रेशन को आवेदक द्वारा दर्ज डेटा पढ़ना है, तो अपने स्वयं के क्लाइंट इनटेक प्रवाह के माध्यम से करें (आपका CRM पहले डेटा संग्रहित करता है, फिर आप DS160.io में डालते हैं) — कभी न मानें कि API वह डेटा लौटाएगा।

दर सीमा

प्रत्येक कुंजी प्रति मिनट 60 अनुरोधों तक सीमित है। प्रत्येक प्रतिक्रिया में निम्न होते हैं:

हेडरअर्थ
X-RateLimit-Limitअधिकतम (60)।
X-RateLimit-Remainingवर्तमान विंडो में शेष अनुरोध।
X-RateLimit-Resetजब विंडो रीसेट होगी, उसका Unix टाइमस्टैम्प।

सीमा पार होने पर API 429 Too Many Requests और Retry-After हेडर के साथ लौटाता है। यदि आपके इंटीग्रेशन को वैध रूप से उच्च सीमा चाहिए, सहायता से संपर्क करें — हम विशिष्ट कुंजियों के लिए सीमा बढ़ा सकते हैं।

आइडेम्पोटेंसी और पुनः प्रयास

v1 API Idempotency-Key हेडर का समर्थन नहीं करता। ठोस रूप में:

  • POST /forms और POST /forms/:formId/clone आइडेम्पोटेंट नहीं हैं और प्रत्येक कॉल पर एक फॉर्म क्रेडिट खर्च करते हैं। नेटवर्क टाइमआउट के बाद भोला पुनः प्रयास एक डुप्लिकेट फॉर्म बनाएगा और दूसरा क्रेडिट जला देगा।
  • POST /forms/:formId/client-links भी आइडेम्पोटेंट नहीं है पर क्रेडिट नहीं खर्च करता — पुनः प्रयास बस अपने jti और expiresAt वाला दूसरा लिंक बनाएगा।
  • सभी GET एंडपॉइंट्स को स्वतंत्र रूप से पुनः प्रयास करना सुरक्षित है।

create/clone के लिए अनुशंसित पुनः प्रयास पैटर्न: यदि POST /forms (या /clone) टाइम आउट हो या 5xx लौटाए, आँख मूँदकर पुनः प्रयास न करें। बजाय इसके, GET /workspaces/:workspaceId/forms कॉल करें (फॉर्म नवीनतम-पहले क्रमित हैं) और जाँचें कि क्या आपके द्वारा दिए गए name के साथ कोई फॉर्म पिछले कुछ सेकंडों में बना। यदि हाँ, मूल कॉल को सफल मानें और पुनः प्रयास छोड़ें। यदि नहीं, मूल लेखन निश्चित रूप से नहीं हुआ और पुनः प्रयास सुरक्षित है।

हम भविष्य के किसी छोटे रिलीज़ में Idempotency-Key समर्थन जोड़ सकते हैं; इंटीग्रेशन को इसकी योजना बनानी चाहिए पर आज इस पर निर्भर नहीं रहना चाहिए।

कुंजी निरस्त करना

यदि कुंजी का रिसाव हो जाए, सेवा-मुक्त हो जाए या केवल अनुपयोगी हो, तो कार्यक्षेत्र सेटिंग्स → API कुंजियाँ → निरस्त करें से निरस्त करें। निरस्तीकरण तत्काल प्रभावी होता है — अगला अनुरोध 401 Unauthorized लौटाएगा। निरस्त कुंजियाँ ऑडिट उद्देश्यों के लिए सूची में रहती हैं पर पुनः सक्रिय नहीं की जा सकतीं; यदि इंटीग्रेशन को चलाते रहना चाहें तो नई कुंजी बनाएँ।

सर्वोत्तम अभ्यास

  • प्रति इंटीग्रेशन एक कुंजी। किसी सिस्टम के विमुद्रीकरण पर सटीकता से निरस्त करना आसान, और डैशबोर्ड में Last used कॉलम बताता है कि कौन से इंटीग्रेशन अभी सक्रिय हैं।
  • न्यूनतम scope। जो कुंजी केवल क्लाइंट लिंक जनरेट करती है, उसे forms:clone नहीं चाहिए। छोटे scope का अर्थ है रिसाव होने पर छोटा प्रभाव क्षेत्र।
  • सीक्रेट को वॉल्ट में रखें। उन्हें कभी भी सोर्स कंट्रोल में commit न करें या फ्रंटएंड बंडल में न डालें — हर ब्राउज़र टैब उन्हें उजागर कर देगा।
  • अनुसूची पर रोटेट करें। नई कुंजी बनाएँ, इंटीग्रेशन स्विच करें, फिर पुरानी निरस्त करें। डैशबोर्ड दिखाता है कि कुंजी का अंतिम उपयोग कब हुआ, ताकि निरस्त करने से पहले स्विचओवर की पुष्टि की जा सके।

त्रुटियाँ

सभी ग़ैर-2xx प्रतिक्रियाएँ समान JSON संरचना साझा करती हैं:

{ "error": "मानव-पठनीय संदेश" }

error मान एक स्ट्रिंग है। schema सत्यापन से उत्पन्न 400 Bad Request के लिए, यह प्रत्येक उल्लंघन का वर्णन करता एक क्रमबद्ध JSON ऐरे है; अन्यथा, यह एक संक्षिप्त संदेश है जिसे आप सीधे दिखा या लॉग कर सकते हैं।

स्थितिकब होता हैउदाहरण बॉडी
400अनुरोध बॉडी या पथ पैरामीटर सत्यापन में विफल (आवश्यक फ़ील्ड अनुपस्थित, सीमा से बाहर मान, अज्ञात enum मान, आदि)।{ "error": "[{\"keyword\":\"required\",\"params\":{\"missingProperty\":\"expiresInDays\"}}]" }
401Authorization हेडर गायब, ख़राब Bearer टोकन, गुप्त कुंजी से मेल नहीं, या कुंजी निरस्त।{ "error": "Missing API key" }  ·  { "error": "Invalid API key" }  ·  { "error": "API key revoked" }
402वर्कस्पेस में फॉर्म क्रेडिट समाप्त। केवल create/clone। वर्कस्पेस को टॉप-अप करके पुनः प्रयास करें।{ "error": "Workspace has no remaining credits" }
403कुंजी के पास आवश्यक scope नहीं, या पथ का :workspaceId कुंजी के बंधे वर्कस्पेस से मेल नहीं खाता।{ "error": "Missing required scope: forms:write" }  ·  { "error": "API key does not match workspace" }
404फॉर्म नहीं मिला, या फॉर्म मौजूद है पर किसी और वर्कस्पेस में। (वर्कस्पेस के बीच अस्तित्व लीक न करने हेतु 403 के बजाय 404 लौटाया जाता है।){ "error": "Form not found" }
429प्रति-कुंजी दर सीमा पार (डिफ़ॉल्ट 60 अनुरोध/मिनट)। Retry-After मान (सेकंड में) तक प्रतीक्षा कर पुनः प्रयास करें।{ "error": "Rate limit exceeded" }
5xxअस्थायी सर्वर त्रुटि। GET को स्वतंत्र रूप से पुनः प्रयास सुरक्षित है; लेखन एंडपॉइंट्स के लिए आइडेम्पोटेंसी और पुनः प्रयास देखें।

एंड-टू-एंड उदाहरण

पूरा इनटेक प्रवाह — फॉर्म बनाएँ, क्लाइंट लिंक जनरेट करें, भेजें और पूर्णता की पोलिंग करें — curl से। वास्तविक इंटीग्रेशन अपने स्वयं के HTTP क्लाइंट का उपयोग करेंगे; आकार किसी भी भाषा में वही है।

# 0. क्रेडेंशियल (एक बार सेट करें)
export DS160_KEY="..."
export DS160_WORKSPACE="65f2a900..."

# 1. एक फॉर्म बनाएँ। प्रतिक्रिया से formId कैप्चर करें।
FORM_ID=$(curl -s -X POST \
  https://ds160.io/api/v1/workspaces/$DS160_WORKSPACE/forms \
  -H "Authorization: Bearer $DS160_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Smith / B1 — 2026-05" }' \
  | jq -r .formId)

# 2. 14 दिनों के लिए वैध क्लाइंट इनटेक लिंक जनरेट करें।
LINK_JSON=$(curl -s -X POST \
  https://ds160.io/api/v1/workspaces/$DS160_WORKSPACE/forms/$FORM_ID/client-links \
  -H "Authorization: Bearer $DS160_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "expiresInDays": 14, "defaultLanguage": "en" }')

CLIENT_URL=$(echo "$LINK_JSON" | jq -r .url)

# 3. $CLIENT_URL को अपने सामान्य चैनल (ईमेल, सुरक्षित पोर्टल, आदि)
#    से आवेदक को भेजें। आवेदक फॉर्म भरता है।

# 4. पूर्णता की पोलिंग। स्थिति परिवर्तन:
#    not_started → in_progress → completed
curl -s https://ds160.io/api/v1/workspaces/$DS160_WORKSPACE/forms/$FORM_ID \
  -H "Authorization: Bearer $DS160_KEY" \
  | jq .status
# → आवेदक पूरा करने पर "completed"

# 5. डैशबोर्ड से DS-160 PDF डाउनलोड करें
#    (इसके लिए आज कोई v1 एंडपॉइंट नहीं)।

रेसिपी पर कुछ टिप्पणियाँ:

  • पोलिंग अंतराल: प्रत्येक 5–15 मिनट पर्याप्त है। 60 अनुरोध/मिनट की सीमा पर एक कुंजी आराम से हजारों चल रहे फॉर्म पोल कर सकती है।
  • वेबहुक अभी उपलब्ध नहीं हैं। यदि पूर्णता पर पुश सूचनाएँ चाहिए, इस पृष्ठ पर नज़र रखें या सहायता से संपर्क करें — यह रोडमैप पर है।
  • चरण 5 (पूर्ण किए गए PDF का डाउनलोड) आज डैशबोर्ड सत्र की आवश्यकता रखता है। v1 API जानबूझकर आवेदक उत्तर उजागर नहीं करता — देखें API के माध्यम से PII पहुँच

संस्करण और सहायता

स्थिरता. /v1 स्थिर API सतह है। हम /v1 के भीतर नए वैकल्पिक फ़ील्ड, नए एंडपॉइंट और नए enum मान जोड़ते हैं बिना मेजर वर्ज़न बढ़ाए, परन्तु हम किसी मौजूदा फ़ील्ड का नाम नहीं बदलते, हटाते नहीं, और न ही उसका प्रकार बदलते। यदि कभी ब्रेकिंग बदलाव की आवश्यकता हुई, वह /v2 के तहत आएगा और /v1 कम से कम 12 महीनों तक उसके साथ काम करता रहेगा।

पीछे-संगत परिवर्तन जिनकी आपको योजना बनानी चाहिए:

  • समय के साथ नए वैकल्पिक अनुरोध फ़ील्ड प्रकट होंगे। मौजूदा अनुरोध जो उन्हें नहीं भेजते, काम करते रहेंगे।
  • प्रतिक्रियाओं में नए फ़ील्ड जोड़े जा सकते हैं। अज्ञात फ़ील्ड को नज़रअंदाज़ करने योग्य मानें — किसी भविष्य के फ़ील्ड के प्रकट होने पर विफल न हों।
  • status, defaultLanguage और disabledSections के लिए नए enum मान जोड़े जाएँगे। अज्ञात मानों पर क्रैश न करें; लॉग करें और जारी रखें।

सहायता:

  • उच्च दर सीमाएँ, कस्टम डोमेन, वेबहुक प्रारंभिक पहुँच और इंटीग्रेशन प्रश्न: अपने अकाउंट मैनेजर से या support@ds160.io पर संपर्क करें।
  • v1 API के बग रिपोर्ट: वही पता। प्रत्येक प्रतिक्रिया x-request-id हेडर ले जाती है — अपनी रिपोर्ट में उसे शामिल करें ताकि हम लॉग में सटीक कॉल ढूँढ सकें।