Skip to content
Keboola Docs

Load data into Storage

Load five CSV files and a live weather forecast into Keboola Storage with the HTTP data source connector, straight from their URLs.

Tutorial Getting Started

Data arrives split across files that cannot answer a question on their own; the next page joins them.

Before you start

Where you are a project with empty Storage.

When you finish six tables in Storage and two connector configurations you can re-run.

You need

What each tab needs

  • Prompt tab Kai, the Kai Agent button in the top bar, on supported stacks. A new Free Plan project has it from the start; elsewhere an organization admin turns it on once: Get started with Kai.
  • UI tab a browser.
  • CLI / API tab kbagent, connected to your project with write access; for the raw requests, your stack’s host and a Storage API token.

Prompt, UI and CLI / API: three ways to do the same task, not three steps. Pick one tab below; later pages open on it.

In the chat, Kai asks before each change it makes (how approvals work), and most of it can be undone: if a step builds something else, say so in the same chat.

A fictional café chain, Boolabean: invented sales and rosters, the real weather of summer 2026 in each café’s city, and a real forecast, fetched live. Each table is half a story.

  • stores 6 rows six cafés in six Czech cities
  • products 18 rows the menu
  • sales 9,761 rows one summer of sales
  • staffing 552 rows the roster for every café and day
  • weather_daily 552 rows the real weather in each café's city, from Open-Meteo
  • forecast 42 rows next week for all six cafés, live from Open-Meteo, no account or key

Weather data by Open-Meteo.com, under CC BY 4.0. weather_daily is Open-Meteo’s historical daily maximum temperature and precipitation for June to August 2026, reshaped into one row per café and day with our column names; forecast comes from its forecast API when you load it.

What the forecast URL asks for

Open-Meteo needs no account and no key. One request returns the next seven days for all six cafés at once, as CSV:

https://api.open-meteo.com/v1/forecast?latitude=50.0755,49.1928,49.8352,49.7475,49.5938,50.7663&longitude=14.4426,16.6083,18.2833,13.3776,17.2509,15.0562&daily=temperature_2m_max,precipitation_sum&timezone=Europe%2FPrague&format=csv

The six coordinate pairs are the cafés in store_id order, so location_id 0 in the answer is S01 and 5 is S06. The connector has to be told about the file’s shape: seven lines of metadata about the locations and a blank line come before the real header row. Skip those lines and the forecast is 42 rows: seven days for six cafés.

  1. A file at a URL
  2. The HTTP connector: one configuration, a row per file
  3. A table in Storage
  • Data source connectors fetch data into Storage tables, on demand or on a schedule. There are hundreds of them, and all of them end in a table.
  • HTTP downloads CSV files from a URL, and can be re-run, scheduled and put in a flow, which Build and schedule a weekly flow depends on.
  • Two configurations: the five files share one, a row each. The forecast gets its own: it lives on another host, and the flow refreshes it every week.

Setting up a data source connector is one of the things Kai does (Integration Setup). Open Kai Agent in the top bar and ask for the whole first configuration at once:

Prompt
Load these five CSV files into Storage as one HTTP data source configuration called "Boolabean sales", one configuration row per file, each table named after its file:
https://help.keboola.com/getting-started/boolabean/stores.csv
https://help.keboola.com/getting-started/boolabean/products.csv
https://help.keboola.com/getting-started/boolabean/sales.csv
https://help.keboola.com/getting-started/boolabean/staffing.csv
https://help.keboola.com/getting-started/boolabean/weather_daily.csv
Run it, then tell me the row count of each of the five tables.

Expect seven approvals: the configuration, one per row, and the run. Kai reads each file’s header itself, so the tables get the files’ column names. After the run approval Kai says the job is running and hands the chat back; it returns with the counts on its own when the job ends, about six minutes later in a Free Plan project.

Check: Kai reports five tables with 6, 18, 9,761, 552 and 552 rows, and the configuration it links in the chat lists five entries under Rows. Then, in the same chat, the forecast:

Prompt
Add a second HTTP data source configuration called "Boolabean forecast" that loads this one URL into a table called forecast:
https://api.open-meteo.com/v1/forecast?latitude=50.0755,49.1928,49.8352,49.7475,49.5938,50.7663&longitude=14.4426,16.6083,18.2833,13.3776,17.2509,15.0562&daily=temperature_2m_max,precipitation_sum&timezone=Europe%2FPrague&format=csv
It is open-meteo's CSV export: seven lines of metadata, a blank line, then the header row, then 42 data rows. Load only the data rows and name the columns location_id, time, temperature_2m_max and precipitation_sum. Run it, then tell me how many rows the forecast table has.

Expect three approvals for the forecast. Kai skips the nine leading lines and names the four columns as asked, rather than keeping the header’s temperature_2m_max (°C).

The chat keeps what Kai made as links, so that is where to find it afterwards:

Screenshot - The forecast prompt in the Kai chat, then Kai's plan to skip the nine non-data lines and name the four columns, then Configuration created: Boolabean forecast, and Configuration row added: forecast, each one a link to what Kai made

Check: a forecast table with 42 rows and the columns location_id, time, temperature_2m_max and precipitation_sum. If Kai built something else, say so in the same chat, or delete the configuration and use the UI tab, which also shows where a configuration and its rows live.

To see what Kai built, ask in the same chat:

Follow-up prompt
Explain the "Boolabean sales" configuration you created, row by row.

It only reads, so it asks for no approval by default.

Open Storage. Each configuration made a bucket of its own, with an IN badge: one holds the five sample tables, the other forecast. The first bucket’s page lists the five with their row counts:

Screenshot - The Storage page of the bucket keboola-ex-http-01m3vt4ta6tfdjayb3fj6z51ke: stage IN, backend BigQuery, and its five tables with their row counts, products 18, sales 9,761, staffing 552, stores 6 and weather_daily 552, each NON-TYPED and last updated by Boolabean sales

  • sales has 9,761 rows; stores 6, products 18, staffing and weather_daily 552 each.
  • forecast has 42 rows: seven dates, location_id 0 to 5.
  • Every column arrived as text. The connector does not guess types, so the next page casts them.

Screenshot - The Data Sample tab of the sales table, marked NON-TYPED, with the columns date, store_id, product_id, units and revenue_czk above rows of sample values

Your bucket names will differ, and what else to look at

A bucket is named after the component plus the configuration’s ID, like keboola-ex-http-01m3vt4ta6tfdjayb3fj6z51ke, so yours will not match the screenshots, and that is fine. The next step refers to the tables by their names inside the transformation; it is those names the SQL depends on.

Click a table and open its Data Sample tab to see the real contents: sales has the columns date, store_id, product_id, units and revenue_czk. In Jobs, the five rows of the first configuration are fetched in turn, so expect about six minutes for all five; the forecast takes seconds.

The job fails with a 404

Base URL and path are concatenated. With the base URL ending in a slash and the path a bare file name, https://help.keboola.com/getting-started/boolabean/ + stores.csv is right; a slash on both sides gives a double slash, and a slash on neither runs the folder into the file name. Open the full URL in a browser to see whether the file is really there.

Every row arrives as one column

The Delimiter setting does not match the file. These files are comma-separated.

The first data row is missing, or the columns are called col_1

Wrong header option: set Read Header back to Read the header from the file(s) header.

The table is empty, but the job succeeded

The URL returned an HTML error page instead of a CSV. Open it in a browser to see what actually comes back.

The forecast has 43 rows, and one of them says time in the time column

The skip count is one short and the header was loaded as data. It should be 9 with named columns, or 8 with Read the header and the header’s own names, unit suffixes included.

You want the five files fetched at the same time

Raise Parallel jobs on the configuration; the connector then processes its rows concurrently.

A public URL is the quickest way to real data in a new project. Production data sits behind credentials and keeps changing; both side trips are this step against a source you authorize first.

Ask Kai

Hi, I'm Kai — Keboola's AI assistant for the docs. Ask me anything and I'll answer from the documentation and cite the pages I use.

Kai is an AI and can make mistakes. Check the sources it links.