- भाग 1, अवधारणा। पहले इसे पढ़ें। v3 एक पुनर्रचना है, केवल नाम-परिवर्तन नहीं: यदि आप पुराने एंडपॉइंट्स को एक-के-एक मैप करेंगे, तो आप API से लड़ते रहेंगे। यहाँ बिताए दस मिनट बाद में कई दिन बचाएँगे।
- भाग 2, API। एंडपॉइंट-दर-एंडपॉइंट मैपिंग, अनुरोध उदाहरण, स्टेट मशीनें, और एक माइग्रेशन चेकलिस्ट।
api.deprecation webhook इवेंट की सदस्यता लें।
विषय-सूची। भाग 1: 1.1 v3 क्यों अस्तित्व में है, 1.2 ऑब्जेक्ट मॉडल, 1.3 प्रति-capability तत्परता, 1.4 task लूप, 1.5 पैसे की गति, 1.6 स्टेट मशीनें, 1.7 सम्मेलन, 1.8 सुनहरा पथ। भाग 2: 2.1 customers, 2.2 capabilities, 2.3 tasks और submissions, 2.4 accounts, 2.5 recipients और destinations, 2.6 quotes और transfers, 2.7 webhooks, 2.8 sandbox, 2.9 विरासती एंडपॉइंट्स, 2.10 माइग्रेशन क्रम, 2.11 सावधानी चेकलिस्ट।
भाग 1, अवधारणा
1.1 v3 क्यों अस्तित्व में है
v1 और v2 में customer को भुगतान-तैयार करने के चार परस्पर-अतिव्यापी तरीके विकसित हुए:/rails, /banks, /accounts/applications, और business rail-applications सतह, प्रत्येक का अपना स्थिति-शब्दकोश। दस्तावेज़ संग्रह (/documents, KYC आयात, verification SDK टोकन) उस चीज़ से डिस्कनेक्टेड था जिसे यह वास्तव में अनब्लॉक करता था। v3 इस सबको छह संसाधनों में समेट देता है, यानी customer और उसके स्वामित्व वाली पाँच चीज़ें:
1.2 ऑब्जेक्ट मॉडल
आत्मसात करने के लिए दो संरचनात्मक नियम:- Capabilities सब कुछ नियंत्रित करती हैं। Accounts का प्रावधान
readycapability के अंतर्गत होता है; quotes का मूल्य capability के विरुद्ध निर्धारित होता है। ऑनबोर्डिंग का अर्थ है आवश्यक capabilities कोreadyतक लाना। - Tasks कहीं भी संलग्न हो सकते हैं। एक capability, एक account, या एक चालू transfer
openTaskIdsवहन कर सकते हैं। जहाँ भी आप उन्हें देखें, लूप वही है: task पढ़ें, उत्तर सबमिट करें, समीक्षा की प्रतीक्षा करें, मूल संसाधन को पुनः पढ़ें।
1.3 तत्परता प्रति-capability है, प्रति-customer नहीं
v1 ने/rails तत्परता को customer-व्यापी KYC द्वार से उलझा रखा था। v3 में कोई customer स्थिति नहीं है: एक customer stablecoin_transfers पर पूरी तरह उपयोग-योग्य हो सकता है जबकि उनकी sepa capability में अभी भी खुले tasks हों। Pooled-account capabilities आम तौर पर named वाली से तेज़ी से ready तक पहुँचती हैं, इसलिए जो ready है उसी पर लेन-देन शुरू करें बजाय इसके कि सबके तैयार होने की प्रतीक्षा करें।
यदि आपका v1 या v2 कोड customer verification स्थिति के आधार पर UI badges चलाता है, तो उसे फिर से लिखें:
- “क्या वे X पर लेन-देन कर सकते हैं?” बन जाता है capability X
status == "ready"। - “क्या उन्हें कुछ करने की आवश्यकता है?” बन जाता है कोई भी task जिसकी स्थिति
action_requiredहो (capability आम तौर परrestrictedदिखेगा,statusReason.resolution: "complete_tasks"के साथ)। - “क्या हम Swipelux की प्रतीक्षा कर रहे हैं?” बन जाता है tasks
in_review, capabilitypending।
1.4 Task लूप
पुरानी दस्तावेज़ और KYC सतह जो कुछ भी करती थी, वह अब यही एक लूप है: मुख्य विशेषताएँ:- एक task में
requirements[]होते हैं, यानी अलग-अलग माँगें। प्रत्येक में एक task-भीतरrequirementId, माँग को नामित करने वाली एक स्थिरkey(उदाहरण के लिए पते का प्रमाण, अपने UI में इसी के अनुसार duplicate हटाएँ), और एक टाइप्डrequestहोता है जो ठीक-ठाक बताता है कि कौन-सा इनपुट अपेक्षित है (text, date, select, document, attestation, आदि)। - सबमिट करना समीक्षा-नियंत्रित है: यह कभी भी सीधे capability या account स्थिति नहीं बदलता, स्वीकृति बदलती है। एक अपवाद:
profileउत्तर सबमिट पर customer profile में सीधे लिखे जाते हैं (2.3)। सबमिट करने के बाद, task या मूल संसाधन को पोल करें। taskRevision(task केrevisionकी प्रतिध्वनि) एक समवर्ती-रक्षक है: यदि आपके पढ़ने के बाद task बदल गया, तो पुनः पढ़ें और अपने उत्तर फिर से तैयार करें।absenceएक प्रथम-श्रेणी उत्तर है (“मेरे पास यह इसलिए नहीं है क्योंकि…”)। इसे उपयोग करें, requirements को अधूरा छोड़ने के बजाय।
1.5 पैसे की गति
payins, payouts, और stablecoin स्थानांतरण के लिए एक ही प्रवाह। कोई direction इनपुट नहीं है, आप कभी payin बनाम payout घोषित नहीं करते। इन और आउट मुद्रा का आकार quote और transfer पर एक केवल-पढ़ाdirection निर्धारित करता है: fiat_to_stablecoin (payin), stablecoin_to_fiat (payout), या stablecoin_move।
1.6 प्रति संसाधन एक स्टेट मशीन
प्रत्येक status-धारी संसाधन का अपना enum होता है, और प्रत्येक गैर-सुखद स्थिति एक संरचित कारण वहन करती है। Accounts, applications, और transfers एक आकार साझा करते हैं{ code, message, actor, retryable }: accounts और applications इसे statusReason के रूप में उजागर करते हैं, transfers इसे stateDetail के रूप में। actor बताता है कि किसे कार्रवाई करनी है (customer, developer, provider, network, swipelux), retryable बताता है कि क्या पुनः प्रयास मदद कर सकता है। Capabilities { code, resolution, message } का उपयोग करती हैं, जहाँ resolution (complete_tasks, wait, contact_support, none) बताता है कि capability को क्या आगे बढ़ाता है। code मान एक खुली, केवल-जोड़ी जाने वाली सूची हैं: resolution (या actor प्लस retryable) पर शाखा बनाएँ, और उन कोड्स को सहन करें जिन्हें आपने कभी नहीं देखा।
जिन स्थितियों से यह मार्गदर्शिका नहीं गुज़रती (
rejected, suspended, disabled, failed, canceled) वे टर्मिनल या सहायता-प्रेरित हैं; प्रति-संसाधन परिभाषाएँ विनिर्देश में हैं।
Transfer, विस्तार से:
1.7 सम्मेलन
कोड लिखने से पहले आत्मसात करने योग्य idempotency नियम:
- अलग body के साथ किसी कुंजी को पुनः उपयोग करना
409 idempotency_conflictहै, जब तक कुंजी बनी रहती है (कम से कम 7 दिन), इसलिए कभी भी कुंजी को पुनः उपयोग की योजना न बनाएँ। प्रत्येक तार्किक ऑपरेशन के लिए एक ताज़ा UUID उत्पन्न करें और उसे अपने job के साथ बनाए रखें। - Replay त्रुटियों को भी शामिल करता है: यदि मूल अनुरोध किसी टर्मिनल 4xx में समाप्त हुआ, तो वही कुंजी प्लस body फिर से वही problem प्रतिक्रिया लौटाएगी।
- समान कुंजी वाले दो समवर्ती अनुरोध: एक जीतता है, दूसरे को
409मिलता है। हारने वाले को विजेता के निपटान के बाद पुनः प्रयास करें; replay मूल प्रतिक्रिया लौटाएगा।
1.8 सुनहरा पथ
भाग 2, API
2.1 Customers
निर्माण,
type पर भिन्न (दृष्टांतीय मान, फ़ील्ड नाम विनिर्देश के अनुसार):
- निर्माण प्रगतिशील है: केवल
{ "type": "individual" }एक वैध निर्माण है। छूटे हुए तथ्य कभी customer को अमान्य नहीं करते, वे बाद में उन capabilities पर intake tasks के रूप में सामने आते हैं जिन्हें उनकी ज़रूरत है। - Businesses
businessप्लस पंजीकरण डेटा वहन करते हैं। v1 का shareholder CRUD related parties पर मैप होता है, जिसे directors, officers, और owners को कवर करने के लिए विस्तृत किया गया है: customer निर्माण पर उन्हें इनलाइन बनाएँ (प्रत्येक को एक स्थिरrp_id मिलती है) या समर्पित related-parties एंडपॉइंट्स के माध्यम से प्रबंधित करें। - कोई customer
statusफ़ील्ड नहीं, 1.3 देखें। - मौजूदा customers चलते हैं: v1 या v2 पर बनाए गए customers v3 एंडपॉइंट्स पर उसी id से पहुँच योग्य हैं। v3 read एक साफ़ किया गया दृश्य है, वे विरासती मान जो v3 सत्यापन में विफल होते हैं अनुपस्थित लौटते हैं। आपके पहले v3 write के बाद वह दृश्य स्थायी हो जाता है: अनुपस्थित मान अपने आप वापस नहीं आते। इसलिए जल्दी संवर्धित करें, एक बार का पास बजट करें जो v3 reads पर निर्भर होने से पहले आपके अपने रिकॉर्ड से पूरा profile
PATCHकरता है। v1metadataएक अलग namespace है और नहीं ले जाया जाता, इसे v3 पर पुनः-सेट करें। externalIdप्रथम-श्रेणी है और v3 पर, प्रति पर्यावरण, आपके customers में अद्वितीय (409 duplicate_external_id)। किसी customer को archive करना उसकीexternalIdजारी नहीं करता, यदि आप उसे पुनः उपयोग करना चाहते हैं तो DELETE से पहले PATCH द्वारा उसे साफ़ करें।DELETEएक archive cascade है (कोई restore नहीं; ids कभी पुनः उपयोग नहीं होतीं)। यह409 customer_has_active_resourcesप्लसblockingResources[]के साथ अवरुद्ध होता है जब कोई गैर-archived account या चालू transfer मौजूद हो।- PATCH विलय नियम: स्पष्ट
nullएक nullable फ़ील्ड को साफ़ करता है, arrays पूरी तरह प्रतिस्थापित होते हैं (inline related parties को छोड़कर, जो id द्वारा upsert होती हैं),metadataकुंजियाँ मर्ज होती हैं। पूर्ण schema और सूची फ़िल्टर OpenAPI विनिर्देश में हैं।
2.2 /rails, /banks, applications Capabilities बनते हैं
- एक capability बराबर है
method(ach,wire,rtp,pix,sepa,swift,spei,pse,transfers_3_0,faster_payments,sepa_instant,uaefts,card,stablecoin_transfers, आदि) प्लसaccountType(pooledयाnamed, गैर-बैंक विधियों के लिएnull) प्लसdirections(payinयाpayout)। सार्वजनिकcapabilityIdयोग्य युग्म है (sepa_pooled,ach_named) याcardऔरstablecoin_transfersके लिए केवल method। - प्रत्येक capability अनुरोध एक application जन्मित करता है, यानी
.../capabilities/{capabilityId}/applicationsके तहत प्रति-प्रयास रिकॉर्ड (साथ ही/{applicationId}/history), अपनी स्थितियों (1.6) औरstatusReasonके साथ। यह एक अनुरोध का ऑडिट-ट्रेल है; रोज़मर्रा में, capability को ही पोल करें। capabilities/supportedउपलब्धता (available,beta, याdisabled), पात्रता, और प्रस्तावित संस्थान लौटाता है। बैंक चयन अनुरोध के समय वैकल्पिकinstitutionsarray के माध्यम से होता है, कोई अलग/banksसंसाधन नहीं। इसे छोड़ना (या[]भेजना) प्रत्येक डिफ़ॉल्ट संस्थान का चयन करता है;isDefault: trueएक customer-और-capability-विशिष्ट ध्वज है, वैश्विक नहीं। एक गैर-रिक्त सूची डिफ़ॉल्ट को ओवरराइड करती है, और बिना किसी लागू डिफ़ॉल्ट के एक बैंक-समर्थित capability422 capability_institutions_requiredलौटाती है। संस्थान ids अपारदर्शी हैं, नई को सहन करें।stablecoin_transferscustomer निर्माण पर स्वतः-प्रदान किया जाता है औरreadyजन्मता है (इसलिए इसका कभी अनुरोध नहीं किया जाता और यह रद्द नहीं होता)।cardकेवल-individual है।- capability पर
openTaskIdsआपका “अब क्या करूँ” संकेतक है। खुला बराबरaction_requiredयाin_reviewहै, और रोलअप में सक्रिय निर्भरताओं के माध्यम से पहुँचे साझा customer-स्तर के tasks शामिल हैं। cancelकेवलpendingयाrestrictedसे काम करता है और बिना किसी अवरोधक संसाधन के, अन्यथा409 capability_not_cancelable, जिसका problem bodyblockingResourcesसूचीबद्ध करता है। रद्द करने के बाद पुनः-अनुरोध एक ताज़ा निर्माण है नई idempotency कुंजी के साथ।- GET को पोल करें। capability स्थिति तब ताज़ा होती है जब आप उसे पढ़ते हैं;
GET .../capabilities/{capabilityId}को पोल करें याcapability.status_changedकी सदस्यता लें, कैश न करें। - एक method का अनुरोध संबंधित methods को एक साथ उपलब्ध कर सकता है, capabilities को उस सेट के रूप में मानें जिसे आप पुनः पढ़ते हैं, न कि एक पंक्ति जिसे आप ट्रैक करते हैं।
- अनुरोध करने से पहले ऑनबोर्डिंग माँगें दिखाने के लिए
tasks-previewका उपयोग करें। - Verification एक-बार नहीं है: पहले से
readycapability पर नए tasks दिखाई दे सकते हैं (आवधिक या इवेंट-प्रेरित पुनः-verification)। पूरे customer जीवनकाल के लिए task लूप को जोड़े रखें, केवल ऑनबोर्डिंग के लिए नहीं।
2.3 Documents और KYC, Tasks और Submissions बनते हैं
नामकरण नोट। ये एंडपॉइंट्स संक्षेप में
requirements और fulfillments के रूप में शिप किए गए थे। 2026-08-02 से सार्वजनिक नाम tasks और submissions हैं। नाम परिवर्तन ने केवल संसाधनों और एंडपॉइंट पथों को कवर किया, task के भीतर requirements[] array और उसकी requirementId अपने नाम रखती हैं।GET /v3/customers/{customerId}/tasks पढ़ें, POST .../tasks/{taskId}/submissions से उत्तर दें।
उस लूप के आसपास:
- कच्चा फ़ाइल भंडारण:
POST/GET/DELETE /v3/customers/{customerId}/documents(साथ ही/{documentId}), अपनी API key के साथ एक बार अपलोड करें, फिर submission उत्तरों में document ids का संदर्भ दें। यह हर upload-token और direct-upload intake को प्रतिस्थापित करता है। - बिल्कुल नए reads:
GET /v3/tasks(merchant-व्यापी inbox),GET /v3/transfers/{transferId}/tasks,GET .../tasks/{taskId}/history,GET .../tasks/{taskId}/submissions(साथ ही/{submissionId})।
- उत्तर प्रकार:
profile,text,date,single_select,multi_select,boolean,attestation,document,resource_reference,absence। प्रत्येक requirement काrequestऑब्जेक्ट आपको बताता है कि वह किस प्रकार की अपेक्षा करता है। - एक submission को वर्तमान दौर के प्रत्येक कार्रवाई-योग्य requirement का उत्तर देना चाहिए, उसी सटीक
taskRevisionके साथ जिसे आपने पढ़ा। आंशिक submissions अस्वीकृत होते हैं। profileउत्तर सीधे लिखते हैं: वे सामान्य सत्यापन पथ के माध्यम से customer profile को अपडेट करते हैं और उसी intake कार्य को संदर्भित करने वाली प्रत्येक capability का तुरंत पुनः-मूल्यांकन करते हैं। सहोदर intake tasks जिनके सारे requirements संतुष्ट हैं, स्वतः बंद हो जाते हैं।- Requirements वैकल्पिक समूह बना सकते हैं (
alternativeKey): समूह में से ठीक एक सबमिट करें। changes_requestedremediationRoundको बढ़ाता है औरreviewFeedbackवहन करता है। task पुनः पढ़ें, एक ताज़ा idempotency कुंजी के साथ फिर से सबमिट करें।- होस्टेड verification URLs केवल customer-scoped task विवरण (
GET /v3/customers/{customerId}/tasks/{taskId}) पर और केवल तब जब session कार्रवाई-योग्य हो प्रकट होते हैं; सूचियाँ औरGET /v3/tasks/{taskId}जानबूझकर URL-मुक्त हैं। - सेवा की शर्तें भी एक task है:
openTaskIdsमेंcategory: "terms_of_service"का एक task शामिल हो सकता है जिसका होस्टेड स्वीकृति पृष्ठ उसी तरह लिंक किया जाता है (केवल customer-scoped विवरण)। सामान्य submissions शर्तें स्वीकार नहीं कर सकते, और KYC अनुमोदन कभी शर्तें स्वीकार नहीं करता। - Tasks प्रति capability scoped हैं, इसलिए “समान” माँग (उदाहरण के लिए पते का प्रमाण) प्रति capability एक बार दिखाई दे सकती है। अपने UI में requirement
keyद्वारा duplicate हटाएँ। - कोई अनुवाद परत नहीं:
/v1/documentsपर पोस्ट करना v3 capabilities को अनब्लॉक नहीं करेगा। एक बार customer v3 पर आ जाए, सभी माँगें tasks के माध्यम से चलाएँ।
2.4 Accounts और wallets
निर्माण,
origin प्लस type पर भिन्न। Issued bank accounts एकल method लेते हैं; external bank accounts इसके बजाय एक methods array लेते हैं (वहाँ method भेजना अस्वीकृत होता है):
- issued bank accounts पर
countryवैकल्पिक है (प्रति method डिफ़ॉल्ट); external bank accounts पर इसे स्पष्ट रूप से प्रदान करें। Wallet accounts पर कोई देश बिल्कुल नहीं होता। - issued bank accounts पर
settlement.accountIdआवश्यक है: यह उस issued wallet account को नामित करता है जो bank account में जमा से निपटाए गए fund प्राप्त करता है। - Issued accounts
details(IBAN या routing प्लस account या address), संस्करणितrouting(जमा coordinates घुमा सकते हैं, हमेशा नवीनतम read प्रस्तुत करें),fees,balancesउजागर करते हैं। - नेटवर्क:
polygon,ethereum,base,arbitrum,optimism,bsc,avalanche। - capability द्वार केवल issued accounts पर लागू होता है: गैर-ready capability के विरुद्ध एक बनाना capability-कोड त्रुटि के साथ विफल होगा, पहले capability का अनुरोध करें (2.2)। External accounts को न capability चाहिए (न customer अनुमोदन); उन्हें केवल request-schema और bank-detail सत्यापन मिलता है।
- Issued bank accounts
provisioningजन्मते हैंdetails: nullके साथ। account को पोल करें याaccount.status_changedदेखें जब तकreadyन हो। DELETEarchive करता है, कभी हार्ड-डिलीट नहीं। चालू transfers द्वारा संदर्भित accounts409 account_has_active_transfersलौटाते हैं। उन transfers के टर्मिनल स्थिति तक पहुँचने के बाद पुनः प्रयास करें।- v3 में बिल्कुल-नया: Rules, एक issued wallet account पर स्थायी निर्देश (
POST/GET /v3/customers/{customerId}/rules,GET/PATCH/DELETE .../rules/{ruleId}) जो आने वाले fund को स्वचालित रूप से किसी अन्य account या wallet destination में स्वीप करते हैं। कोई v1 या v2 समकक्ष नहीं।
2.5 Recipients और destinations
v2 में कोई recipient अवधारणा नहीं थी। यदि आप v2 पर हैं और तीसरे पक्षों को payout करते हैं, यह नई सतह है, नाम-परिवर्तन नहीं।
- Recipient बराबर कौन:
individual(पहला और अंतिम नाम) याbusiness(कंपनी नाम), आवश्यकrelationshipके साथ (employee,contractor,vendor,subsidiary,merchant,customer,landlord,family,other)। Recipients और destinations केवल तीसरे पक्षों के लिए हैं। एक first-party payout में recipient का बिल्कुल उपयोग नहीं होता: customer के अपनेacc_accounts में से किसी एक को quotedestinationIdके रूप में लक्षित करें (2.6)। - Destination बराबर कहाँ: प्रति method टाइप्ड,
sepa(iban, bic वैकल्पिक),achयाwire(routing प्लस account),swift(पूर्ण coordinates प्लस वैकल्पिक intermediary),spei(clabe),pse,transfers_3_0(cbu), आदि, प्लस wallet destinations। प्रत्येक destination की अपनी स्थिति होती है।destination.status_changedदेखें। - Fiat destinations को निर्माण से पहले recipient का पूरा
address(street, city, postal code, country) चाहिए। छूटे हुए भाग422 recipient_address_requiredके साथ विफल होते हैं। Wallet destinations address छोड़ते हैं लेकिन top-levelownership(self_custodied, या custodian नाम के साथcustodial) की आवश्यकता होती है। - लाभार्थी-नाम सटीकता महत्वपूर्ण है: प्राप्तकर्ता बैंक account के कानूनी नाम से मिलान करते हैं। सटीक कानूनी पहला और अंतिम नाम या कंपनी नाम भेजें, प्रदर्शन उपनाम नहीं।
- प्रति-method destination फ़ील्ड schemas OpenAPI विनिर्देश में हैं।
2.6 Quotes और transfers
destinationIdएकacc_(customer-स्वामित्व account) याdst_(recipient destination) id लेता है। Fiat-funded quotes (payins) कोacc_account लक्षित करना चाहिए, एकdst_लक्ष्य हमेशा payout का अर्थ है (अन्यथा422 quote_direction_invalid)।- quotes और transfers पर
externalIdएक गैर-अद्वितीय सहसंबंध संदर्भ है (reads पर प्रतिध्वनित, सूचियों पर filterable)। प्रति-पर्यावरण विशिष्टता नियम (2.1) केवल customerexternalIdपर लागू होता है। - एक quote ठीक एक बार निष्पादित करें,
expiresAtसे पहले। एक expired quote409 quote_expiredके साथ विफल होता है, दूसरा निष्पादन409 quote_already_executedके साथ (problem मौजूदाtransferIdवहन करता है)। - Transfer रद्दीकरण अभी समर्थित नहीं है:
POST .../cancelहर स्थिति में409 transfer_not_cancelableलौटाता है। आज केcanceledtransfers एक बिना-funded payin पर funding window समाप्त होने से आते हैं, इस एंडपॉइंट से नहीं। - Payins
awaiting_fundsसे शुरू होते हैं: भुगतानकर्ता कोGET .../instructionsप्रस्तुत करें, यानी fiat के लिए bank coordinates प्लस reference या memo code, या crypto के लिए deposit address। Reference code यही है जिससे जमा का मिलान होता है। हमेशा प्रदर्शित करें। - मशीन-पठनीय substates के लिए
stateप्लसstateDetail;action_requiredका अर्थ है कि एक अनुपालन task संलग्न है (openTaskIds,GET .../tasks), submissions के माध्यम से उत्तर दें। - Issued accounts पर पहचाने गए inbound जमा
origin: "inbound_deposit"वाले transfers के रूप में प्रकट होते हैं ("quoted"के विपरीत)। - भुगतान-नेटवर्क संदर्भ
referencesके तहत समेकित:transactionHash,traceNumber,imad,uetr,explorerUrl,returnedTransferId।
दो माइग्रेशन चेतावनियाँ:
- Transfers संस्करण पार नहीं करते। v1 या v2 पर बनाए गए transfers v3 से पठनीय नहीं हैं। सूची उन्हें छोड़ती है और
GET /v3/transfers/{transferId}404 देता है। पहले निर्माण को स्थानांतरित करें, v1 read पथ बनाए रखें जब तक वे transfers टर्मिनल स्थिति तक न पहुँचें, फिर हटा दें। - कोई token swaps नहीं।
stablecoin_moveको समान in और out currency आवश्यक है: USDC से USDT422 recipient_destination_invalidके साथ विफल होता है,currency_mismatchफ़ील्ड त्रुटि वहन करते हुए। दोनों तरफ समान नेटवर्क, कोई bridging नहीं, और wallet-to-wallet moves वर्तमान में केवल zero-fee delivery का समर्थन करते हैं: एक quote जिसका platform या developer fee गैर-शून्य है422 amount_not_deliverableके साथ विफल होता है।
2.7 Webhooks
इवेंट कैटलॉग:
customer.created, customer.updated, customer.archived, capability.created, capability.status_changed, application.status_changed, recipient.status_changed, destination.status_changed, account.created, account.status_changed, account.details_changed, transfer.created, transfer.state_changed, api.deprecation।
GET /v3/webhooks/portaldelivery logs, retries, और manual replay के लिए एक होस्टेड प्रबंधन-पोर्टल URL लौटाता है।transfer.createdवर्तमान में विरासती v1 payload आकार के साथ डिलीवर होता है (v3 envelope तब सक्रिय होगा जब v1 webhooks सूर्यास्त होंगे)। इसे विशुद्ध रूप से संकेत के रूप में मानें और transfer को GET करें; इसके body के विरुद्ध निर्माण न करें।- इवेंट्स संकेत हैं: प्राप्ति पर, संसाधन को GET करें और read पर कार्रवाई करें। कभी भी इवेंट payload या क्रम से स्थिति न बनाएँ। डिलीवरी at-least-once है और विलंबित या पुनः-क्रमित हो सकती है। इवेंट id द्वारा duplicate हटाएँ, और छूटे इवेंट्स को प्रत्येक सूची के समावेशी
updatedAfterफ़िल्टर से पुनः प्राप्त करें। api.deprecationकी सदस्यता लें, यह संस्करण सूर्यास्त का मशीन चैनल है।- आज कोई
task.*इवेंट नहीं: सबमिट करने के बाद, task या उसके मूल को पोल करें।
2.8 Sandbox
वही base URL; sandbox API key पर्यावरण चुनती है।
v3 sandbox समीक्षा लूप का पूरा अनुकरण करता है: एक task बनाएँ, उसके विरुद्ध सबमिट करें,
accepted या rejected पर review करें, capability को अनब्लॉक होते देखें। उत्पादन से पहले अपने उपचार UX का अभ्यास करें। Sandbox-निर्मित tasks और अनुरोधित capabilities पर प्रकट होने वाले नियमित intake tasks दोनों इस तरह समीक्षा-योग्य हैं; उत्पादन की तरह, कोई task webhooks नहीं आते, पोल करें (2.7)।
2.9 v3 प्रतिस्थापन के बिना विरासती एंडपॉइंट्स
इनका कोई v3 प्रतिस्थापन नहीं है। अधिकांश v1 पर अपरिवर्तित रहते हैं (अपने मौजूदा कॉल रखें); दो सीधे सेवानिवृत्त हैं (निपटान देखें):
अन्य सभी सार्वजनिक v1 या v2 एंडपॉइंट ऊपर के मैपिंग तालिकाओं में प्रकट होते हैं।
2.10 सुझाया गया माइग्रेशन क्रम
प्रत्येक चरण स्वतंत्र रूप से शिप होता है; v1 या v2 और v3 समान customer आधार के विरुद्ध साथ-साथ चलते हैं। उत्पादन में दोहराने से पहले प्रत्येक चरण को अपनी sandbox key (2.8) के विरुद्ध अभ्यास करें।1
Plumbing
सभी प्रभावकारी अनुरोधों (POST, PATCH, PUT, DELETE; sandbox एंडपॉइंट्स को छोड़कर) पर
Idempotency-Key; पैसा स्ट्रिंग्स के रूप में; cursor pagination सहायक।2
Webhooks
प्रति इवेंट v3 एंडपॉइंट पंजीकृत करें,
api.deprecation सहित। v1 का एकल-एंडपॉइंट कॉन्फ़िगरेशन एक अलग सतह है, इसे यथावत छोड़ें; दोनों चरण 9 के drain तक साथ-साथ चलेंगे।3
Profile enrichment
अपने पास मौजूद पूरे profile के साथ
PATCH /v3/customers/{id} (v1 ने v3 द्वारा उजागर की गई मात्रा से कम एकत्र किया) और metadata पुनः-सेट करें। इसे प्रति customer जानबूझकर पहला v3 write बनाएँ: यह उस साफ़ किए गए दृश्य को भरता है इससे पहले कि वह दृश्य स्थायी हो जाए (2.1)।4
Reads
customer, capability, और account reads को v3 पर इंगित करें; 1.3 के अनुसार customer-status तर्क को फिर से लिखें। केवल चरण 3 के बाद, बिना-संवर्धित reads विरासती-अमान्य फ़ील्ड्स के बिना वापस आते हैं।
5
Onboarding writes
POST /v3/customers के माध्यम से बनाएँ; /rails, /banks, या applications के बजाय capabilities का अनुरोध करें; task लूप बनाएँ (सबसे बड़ा बिल्कुल-नया UI कार्य, tasks-preview माँगें अग्रिम दिखाने में मदद करता है)। इस बिंदु से, v3-प्रेरित customers के लिए /v1/documents पर पोस्ट करना बंद करें, वे capabilities को अनब्लॉक नहीं करते (2.3)।6
Accounts
v3 के माध्यम से issue करें; imports को
origin: external में स्थानांतरित करें।7
Payouts
Recipients प्लस destinations, फिर quote और transfer।
8
Payins
Quote, transfer, instructions; reference code प्रस्तुत करना जारी रखें।
9
Drain
Transfers संस्करण पार नहीं करते (2.6)। वहाँ बनाए गए transfers के लिए v1 या v2 read पथ और v1 webhook एंडपॉइंट बनाए रखें, टर्मिनल स्थिति तक पहुँचने तक dual-read करें, फिर पुराने client और v1 webhook कॉन्फ़िगरेशन को हटा दें।
2.11 सावधानी चेकलिस्ट
- प्रति तार्किक ऑपरेशन ताज़ा UUID, अपने job के साथ बनाए रखा जाए और पुनः प्रयास पर पुनः उपयोग किया जाए; कभी बदले हुए body के साथ किसी कुंजी का पुनः उपयोग न करें (
409 idempotency_conflict)। Sandbox एंडपॉइंट्स हेडर से छूट प्राप्त हैं। - मौजूदा customers को संवर्धित करें (पूरा profile
PATCHकरें,metadataपुनः-सेट करें, यह नहीं ले जाया जाता) किसी भी अन्य v3 write से पहले, पहला v3 write साफ़ किए गए दृश्य को स्थायी बनाता है। -
externalIdप्रति पर्यावरण अद्वितीय है और archive द्वारा जारी नहीं होती, यदि आप इसे पुनः उपयोग करने की योजना बनाते हैं तोDELETEसे पहलेPATCHद्वारा साफ़ करें। - कोई customer
statusफ़ील्ड नहीं है, प्रति capability तत्परता निकालें। -
action_requiredऔरin_reviewदोनों का अर्थ एक खुला task है। - Submissions समीक्षा-नियंत्रित हैं (सबमिट करना अनब्लॉक करने के समान नहीं है) और सटीक
taskRevisionके साथ प्रत्येक कार्रवाई-योग्य requirement का उत्तर देना चाहिए। बेमेल होने पर, पुनः पढ़ें और फिर से तैयार करें। - कोई
task.*webhook नहीं है, प्रत्येक सबमिट के बाद task (या इसके मूल) को पोल करें। -
changes_requestedपुनः प्रयास बराबर है task को पुनः पढ़ना, ताज़ा उत्तर, ताज़ी idempotency कुंजी। -
/v1/documentsपर पोस्ट करना कभी v3 capability को अनब्लॉक नहीं करेगा, एक बार customer tasks पर आ जाए, सभी माँगों को tasks के माध्यम से चलाएँ। - पहले से
readycapability पर नए tasks दिखाई दे सकते हैं, ऑनबोर्डिंग के बाद भी task लूप जोड़े रखें, केवल इसके दौरान नहीं। - Capability
cancelकेवलpendingयाrestrictedसे बिना अवरोधक संसाधनों के काम करता है (409 capability_not_cancelable); रद्द करने के बाद पुनः-अनुरोध एक ताज़ा idempotency कुंजी के साथ ताज़ा निर्माण है। - Accounts को इसके तहत issue करने या इसके विरुद्ध quote करने से पहले Capability को
readyहोना चाहिए। - Quote में ठीक एक तरफ राशि हो; कोई direction फ़ील्ड नहीं;
expiresAtसे पहले ठीक एक बार निष्पादित करें (409 quote_expiredया409 quote_already_executed)। - Stablecoin moves केवल समान-currency, समान-network हैं (USDC से USDT
422विफल); wallet-to-wallet केवल zero-fee delivery का समर्थन करता है। -
DELETEarchive करता है, कभी हार्ड-डिलीट नहीं। Account delete चालू transfers द्वारा अवरुद्ध होता है (409 account_has_active_transfers); customer delete इसके अलावा किसी भी गैर-archived account द्वारा (409 customer_has_active_resources,blockingResources[]उन्हें नामित करता है)। - v1 या v2 transfers v3 reads के लिए अदृश्य हैं (सूची छोड़ती है, GET 404), drain होने तक dual-read करें, फिर पुराने पथ हटाएँ।
- Deposit
routingऔर instructions घूम सकते हैं, हमेशा नवीनतम GET प्रस्तुत करें, और हमेशा reference code दिखाएँ। - Webhooks संकेत हैं; GET सत्य है, इवेंट id द्वारा duplicate हटाएँ,
updatedAfterसे छूटे इवेंट्स पुनः प्राप्त करें।