Search API Connector Documentation


ImportAPI Custom Function

The API Connector add-on for Google Sheets activates a custom function called IMPORTAPI. This function works similarly to functions like IMPORTDATA, IMPORTJSON, etc. It enables you to call your APIs (in JSON, XML, or CSV format) from directly within a Google Sheets cell, instead of the standard method of requesting APIs via the add-on sidebar.

Example using the IMPORTAPI function with the Genderize API to predict gender for a list of names:


Before You Begin

If you haven’t already, click here to install the API Connector add-on from the Google Marketplace.

Why Use the ImportAPI Function?

  • copy down an API request to run it against a list of input cells,
  • run requests by changing cells instead of opening the sidebar,
  • get a faster potential data refresh rate than you can achieve through scheduling.
Note that you can’t use scheduling with the IMPORTAPI function. If you need to schedule requests, please use the standard sidebar method.

Comparison: ImportAPI vs. Sidebar

Either way, begin by configuring and saving your request in the API Connector sidebar. You can then choose whether to run your API requests through the sidebar (by clicking Run) or through your sheet using the IMPORTAPI custom function. The following table identifies the key differences between the two methods.

Run API requests
Set headers, JMESPath, report styles, etc.
Use cell values in requests
Schedule data refreshes at hourly, daily, or monthly intervals
Run requests while the sheet is closed
Process API requests for up to 6 minutes per execution
Process API requests for up to 30 seconds only
Trigger requests by clicking a checkbox or changing cells
Quick, dynamic, a bit hack-y 🙂 and sometimes error-prone 🙁

In general, use the standard sidebar for regular, reliable, scheduled reporting. ImportAPI is designed for faster, dynamic API pulls that you use while active in your sheet. If you encounter errors, please check the section on Error Messages for help resolving them.

ImportAPI Syntax

The syntax for this feature is =IMPORTAPI(requestName, url, cell).

  • requestName Required. Refers to the API request name you’ve saved within API Connector. By referencing the request name, the IMPORTAPI function will automatically make an API call that includes that request name’s headers, report style, and other saved options.
  • url Optional. Allows you to specify a request URL. If you don’t include this argument in your function, your request will use the request URL from your saved request.
  • cell Optional. Refers to any cell in your sheet, e.g. $A$1. Google Sheets will refresh data whenever a function changes, so you can force API refreshes by changing the value in $A$1. This needs to be the third argument, so if you apply it without including the optional URL in your function, you should add an empty string into the second position, e.g. =IMPORTAPI("Binance","",$A$1).

Example 1: Basic Request

If you’ve saved an API request called Binance, you can now run this request with the following custom function:


Example 2: With URL Parameter

You can include a request URL parameter, so the request will use this URL instead of the URL in your saved Binance request. All other settings will be retained:


Example 3: Fast Cell-Based Refresh

This example function will allow you to refresh your data every time the value in cell $A$1 changes.


If you want to use the same URL from your saved API request, you can leave that parameter out, like this:


Add a checkbox: Populate cell $A$1 with a checkbox (Insert > Checkbox) so you can update your sheet each time you check or uncheck the box.

Example 4: Reference a Cell

Referencing a cell enables you to base your API calls on changing URL inputs. For example, you can enter BTCUSDT into cell A1, and then construct your custom function like this:


Now, every time you edit cell A1 with a new currency pair, your data will automatically refresh.


Example 5: Reference Multiple Cells

Like shown in the first GIF, there are some situations where you may want to “zip” through a list of names or values and perform an API call on each one. Let’s use the genderize API as an example:


In order to accomplish this stacked API output, you will need to go to Output options and then Output Mode. Choose the Append radio button (this removes the headers).

Setup your API call in the adjacent cell and just drag it down to run it for each respective cell. Bam!

Note that “Append” mode does not return the column names, so you will need to manually enter them yourself.

Excess Recalculation

Google runs custom functions when the sheet is opened and when the inputs to the function have changed. It may also run functions after a period of inactivity as well (Google hasn’t confirmed this, but people have reported it).

Therefore, if you have a large number of IMPORTAPI calls, it’s possible to quickly rack up thousands of requests. This can hit Google’s 20K requests/day limit, as well as the limits of the API you’re calling. When you hit these limits, your data will usually stop refreshing altogether.

Unfortunately we can’t change how often custom functions run, so we can only offer the following suggestions:

  • Move your IMPORTAPI requests into a separate worksheet, to avoid inadvertently triggering API calls when you’re working on unrelated data calculations.
  • Under File > Spreadsheet Settings > Calculation, check that the Recalculation setting is “On change” and not “On change and every minute” or “On change and every hour”.
  • Wrap any automatically updating IMPORTAPI calls in a SWITCH() or IF() statement (info). For example, you could make a function like this:=if(B1="on", IMPORTAPI("Binance"),"switched off"), so the function only runs when you enter the text “on” in cell B1.
  • If you need to run a large quantity of queries, move requests to the standard sidebar. Many APIs provide some sort of batched request feature, and/or you can use API Connector’s multi-query function to cycle through a list of requests.

Error Messages

ImportAPI is a quick and convenient way to run dynamic API requests while you are active in the sheet, but is subject to a number of limitations. If you are unable to resolve the following errors, please run your requests through the sidebar instead of through the ImportAPI custom function.

#NAME? along with Unknown function: ‘ImportAPI’
This error occurs because, in some cases, Google doesn’t recognize the IMPORTAPI custom function at all. This is a bug on Google’s side associated with custom functions (info). As of now there is no reliable fix for the above issue, but here are a few things you can try:

  • Re-open the sidebar and run your saved request. This often makes Google recognize the custom function.
  • based on this this comment, please try clicking Add-ons > API Connector > Help > View in Store. After “View in store”, click Settings (gear icon top-right) > Manage Apps > Options (3 vertical dots) > Toggle “Use in this document”. After toggling off and on it may work again.
  • Another option is to copy your requests into a new sheet, it often works in one sheet but not another.
  • Refresh your sheet, or wait and try again later.

Internal error executing the custom function
This error comes from Google, and means that your custom function has taken too long (more than 30 seconds) to execute (documentation).

To address, reduce the size of your request or run your request through the sidebar rather than through IMPORTAPI.

You may see some cells get stuck with a “Loading…” error. See here and here for relevant discussions. Generally the problem occurs when updating a lot of cells at once. You can usually fill in the missing values by changing the inputs of affected cells one by one to force a recalculation.

Pagination is only available for paid users (when you are a paid user).
Google generally seems to associate custom functions with the Sheet owner’s account, regardless of who is actually running the function. This means, if you’re combining IMPORTAPI with pro features like pagination or JMESPath, you might receive an authorization error where your pro account isn’t recognized. You can usually resolve this issue by transferring sheet ownership to yourself, or making a copy of the sheet where you are the owner.

Request failed, cannot find function split in object true
This error occurs when you are missing a middle argument in your function. To resolve, make sure you’ve included the middle argument, even if it’s empty, like this: =IMPORTAPI("saved request","",$A$1)

Service invoked too many times for one day: urlfetch
This error message is from Google. If you have a large number of IMPORTAPI calls, it’s possible to quickly rack up thousands of requests, thus hitting Google’s 20k/day limit. See here for more information and ideas to reduce your API calls.

You do not have permission to call setValues
This error sometimes occurs when you wrap your IMPORTAPI in other formulas, such that the result would expand outside the immediate cell. As discussed here, the documentation says “if a custom function returns a double array, the results overflow the cell containing the function and fill the cells below and to the right of the cell containing the custom function“. Custom functions are not permitted to set values in adjacent cells.

Usage Notes

  • If you’d like to avoid printing out header keys from the API response, switch to Append mode (under Output options).
  • Standard API Connector request limits do NOT apply, the IMPORTAPI feature is free and unlimited (up to Google Sheets’ own limits).
Previous Filter Fields (JMESPath)
Next Multi-Query Requests

35 thoughts on “ImportAPI Custom Function”

  1. This is great but I have one question. In the animated example on this site showing when you change cell a1 to another value the data is then refreshed. The formula is actually located in cell c1. I have essentially the same setup on my spread sheet and it works great! BUT when the data comes in after a couple runs it overwrites the formula that is in the cell and then stops the whole auto refresh on change function. How can I fix this?

    • I’ve tried and can’t replicate this, in my tests the formula remains a formula and doesn’t get overwritten. Would it be possible for you to share your sheet so I can check it out?

  2. Hello Ana! I’ve said it before, I really like what you’ve built, congrats!
    I have a small problem though. Sometimes the IMPORTAPI() function does not load when I create a new GSheet. I can run the request normally but when I try to do it with the IMPORTAPI() function it does not run because it does not find the function. Would love your help here. I tried refreshing the GSheet sometimes and it still doesn’t load the function. Thank you!

    • Thank you! And sorry you’re having trouble with the custom function. I think this is an issue with Google Sheets, related to caching or authorization. Two suggestions:
      1) When you create a new sheet, can you please try opening up the sidebar before running ImportAPI() in the sheet? That should initiate the API Connector code, including the custom function.
      2) Clear your cache and do a hard refresh. You can do this by opening Dev Tools (click Ctrl-Shift-J or Cmd-Option-J), then long-press the Refresh symbol and choose “Empty cache and hard reload.”

  3. Hello Ana,

    I am new here and I am trying to discover the potential of this tool by myself and of course I’ve found so much doubts. I am trying to create an API that changes based on a cell on the spreedshet. My request has 2 variables as begining and end that should change accordingly to the cell.

    Is it possible?
    ps: is a date here that should change based on a cell)&end=“(there is a date here that should change based on a cell)

    Kindly regards;

    • Hi Allan! We sent you a support email separately to work through this, but just to leave some info here as well, there are 2 potential ways to do this:
      1) if you’re using the IMPORTAPI() function, you’d basically follow the instructions shown in the “Example Referencing a Cell” section above. Your cell would include a formula like =IMPORTAPI("xyz",""&A1"&"&end="&B1), where cells A1 and B1 contain your start and end dates.

      2) Alternatively, you can use the standard sidebar method and reference cells that way. In that case, if your dates were in cells A1 and B1, your request would look like this:!A1+++&end=+++Sheet1!B1+++

  4. When I run the formula, to an entire column, only the last row shows data, because all above cells show in each of them: “The result in this cell is now showed because it would override the data from the bottom cell.”
    This happens mainly because the Call I’m using gives me 2 rows but one of them is the Header.
    If there is a way that I could drop the Header row for my methods this would be solved.
    Is there any way to do this?

    • Hi there, please try changing to “Append” mode (located under Output Options) and re-saving your request. Append mode will drop the headers.

  5. Hello. Great feature.
    Is there any possibility to add auto refresh like on dally basis for those with a IMPORTAPI?
    And is there any extra limitations from Google Sheets on the number of requests run daily?

    • Hey Glib, there’s no way to set up daily auto-refresh for IMPORTAPI(). It’s basically a function just like SUM() or any other function, so it doesn’t support scheduling, and runs only when the sheet is open. If you want daily refreshes, you can use the standard sidebar method and set up scheduling.

      Google Sheets does have limits on the number of times you’re allowed to run queries, as described here. The most relevant limit is that you may only make 20,000 fetch calls a day.  Normally it’s very hard to run so many requests, but it’s possible to use IMPORTAPI() a little carelessly and inadvertently hit those limits.

  6. Hi Ana,

    I’d love to use IMPORTAPI in ‘Overwrite’ mode but without headers included, e.g. just like in your example “EXAMPLE REFERENCING MULTIPLE CELLS,” but when I toggle the fast cell based refresh the response data is overwritten. I was thinking about the way QUERY works, where you can just put a ‘0’ in at the end in order to not have headers returned. Is something like that possible with IMPORTAPI?


  7. Hi,
    I have a question regarding to the autorefresh function with import api. I am referencing the $A$1 cell to the googlefinance currency so it updates every 2 minutes as you suggested. I am referencing the importapi to the saved request that pulls data. Therefore, the importapi looks like =importapi(“saved request”, $a$1) – when i do it i see this error “Request failed: Cannot find function split in object 0.842075.”. What should I do in that case?

    • Hi Wojtek, I think the problem is that you’re missing the middle argument in your request. Can you please try the following instead?
      =IMPORTAPI("saved request","",$A$1)

  8. What would my ImportAPI() look like if I wanted to refresh every 30 minutes. Could I use an if statement combined with some type of now()= etc. or is there an easier way to do this using this function? I pretty much want to be able to have this run every 30 minutes so that when I connect it to a tool, it will be up to date. (side note: the reason I don’t connect the api directly to the tool is because it will not allow me to append results to store long term like this add-in will).


    • Also it appears that the “append” option moves columns around every other time (or at least it does for me). I ran it 4 times and every other time 2 or so of the columns were flipped. This makes it really hard to dedupe. Not sure if anyone else has had this problem too.

      • This isn’t directly related to append mode, it’s related to how the API sends back the data, so you’d see the same column order whether in overwrite or append mode. API Connector displays the data as it gets returned from the API, and some APIs switch the order or leave out fields depending on what fields are populated. You can see some suggestions for remedying this in the troubleshooting guide (check the section called ‘Columns Shifting’).

    • Sorry, there’s no way to set IMPORTAPI() to refresh every 30 minutes. Custom functions behave like any other function in sheets, and can’t be scheduled. If you want to have scheduled refreshes you’d need to use the scheduling function. Google limits all add-ons to 1x an hour scheduling, though, though, so there’s no way to refresh every 30 minutes unless you make your own custom script.

    • IMPORTAPI is just a function to call your sidebar requests, so you put it in the sidebar as usual (generally in the headers or URL query strings, depending on the API).

    • Hi there, IMPORTAPI returns all the data from the API response. If you’d like to limit your data please check the documentation of the API you’re working with. Most APIs have some way to limit or filter the data that they return, or you can check through the docs for an endpoint that returns current data only.

  9. Hi Ana, great work, thanks!

    I’m really confused about how to use this. If i remove the api call in the sidebar, there is an error, so i have to leave it in. I can add the API call in a cell in the sheet that i’ve set it too, this works. But then i I run the sidebar script, it overwrites the entire page right?

    I want to design the page with various date coming in from multiple calls from CryptoCompare. I’m trialling the Pro version of the app so I am able to do that. But if it keeps overwriting the IMPORTAPI cells than how do you even use it?

    I think I’m missing something very obvious, maybe it’s something that you can include in the tutorial above.

    Thanks again,

    • Hi Marc! Thanks for the message and sorry for the confusion. I think the key point here is that IMPORTAPI is generally used as an alternative method of running requests. You store your request details via the sidebar, but then you can choose whether to run them the standard way (by clicking Run), or by using IMPORTAPI. They are 2 different methods, so that’s why you won’t normally have this type of conflict.

      With that said, it is still possible to use them together. In that case you would just set your request output to a different tab from the one you’re using IMPORTAPI in and then the results won’t get overwritten.

      I hope that clarifies things, if not, just let me know and I’ll be happy to explain further.

  10. Hello! An incredibly helpful article! You explained the sequence of actions very easily, thank you!
    I have a few questions:
    1) is it possible to make the data updated? Perhaps by a button that will start the update. Because it helped me only to restart the API (that is, to do everything again according to your instructions). I need to update such a table two or three times a day.
    2) I also need to save the previous data of this table so that I can compare the “updated data” and “previous data”.
    I’m only interested in the price of the cryptocurrency to USDT

    • 1) when I try to update the table via the “Refresh All Now” button, the system shows me the error “ERROR can’t find sheet undefined”

      • ‘ERROR can’t find sheet’ generally means you’ve deleted or renamed your output sheet. Just open up your request and choose a new output sheet, that should resolve the issue.

    • 1) Hi Renne, the data will update any time you make a change in the sheet. I also listed some other ways to refresh your data in this article, like through a checkbox. Or if you’re using the sidebar, you can click Run.
      2) Some APIs let you choose a date for your data pull, or you can try my other add-on Archive Data for this.

  11. Hello Ana,

    I’m trying to install the checkbox trick:

    – When I uncheck the box, it works : the api is working properly

    – When I check the box I get this error: “Request failed, cannot find function split in object true”

    Is there a solution?

    Thank you very much for your help!

    Have a nice day

  12. Hello, thanks for this great article but I have a question regarding the checkbox refresh method.

    I did the exact same as displayed in the article but I have this error : Formula analysis error (translated from French)

    =IMPORTAPI(“SOL/EUR”,””,$Q$3) is the content of this cell and Q3 is the cell with the checkbox.

    I wonder what I did wrong because if I only do =IMPORTAPI(“SOL/EUR”), it works fine.

    Thanks in advance!


Leave a Comment

Table of Contents