# Google BigQuery

Run SQL in Google BigQuery with query parameters, stream rows into tables, read table rows and schemas, and list projects, datasets, tables and jobs.

## Connect Google BigQuery

1. In the sidebar, open **Connections** and press **Add connection**.
2. Type `google bigquery` and choose **Google BigQuery**.
3. Press **Sign in with Google**.
4. Choose your account in Google’s window and allow access.

You should see **Signed in as** and the account’s address.

You can also connect from a step: under **Connection**, press **New**.

**What if it says “Google sign-in isn’t set up here”?**

This installation has no Google app yet. An admin of the installation sees **Set up Google sign-in** instead, and sets it up once for everyone:

1. In Google Cloud, create an OAuth client of type **Web application**, and turn on the API for Google BigQuery.
2. In GoRunner, copy the **Redirect address to add in Google Cloud**, and add it to the client.
3. Paste the **Client ID** and **Client secret**, then press **Save and sign in**.

Publish the app in Google Cloud. An app left in Testing signs everyone out after 7 days.

Everyone else sees who to ask.

[Set up Google sign-in for connections](https://docs.gorunner.io/self-host/oauth-apps)

**Can I use my own Google app?**

Yes. In the sheet, open **Use your own Google app** and paste its **Client ID** and **Client secret**. Add the **Redirect address to add in Google Cloud** to your app first. The connection then signs in through your app instead of the installation’s.

[Connections](https://docs.gorunner.io/build/connections) says how to sign in again, rename or delete it. In a product that embeds GoRunner, **Add connection** can be missing: then [your provider makes connections](https://docs.gorunner.io/embed/customer-connections) for you.

## Do things in Google BigQuery

Add a **Google BigQuery** step, choose a **Resource**, then an **Operation**. Choose a row to see its fields.

- [Query and Insert](https://docs.gorunner.io/apps/google-bigquery#fields-f-database): Execute Query · Insert Rows
- [Table](https://docs.gorunner.io/apps/google-bigquery#fields-f-table): Get Rows · Get · Get Many
- [Dataset](https://docs.gorunner.io/apps/google-bigquery#fields-f-dataset): Get Many
- [Project](https://docs.gorunner.io/apps/google-bigquery#fields-f-project): Get Many
- [Job](https://docs.gorunner.io/apps/google-bigquery#fields-f-job): Get · Get Results

To start a workflow from Google BigQuery, use a [Schedule](https://docs.gorunner.io/apps/schedule), [Webhook](https://docs.gorunner.io/apps/webhook) or [Form](https://docs.gorunner.io/apps/form) trigger.

Later steps read a step’s output by its name: see [Use data from earlier steps](https://docs.gorunner.io/build/use-data-from-earlier-steps).

## Limits

- A reply from Google BigQuery can be up to 16 MB (a file download can have its own limit). A larger one fails the step; it is never cut short.
- When Google BigQuery says to slow down (429), the step waits as long as it asks, if the step’s time allows. Otherwise it fails and says when to try again.

Not in your list? See [When an app isn’t here](https://docs.gorunner.io/apps/when-an-app-isnt-here#q-not-in-list).

## For developers

In the API, which calls apps pieces, Google BigQuery is `pieceId: "googlebigquery"` with `actionId: "googlebigquery"`, set by `resource` and an `operation_…` field, such as `operation_database`. [Get an app](https://docs.gorunner.io/api/apps/get-app) returns every field.

It can change something outside the run (`writes_external`). See [How versions and side effects work](https://docs.gorunner.io/apps#q-versions).

### Google BigQuery › Query and Insert

### Execute Query

- **Project · Required**: The project the query job runs (and is billed) in, or that holds the table.
- **SQL Query · Required**: GoogleSQL, exactly as written. Put values from earlier steps in Query Parameters and refer to them as @name, such as SELECT * FROM `shop.orders` WHERE customer_id = @customer.
- **Query Parameters · Optional**: Values for the @names in the query, such as {"customer": "{{trigger.body.id}}", "since:DATE": "2026-10-01", "ids": [1, 2, 3]}. Types follow the value (text, whole number, decimal, true/false, list, JSON object); add :TYPE to a name to set one (DATE, TIMESTAMP, NUMERIC, ARRAY\<STRING> …).
- **Location · Optional**: Where the data lives, such as EU, US or europe-west3. Needed when the dataset is in one region rather than the US or EU multi-region.
- **Default Dataset · Optional**: A dataset (dataset or project.dataset) that table names without one refer to.
- **Maximum Bytes Billed · Optional**: Fail the query, without charge, if it would read more than this many bytes. Empty uses the project's limit.
- **Dry Run · Optional**: Only check the query and say how many bytes it would read; nothing runs. Off by default.
- **Simplify · Optional**: Return each row as one object of column values by name, with numbers, booleans, timestamps, records and lists as such. Off returns BigQuery's row format (f/v). On by default.
- **Return All · Optional**: Read every row, page by page (at most 20000; past that the step fails rather than stop early). On by default.
- **Limit · Optional**: How many rows to return (1–20000). Default: 1000. Shows when **Return All** is off.

### Insert Rows

- **Project · Required**: The project the query job runs (and is billed) in, or that holds the table.
- **Dataset · Required**: The dataset that holds the table.
- **Table · Required**: The table.
- **Location · Optional**: Where the data lives, such as EU, US or europe-west3. Needed when the dataset is in one region rather than the US or EU multi-region.
- **Rows · Required**: The rows to insert: a list of objects by column name, such as [{"order_id": 1042, "customer": "Ada"}], or one object. Sent 500 at a time.
- **Row ID Column · Optional**: A column whose value identifies each row: BigQuery then drops a row sent twice within about a minute (best effort).
- **Skip Invalid Rows · Optional**: Insert the valid rows and list the others under insertErrors. Off, one invalid row fails its batch and nothing of it is inserted. Off by default.
- **Ignore Unknown Columns · Optional**: Drop values for columns the table does not have, instead of refusing the row. Off by default.
- **Table Suffix · Optional**: Insert into \<table>\<suffix>, created from the table as a template when it does not exist (such as _20261101).

### Google BigQuery › Table

### Get Rows

- **Project · Required**: The project that holds the dataset.
- **Dataset · Required**: The dataset that holds the table.
- **Table · Required**: The table.
- **Columns · Optional**: Only these columns, comma-separated. Empty reads every column.
- **Start at Row · Optional**: Skip this many rows first (0 starts at the first). Rows of a table come in no set order.
- **Return All · Optional**: Read every row, page by page (at most 20000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many rows to return (1–20000). Default: 100. Shows when **Return All** is off.
- **Simplify · Optional**: Return each row as one object of column values by name. Off returns BigQuery's row format (f/v). On by default.

### Get

- **Project · Required**: The project that holds the dataset.
- **Dataset · Required**: The dataset that holds the table.
- **Table · Required**: The table.

### Get Many

- **Project · Required**: The project that holds the dataset.
- **Dataset · Required**: The dataset that holds the table.
- **Return All · Optional**: List every table (at most 5000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many tables to return (1–5000). Default: 100. Shows when **Return All** is off.

### Google BigQuery › Dataset

### Get Many

- **Project · Required**: The project whose datasets to list.
- **Include Hidden · Optional**: Also list hidden datasets (names starting with _). Off by default.
- **Return All · Optional**: Read every dataset, page by page (at most 5000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many datasets to return (1–5000). Default: 100. Shows when **Return All** is off.

### Google BigQuery › Project

### Get Many

- **Return All · Optional**: Read every project, page by page (at most 5000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many projects to return (1–5000). Default: 100. Shows when **Return All** is off.

### Google BigQuery › Job

### Get

- **Project · Required**: The project the job ran in.
- **Job ID · Required**: The job's id, such as from an earlier Execute Query's jobId.
- **Location · Optional**: The job's location (Execute Query's location), needed outside the US and EU multi-regions.

### Get Results

- **Project · Required**: The project the job ran in.
- **Job ID · Required**: The job's id, such as from an earlier Execute Query's jobId.
- **Location · Optional**: The job's location (Execute Query's location), needed outside the US and EU multi-regions.
- **Return All · Optional**: Read every row, page by page (at most 20000; past that the step fails rather than stop early). On by default.
- **Limit · Optional**: How many rows to return (1–20000). Default: 1000. Shows when **Return All** is off.
- **Simplify · Optional**: Return each row as one object of column values by name. On by default.

Source: https://docs.gorunner.io/apps/google-bigquery
