The HubDB endpoints are used to get and manage data in your HubDB data tables.
draft
and published
versions. This allows you to update data in the table, either for testing or to allow for a manual approval process, without affecting any live pages. Learn more about drafted versus live tables.
If a table is set to be allowed for public access, you can access the published version of the table and rows without any authentication by specifying your HubSpot account ID via the query parameter portalId
.
If you’re migrating from v2 of the HubDB API, learn more about the changes in the current (v3) API.
GET
also support CORS
, so you can access data in a table client-side using JavaScript and your account ID. Other methods and the Get all tables endpoint require authentication and do not support CORS
.GET
requests made that don’t require authentication (including client-side JavaScript requests) are limited to 10 requests per second. These requests won’t count towards the daily limit.GET
request to /cms/v3/hubdb/tables/{tableIdOrName}
.
To retrieve any content that has been drafted but not yet published, you would add /draft
to the end of the URL: /cms/v3/hubdb/tables/{tableIdOrName}/draft
.
Draft data can be reviewed and then pushed in HubSpot, or with the /push-live
endpoint. The draft data can also be discarded via the /reset
endpoint, allowing you to revert to the current live version of the data without disruption.
POST
request to /cms/v3/hubdb/tables
.
In the request body, specify the following required fields:
Field | Type | Description | Example |
---|---|---|---|
name | String | The internal name of the table. This name cannot be changed once the table is created. Names can only include lowercase letters, digits, and underscores and cannot begin with a number. | "name": "my_table" |
label | String | The label of the table that users see when editing the table in HubSpot. | "label":"My table" |
Field | Type | Description | Example |
---|---|---|---|
useForPages | Boolean | Whether the table can be used for creating dynamic pages. | "useForPages": false |
allowPublicAPIAccess | Boolean | Whether the table can be read without authorization. | "allowPublicApiAccess": false |
allowChildTables | Boolean | Whether child tables can be created for the table. | "allowChildTables": false |
enableChildTablePages | Boolean | Whether multilevel dynamic pages should be created using child tables. | "enableChildTablePages": false |
columns | Object | The columns of the table. Learn more about column properties in the Add table columns sections. | See "Add table columns" section below |
Field | Type | Description | Example |
---|---|---|---|
name | String | Required. The internal name of the column. Cannot be changed after the column is created. | "name": "row_name" |
label | String | Optional. The label for the column that users will see when editing the table in HubSpot. | "label": "Row label" |
type | String | The data type of the column. Must be one of the following:
| "type": "type" |
options | Object | A list of options for select and multiselect columns. Each option is defined with a name along with a type equal to option . | "option": [{"name":"Option 1", "type":"option"}, {"name": "Option 2", "type": "option"}] |
id
field in the input object.
POST
request to /cms/v3/hubdb/tables/{tableIdOrName}/rows
.
For each table row, you can include the following fields:
Field | Type | Description | Example |
---|---|---|---|
values | Object | A list of key-value pairs with the column name and the value you want to add to it. If you don’t want to set a specific value for a column, you can omit the column name from the list of key-value pairs. | "values": { "text_column": "sample text", "number_column": 76} |
path | String | For tables enabled for dynamic pages, path is the path suffix used for the page created for this row. | "path": "example_url_path" |
name | String | For tables enabled for dynamic pages, name is the HTML title used for the page created for this row. | "name": "Example Title" |
childTableId | Number | When creating multilevel dynamic pages, childTableId specifies the child table ID. | "childTableId": 123456 |
POST
request to /cms/v3/hubdb/tables/{tableIdOrName}/draft/import
.
The import endpoint takes a multipart/form-data
POST
request:
config
: a set of JSON-formatted options for the import.file
: the CSV file that you want to import.config
, include the following fields as a JSON string:
Field | Type | Description | Example |
---|---|---|---|
skipRows | Number | The number of header rows that should be skipped over. This field defaults to 1 , skipping the first row and treating it as a header. Set this to 0 if all of the rows are valid data. | "skipRows": 0 |
separator | String | The column delimiter in the CSV file. Set to "," by default. | "separator": "," |
idSourceColumn | Number | The index of the column in the source file containing the row’s ID (hs_id ).If this column is specified, the import will update the existing rows in the table for the matching row IDs from the CSV file. This is optional and you can ignore this during the first time you import data into a table.See the Reset options section below more detailed information. | "idSourceColumn": 1 |
resetTable | Boolean | Defaults to false , meaning that the table’s rows will be updated without removing any existing rows. If set to true , the spreadsheet rows will overwrite table data, meaning that any rows in the table that aren’t in the spreadsheet will be deleted.See the Reset options section below more detailed information. | "resetTable": true |
nameSourceColumn | Number | For tables enabled for dynamic pages, nameSourceColumn specifies the column in the CSV file that contains the row’s name . Column numbers are in ascending order, with the first column being 1 . | "nameSourcecolumn": 5 |
pathSourceColumn | Number | For tables enabled for dynamic pages, pathSourceColumn specifies the column in the CSV file that contains the row’s path . Column numbers are in ascending order, with the first column being 1 . | "pathSourcecolumn": 6 |
childTableSourceColumn | Number | Specifies the column in the CSV file that contains the row’s childTableId . Column numbers are in ascending order, with the first column being 1 . | "childTableSourcecolumn": 3 |
columnMappings | Array | A list of mappings for the columns in the source file to the columns in the destination HubDB table.Each mapping must have the following format: {"source":1,"target”:"columnIdOrName"}
hs_id column, you shouldn’t include it in columnMappings . Instead, include it as the idSourceColumn to update existing rows. | "columnMappings": [{"source":1, "target": 2}, {"source": 2, "target": "column_name"}] |
primaryKeyColumn | String | The name of a column in the target HubDB table that will be used for deduplication. The column’s ID cannot be used for this field. | "primaryKeyColumn": "column_name" |
encoding | String | The file’s encoding type. For example, utf-8 , ascii , iso-8859-2 , iso-8859-5 , iso-2022-jp , windows-1252 . | "encoding": "utf-8" |
format | String | Only CSV is supported. | "format": "csv" |
config
JSON might look like the following:
yyyy/mm/dd
yyyy/mm/dd
mm/dd/yyyy
mm/dd/yy
dd/mm/yy
is not accepted). Integers can be separated by hyphens (-
) or slashes (/
).
Relaxed dates
You can also import date formats that are less standardized than integer-based dates. For example:
The 1st of March in the year 2022
Fri Mar 4 2022
March 4th '22
next Thursday
Today
tomorrow
3 days from now
resetTable
field to true
or false
(default) to manage whether HubDB row data is overwritten.
resetTable
is set to true
:
hs_id
or row ID is specified as 0
, those rows will be inserted with the new row IDs generated.resetTable
is set to false
(default):
0
, those rows will be inserted with the new row IDs generated.GET
request to /cms/v3/hubdb/tables
.GET
request to /cms/v3/hubdb/tables/{tableIdOrName}
.GET
request to /cms/v3/hubdb/tables/{tableIdOrName}/rows
.GET
request to /cms/v3/hubdb/tables/{tableIdOrName}/rows/{rowId}
.portalId
.
columnName__operator
.
For example, if you have a number column named bar, you can filter results to only include rows where bar is greater than 10: &bar__gt=10
.
All filters are ANDed together (OR filters are not currently supported).
When filtering, keep the following in mind:
multiselect
columns, the values should be comma-separated (e.g. multiselect_column__contains=1,2
).
datetime
filters, you can use relative dates in place of timestamps in order to specify a value relative to the current time. For example, -3h
would correspond to the timestamp 3 hours before now, whereas 10s
would correspond to 10 seconds in the future. Supported time units are ms (milliseconds), s (seconds), m (minutes), h (hours), d (days). Current time can be used by specifying a zero value: 0s
hs_id
is a number
column, the hs_created_at
column is a datetime
, and the hs_path
and hs_name
columns are text
columns.
Operator | Name | Description |
---|---|---|
eq (or none) | Equals | All column types.This filter is applied if no operator is used. When used with multiselect columns, returns rows that exact match supplied values. |
ne | Not equal to | All column types. |
contains | Contains | Text, richtext, and multiselect.When used with multiselect columns, returns rows that contain all of the supplied values. This filter is case sensitive. |
lt | Less than | Number, date, and datetime. |
lte | Less than or equal to | Number, date, and datetime. |
gt | Greater than | Number, date, and datetime. |
gte | Greater than or equal to | Number, date, and datetime. |
is_null | Null | All column types except boolean.This filter doesn’t require a value (e.g. &exampleColumn__is_null= ). |
not_null | Not null | All column types except boolean.This filter doesn’t require a value (e.g. &exampleColumn__not_null= ). |
like | Like | Text and richtext. |
not_like | Not like | Text and richtext. |
icontains | Contains | Text and richtext.This filter is case insensitive. |
startswith | Starts with | Text and richtext. |
in | In | Number, select, and multiselect.Returns rows where the column includes at least one of the passed options. When there is no other sort in the query parameter, the results will be sorted in the order in which values are specified in the in operator. |
sort
query parameter and specify the column name:
&sort=columnName
By default, data will be returned in the natural order of the specified column. You can reverse the sort by adding a -
to the column name:
&sort=-columnName
You can include this parameter multiple times to sort by multiple columns.
In addition to sorting by a column, there are three functions that can be used:
geo_distance(location_column_name, latitude, longitude)
: takes the name of a location column and coordinates, returns the rows ordered by how far away the values of the specified location column are from the provided coordinates.
length(column_name)
: takes the name of a column, returns the rows ordered by the length of the column value (calculated as a string)
random()
: returns the rows in random order.
geo_distance
sort returns items that are the farthest away first:
sort=-geo_distance(location_column,42.37,-71.07)
useForPage
to true
. You can optionally include dynamicMetaTags
to specify which columns to use for each page’s metadata.
dynamicMetaTags
, you’ll need to ensure that the page is using page_meta
HubL tags instead of content
. Learn more in the dynamic pages guide.Parameter | Type | Description |
---|---|---|
useForPages | Boolean | Set to true to enable the table to be used as a data source for dynamic pages. |
dynamicMetaTags | Object | Specifies the columns by ID to use for metadata on each dynamic page. Can contain:
|
DESCRIPTION | Number | The numeric ID of the column to use for each page’s meta description. |
FEATURED_IMAGE_URL | Number | The numeric ID of the column to use for each page’s featured image URL. |
LINK_REL_CANONICAL_URL | Number | The numeric ID of the column to use for each page’s canonical URL. |
name
and label
. This name cannot be changed once the table is created. Names can only include lowercase letters, digits, and underscores and cannot begin with a number. Both name
and label
should be unique in the account.id
and name
in the URL paths.GET
row endpoints return column name
instead of id
in values
field. Also, POST
/ PUT
/ PATCH
row endpoints require column name
instead of id
in values
field.PATCH
endpoints now accept sparse updates, which means you can specify only the column values that you need to update (whereas you had to specify all the column values in the previous versions). When you update a column with a list of values such as multiselect, you need to specify the list of all the values. In order to delete the value for a column, you need to specify the column with the value as null
in the request.get
/ update
/ delete
a row cell in favor of the row update PATCH
endpoints.idSourceColumn
along with existing fields in the JSON-formatted options. You can use this field to specify the column in the CSV file which contains row IDs. To import new rows along with the new values for existing rows, specify 0
as the row ID for the new rows and the valid row IDs for the existing columns. Learn more about importing rows from CSV. Also you can use column names or IDs in the target field of the column mappings in the JSON-formatted options.