Create Contract API Endpoint Unclear "inputfields" Requirements

Create Contract API Endpoint Unclear "inputfields" Requirements

Hello,

I'm trying to create a Deluge function that accepts inputs from a form in Zoho Creator and creates a barebones contract of a given type. See below for the current code, cleaned of authentication information.
  1. // Fetch form data
  2. // Hidden field
  3. client_name = input.Client_Name;
  4. if(client_name == null || client_name == "")
  5. {
  6. client_name = "Testing Client";
  7. }
  8. // Dropdown field
  9. contract_type = input.Contract_Type;
  10. // Single line field
  11. title = input.Title;
  12. // Multi-line field
  13. description = input.Description;
  14. // Dropdown field
  15. signer_name = input.Signer_Name;
  16. //
  17. // Define the access token and refresh token
  18. accessToken = "ACCESS_TOKEN";
  19. refreshToken = "REFRESH_TOKEN";
  20. //
  21. // Define headers for token refresh request
  22. tokenRefreshHeaders = Map();
  23. tokenRefreshHeaders.put("Content-Type","application/x-www-form-urlencoded");
  24. tokenRefreshParameters = Map();
  25. tokenRefreshParameters.put("grant_type","refresh_token");
  26. tokenRefreshParameters.put("client_id","CLIENT_ID");
  27. tokenRefreshParameters.put("client_secret","CLIENT_SECRET");
  28. tokenRefreshParameters.put("refresh_token",refreshToken);
  29. //
  30. // Refresh the access token
  31. response = invokeurl
  32. [
  33. url :"https://accounts.zoho.com/oauth/v2/token"
  34. type :POST
  35. parameters:tokenRefreshParameters
  36. headers:tokenRefreshHeaders
  37. ];
  38. if(response.get("access_token") != null)
  39. {
  40. accessToken = response.get("access_token");
  41. }
  42. //
  43. // Define headers for Zoho Contracts API request
  44. contractsHeaders = Map();
  45. contractsHeaders.put("Authorization","Zoho-oauthtoken " + accessToken);
  46. contractsHeaders.put("Content-Type","application/json");
  47. //
  48. // Prepare contract data
  49. contract_type = lower(replaceAll(contract_type," ","-"));
  50. client_name = lower(replaceAll(client_name," ","-"));
  51. signerNameContainsTitle = signer_name.containsIgnoreCase(". ");
  52. signerFirstSpace = signer_name.find(" ");
  53. if(signerNameContainsTitle)
  54. {
  55. signerTitle = signer_name.left(signerFirstSpace);
  56. signerFullName = signer_name.remove(signerTitle).trim();
  57. signerFirstSpace = signerFullName.find(" ");
  58. signerFirstName = signerFullName.left(signerFirstSpace);
  59. signerLastName = signerFullName.remove(signerFirstName).trim();
  60. }
  61. else
  62. {
  63. signerFirstName = signer_name.left(signerFirstSpace);
  64. signerLastName = signer_name.remove(signerFirstName).trim();
  65. }
  66. signer_record = zoho.crm.searchRecords("Contacts","(First_Name:equals:" + signerFirstName + ") and (Last_Name:equals:" + signerLastName + ")");
  67. signer_email = signer_record.get(0).get("Email");
  68. //
  69. // Create nested maps/lists in the structure of the contracts API JSON
  70. contractDataMap = Map();
  71. contractDataMap.put("source",1);
  72. inputFieldsList = List();
  73. contractTypeInputFieldMap = Map();
  74. contractTypeInputFieldMap.put("metaApiName","contract-type");
  75. contractTypeInputsList = List();
  76. contractTypeInput = Map();
  77. contractTypeInput.put("inputApiName","contract-type");
  78. contractTypeInput.put("inputValue","non-disclosure-agreement");
  79. contractTypeInputsList.add(contractTypeInput);
  80. contractTypeInputFieldMap.put("inputs",contractTypeInputsList);
  81. inputFieldsList.add(contractTypeInputFieldMap);
  82. titleInputFieldMap = Map();
  83. titleInputFieldMap.put("metaApiName","title");
  84. titleInputsList = List();
  85. titleInput = Map();
  86. titleInput.put("inputApiName","title");
  87. titleInput.put("inputValue",title);
  88. titleInputsList.add(titleInput);
  89. titleInputFieldMap.put("inputs",titleInputsList);
  90. inputFieldsList.add(titleInputFieldMap);
  91. descriptionInputFieldMap = Map();
  92. descriptionInputFieldMap.put("metaApiName","description");
  93. descriptionInputsList = List();
  94. descriptionInput = Map();
  95. descriptionInput.put("inputApiName","description");
  96. descriptionInput.put("inputValue",description);
  97. descriptionInputsList.add(descriptionInput);
  98. descriptionInputFieldMap.put("inputs",descriptionInputsList);
  99. inputFieldsList.add(descriptionInputFieldMap);
  100. requesterNameInputFieldMap = Map();
  101. requesterNameInputFieldMap.put("metaApiName","requester-name");
  102. requesterNameInputsList = List();
  103. requesterNameInput = Map();
  104. requesterNameInput.put("inputApiName","requester-name");
  105. requesterNameInput.put("inputValue","Tom Rismeyer");
  106. requesterNameInputsList.add(requesterNameInput);
  107. requesterNameInputFieldMap.put("inputs",requesterNameInputsList);
  108. inputFieldsList.add(requesterNameInputFieldMap);
  109. requesterDepartmentInputFieldMap = Map();
  110. requesterDepartmentInputFieldMap.put("metaApiName","requester-department");
  111. requesterDepartmentInputsList = List();
  112. requesterDepartmentInput = Map();
  113. requesterDepartmentInput.put("inputApiName","requester-department");
  114. requesterDepartmentInput.put("inputValue","sales");
  115. requesterDepartmentInputsList.add(requesterDepartmentInput);
  116. requesterDepartmentInputFieldMap.put("inputs",requesterDepartmentInputsList);
  117. inputFieldsList.add(requesterDepartmentInputFieldMap);
  118. partyBNameInputFieldMap = Map();
  119. partyBNameInputFieldMap.put("metaApiName","party-b-name");
  120. partyBNameInputsList = List();
  121. partyBNameInput = Map();
  122. partyBNameInput.put("inputApiName","party-b-name");
  123. partyBNameInput.put("inputValue","guy-mcnobody);
  124. partyBNameInputsList.add(partyBNameInput);
  125. partyBNameInputFieldMap.put("inputs",partyBNameInputsList);
  126. inputFieldsList.add(partyBNameInputFieldMap);
  127. counterpartyPrimaryContactInputFieldMap = Map();
  128. counterpartyPrimaryContactInputFieldMap.put("metaApiName","counterparty-primary-contact");
  129. counterpartyPrimaryContactInputsList = List();
  130. counterpartyPrimaryContactInput = Map();
  131. counterpartyPrimaryContactInput.put("inputApiName","party-b-primary-contact-name");
  132. counterpartyPrimaryContactInput.put("inputValue",signer_email);
  133. counterpartyPrimaryContactInputsList.add(counterpartyPrimaryContactInput);
  134. counterpartyPrimaryContactInputFieldMap.put("inputs",counterpartyPrimaryContactInputsList);
  135. inputFieldsList.add(counterpartyPrimaryContactInputFieldMap);
  136. contractTermInputFieldMap = Map();
  137. contractTermInputFieldMap.put("metaApiName","contract-term");
  138. contractTermInputsList = List();
  139. contractTermInput = Map();
  140. contractTermInput.put("inputApiName","contract-term");
  141. contractTermInput.put("inputValue",false);
  142. contractTermInputsList.add(contractTermInput);
  143. contractTermInputFieldMap.put("inputs",contractTermInputsList);
  144. inputFieldsList.add(contractTermInputFieldMap);
  145. contractEffectiveDateInputFieldMap = Map();
  146. contractEffectiveDateInputFieldMap.put("metaApiName","contract-effective-date");
  147. contractEffectiveDateInputsList = List();
  148. contractEffectiveDateInput = Map();
  149. contractEffectiveDateInput.put("inputApiName","contract-effective-date");
  150. contractEffectiveDateInput.put("inputValue",1);
  151. contractEffectiveDateInputsList.add(contractEffectiveDateInput);
  152. contractEffectiveDateInputFieldMap.put("inputs",contractEffectiveDateInputsList);
  153. inputFieldsList.add(contractEffectiveDateInputFieldMap);
  154. renewalTypeInputFieldMap = Map();
  155. renewalTypeInputFieldMap.put("metaApiName","renewal-type");
  156. renewalTypeInputsList = List();
  157. renewalTypeInput = Map();
  158. renewalTypeInput.put("inputApiName","renewal-type");
  159. renewalTypeInput.put("inputValue",1);
  160. renewalTypeInputsList.add(renewalTypeInput);
  161. renewalTypeInputFieldMap.put("inputs",renewalTypeInputsList);
  162. inputFieldsList.add(renewalTypeInputFieldMap);
  163. contractDataMap.put("inputfields",inputFieldsList);
  164. //
  165. // Create the contract in Zoho Contracts
  166. response = invokeurl
  167. [
  168. url :"https://contracts.zoho.com/api/v1/contracts"
  169. type :POST
  170. parameters:contractDataMap
  171. headers:contractsHeaders
  172. ];
  173. if(response.get("code") == 201)
  174. {
  175. alert "Contract created successfully";
  176. }
  177. else
  178. {
  179. alert "Error in creating contract: " + response.toString();
  180. cancel submit;
  181. }

Here is the resulting JSON per logging:
  1. {
  2.   "source": 1,
  3.   "inputfields": [
  4.     {
  5.       "metaApiName": "contract-type",
  6.       "inputs": [
  7.         {
  8.           "inputApiName": "contract-type",
  9.           "inputValue": "non-disclosure-agreement"
  10.         }
  11.       ]
  12.     },
  13.     {
  14.       "metaApiName": "title",
  15.       "inputs": [
  16.         {
  17.           "inputApiName": "title",
  18.           "inputValue": "Test title"
  19.         }
  20.       ]
  21.     },
  22.     {
  23.       "metaApiName": "description",
  24.       "inputs": [
  25.         {
  26.           "inputApiName": "description",
  27.           "inputValue": ""
  28.         }
  29.       ]
  30.     },
  31.     {
  32.       "metaApiName": "requester-name",
  33.       "inputs": [
  34.         {
  35.           "inputApiName": "requester-name",
  36.           "inputValue": "Tom Rismeyer"
  37.         }
  38.       ]
  39.     },
  40.     {
  41.       "metaApiName": "requester-department",
  42.       "inputs": [
  43.         {
  44.           "inputApiName": "requester-department",
  45.           "inputValue": "sales"
  46.         }
  47.       ]
  48.     },
  49.     {
  50.       "metaApiName": "party-b-name",
  51.       "inputs": [
  52.         {
  53.           "inputApiName": "party-b-name",
  54.           "inputValue": "guy-mcnobody"
  55.         }
  56.       ]
  57.     },
  58.     {
  59.       "metaApiName": "counterparty-primary-contact",
  60.       "inputs": [
  61.         {
  62.           "inputApiName": "party-b-primary-contact-name",
  63.           "inputValue": "contact@mail.com"
  64.         }
  65.       ]
  66.     },
  67.     {
  68.       "metaApiName": "contract-term",
  69.       "inputs": [
  70.         {
  71.           "inputApiName": "contract-term",
  72.           "inputValue": false
  73.         }
  74.       ]
  75.     },
  76.     {
  77.       "metaApiName": "contract-effective-date",
  78.       "inputs": [
  79.         {
  80.           "inputApiName": "contract-effective-date",
  81.           "inputValue": 1
  82.         }
  83.       ]
  84.     },
  85.     {
  86.       "metaApiName": "renewal-type",
  87.       "inputs": [
  88.         {
  89.           "inputApiName": "renewal-type",
  90.           "inputValue": 1
  91.         }
  92.       ]
  93.     }
  94.   ]
  95. }

I'm getting this error when I submit the form, triggering the deluge function:
  1. Error in creating contract: {"Errors":{"ErrorCode":"ZSEC-JSON_PARSE_ERROR","ErrorMessage":"Sorry, unable to complete your action due to an unknown error. Please try again.","APIErrorMessage":"JSON_PARSE_ERROR"}}

The error message is not very helpful, as it does not specify where it has an issue when parsing the JSON. The API documentation does not specify which fields are required for the Create Contract Endpoint, so I'm either left posting here to request more info, or to just tinker with different combinations of fields included and excluded, so I'm posting here. Can anybody help determine exactly which fields I'm missing, using incorrectly, or other issues with the JSON?
      • Recent Topics

      • Zoho Tracking Image location

        So we've been having an issue with tracking email opens. Specifically in Gmail. Our emails are not that long either, maybe 4 sections of image/250 characters of text/button per section.  But all my test accounts I used via Gmail we're showing opens. But then come to find out the tracking image is at the very bottom of the email. So If the message is clipped (It always just clips our social icons on the bottom) and the user doesn't click the show more button it never tracks the open.  Looking at other
      • AI Interview Insights: Turn Recorded Interviews into Quick Transcripts & Summaries

        Evaluating interviews shouldn’t require replaying long recordings or taking manual notes. With AI Interview Insights, you can now review complete transcripts and AI-generated summaries of your One-way (Recorded) interviews right inside Zoho Recruit. This
      • API in E-Invoice/GST portal

        Hi, Do I have to change the api in gst/e-invoice portal as I use zoho e books for my e-invoicing. If yes, please confirm the process.
      • Ask the Experts 26: Brighten every customer interaction with Zoho Desk all year long

        Hello everyone, Greetings and welcome to Ask the Experts 26. As we wrap up 2025, we are excited to invite you to the 26th episode of our Ask the Expert series. 🎄The Merry Metrics Edition = Best of Zoho Desk [Best Practices + Holiday Automation + Year-End
      • Pricing calculator

        Alright, so I'm trying to create a pricing calculator/pricing report generator to use in a cabinet shop. I did all the logic and such, and the calculator works. I have a few other things that I would need it to be able to do though, I'll do my best to
      • Bug Details

        In the Bug detail the milestoneid is missing
      • Stop completed task lists from disappearing?

        Is there any way to stop projects from making tasks lists disappear when all the tasks in the list are completed? That's one of those little things where we're constantly fighting the product. For instance we have some projects which are ongoing - no start and end date. We use Kanban view to show the various task lists. We don't want the kanban list to disappear every time the items on it happen to be closed out. Thanks
      • One Contact with Multiple Accounts with Portal enabled

        I have a contact that manages different accounts, so he needs to see the invoices of all the companies he manage in Portal but I found it not possible.. any idea? I tried to set different customers with the same email contact with the portal enabled and
      • Change of Blog Author

        Hi, I am creating the blog post on behalf of my colleague. When I publish the post, it is showing my name as author of the post which is not intended and needs to be changed to my colleague's name. How can I change the name of the author in the blogs?? Thanks, Ramanan
      • Allow customers to choose meeting venue and meeting duration on booking page

        My business primarily involves one-to-one meetings with my clients. Given the hybrid-work world we now find ourselves in, these meetings can take several forms (which I think of as the meeting "venue"): In-person Zoom Phone call I currently handle these
      • Booking outside of scheduled availability

        Is there a way for staff (such as the secretary) to book appointments outside of the scheduled availability? Right now to do this special hours must be set each time. There should be a quicker way. Am I missing something?
      • Operation Questions.

        Hello, I hope you are well. To explain a little, we are a company that sells services and products with a technical team responsible for installation and maintenance. Zoho FSM can be useful for the technical team, namely for the technical coordinator
      • Direct Access and Better Search for Zoho Quartz Recordings

        Hi Zoho Team, We would like to request a few enhancements to improve how Zoho Quartz recordings are accessed and managed after being submitted to Zoho Support. Current Limitation: After submitting a Quartz recording, the related Zoho Support ticket displays
      • Update date & time when a cell is edited

        Hi All, I am desiring to have a cell update with the current date and time when another cell is edited. Any ideas?  Thank you
      • Add "Groups" to "Share With" on Reports & All Entries

        Hi, On Forms we can share Publicly, with Specific Users And/Or Specific Groups or All Users. With Reports and All Entries we lack the "Groups" option, please add this as with many users this saves a lot of work. Thanks Dan
      • Add Pause / Resume Option to Zoho Quartz Recordings

        Hi Zoho Team, We would like to request an enhancement to Zoho Quartz recordings: the ability to pause and resume an ongoing recording. Current Limitation: At the moment, when recording an issue with Zoho Quartz, the recording continues even when we are
      • Custom Fields Not Showing Up in Invoice PDF Template Document Information

        I have added 2 custom fields under Sales > Invoices > Manage Custom Fields. They are set to show in all PDFs. However when I am editing my Invoice PDF template, i do not see the custom fields under Document Information.
      • Tracking Non-Inventory Items

        We have several business locations and currently use zoho inventory to track retail items (sales and purchase orders). We were hoping to use zoho inventory to track our non-inventory items as well (toilet paper, paper towels, etc). I understand that we
      • Can I use a Standalone CRM Function as the Callback URL For Async Export Data API?

        I am creating an export job using this API https://www.zoho.com/analytics/api/v2/bulk-api/export-data-async/create-export/view-id.html There is a "callbackUrl" key in the CONFIG object. I tried copying the URL for a standalone function in CRM which can
      • ZOHO Books

        Hi there, Why after I upgrade my Zoho invoice > Books then i wanted to add plugin which i cannot do. Please advise.
      • How is Your eCommerce Experience w/Zoho Inventory?

        First off, I'm SUPER grateful for the advent of Zoho Inventory and now the Zoho Commerce Suite. Overall, Inventory is a great product, especially for customers without an eCommerce presence. For eCommerce companies (especially those shipping more than ~10 packages/day), however, there are certain drawbacks that keep my clients from moving over to Zoho Inventory: Cons: 1. Invoice + Package Creation from Shopify/Other eCommerce Integrations: Zoho Inventory makes the somewhat perplexing decision to
      • Error AS101 when adding new email alias

        Hi, I am trying to add apple@(mydomain).com The error AS101 is shown while I try to add the alias.
      • Simplify Mass Replies with Predefined Templates and Snippets

        Hello everyone, We are happy to introduce a new enhancement to Mass Reply that helps agents respond to customers quickly and consistently. With the addition of Email Templates and Snippets in the reply window, agents can use predefined messages while
      • Mapping custom fields from one module to another

        I have a custom field, "Subscription Period" that appears as a required field in every Opportunity (Potential). I want that field to appear on any Quotes derived from that Opportunity (and have created a custom field of the same name in Quotes for that
      • The Social Wall: November 2025

        We’re nearing the end of the year, and the holiday season is officially kicking in! It’s that time when sales peak and your social media game needs to be stronger than ever. We’re back with exciting new updates across AI, analytics, and the mobile app
      • Item name special charaters <>

        Im trying to input speical characters such as < and > into item name and item description but comes up with following error: Invalid value passed for Item Name and Invalid value passed for Item Description How do i allow speical characters?
      • How to update Multi File upload field

        Assume that i have a multi file upload field,how can i update the same field again?
      • Customer Address Not on Standard Invoice when Address is on Contact Record

        Hi,  I entered the customer billing and shipping address in Zoho CRM. I created an invoice in Zoho Books with the same customer contact. The contact is correctly in Zoho Books with the billing and shipping address. The invoice for the customer does not
      • Apply partial payments to invoices from the Banking Module

        We need this! Why is this not possible?
      • Welcome to the Zoho Show Community Forums page!

        Hello everyone, The Zoho Show community is a place for you to discuss and share anything and everything related to Zoho Show Presentations, our online presentation software. It includes users from all over the globe and all walks of life. Our community helps answer your Zoho Show questions with responses from other knowledgeable community members to give you the best experience creating and designing exciting presentations. Along the way, you'll meet recognized experts from our software team and
      • How can I convert an existing contact into a lead?

        I imported many contacts into ZOHO CRM. In order to select a few of them as leads, I want to mark or convert a few hundred as Leads. Who can I do that?
      • Introducing Dedicated Modules for Plans, Addons, and Coupons in Zoho Billing

        We’ve enhanced the way you manage Plans, Addons, and Coupons in Zoho Billing. Previously, all three grouped together under Subscription Items. Now, each one has its own dedicated module, giving you a cleaner and more intuitive experience. This update
      • Price book functionality enhancement

        A common use of price books is to create a price book for a given customer level or contract with a specific company. Given that this is done at a company/customer level it would be great to see a way to associate a price book to a given customer and
      • Contact data removes Account data when creating a quote

        Hi, Our customer has address fields in their quote layout which should be the address of the Account. They prefill the information, adding the account name - the address data is populated as per what is in the account - great. However when they then add
      • Can we have 24x7 live support for Zohobooks ?

        Can we have 24x7 live support for Zohobooks ?
      • Important update about notification security in Business Messaging SDK

        As part of our ongoing effort to strengthen the security of notification data, we have enhanced how notifications are processed and protected in our applications. These improvements ensure that all notification related data follows the most up-to-date
      • 年内最後のユーザー向けイベント:5名限定! 課題解決型ワークショップイベント Zoho ワークアウト開催のお知らせ (12/18)

        ユーザーの皆さま、こんにちは。コミュニティチームの中野です。 12月開催のZoho ワークアウトについてお知らせします。 今回はZoomにて、オンライン開催します。 参加登録はこちら(無料) https://us02web.zoom.us/meeting/register/QHn6kJAcRs-znJ1l5jk0ww ━━━━━━━━━━━━━━━━━━━━━━━━ Zoho ワークアウトとは? Zoho ユーザー同士で交流しながら、サービスに関する疑問や不明点の解消を目的とした「Zoho ワークアウト」を開催します。
      • Sync Zoho Marketing Automation with Zoho Forms

        I can't find a section where the integration between Zoho Marketing Automation and Zoho form is explained. And how form subscription works with opt-in and consents.
      • What is the difference between Zoho Campaigns and marketing hub?

        Zoho Campaigns is a permission-based email marketing tool for sending marketing emails and mass emails. Marketing Automation is a multichannel marketing automation tool that caters to organizations looking for tools to engage their users across multiple
      • Webhook not firing.

        I created a webhook using the Web UI, it looks very nice and the testing worked without an issue, but when i save/ update a ticket, the webhook is not firing. Here are the details of the web-hook i get from using the API "modifiedTime": "2019-10-22T09:23:37.380Z",
      • Next Page