{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"0181725d-f099-4ff6-8d88-1c4a5bd081d9","name":"Dailyhunt Content Syndication","description":"<strong>Partner Integration Reference</strong> _Version 2.2_\n\n<p>Dailyhunt is offering it’s rich catalogue of content via a seamless API integration. This document describes the details on how a partner can integrate with its Content Syndication API. It will help you understand the technical details of how you can integrate with Dailyhunt’s API, expectations from you & the API protocol specification.</p>\n\n\n# Change log\n\n- 29-Jan-2020 : [v2.1] Updated [**Attribution**](https://api-syndication.dailyhunt.in/#attribution) section\n- 22-May-2020 : [v2.2] Included shortned shareInfo and shareUrl for each item in items API\n- 24-Aug-2021 : [v2.3] Included appDeepLinkUrl for each row of item in items API\n- 24-Aug-2021 : [v2.3] Included appDeepLinkUrl for each row of item, homeUrl and appHomeUrl channels API\n- 24-Aug-2021 : [v2.3] Added [**Search**](https://api-syndication.dailyhunt.in/#f4cabd13-e8cf-4bf8-ba37-94b9c501317c) API details under Content Fetch section.\n\n___\n\n\n# Getting Started\n\n<p>This section describes the technical details of how to invoke Dailyhunt’s Syndication API. It will help you understand how to use the API security, message signing & the API protocol needed for integration.</p>\n\n<br>\n<br>\n<p>During onboarding, Dailyhunt will provision the following items for your integration:</p>\n\n\n<table>\n  <tr>\n   <td><strong>Item</strong>\n   </td>\n   <td><strong>Description</strong>\n   </td>\n  </tr>\n  <tr>\n   <td><em>API Key</em>\n   </td>\n   <td>API access key needed for authentication of the API client\n   </td>\n  </tr>\n  <tr>\n   <td><em>Secret Key</em>\n   </td>\n   <td>Needed for signing the API parameters to generate a signature for API authentication\n   </td>\n  </tr>\n  <tr>\n   <td><em>Partner Code</em>\n   </td>\n   <td>Partner identification code\n   </td>\n  </tr>\n</table>\n\n\n<br>\nYou will need to include the following items in all the API calls:\n\n\n<table>\n  <tr>\n   <td><strong>Item</strong>\n   </td>\n   <td><strong>Description</strong>\n   </td>\n  </tr>\n  <tr>\n   <td><em>Unique Partner user id (puid)</em>\n   </td>\n   <td>Your unique user id accessing Dailyhunt API\n   </td>\n  </tr>\n  <tr>\n   <td><em>API Key</em>\n   </td>\n   <td>API access key needed for authentication of the api user\n   </td>\n  </tr>\n  <tr>\n   <td><em>API Signature</em>\n   </td>\n   <td>The API authentication signature generated using <em>Secret Key</em>\n   </td>\n  </tr>\n  <tr>\n   <td><em>Partner Code</em>\n   </td>\n   <td>Partner identification code\n   </td>\n  </tr>\n  <tr>\n   <td><em>Dailyhunt Cookie (dhFeedV1)</em>\n   </td>\n   <td>Dailyhunt generated cookie (as received from the very first API call) per user\n   </td>\n  </tr>\n</table>\n\n\nThe following section describes in detail, the steps needed for integration, including how to generate some of the above fields & how to include them in the API calls.\n\n# Integration Checklist\n\n- Get API Keys and partner code from Dailyhunt\n- Establish Signature generation for requests and get response from APIs\n- Puid generation: Unique id for each user to be passed for each request\n- Choose channels from Applicable options below and get configured from Dailyhunt\n\t\t- News Channels\n\t\t- Video Channels\n\t\t- DailyShare Channels\n\t\t- Location Channels\n\n- Include language onboarding for user to select content language (Recommended)\n- Integrate Tracking API\n- Place attribution request along with tracking\n- Share estimated volume and rollout plan with Dailyhunt\n\n# API Security\n\nSince the APIs are protected, you will need to generate a message signature using the secret key as described below and pass it along with the API Key to all the API calls.\n\n\n## API Key & Secret Key\n\n\n\n1. Dailyhunt will share the API Key & Secret Key with you through email.\n2. You will pass the API key on every API call.\n3. You will use the Secret Key for signing API requests & generate a _Signature Base String_ that needs to be passed on every API call.\n\n\n\n## How to generate Signature Base String\n\nTo generate a _Signature Base String_, you will need to do the following steps:\n\n\n\n1. Append _ts_=_<current local server time in millis>_ in the url as query parameter.\n\n2. URL encode the parameter key & value pairs.\n\n3. Sort all the request query parameters lexicographically, sorted on encoded key.\n\n4. Append all the _key=value_ with “_&_” as separator if more than one _key=value_ is present.\n\n5. Uppercase the _http_ method used in the url and in that, append the string from _#4_ above. This new string (encoded sorted parameters + uppercase http method) represents the _Signature Base String._\n\n\n**__For testing out the APIs in Postman, this collection includes a Pre-request Script, which handles the generation of Signature. You can use the test environment provided with the collection__**\n\nReplace the below values by values provided by Dailyhunt to test, in the postman environment or the below sample snippets.\n\n- PARTNER_CODE\n- YOUR_API_KEY\n- YOUR_SECRET_KEY\n\nOr use one of the below sample snippets which use API Key & Secret Key to generate signature and to invoke Dailyhunt API\n\n### Javascript sample snippet\n```\n<!DOCTYPE html>\n<html>\n\n<head>\n  <title>Dailyhunt Content Syndication</title>\n  <style>\n    pre {\n      width: 100%;\n      overflow-x: auto;\n      white-space: pre-wrap;\n      white-space: -moz-pre-wrap;\n      white-space: -pre-wrap;\n      white-space: -o-pre-wrap;\n      word-wrap: break-word;\n    }\n  </style>\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css\">\n    <script type=\"text/javascript\" src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.9/highlight.min.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/core.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/hmac.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/sha1.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/enc-base64.js\"></script>\n    <script>\n      $.support.cors = true;\n      hljs.initHighlightingOnLoad();\n    </script>\n</head>\n\n<body>\n  <div>\n    <pre><code id=\"result\" class=\"json hljs\" style=\"opacity: 1;\"></code></pre>\n  </div>\n  <script>\n    var urlParams = new URLSearchParams(window.location.search);\n    var type = urlParams.get(\"type\") ? urlParams.get(\"type\") : \"items\";\n    var partner = urlParams.get(\"partner\") ? urlParams.get(\"partner\") : '<PARTNER_CODE>';\n    var channelId = urlParams.get(\"cid\") ? urlParams.get(\"cid\") : 5;\n    var langCode = urlParams.get(\"langCode\") ? urlParams.get(\"langCode\") : 'en';\n    var env = urlParams.get(\"env\") ? urlParams.get(\"env\") : \"qa\";\n    var fm = urlParams.get(\"fm\") ? urlParams.get(\"fm\") : 0;\n    var pfm = urlParams.get(\"pfm\") ? urlParams.get(\"pfm\") : 0;\n    var puid = urlParams.get(\"puid\")? urlParams.get(\"puid\"):123;\n    var ts = urlParams.get(\"ts\")? urlParams.get(\"ts\"):Date.now();\n    var fields = urlParams.get(\"fields\")? urlParams.get(\"fields\"):'';\n    var pagesize = urlParams.get(\"pageSize\")?urlParams.get(\"pageSize\"):'';\n    var config = {\n      prod: {\n        domain: \"http://feed.dailyhunt.in\",\n        keys: {\n          PARTNER_CODE: [\"YOUR_PROD_API_KEY\",\"YOUR_PROD_SECRET_KEY\"]\n        }\n      },\n      qa: {\n        domain: \"http://qa-news.newshunt.com\",\n        keys: {\n          PARTNER_CODE: [\"YOUR_STAGE_API_KEY\",\"YOUR_STAGE_SECRET_KEY\"]\n        }\n      }\n    };\n    if (!partner) {\n      document.getElementById(\"demo\").innerHTML = \"Partner ID is missing\";\n    } else if (!config[env].keys[partner]) {\n      document.getElementById(\"demo\").innerHTML = \"Partner keys are missing\";\n    }\n    var domain = config[env].domain;\n    console.log(domain)\n    var apiKey = config[env].keys[partner][0];\n    var apiSecretKey = config[env].keys[partner][1];\n    urlRequestParamToMap = function urlRequestParamToMap(url) {\n      var keyValueMapping = {};\n      if (url) {\n        var params = url.split(\"&\");\n        var arrayLength = params.length;\n        for (var i = 0; i < arrayLength; i++) {\n          var keyValue = params[i].split(\"=\");\n          var key = encodeURI(keyValue[0]);\n          var value = keyValue.length == 2 ? keyValue[1] : \"\";\n          // keyValueMapping[key] = encodeURI(value);\n          keyValueMapping[key] = encodeURIComponent(value);\n        }\n      }\n      console.log(\"keyValueMapping:\" + JSON.stringify(keyValueMapping));\n      return keyValueMapping;\n    };\n    //Generate SignatureBasevW1bXc1y7qzsYEEq5AAZ1BokhbgRtdLjGI8I3FKlcwQ=\n    generateSignatureBase = function (queryString, method) {\n      if (queryString) {\n        var queryParams = this.urlRequestParamToMap(queryString);\n        var encodedAndSortedQueryParams = {};\n        Object.keys(queryParams).sort().forEach(function (key) {\n          if(queryParams[key]!='')\n            encodedAndSortedQueryParams[key] = queryParams[key];\n        });\n        console.log(\"encodedAndSortedQueryParams:\" + JSON.stringify(encodedAndSortedQueryParams));\n        var signatureBaseBuffer = JSON.stringify(encodedAndSortedQueryParams);\n        method = method;\n        signatureBaseBuffer = signatureBaseBuffer.replace(/:/g, '=')\n          .replace(/,/g, '&').replace(/\"/g, '')\n          .replace(/[{ }]/g, '') + method;\n        console.log('stringbuffer '+signatureBaseBuffer);\n        var encrypted = CryptoJS.HmacSHA1(signatureBaseBuffer, apiSecretKey);\n        console.log('encrypted '+encrypted);\n        var s64 = CryptoJS.enc.Base64.stringify(encrypted);\n        console.log(\"s64: \" + s64);\n        return s64;\n      }\n    };\n    var url = \"partner=\" + partner + \"&puid=\" + puid + \"&langCode=\" + langCode + '&ts=' + ts;\n    if (fm) {\n      url += \"&fm=\" + fm;\n    }\n    if (pfm) {\n      url += \"&pfm=\" + pfm;\n    }\n    if (type == \"items\") {\n      url += \"&cid=\" + channelId;\n    }\n    if(fields) {\n      url += \"&fields=\" + fields;\n    }\n    if(pagesize) {\n      url += \"&pageSize=\" + pagesize;\n    }\n    console.log(\"querystring \" + url);\n    var s64 = generateSignatureBase(url, \"GET\")\n    var xhttp = new XMLHttpRequest();\n    xhttp.onreadystatechange = function () {\n      if (this.readyState == 4 && this.status == 200) {\n        // Typical action to be performed when the document is ready:\n        var response = xhttp.responseText;\n        response = JSON.stringify(JSON.parse(response), undefined, 4);\n        var result = document.getElementById(\"result\");\n        result.innerHTML = response\n          .replace(/\\n/g, \"<br/>\")\n          .replace(/\\\\n/g, \" \")\n          .replace(/\\t/g, \"&nbsp;&nbsp;\");\n\n        hljs.highlightBlock(result);\n      }\n    };\n    xhttp.withCredentials = true;\n    var url = domain + \"/api/v2/syndication/\" + type + \"?\" + url;\n    console.log(\"url =\"+url);\n    xhttp.open(\"GET\", url, true);\n    xhttp.setRequestHeader(\"SSL_CONNECTION\", \"HTTPS\");\n    xhttp.setRequestHeader(\"Authorization\", \"key=\" + apiKey);\n    xhttp.setRequestHeader(\"Signature\", s64);\n    xhttp.setRequestHeader(\"Content-type\", \"application/json\");\n    xhttp.send();\n  </script>\n</body>\n\n</html>\n\n```\n\n\n### Java sample snippet\n\n\n```\n/*\n * Copyright (c) 2019 Dailyhunt. All rights reserved.\n */\n\nimport java.io.BufferedWriter;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.security.InvalidKeyException;\nimport java.security.NoSuchAlgorithmException;\nimport java.security.SignatureException;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.TreeMap;\n\nimport javax.crypto.Mac;\nimport javax.crypto.spec.SecretKeySpec;\n\nimport org.apache.commons.codec.binary.Base64;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.client.methods.CloseableHttpResponse;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.impl.client.HttpClients;\nimport org.apache.http.util.EntityUtils;\nimport org.json.simple.JSONObject;\nimport org.json.simple.parser.JSONParser;\n\npublic class APIClient {\n\n  private static String PARTNER_CODE = \"<PARTNER_CODE>\";\n  private static String API_KEY_VALUE = \"<YOUR_API_KEY>\";\n  private static String SECRET_KEY = \"<YOUR_SECRET_KEY>\";\n  private static String HTTP_METHOD_GET = \"GET\";\n  \n  public static void main(String[] args) throws Exception {\n    APIClient client = new APIClient();\n    \n    // In query parameter always add the \"ts\" query parameter\n    String queryParameter = \"&langCode=en&partner=\"+PARTNER_CODE+\"&cid=1&puid=test123&ts=\" +\n        System.currentTimeMillis();\n    \n    // Generate the signature base string\n    String signatureBase = client.generateSignatureBase(HTTP_METHOD_GET, queryParameter);\n\n    // Generate the signature i.e. Message Authentication Code using HMAC\n    String signature = client.calculateRFC2104HMAC(signatureBase, SECRET_KEY);\n    System.out.println(\"signature = \" + signature);\n    \n    // Form the url & pass the API_KEY and the Signature generated in the header\n    String httpUrl = \"http://feed.dailyhunt.in/api/v2/syndication/items?\" + queryParameter;\n    Map<String, String> headers = new HashMap<>();\n    headers.put(\"Authorization\", \"key=\" + API_KEY_VALUE);\n    headers.put(\"Signature\", signature);\n    \n    // Now call the url now\n    client.httpGet(httpUrl, headers,args[0]);\n  }\n\n  private String calculateRFC2104HMAC(String data, String key) throws SignatureException {\n    String result;\n    try {\n      // get an hmac_sha1 key from the raw key bytes\n      SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), \"HmacSHA1\");\n      \n      // get an hmac_sha1 Mac instance and initialize with the signing key\n      Mac mac = Mac.getInstance(\"HmacSHA1\");\n      mac.init(signingKey);\n      \n      // compute the hmac on input data bytes\n      byte[] rawHmac = mac.doFinal(data.getBytes());\n      \n      // base64-encode the hmac\n      result = Base64.encodeBase64String(rawHmac);\n    } catch (InvalidKeyException e) {\n      throw new SignatureException(\"Failed to generate HMAC as key is invalid\", e);\n    } catch (NoSuchAlgorithmException e) {\n      throw new SignatureException(\"Failed to generate HMAC as encoding algorithm does not exists\", e);\n    }\n    return result;\n  }\n  \n  private String generateSignatureBase(String httpMethod, String queryString) {\n    StringBuilder signatureBaseBuffer = new StringBuilder();\n    \n    if (!isEmpty(queryString)) {\n      Map<String, String> queryParams = urlRequestParamToMap(queryString);\n      \n      // Sort all the request query parameters lexicographically, sorted on encoded key\n      Map<String, String> encodedAndSortedQueryParams = new TreeMap<>();\n      for (String key : queryParams.keySet()) {\n        encodedAndSortedQueryParams.put(urlEncodedString(key), \n            urlEncodedString(queryParams.get(key)));\n      }\n      \n      // Append all the key=value with “&” as separator if more than one key=value is present\n      signatureBaseBuffer.append(formatAsUrl(encodedAndSortedQueryParams));\n    }\n    // Append the UPPERCASE(http method)\n    signatureBaseBuffer.append(httpMethod.toUpperCase());\n    return signatureBaseBuffer.toString();\n  }\n  \n  private boolean isEmpty(String str) {\n    return null == str || (null != str && \"\".equals(str.trim()));\n  }\n  \n  private Map<String, String> urlRequestParamToMap(String url) {\n    if (isEmpty(url)) {\n      return new HashMap<String, String>();\n    }\n\n    Map<String, String> keyValueMapping = new HashMap<>();\n    String[] params = url.split(\"&\");\n    for (String param : params) {\n      String[] keyValue = param.split(\"=\");\n      String key = keyValue[0];\n      String value = keyValue.length == 2 ? keyValue[1] : \"\";\n      keyValueMapping.put(key, value);\n    }\n\n    return keyValueMapping;\n  }\n\n  private String formatAsUrl(Map<String, String> pairs) {\n    if (pairs == null) {\n      return \"\";\n    }\n\n    StringBuilder urlBuilder = new StringBuilder();\n    for (String key : pairs.keySet()) {\n      if (urlBuilder.length() != 0) {\n        urlBuilder.append(\"&\");\n      }\n      urlBuilder.append(key).append(\"=\").append(pairs.get(key));\n    }\n\n    return urlBuilder.toString();\n  }\n  \n  private String urlEncodedString(String normalString) {\n    try {\n      return URLEncoder.encode(normalString, \"UTF-8\");\n    } catch (UnsupportedEncodingException e) {\n      return normalString;\n    }\n  }\n  \n  private void httpGet(String url, Map<String, String> headers,String fileName) throws IOException {\n    CloseableHttpClient httpclient = HttpClients.createDefault();\n    \n    HttpGet httpGet = new HttpGet(url);\n    for (String key : headers.keySet()) {\n      httpGet.addHeader(key, headers.get(key));\n    }\n    \n    CloseableHttpResponse response1 = httpclient.execute(httpGet);\n    try {       \n      try (FileWriter writer = new FileWriter(fileName);\n          BufferedWriter bw = new BufferedWriter(writer)) {\n        if(response1.getStatusLine().getStatusCode() == 200){\n          HttpEntity entity1 = response1.getEntity();          \n          String str = EntityUtils.toString(entity1, \"UTF-8\"); \n          JSONParser parser = new JSONParser();\n          JSONObject json = (JSONObject) parser.parse(str);\n          JSONObject data = (JSONObject)json.get(\"data\");\n          System.out.println(data.get(\"count\"));\n          Long c = (Long)data.get(\"count\");\n          bw.write(Long.toString(c));\n        }else{\n          bw.write(response1.getStatusLine().getStatusCode());\n        }\n      } catch (IOException e) {\n          System.err.format(\"IOException: %s%n\", e);\n      }  \n    }catch(Exception ex){\n      System.out.println(ex);\n    }finally {\n        response1.close();\n    }\n\n  }\n}\n\n```\n\n\n\n## Passing API Key & Signature Request Headers\n\nFollowing steps need to be followed to pass the API Key & Signature headers to Dailyhunt:\n\n1. You will pass the API key in the _Authorization_ header with value as *_key=<API Key>_*.\n2. You will generate a signature (Message Authentication Code - MAC) using the secure message Authentication code algorithm SHA1-HMAC as explained below:\n    a. Generate a signature (S), _S = SHA1-HMAC(Secret Key, Signature Base String)_.\n    b. Base64 encode the signature (S), let's call it _S64_.\n3. While calling the API, include the signature (S) in the header as *_Signature:<value of S64 in 2.b above>_*\n4. If the API key & the signature are correct, Dailyhunt server will allow the API access, otherwise it will return error codes.\n\n\n### References\n\nHMAC\n[https://en.wikipedia.org/wiki/Hash-based_message_authentication_code](https://en.wikipedia.org/wiki/Hash-based_message_authentication_code) \n\nJava HMAC\n[https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/HmacUtils.html](https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/HmacUtils.html) \n\n[http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/AuthJavaSampleHMACSignature.html](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/AuthJavaSampleHMACSignature.html) \n\n## Error Codes\n\nYou will get below error codes for failures:\n\n<table>\n  <tr>\n   <td>401</td> <td>If invalid API key is given in the request header</td>\n   </tr>\n\n\n<tr>\n   <td>403</td> <td>If invalid Signature is given in the request heade</td>\n   </tr>\n<tr>\n<td>500</td> <td>For any unexpected issues at Dailyhunt</td>\n</tr>\n</table>\n\n<br>\n\nExample\n\n\tcurl -H\"Authorization:key=<API Key>\" -H\"Signature:<value of S64>\"\" \"http://<host:port>/api/v2/syndication/channels?partner=xxxx&puid=<your unique user id>&ts=<current server local timestamp>\"\n\n\n## Handling CORS\n\nDailyhunt API can also be integrated directly from the browser. In order to avoid Cross-Origin issue, Dailyhunt supports Cross-Origin Resource Sharing (CORS). Dailyhunt will provide the following headers in the preflight response with OPTIONS http method.\n\n_Access-Control-Allow-Origin:<Your Origin Host>_\n\n_Access-Control-Allow-Credentials: true_\n\nFor more information on CORS, you may refer [https://en.wikipedia.org/wiki/Cross-origin_resource_sharing](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) \n\n# API Integration Environments\n\nFollowing lists the integration environments available:\n\n\n<table>\n  <tr>\n   <td><strong>Environment</strong>\n   </td>\n   <td><strong>Host</strong>\n   </td>\n   <td><strong>Port</strong>\n   </td>\n   <td><strong>Description</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>Stage\n   </td>\n   <td><a href=\"http://qa-news.newshunt.com\">qa-news.newshunt.com</a>\n   </td>\n   <td>80\n   </td>\n   <td>The stage integration environment for development & testing\n   </td>\n  </tr>\n  <tr>\n   <td>Prod\n   </td>\n   <td>feed.dailyhunt.in\n   </td>\n   <td>80\n   </td>\n   <td>The production environment\n   </td>\n  </tr>\n</table>\n\n# Identity Management\n\nA unique user id is needed for every user accessing and consuming Dailyhunt’s content. \nDailyhunt uses the user id to understand the user’s content consumption pattern and to serve personalized content to the user.\n\n\nFollowing sections describe how you can pass a unique user id and the need for a Dailyhunt Cookie which needs to be maintained at your end.\n\n\n### Unique User ID\n\n\n\n1. You will need to provide a unique user id as query parameter in the Dailyhunt API calls. This could be any identifier such as a device identifier, if accessible and available.\n\n>Parameter Name: {{puid}}\n>    \n>Example: http://host:port/{{api_url}}?puid={{Your_unique_user_id}}\n\n\n\n2. Dailyhunt will generate & maintain an internal (Dailyhunt side) user id corresponding to your unique user id.\n\n\n### Dailyhunt Cookie\n\n\n\n1. When you access Dailyhunt API with your Unique User Id (i.e. “_puid_”) in the query parameter, Dailyhunt API will provide a user specific Cookie (_dhFeedV1_) in the API response.\n\n2. You are expected to maintain the _dhFeedV1_ Cookie per user at your end and pass it back on subsequent Dailyhunt API calls. For common browser based integrations, this should happen seamlessly.\n\n3. Dailyhunt will take care of (re-)generating the _dhFeedV1_ Cookie, if found missing in the request or if the Cookie is expired. Dailyhunt will reject the request if _dhFeedV1 _Cookie is found invalid.\n\n4. Dailyhunt Cookie helps avoid repeated lookup of the Dailyhunt internal user id for a given partner user id (_puid_) in every API call.\n\n5. Dailyhunt Cookie will be having a TTL of one month initially (and this may change in future).\n\n___\n\n# Available Language Codes\n\nFollowing table lists the available language codes supported by Dailyhunt’s content feeds. \n\nNote: Some of the channels may not have content for all languages. Please therefore review the feeds for the language of choice prior to rolling out your integration for a chosen language.\n\n\n<table>\n  <tr>\n   <td><strong>Code</strong>\n   </td>\n   <td><strong>Language Name</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>en\n   </td>\n   <td>English\n   </td>\n  </tr>\n  <tr>\n   <td>hi\n   </td>\n   <td>Hindi\n   </td>\n  </tr>\n  <tr>\n   <td>mr\n   </td>\n   <td>Marathi\n   </td>\n  </tr>\n  <tr>\n   <td>gu\n   </td>\n   <td>Gujarati\n   </td>\n  </tr>\n  <tr>\n   <td>pa\n   </td>\n   <td>Punjabi\n   </td>\n  </tr>\n  <tr>\n   <td>bn\n   </td>\n   <td>Bangla\n   </td>\n  </tr>\n  <tr>\n   <td>kn\n   </td>\n   <td>Kannada\n   </td>\n  </tr>\n  <tr>\n   <td>ta\n   </td>\n   <td>Tamil\n   </td>\n  </tr>\n  <tr>\n   <td>te\n   </td>\n   <td>Telugu\n   </td>\n  </tr>\n  <tr>\n   <td>ml\n   </td>\n   <td>Malayalam\n   </td>\n  </tr>\n  <tr>\n   <td>or\n   </td>\n   <td>Oriya\n   </td>\n  </tr>\n  <tr>\n   <td>ur\n   </td>\n   <td>Urdu\n   </td>\n  </tr>\n  <tr>\n   <td>bh\n   </td>\n   <td>Bhojpuri\n   </td>\n  </tr>\n  <tr>\n   <td>ne\n   </td>\n   <td>Nepali\n   </td>\n  </tr>\n</table>\n\n___\n\n\n# Image Resolutions\n\n## Handling Image Url for Different Resolutions/Quality\n\nThe content fetch API provides *_images_* field, having one or more image urls for the story card. The image url will have the following format:\n\n>[http://bcdn.newshunt.com/{CMD}/{W}x{H}_{Q}/(image_folder).{EXT}]\n\nWhere,\n\n*   **_{CMD}_** = one of _“crop”_ or _“resize”_\n\tIf cropped, Dailyhunt will return the exact image size center cropped\n\tIf resized, Dailyhunt will return the size closest to the one specified.\n\n*   **_{W}_** = Desired width of the image based on your user’s device dimension\n*   **_{H}_** = Desired height of the image based on your user’s device dimension\n*   **_{Q}_** = Desired image quality in percentage based on user’s network quality, highest possible value is 100 and quality value is directly proportional to the image file size\n*   **_{EXT}_** = Desired image extension such as _webp_, _jpg_, etc.\n\nYou should take care of replacing the above placeholders with appropriate values matching your user’s device & network speed qualifier. \n\nDailyhunt will dynamically generate each image matching your criteria & cache on Dailyhunt’s CDN.\n\n\n# Content Types \n\nPossible values of the \"_Content Type_\" of a card are as follows:\n\n\n<table>\n  <tr>\n   <td><strong>Content Type</strong>\n   </td>\n   <td><strong>Applicable Fields from (/api/v2/syndication/items)</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>STORY\n   </td>\n   <td>All the fields except \"collectionItems\"\n   </td>\n  </tr>\n  <tr>\n   <td>VIDEO\n   </td>\n   <td>All the fields except \"collectionItems\"\n   </td>\n  </tr>\n  <tr>\n   <td>PHOTO\n   </td>\n   <td>All the fields except \"collectionItems\"\n   </td>\n  </tr>\n  <tr>\n  <td>\n  ASTROLOGY (similar to STORY, belonging to ASTRO category)\n  </td>\n  <td>\n  All the fields except \"collectionItems\"\n  </td>\n  </tr>\n   <tr>\n   <td>VHMEME (Dailyshare cards)\n   </td>\n   <td>All the fields except \"collectionItems\"\n   </td>\n  </tr>\n  <tr>\n   <td>BANNER\n   </td>\n   <td>images & deepLinkUrl\n   </td>\n  </tr>\n  <tr>\n   <td>QUESTION_MULTI_CHOICES\n   </td>\n   <td>All the fields including \"collectionItems\" \n   </td>\n  </tr>\n  <tr>\n   <td>HTML\n   </td>\n   <td>*description* & *deepLinkUrl* (description will have HTML content for dynamic content channels such as for Elections, Cricket etc)\n   </td>\n  </tr>\n</table>\n\n\n\n# Feature Mask for advanced features\n\nThe __**pfm(Partner feature mask)**__ parameter in Channels and Items API controls which features are enabled for a particular partner or channel.\nIn basic integration, only news items are served under each channel.\nFor advanced cards and features like videos and DailyShare cards etc, the appropriate value of __**pfm**__ has to be set.\n\nThe value of pfm is the sum of all bit vlaues of desired features by a partner. \n\nEach feature is controlled by a specific bit defined.\n\nList of available features:\n\n\n<table>\n  <tr>\n   <td><strong>Feature</strong>\n   </td>\n   <td><strong>Value</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>LIVE_TV_CARD\n   </td>\n   <td>1\n   </td>\n  </tr>\n  <tr>\n   <td>CRICKET_CARD(Brief)\n   </td>\n   <td>8\n   </td>\n  </tr>\n  <tr>\n   <td>HERO_CARD\n   </td>\n   <td>16\n   </td>\n  </tr>\n  <tr>\n   <td>VIDEO_CHANNELS\n   </td>\n   <td>32\n   </td>\n  </tr>\n  <tr>\n   <td>VIRAL_CHANNELS\n   </td>\n   <td>64\n   </td>\n  </tr>\n   <tr>\n   <td>CRICKET_CARD(Detailed)\n   </td>\n   <td>128\n   </td>\n  </tr>\n</table>\n\n\n*Bit 2 and 4 are reserved for some default feature.\n\nFor example:\n\nIf a partner wants to get HERO cards and Videos, the pfm value needs to be set to 16+32 = 48\n\nIdeally, the pfm should be set at the channels API level. The contenUrl of each channel in the response inherently has the desired value of *_fm_*.\n\nThe value of *_fm_* of a particular channel should only be modified in case there is specific change needed in one particular channel. \n\n\n\n# UI Type - Content Type Mapping\n\n\n<table>\n  <tr>\n   <td><strong>Content Type <em>type</em></strong>\n   </td>\n   <td><strong>Card Layout <em>uiType</em></strong>\n   </td>\n   <td><strong>Example</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>STORY\n   </td>\n   <td>NORMAL \\\n(with image)\n   </td>\n   <td>\n\t<img src=\"https://imgur.com/e0G5V4Z.png\" width=\"\"  title=\"story_normal_img\">\n\t<img src=\"https://imgur.com/YzaqU7f.png\" width=\"\"  title=\"story_normal_img\">\n\n   </td>\n  </tr>\n  <tr>\n   <td>STORY\n   </td>\n   <td>NORMAL (without image)\n   </td>\n   <td>\n\t<img src=\"https://imgur.com/aoNPCiw.png\" width=\"\" title=\"story_normal\">\n   </td>\n  </tr>\n  <tr>\n   <td>STORY\n   </td>\n   <td>HERO\n   </td>\n   <td>\n   <img src=\"https://imgur.com/i4Wtdco.png\" width=\"\" title=\"story_hero\">\n   <img src=\"https://imgur.com/Mb5utcK.png\" width=\"\" title=\"story_hero\">\n   </td>\n  </tr>\n  <tr>\n   <td>STORY\n   </td>\n   <td>TILE_3\n   </td>\n   <td>\n<img src=\"https://imgur.com/lDZa2G9.png\" width=\"\" title=\"story_tile_3\">\n   </td>\n  </tr>\n  <tr>\n   <td>PHOTO\n   </td>\n   <td>TILE_3\n   </td>\n   <td>\n<img src=\"https://imgur.com/lDZa2G9.png\" width=\"\" title=\"photo_tile_3\">\n   </td>\n  </tr>\n  <tr>\n   <td>PHOTO\n   </td>\n   <td>GRID_3\n   </td>\n   <td>\n<img src=\"https://imgur.com/i3UKx2K.png\" width=\"\" title=\"photo_grid_3\">\n   </td>\n  </tr>\n  <tr>\n   <td>PHOTO\n   </td>\n   <td>GRID_5\n   </td>\n   <td>\n<img src=\"https://imgur.com/FZ5ohfc.png\" width=\"\" title=\"photo_grid_5\">\n   </td>\n  </tr>\n  <tr>\n   <td>VIDEO\n   </td>\n   <td>NORMAL\n   </td>\n   <td>\n<img src=\"https://imgur.com/BkeNnVH.png\" width=\"\" title=\"video_normal\">\n   </td>\n  </tr>\n  <tr>\n   <td>VIDEO\n   </td>\n   <td>HERO\n   </td>\n   <td>\n<img src=\"https://imgur.com/rtYL66n.png\" width=\"\" title=\"video_hero\">\n   </td>\n  </tr>\n  <tr>\n   <td>BANNER\n   </td>\n   <td>NORMAL\n   </td>\n   <td>\n<img src=\"https://imgur.com/K76LEi2.png\" width=\"\" title=\"banner_normal\">\n   </td>\n  </tr>\n  <tr>\n   <td>QUESTION_MULTI_CHOICES\n   </td>\n   <td>GRID\n   </td>\n   <td>\n<img src=\"https://imgur.com/00PZKh2.png\" width=\"\" title=\"q_multi_grid\">\n   </td>\n  </tr>\n  <tr>\n   <td>QUESTION_MULTI_CHOICES\n   </td>\n   <td>TAGS\n   </td>\n   <td>\n<img src=\"https://imgur.com/6jUNzFj.png\" width=\"\" title=\"q_multi_tags\">\n   </td>\n  </tr>\n  <tr>\n   <td>QUESTION_MULTI_CHOICES\n   </td>\n   <td>CAROUSEL\n   </td>\n   <td>\n<img src=\"https://imgur.com/jlTMzW2.png\" width=\"\" title=\"q_multi_carousel\">\n   </td>\n  </tr>\n</table>\n\n\n\n# Managing Clickouts\n\n\n\n- When your user clicks on a story card, you will invoke the story card **deepLinkUrl** which is given in the [**syndication/items** api response](https://api-syndication.dailyhunt.in/#b35b0121-ae73-4532-8d83-8d5bd0834f0d) \n\n\tYou need to add the below to **deepLinkUrl**:\n\t* Unique **puid**  \n\t* **Dailyhunt Cookie (dhFeedV1)** while calling **deepLinkUrl**\n\t\n\tFor e.g:\n\t\n\tIf the deepLinkUrl received from the items API is:\n\t\n\t> http://m.dailyhunt.in/news/india/english/ibtimes-epaper-ibtimes/just+let+the+original+be+malaika+arora+on+chaiyya+chaiyya+being+recreated-newsid-168150810?mode=pwa&s=<partner>&ss=Browser-Feed&utm_source=<partner>&utm_medium=Browser-Feed&utm_campaign=<partner>-Browser-Feed&lite=true&prevRef=<partner>1&partnerRef=%7B%22pid%22%3A%22<partner>%22%7D\n\t\n\tappend **puid**\n\t\n\t> http://m.dailyhunt.in/news/india/english/ibtimes-epaper-ibtimes/just+let+the+original+be+malaika+arora+on+chaiyya+chaiyya+being+recreated-newsid-168150810?mode=pwa&s=<partner>&ss=Browser-Feed&utm_source=<partner>&utm_medium=Browser-Feed&utm_campaign=<partner>-Browser-Feed&lite=true&prevRef=<partner>1&partnerRef=%7B%22pid%22%3A%22<partner>%22%7D**&puid={puid_value}**\n\n- Dailyhunt will include the some explicit tracking parameters in the **deepLinkUrl**. These parameters should be retained as is.\n\nFor eg: s, ss, utm_medium, partnerRef etc.\t\n\t\n\n__*These are important to ensure proper tracking and attribution.*__\n\n\nThe deep link URL will either open in the browser (if user does not have Dailyhunt app installed) or in the Dailyhunt app (if user has Dailyhunt app installed & chooses to open with Dailyhunt app)\n\n\n\n\n\n# Managing Tracking\n\nTo help measure/track the cards seen by the user, you will need to pass the tracking data for each item card seen by your user. To enable this, Dailyhunt provides the tracking data & tracking POST URLs in the Content Fetch API response.\n\nThis tracking needs to be enabled for each list view. \nA call is required to be made to dailyhunt tracking server for every list view that is invoked:\n\n  * As the first page in a new channel \n  * As the next page in the same channel\n  * On load of the list\n  \n\n### How to track the seen cards\n\n1. Dailyhunt provides **trackData** field for each card, this is mentioned in the [**Content Fetch API**](https://api-syndication.dailyhunt.in/#b35b0121-ae73-4532-8d83-8d5bd0834f0d) section,\n2. In the same response above, Dailyhunt also provides a tracking POST URL via the **trackUrl** field.\n\nYou will need to form an array of the **trackData** values and POST the same to the **trackUrl** for the cards seen by the user. \nFor e.g, if the pageSize is 10, the track request will contain 10 items in the array.\n\nYou can do this periodically or every time user sees a page worth of cards (as close to the user activity as possible). Please refer to [**Tracking API**](https://api-syndication.dailyhunt.in/#a2d23afb-1a6c-426c-85b4-7a6241bc402f) for more details.\n\n# Attribution \n\n<a href=\"https://www.comscore.com/\">ComScore</a> is a provider for audience measurement using Unified Digital Measurement® (UDM) methodology, which accounts for all unique site visitors from all platforms.\nIt is an industry standard traffic attribution tool that helps advertisers validate attributable traffic data to each site / app / service etc. \n\nFor each __Pageview__ that occurs on a particular URL, a single ping is sent to ComScore to count the respective pageview as valid. You can find more info here - https://www.comscore.com/About\n\n\n## Comscore ListView attribution\n\nThe requirement is that the partner places this tracking pixel on the list page so that all list pageviews that occur can be attributed as Dailyhunt content pageviews on ComScore. When each page is loaded (page 1, page 2 etc.), this ping will need to be made.\n\nA call is required to be made to comscore for every list view that is invoked:\n\n  * As the first page in a new channel \n  * As the next page in the same channel\n  * On load of the list\n\nThis can be done alongside each tracking call for list views.\n\n### How to get the ComScore Url?\n\nThe ComscoreUrl that needs to be pinged is available as a part of [**Content Fetch API**](https://api-syndication.dailyhunt.in/#b35b0121-ae73-4532-8d83-8d5bd0834f0d) , as shown below:\n\n```\n \"track\": {\n        \"comscoreUrls\": [\n            \"http://b.scorecardresearch.com/p?c1=2&c2=21733245&c4=http://m.dailyhunt.in/news/&c9=m.dailyhunt.in\"\n        ]\n    }\n```\n\nThere are two options to do this  basis the protocol used HTTP or HTTPS .\n1. Via javascript placed within the page (for browser integrations)\n2. Direct call (for native or any other non-browser integrations)\n\n### Javascript Approach\n\nInclude the below script tag for every list view:\n\n\t<div id=\"csDiv\"></div> <script> document.getElementById(\"csDiv\").innerHTML = '<img src=\"PLACE COMSCORE URL DYNAMICALLY FROM THE API HERE\" />'; </script>\n\t\n### Direct URL Approach\n\nIn this approach the client loading content page needs to fire a call to ComScore url fetched from the API.\n\nThis calls sets cookie back to client on 1st time call. Client needs to pass this cookie in all subsequent calls to ComScore. All standard libraries handles it automatically.\n\n\n\n# Collecting User Feedback On Cards\n\nFor all the cards displayed at your end, your user may want to give feedback about the cards seen. Dailyhunt provides ability to show the specific feedback options that can be displayed to your user & allow to send the signals to the Dailyhunt server. Dailyhunt will use these signals to further improve the personalized feed of your user.\nRefer : [Feedback API](https://api-syndication.dailyhunt.in/#74e3a9ab-693f-4743-83d0-366d24eea240)\n\n\n\n# Integration Points Of Contact\n\n\n<table>\n  <tr>\n   <td><strong>Contact</strong>\n   </td>\n   <td><strong>Primary</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>Das Diwakar (<span style=\"text-decoration:underline;\">dasdiwakar.bommaji@verse.in</span>)\n<p>\nShashikant Kulkarni (<span style=\"text-decoration:underline;\">shashikant.kulkarni@dailyhunt.in</span>)\n   </td>\n   <td>Tech\n   </td>\n  </tr>\n  <tr>\n   <td>Preeti Jain (<span style=\"text-decoration:underline;\">preeti.jain@verse.in</span>)\n   </td>\n   <td>Product/UX\n   </td>\n  </tr>\n</table>\n\n\n# APIs available","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"9554411","team":597243,"collectionId":"0181725d-f099-4ff6-8d88-1c4a5bd081d9","publishedId":"SW7gSj34","public":true,"publicUrl":"https://api-syndication.dailyhunt.in","privateUrl":"https://go.postman.co/documentation/9554411-0181725d-f099-4ff6-8d88-1c4a5bd081d9","customColor":{"top-bar":"FFFFFF","right-sidebar":"F6F5F7","highlight":"2979FF"},"documentationLayout":"classic-double-column","customisation":null,"version":"8.10.0","publishDate":"2021-08-26T04:47:17.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[{"name":"Test Prod","id":"13140a34-7dc5-4cf6-a26d-6f622861c5da","owner":"9554411","values":[{"key":"apiKey","value":"key=YOUR_API_KEY","enabled":true},{"key":"secretKey","value":"YOUR_SECRET_KEY","enabled":true},{"key":"partner","value":"YOUR_PARTNER_CODE","enabled":true},{"key":"signature","value":"VALUE_OF_SIGN_GENERATED","enabled":true},{"key":"timestamp","value":"","enabled":true},{"key":"url","value":"feed.dailyhunt.in","enabled":true},{"key":"puid","value":"test123","enabled":true}],"published":true}],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/48b35c97154787dba154d97dc66fb7199bae00334f55f4949a0db556fed7668d","favicon":"https://res.cloudinary.com/postman/image/upload/v1575372649/team/tt3m2udeeiyfpqhyfwoa.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"},{"label":"Test Prod","value":"9554411-13140a34-7dc5-4cf6-a26d-6f622861c5da"}],"canonicalUrl":"https://api-syndication.dailyhunt.in/view/metadata/SW7gSj34"}