# Populate Knack Object with External source via External Source API

**URL:** https://forums.knack.com/t/populate-knack-object-with-external-source-via-external-source-api/10021
**Category:** API & Custom Code
**Created:** [December 24, 2017, 1:16pm UTC](https://forums.knack.com/t/populate-knack-object-with-external-source-via-external-source-api/10021 "2017-12-24T13:16:08Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![BRUNOCERQU60563](https://sea2.discourse-cdn.com/flex020/user_avatar/forums.knack.com/brunocerqu60563/32/162_2.png) [@BRUNOCERQU60563](https://forums.knack.com/u/BRUNOCERQU60563)
#### Post date: [December 24, 2017, 1:16pm UTC](https://forums.knack.com/t/populate-knack-object-with-external-source-via-external-source-api/10021/1 "2017-12-24T13:16:08Z")

</div>

Hi,

is it possible to populate a Knack object from an external source API?

I would like to use the&nbsp;[https://coinmarketcap.com/api/](https://coinmarketcap.com/api/) to auto populate a knack object, both on IDE and runtime when user submits a button to refresh information.

Any help would be extremely grateful&nbsp;since I'm lost on this one.

Thanks

---

<div class="post-metadata">

### Author: ![Sunny\_Singla](https://sea2.discourse-cdn.com/flex020/user_avatar/forums.knack.com/sunny_singla/32/1007_2.png) [@Sunny\_Singla](https://forums.knack.com/u/Sunny_Singla)
#### Post date: [December 26, 2017, 8:20am UTC](https://forums.knack.com/t/populate-knack-object-with-external-source-via-external-source-api/10021/2 "2017-12-26T08:20:47Z")

</div>

If you required a professional help then please contact me on Skype : sunny\_singla04 or email me on [ssingla1985@gmail.com](mailto:ssingla1985@gmail.com)

---

<div class="post-metadata">

### Author: ![Sunny\_Singla](https://sea2.discourse-cdn.com/flex020/user_avatar/forums.knack.com/sunny_singla/32/1007_2.png) [@Sunny\_Singla](https://forums.knack.com/u/Sunny_Singla)
#### Post date: [December 26, 2017, 5:21am UTC](https://forums.knack.com/t/populate-knack-object-with-external-source-via-external-source-api/10021/3 "2017-12-26T05:21:46Z")

</div>

Hello Bruno,

&nbsp;

No need to Set limit and delay and instead of&nbsp; 'POST' First we can get all object data and check one by one if exist then call 'PUT' if not exist then call 'POST' .&nbsp;

To overcome **setTimeout** &nbsp;functionality you just need to call method one by one, after one method success then call next record below this method .

&nbsp;

Regards,

Sunny Singla&nbsp;

&nbsp;

---

<div class="post-metadata">

### Author: ![BRUNOCERQU60563](https://sea2.discourse-cdn.com/flex020/user_avatar/forums.knack.com/brunocerqu60563/32/162_2.png) [@BRUNOCERQU60563](https://forums.knack.com/u/BRUNOCERQU60563)
#### Post date: [December 25, 2017, 8:38pm UTC](https://forums.knack.com/t/populate-knack-object-with-external-source-via-external-source-api/10021/4 "2017-12-25T20:38:51Z")

</div>

Sunny thanks for the reply

I did it :)

But to bypass the API transaction limits I had to put in a delay, which turns the routine a little slow ( I'm refreshing 1000 records )

Also, don't quite know how to auto delete all records prior to refresh the information, since this code will add another set of records to the existing ones, and what I need is to replace them all.

Another step would&nbsp;be to run this every hour, don't think Knack can handle this level of customization yet

//CODE#1 Button to get coinmarketcap values via Json  
$(document).on('knack-scene-render.scene\_1', function(event, scene) {  
   
 $('#view\_1 .view-header').after('\<div style="padding:5px"\>\<a href="#" id="refreshcmc" class="kn-button"\>Update From Coinmarketcap\</a\>\</div\>');

$('#refreshcmc').click(function(event) {  
 event.preventDefault();  
 // get data from coinmarketcap (Json)  
   
 function loadJSON(callback) {

var xobj = new XMLHttpRequest();  
 xobj.overrideMimeType("application/json");  
 xobj.open('GET', '[https://api.coinmarketcap.com/v1/ticker/?limit=1000](https://api.coinmarketcap.com/v1/ticker/?limit=1000)', true);  
 xobj.onreadystatechange = function() {  
 if (xobj.readyState == 4 && xobj.status == "200") {

// .open will NOT return a value but simply returns undefined in async mode so use a callback  
 callback(xobj.responseText);

}  
 }  
 xobj.send(null);

}  
   
 loadJSON(function(response) {  
 // Do Something with the response e.g.  
 jsonresponse = JSON.parse(response);

var data = {};  
   
 // set the delay to prevent hitting Knack API rate limit (milliseconds)  
 var myDelay = 100;  
   
 //Knack.showSpinner();  
 for (var i = 0, len = jsonresponse.length; i \< len; i++) {  
   
   
 data.field\_6 = jsonresponse[i].id;  
 data.field\_7 = jsonresponse[i].name;  
 data.field\_8 = jsonresponse[i].symbol;  
 data.field\_9 = jsonresponse[i].rank;  
 data.field\_10 = jsonresponse[i].price\_usd;  
 data.field\_11 = jsonresponse[i].price\_btc;  
 //data.field\_12 = jsonresponse[0].24h\_volume\_usd;  
 data.field\_13 = jsonresponse[i].market\_cap\_usd;  
 data.field\_14 = jsonresponse[i].available\_supply;  
 data.field\_18 = jsonresponse[i].total\_supply;  
 data.field\_19 = jsonresponse[i].max\_supply;  
 data.field\_15 = jsonresponse[i].percent\_change\_1h;  
 data.field\_16 = jsonresponse[i].percent\_change\_24h;  
 data.field\_17 = jsonresponse[i].percent\_change\_7d;  
 data.field\_20 = jsonresponse[i].last\_updated;

setTimeout(runapi(data), myDelay);

}; // for   
 // Knack.hideSpinner();   
 alert('All information refreshed');   
   
 function runapi(data) {  
 $.ajax({  
 url: "[https://us-api.knack.com/v1/objects/object\_2/records/](https://us-api.knack.com/v1/objects/object_2/records/)",  
 type: "POST",  
 headers: {  
 "X-Knack-Application-Id": "\*\*\*\*\*\*\*\*\*\*\*",   
 "X-Knack-REST-API-Key": "\*\*\*\*\*\*\*\*\*\*\*"  
 },  
 data: data,  
 success: function(response) {  
 //console.log('Checks updated!!!');  
 }  
 });  
   
 }  
   
   
 });  
   
   
 });  
});

&nbsp;

&nbsp;

---

<div class="post-metadata">

### Author: ![Sunny\_Singla](https://sea2.discourse-cdn.com/flex020/user_avatar/forums.knack.com/sunny_singla/32/1007_2.png) [@Sunny\_Singla](https://forums.knack.com/u/Sunny_Singla)
#### Post date: [December 25, 2017, 7:37pm UTC](https://forums.knack.com/t/populate-knack-object-with-external-source-via-external-source-api/10021/5 "2017-12-25T19:37:11Z")

</div>

Hello Bruno,

It's simple you can just call ajax call to update knack object like below

&nbsp;

$.ajax({  
 url: "[https://us-api.knack.com/v1/objects/](https://us-api.knack.com/v1/objects/)" + Knack\_Object\_id + "/records/" + id,  
 type: 'PUT',  
 data: data,  
 headers: {  
 'X-Knack-Application-Id': API\_ID,  
 'X-Knack-REST-API-Key': API\_Key  
 },  
 success: function (response) {

}

});

Hope this help otherwise you can contact me on skype : sunny\_singla04

Thanks&nbsp;

---

<div class="post-metadata">

### Author: ![BRUNOCERQU60563](https://sea2.discourse-cdn.com/flex020/user_avatar/forums.knack.com/brunocerqu60563/32/162_2.png) [@BRUNOCERQU60563](https://forums.knack.com/u/BRUNOCERQU60563)
#### Post date: [December 24, 2017, 6:28pm UTC](https://forums.knack.com/t/populate-knack-object-with-external-source-via-external-source-api/10021/6 "2017-12-24T18:28:55Z")

</div>

ok, so here what I accomplish so far:

I've created a button on a form to refresh information from the external source, it's a json&nbsp;file, and that part is already working, I can read it's contents, now I just don't know how to use this data to update my object, I want to replace all data on my object with this Json&nbsp;records.

$(document).on('knack-scene-render.scene\_1', function(event, scene) {  
   
 $('#view\_1 .view-header').after('\<div style="padding:5px"\>\<a href="#" id="refreshcmc" class="kn-button"\>Update From Coinmarketcap\</a\>\</div\>');

$('#refreshcmc').click(function(event) {  
 event.preventDefault();  
 // get data from coinmarketcap (Json)  
   
 function loadJSON(callback) {

var xobj = new XMLHttpRequest();  
 xobj.overrideMimeType("application/json");  
 xobj.open('GET', '[https://api.coinmarketcap.com/v1/ticker/](https://api.coinmarketcap.com/v1/ticker/)', true);  
 xobj.onreadystatechange = function() {  
 if (xobj.readyState == 4 && xobj.status == "200") {

// .open will NOT return a value but simply returns undefined in async mode so use a callback  
 callback(xobj.responseText);

}  
 }  
 xobj.send(null);

}  
   
 loadJSON(function(response) {  
&nbsp; &nbsp;jsonresponse = JSON.parse(response);

alert(jsonresponse[0].name);&nbsp; // JUST TO CHECK IF DATA HAS PASSED  
 });  
  
 });  
});

&nbsp;
