For AI agents: the complete documentation index is available at https://docs.dataplatform.ovh.net/llms.txt, the full documentation bundle is available at https://docs.dataplatform.ovh.net/llms-full.txt, and this page is available as Markdown at https://docs.dataplatform.ovh.net/connectors-sources-hubspot-technical-reference.md.
  • 🇬🇧 English
  • HubSpot: Technical Reference

    This is the technical companion to the main HubSpot connector documentation

    Objective

    This is the technical companion to the main HubSpot connector documentation. It covers authentication internals, the full endpoint reference, scopes, pagination, output format, and limitations, everything needed to integrate the connector into a data pipeline.

    Authentication

    Supported Methods

    MethodFormatUse case
    Private App Token (recommended)pat-na1-xxx or pat-eu1-xxxServer-side integrations
    OAuth2 Access TokenStandard OAuth bearer tokenPublic distributed apps

    All methods use the same Bearer header:

    Authorization: Bearer {token}

    Deprecated authentication methods

    MethodWhy
    API Key (hapikey)Sunset since November 2022
    Personal Access KeyCLI only, which returns 401 on REST API calls

    Credentials Format

    {
      "token": "pat-eu1-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }

    Architecture

    The connector returns raw JSON from the HubSpot API. The platform takes over from there. It auto-discovers the schema from the JSON payload, flattens nested objects into dot-notation columns (slugified to lowercase with underscores), and stores the result in the lakehouse, queryable via Trino. Any new field HubSpot adds to an object appears automatically on the next extraction; you don't define a schema, list columns, or write any transformation code.

    The connector itself is responsible for authentication (Bearer token), endpoint routing, pagination (cursor or offset depending on the endpoint), and rate-limit retries.

    CRM Object Types

    27 Standard Objects

    The connector exposes the 27 standard HubSpot CRM object types. Each is reachable via /crm/v3/objects/{object_type} (except owners, see below).

    Core CRM

    Object TypeAPI Path
    contacts/crm/v3/objects/contacts
    companies/crm/v3/objects/companies
    deals/crm/v3/objects/deals
    tickets/crm/v3/objects/tickets

    Engagements

    Object TypeAPI Path
    calls/crm/v3/objects/calls
    emails/crm/v3/objects/emails
    meetings/crm/v3/objects/meetings
    notes/crm/v3/objects/notes
    tasks/crm/v3/objects/tasks
    communications/crm/v3/objects/communications
    postal_mail/crm/v3/objects/postal_mail

    E-commerce & Sales

    Object TypeAPI Path
    products/crm/v3/objects/products
    line_items/crm/v3/objects/line_items
    quotes/crm/v3/objects/quotes

    Commerce

    Object TypeAPI Path
    invoices/crm/v3/objects/invoices
    subscriptions/crm/v3/objects/subscriptions
    orders/crm/v3/objects/orders
    payments/crm/v3/objects/payments

    Commerce Hub

    Object TypeAPI Path
    carts/crm/v3/objects/carts
    discounts/crm/v3/objects/discounts
    fees/crm/v3/objects/fees
    taxes/crm/v3/objects/taxes

    Sales Hub

    Object TypeAPI PathNotes
    leads/crm/v3/objects/leadsSales Hub Pro+
    goals/crm/v3/objects/goals

    Service & Scheduling

    Object TypeAPI PathNotes
    feedback_submissions/crm/v3/objects/feedback_submissionsService Hub
    appointments/crm/v3/objects/appointmentsScheduling
    services/crm/v3/objects/services

    Special: Owners

    Owners use a dedicated endpoint (GET /crm/v3/owners) instead of /crm/v3/objects/owners. The connector handles this automatically when object_type=owners is selected.

    Endpoint Reference

    crm_objects

    Extract records from any CRM object type.

    ParameterTypeRequiredDescription
    object_typeselectYesOne of 27 CRM types + owners
    max_itemsnumberNoMaximum records to extract (empty = all)
    properties_filtertagsNoSpecific properties to fetch (empty = HubSpot default set)

    API: GET /crm/v3/objects/{object_type}?properties={props}&limit=100&after={cursor}

    Pagination: Cursor-based (paging.next.after)

    Output: Raw JSON. Each record has id, createdAt, updatedAt, archived, and a nested properties dict containing all requested property values.

    Properties behavior:

    • Empty filter: fetches ALL properties via GET /crm/v3/properties/{type} first, then requests all of them
    • With filter: requests only the specified properties
    • HubSpot returns all property values as strings (even numbers and dates)
    Object TypeApprox. Default Properties
    Contacts~370+ properties
    Companies~250+ properties
    Deals~200+ properties

    associations

    Extract relationships between CRM objects.

    ParameterTypeRequiredDescription
    from_typeselectYesSource object type (14 options)
    to_typeselectYesTarget object type (14 options)
    max_itemsnumberNoMax source records to process

    API: POST /crm/v4/associations/{from_type}/{to_type}/batch/read

    Pagination: Cursor-based on source objects, batch POST for association lookup (max 1000 IDs per request)

    Output: Raw JSON. Each result contains from and to objects with IDs and association metadata.

    association_definitions

    Get the available association types between two object types.

    ParameterTypeRequiredDescription
    from_typeselectYesSource object type
    to_typeselectYesTarget object type

    API: GET /crm/v4/associations/{from_type}/{to_type}/labels

    Pagination: None (single GET)

    Output: Raw JSON, association type definitions with category, type ID, and label.

    pipelines

    Extract pipeline definitions with their stages.

    ParameterTypeRequiredDescription
    pipeline_object_typeselectYesdeals or tickets

    API: GET /crm/v3/pipelines/{pipeline_object_type}

    Pagination: None (single GET, returns all pipelines)

    Output: Raw JSON. Each pipeline contains id, label, displayOrder, createdAt, updatedAt, and a nested stages array. The platform flattens stages into separate rows automatically.

    pipeline_audit

    Audit log for a specific pipeline.

    ParameterTypeRequiredDescription
    pipeline_object_typeselectYesdeals or tickets
    pipeline_idtextYesPipeline ID (use pipelines endpoint to find IDs)

    API: GET /crm/v3/pipelines/{object_type}/{pipeline_id}/audit

    Pagination: None (single GET)

    Output: Raw JSON, audit entries as returned by the API.

    properties_meta

    Extract the data dictionary (property schema) for an object type.

    ParameterTypeRequiredDescription
    property_object_typeselectYesObject type (12 options)

    API: GET /crm/v3/properties/{property_object_type}

    Pagination: None (single GET)

    Output: Raw JSON. Each property has name, label, type, fieldType, groupName, description, and more.

    property_groups

    Extract property groups for an object type.

    ParameterTypeRequiredDescription
    property_object_typeselectYesObject type (12 options)

    API: GET /crm/v3/properties/{property_object_type}/groups

    Pagination: None (single GET)

    Output: Raw JSON, group definitions as returned by the API.

    lists

    Extract list and segment definitions.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum lists to extract

    API: GET /crm/v3/lists

    Pagination: Cursor-based

    Output: Raw JSON, list definitions as returned by the API.

    list_memberships

    Get member record IDs from a specific list.

    ParameterTypeRequiredDescription
    list_idtextYesHubSpot List ID (ILS number, found in Contacts > Lists)
    max_itemsnumberNoMaximum members to extract

    API: GET /crm/v3/lists/{list_id}/memberships

    Pagination: Cursor-based

    Output: Raw JSON, membership records as returned by the API.

    marketing_emails

    Extract marketing email definitions with statistics.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum emails to extract

    API: GET /marketing/v3/emails

    Pagination: Cursor-based

    Output: Raw JSON, email campaign data with nested statistics, flattened by the platform.

    forms

    Extract form definitions.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum forms to extract

    API: GET /marketing/v3/forms

    Pagination: Cursor-based

    Output: Raw JSON, form definitions as returned by the API.

    form_submissions

    Extract submissions for a specific form.

    ParameterTypeRequiredDescription
    form_idtextYesForm ID (find in Marketing > Forms > form details URL)
    max_itemsnumberNoMaximum submissions to extract

    API: GET /form-integrations/v1/submissions/forms/{form_id}

    Pagination: Offset-based (v1 API, uses offset + hasMore, NOT cursor-based)

    Output: Raw JSON, submission data as returned by the API.

    conversations

    Extract conversation threads (chat, email, bot).

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum threads to extract

    API: GET /conversations/v3/conversations/threads

    Pagination: Cursor-based

    Output: Raw JSON, thread data as returned by the API.

    Requires: Conversations scope + appropriate HubSpot plan

    campaigns

    Extract marketing campaign definitions.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum campaigns to extract

    API: GET /marketing/v3/campaigns

    Pagination: Cursor-based

    Output: Raw JSON, campaign data as returned by the API.

    blog_posts

    Extract CMS blog articles.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum posts to extract

    API: GET /cms/v3/blogs/posts

    Pagination: Cursor-based

    Output: Raw JSON, blog post data (title, content, author, publish date, etc.).

    site_pages

    Extract CMS website pages.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum pages to extract

    API: GET /cms/v3/pages/site-pages

    Pagination: Cursor-based

    Output: Raw JSON, page data as returned by the API.

    landing_pages

    Extract CMS landing pages.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum pages to extract

    API: GET /cms/v3/pages/landing-pages

    Pagination: Cursor-based

    Output: Raw JSON, page data as returned by the API.

    workflows

    Extract automation workflow definitions.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum workflows to extract

    API: GET /automation/v3/workflows

    Pagination: None (single GET, data key is workflows, not results)

    Output: Raw JSON, workflow definitions as returned by the API.

    sequences

    Extract sales sequence definitions.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum sequences to extract

    API: GET /automation/v4/sequences

    Pagination: Cursor-based

    Output: Raw JSON, sequence data as returned by the API.

    Requires: Sales Hub Pro+

    users

    Extract account users.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum users to extract

    API: GET /settings/v3/users

    Pagination: Cursor-based

    Output: Raw JSON, user data as returned by the API.

    imports

    Extract CRM import history.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum import records to extract

    API: GET /crm/v3/imports

    Pagination: Cursor-based

    Output: Raw JSON, import records as returned by the API.

    crm_schemas

    Extract custom object schema definitions.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum schemas to extract

    API: GET /crm/v3/schemas

    Pagination: None (single GET)

    Output: Raw JSON, schema definitions as returned by the API.

    custom_events

    Extract behavioral events for a specific CRM record.

    ParameterTypeRequiredDescription
    event_object_typeselectYesCRM object type (contacts, companies, deals, tickets)
    event_object_idtextYesHubSpot record ID
    max_itemsnumberNoMaximum events to extract

    API: GET /events/v3/events?objectType={type}&objectId={id}

    Pagination: Cursor-based (with extra_params)

    Output: Raw JSON, event data as returned by the API.

    Requires: Marketing Hub Enterprise

    timeline_events

    Extract timeline event templates for an integration app.

    ParameterTypeRequiredDescription
    app_idtextYesHubSpot App ID (found in developer account)

    API: GET /crm/v3/timeline/{app_id}/event-templates

    Pagination: None (single GET)

    Output: Raw JSON, event template data as returned by the API.

    hubdb_tables

    Extract HubDB table definitions.

    ParameterTypeRequiredDescription
    max_itemsnumberNoMaximum tables to extract

    API: GET /cms/v3/hubdb/tables

    Pagination: Cursor-based

    Output: Raw JSON, table definitions as returned by the API.

    Scopes by Endpoint

    CRM Objects

    Object TypeRequired Scope
    contactscrm.objects.contacts.read
    companiescrm.objects.companies.read
    dealscrm.objects.deals.read
    ticketstickets
    productse-commerce
    line_itemscrm.objects.line_items.read
    quotescrm.objects.quotes.read
    calls, emails, meetings, notes, taskscrm.objects.contacts.read
    communicationscrm.objects.contacts.read
    feedback_submissionscrm.objects.feedback_submissions.read
    leadscrm.objects.leads.read
    invoicescrm.objects.invoices.read
    subscriptionscrm.objects.subscriptions.read
    goalscrm.objects.goals.read
    orderscrm.objects.orders.read
    paymentscrm.objects.payments.read
    ownerscrm.objects.owners.read

    Other Endpoints

    EndpointRequired Scope
    pipelines, pipeline_auditcrm.objects.deals.read or tickets (depends on pipeline_object_type)
    properties_meta, property_groupsSame scope as the target object type
    lists, list_membershipscrm.lists.read
    marketing_emailscontent
    forms, form_submissionsforms
    associations, association_definitionsScopes for both the source and target object types
    campaignscontent
    blog_posts, site_pages, landing_pagescontent

    For endpoints not listed above (workflows, sequences, users, imports, crm_schemas, conversations, custom_events, hubdb_tables, timeline_events), refer to HubSpot's scope reference for the authoritative scope name.

    Pagination

    The connector uses three pagination strategies depending on the endpoint:

    Cursor-based (most endpoints)

    GET /crm/v3/objects/contacts?limit=100&after=NTI1Cg==

    Response:

    {
      "results": [...],
      "paging": {
        "next": { "after": "NTI1Cg==" }
      }
    }

    When paging.next.after is absent, all data has been fetched.

    Offset-based (form submissions only)

    GET /form-integrations/v1/submissions/forms/{id}?limit=50&offset=0

    Response:

    {
      "results": [...],
      "hasMore": true,
      "offset": 50
    }

    When hasMore is false, all data has been fetched.

    No pagination (single GET)

    Some endpoints return all data in a single response: pipelines, pipeline_audit, properties_meta, property_groups, association_definitions, workflows, timeline_events, crm_schemas.

    Rate Limits

    Limits by Plan

    Refer to HubSpot's official rate limit documentation for current limits. Limits vary by plan and API endpoint.

    Rate Limit Handling

    The connector automatically handles 429 Too Many Requests responses:

    1. Reads the Retry-After header (seconds to wait)
    2. Falls back to 10 seconds if header is missing
    3. Retries the request after waiting

    Output Format

    Raw JSON (connector output)

    The connector returns raw JSON from the HubSpot API via handle_api_extraction(data, limit, return_type). The data is a list of dicts, exactly as returned by the API.

    Example CRM object (contacts):

    {
      "id": "123",
      "createdAt": "2024-01-15T10:30:00.000Z",
      "updatedAt": "2024-03-20T14:22:00.000Z",
      "archived": false,
      "properties": {
        "email": "john@example.com",
        "firstname": "John",
        "lastname": "Doe",
        "createdate": "2024-01-15T10:30:00.000Z"
      }
    }

    Flattened output (lakehouse)

    The platform automatically flattens the raw JSON into a flat table. Nested keys become column names with underscores:

    Raw JSON pathLakehouse column
    idid
    createdAtcreatedat
    properties.emailproperties_email
    properties.firstnameproperties_firstname

    Column names are slugified: lowercase, dots/special chars replaced by underscores, must start with a letter or underscore.

    Limitations

    • Property values are always strings, even numbers and dates. Cast them in your downstream processing.
    • Custom objects are not supported: the object_type parameter is a fixed select list of 27 standard CRM types + owners. Custom object types cannot be extracted with this connector.
    • Some object types require paid plans: invoices, subscriptions, and goals may require Sales Hub or Commerce Hub. Leads require Sales Hub Professional+. Commerce objects (carts, discounts, fees, taxes) require Commerce Hub. The API returns 403 if unavailable.
    • Form submissions use v1 API: the only endpoint still on the legacy v1 API. Uses offset pagination instead of cursor-based.
    • Behavioral events: require Marketing Hub Enterprise and a specific record ID (cannot bulk-extract all events).
    • Column names in lakehouse are slugified: properties.email becomes properties_email. This is handled by the platform, not the connector.

    Go further

    If you need training or technical assistance to implement our solutions, contact your sales representative or click on this link to get a quote and ask our Professional Services experts for a custom analysis of your project.

    Ask questions, give your feedback and interact directly with the team building the Data Platform on the dedicated Discord channel.

    If you need support with your OVHcloud services, create a request in our Help Centre.

    Join our community of users.