Need development and API help? Ask your questions here!
Recently active
Hi! I’m James, an engineer on the API team. Today I’m sharing an update as part of our API infrastructure changes that could affect your API usage, along with some action items that might be relevant.We’ll be implementing a 16,000 character limit on the URL length of requests made to list table records using the public REST API. Once the limit is enforced, requests to this endpoint that exceed 16k characters will begin to fail.Who is impacted?From looking at past usage of our API, the vast majority of requests from users would not exceed or even come close to approaching this limit. We’ve used this data to identify and reach out directly to users who would be potentially affected, but if you currently have a workflow that involves making requests that meet this criteria, or plan to within the next few months, you will need to migrate to one of the suggested alternatives.What do I need to do?If your workflow involves making these requests using Airtable.js, we have already made the chan
Perhaps I’m missing something, but for whatever reason I cannot get a list of bases available to me using the latest OAuth API integration. I have “shared” a couple of bases that I want to be available via the API, but I get nothing but an empty array when querying the List Bases metadata endpoint. curl "https://api.airtable.com/v0/meta/bases" -H "Authorization: Bearer <access_token_from_oAuth_response" {"bases":[]} I have confirmed that my access_token is indeed good does return my user ID and scopes allowed via the token. curl "https://api.airtable.com/v0/meta/whoami" -H "Authorization: Bearer <access_token_from_oauth_response>" {"id":"<my_user_id>","scopes":["data.records:read","schema.bases:read"]} I presume that I haven’t “shared” the base in the way the API expects, but I have not found where I might do that. Ian
Hey there, I have a script which: Takes the Qty of a product and creates rows in another table based on this qty. At the same time it maps 2 x Linked Record fields and sets the row ‘Status-’ to a pre-defined value. The script is running wonderfully until the ‘Qty’ of a product starts to increase - for example I received the ‘Script exceeded execution time limit for 30 seconds’ error based on a qty of 380. I’m a little confused at why this is occurring and wondering if anyone has any suggestions on the script posted below? Thanks in advance. let inputConfig = input.config() let originalLineItem = inputConfig.originalLineItem let originalProject = inputConfig.originalProject let quantity= inputConfig.quantity let tableToUpdate = base.getTable('Inventory Ledger') let updates = new Array for (let i = 0; i < quantity; i++){ updates.push({ "fields": { "Stock! Linked": [{id:originalLineItem[0]}], "Allocated to (remember late is best)": [{id:origina
Hello, This topic has been discussed many times among all the Airtable experts but it has remained similar since it was started. Airtable provides many features in UI or using Interfaces but when you talk about making integration with other tools or using some programming language it still lacks features and also limits in accessing data via API. We can understand that Airtable want to control everything(every request) and they need to make sure that security is not broken by using API and developer options. But I think they give at least some built-in options so developers can use it. For example: If I’ve to access more than 10k records in my custom build CRM/Software, I’ve to make 100 requests with their specific rate limit to fetch that data. If I need to filter some data directly it’s still really slow. I can able to access the base schema or update any basic fields( Manage select field via API is super useful). There are lots of things.
Hello, Is there a chance reading & creating comments would be added to the API? Would be really useful in the integration I’m working on.
The REST call from Appgyver for a new record fails, because the call has a ‘null’ for a linked record. Appgyver won’t remove the field just because its blank, so a null is sent - and Airtable breaks on it.
I have 2 tables. One called Booked jobs and one called Planning I have a form from which a user can add one record at a time to the Booked jobs table. Each booked job could be a service from a list of 3 services: Origin, Destination or Both. For the Origin service there is a Start Date and an End Date. For the Destination service there is a Start Date and an End Date. For the Both service there is a Start Date Origin, End Date Origin, Start Date Destination and End Date Destination. For each date in one of the ranges mentioned above a new record would need to be created in the Planning table with the respective date and some other details from the Booked job. What I have until now is the following: let table = base.getTable('Booked jobs'); let query = await table.selectRecordsAsync(); let destination = base.getTable('Planning'); let prev = input.config(); let typeService = prev.typeService; let startOS = prev.StartOS; let endOS = prev.EndOS; let startDS = prev.StartDS; let endDS = pr
I am trying to use Promise.all to asynchronously get data from an array of urls. I’m fairly new to promises but as far as I understand the below code should work? The code executes but no response is logged from the promise.all Promise.all(urls.map(u=>fetch(u,options))).then(response=>{ console.log(response[0]) }
Hi guys, I was thinking about developing an Airtable extension myself, however, I couldn’t help my curious self but wonder how Airtable is actually integrating the extensions under the hood? How did they implement it so that once I run the Blocks CLI and host my local dev environment, I can connect my live Airtable Base with my locally hosted app? (See here for more details) And once I finish building my application and publish it to the marketplace, how is my finished app integrated to Airtable? Do they bundle up the finished extensions and import them as npm-packages? Would love to have some discussion on that topic :slightly_smiling_face:
Reading through the API help, and searching these forums - I’m not seeing a method for returning all Field ID’s or Names that are used within a Table View. Is the only way to construct a record object using the desired fields found within a view, is to manually type out each of the fields, one by one, in my script / automation? That’s a real pain - I get that views only return the records within that view + all table fields, but it’s … kinda tough that I can at least retrieve the name/ID of visible fields within a view? What options do I have, apart from manually writing out all my required fields within my script? I’m assuming this applies to the Script Extension, Automation and API calls - Does this same limitation exist for custom extension creation too? I also recall reading about a beta API of sorts that … I think did allow for view and field data retrieval? Is that still a closed beta, and does different API address what I’m researching now?
Hi, I have a few tables that only output 100 rows when using Postman. I’m wondering why. Please help.
Hi guys, It looks like a change has happened overnight - URLs to attachments have changed from this structure: https://dl.airtable.com/.attachments/d656d5c54fbc38ad9195c2f62cd02dae/5eb64051/Supreme_Apex-1120x740.jpg To this structure: https://v5.airtableusercontent.com/v1/10/10/1668182400000/q_tvhAt9ivi_oCjJ5LvWQQ/ghcs73y0Vma8Rz6c7EJaen3sRTVMOCrqmPpkS38kxl2SOiMEE5boOfVOorY5nfQ9PZkrQCYfehg76B4CcI8-MA/1wi2qtg7XnHCVhZhtKjxg_BXwwegwsGxphbPlJRYlao This has broken our API integrations for saving images to WordPress / WooCommerce as WordPress requires a file extension to exist. Has there been an announcement anywhere about this major change?
The Shift Scheduler script/extension has failed ever since the daylight savings time change. I am receiving the following messages: Can anyone tell me what’s going on or what I need to change to make this work again? Our team has begun to rely heavily on this script to check who is available for a scheduled shift. Thanks! Manny
Hi, I have studied the API docs and seen infos on how to retrieve a record, but my need is to get all the infos about a record with a special value in a field - say the 1st found “invoice” with “unpaid” in its status field, so I can act on it on an external system and then update the status to “reminded” for example. How would that work ? Thanks !
Hi all, I am using the Spreadsheet Importer in the Scripting Extension to upload an XLSX file to create new records in my table (“Report Data”). One of the fields in this XLSX report is a Customer ID. That should be a linked field to a table called “Customer IDs”. After going through a few different threads, I declared the following variables to create a “Dictionary” array of the Customer IDs (primary field) & their RecordIDs: let IDTable = base.getTable("Customer IDs"); let IDQuery = await IDTable.selectRecordsAsync(); let IDDict = {}; for (let record of IDQuery.records) { IDDict[record.name] = record.id; } Then when I am mapping the fields I am declaring that field like so: let newRecords = xlsxRows.map(xlsxRow => ({ fields: { 'Customer ID': [{ id: IDDict[String(xlsxRow['Customer ID'])] }] } })); This works… only IF the ID already exists. If an ID is new, I get the following error: j: Can't create records: invalid cell value for field '
Hi! I have an issue I think I might be able to solve with automation but just not sure how. I have 3 tables Providers details, Solutions and Parts. When I create a new Provider record I want to use a trigger to populate the name of the Provider into the Solutions table. I want this to happen 30 times as for each new provider I also have to update the same table with 30 parts. Is it possible to create 30 new records in the Solutions table when a new provider is entered into the Provider details table and them simultaneously pull the 30 records from the parts table into Solutions table. Can this be done with Automation? Thank you in advance
I try to sync all rows of a table to sql database. I wrote script. I use offset to get all records. If a new record has been added to the table, then I cannot get it within the current pagination and i must to run sync from begining. Is it rigth? Is it possible to Continuation of pagination?
Hi, How can I get a Record ID by a VLOOKUP type situation by specifiying email in other words I want to pass email I want to find to API and get the record id so I could use it to upload a field. Thanks!
hello everyone! i would like to write a script. that allows we to creat (generate) a stripe payment link in airtable from pressing a button. this is how it would work : i will inter a price in the (price column) then pressing the generate payment link button will then generate a payment link inside the (payement link colmun) corresponding to the price hopefully this was clear and understandable. please anyone help
I am using the “Create records from multiple select” script. I have a table named “Notes” with 1500 rows. There are two relevant columns. One column is a text field named “Description”. The second column is a multi-select field named “Categories.” I want to create a new table which has a unique row for each Category-Description combination. I effectively got your script to work for one record at a time by pressing “Pick a record.” Rather than using “Pick a record” to run the script on each of the 1500 rows separately, is there a way to run the script across all 1500 rows at once, to create thousands of Category-Description rows? I am open to modifying the code, but was curious if there was a known solution before attempting that task. Thank you!
Sorry, but I can’t find examples of how to use Script block to write rich text formatted text to Long Text field with Rich Text enabled. Any references would be greatly appreciated. Thx!
Hi everyone, Recently I am facing an error with the following code: await myTable.updateRecordsAsync([ { id: record.id, fields: { 'Attachment': [ { 'url': "https://dl.airtable.com/.attachments/63001f29cc9836435b1ac84dd7dba62f/98c345c9/63NHT_2.jpg" } ] , }, } ]); The error It was totally fine before. I don’t know why? Thank you
While scoping a new Airtable solution for a client, the topic of forecasting came up and specifically by employing machine learning. There are many definitions of machine learning and while my focus was to at least prove to myself that a Script Block could perform the forecasting process natively (i.e., without calling out to any external services), I took a stab at crafting a simple data science block to forecast sales by month for the next three years. Setting the Table - Aggregation by Month/Year The sales data exists in a table which includes about 3,000 transactions spanning 2018 and 2019. Instead of using roll-ups or formula fields I decided to see how well the Script Block was able to perform the aggregation of sales by year and month. The objective is simple – total sales by month and year. The performance of this part of the process is blistering fast; about 1.3 seconds. Forecasting Algorithm As I mentioned, there are many AI approaches to forecasting but I self-constrained t
I am a bit of a newb to scripting in general so still learning… But can someone help me parse parts of this text into columns within another table? “Ether Protocol :black_small_square: 0xE2e335Ef26281ae3feaD48d79cF8F35Fb206fB54” For example in one column to include “Ether Protocol” and in another the token address “0xE2e335Ef26281ae3feaD48d79cF8F35Fb206fB54”
When getting a record with a pdf attachment through the Airtable API, I see that the URL of the pdf attachment has the following structure: https://dl.airtable.com/.attachment/<long-hash-code>/<short-hash-code>/<filename.ext> Attachments thumbnails have the following structure: https://dl.airtable.com/.attachmentThumbnails/<long-hash-code>/<short-hash-code> What is the long-hash-code and what is the short-hash-code? Can I assume that both hash codes will change when the pdf if replaced? Can I assume that both hash codes will not change unless the file was replaced?
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.