Search code examples
node.jsapipaginationhubspothubspot-api

Hubspot pagination using after in nodejs


i am building hubspot api, i having trouble paginating the contacts records. i am using @hubspot/api-client - npm for integration with hubspot and this is the docs for that https://github.com/HubSpot/hubspot-api-nodejs

hubspotClient.crm.contacts.basicApi .getPage(limit, after, properties, propertiesWithHistory, associations, archived) .then((results) => { console.log(results) }) .catch((err) => { console.error(err) })

in this code there is after argument, we can provide contacts id in it, and it will provide the records including and after that particular id. How do i use this for pagination. or there is any other way.


Solution

  • Take a look at API Endpoints documentation for GET /crm/v3/objects/contacts and the data you receive. The getPage method returns the following data:

    {
      "results": [
        {
          // contact detail here
        }
      ],
      "paging": {
        "next": {
          "after": "NTI1Cg%3D%3D",
          "link": "?after=NTI1Cg%3D%3D"
        }
      }
    }
    

    The pagination information is available in paging.next.after (if there is a consecutive page). So you can do something like this to iterate through each page:

    async function doSomethingWithEachPage() {
      let after = undefined;
      const limit = 10;
      const properties = undefined;
      const propertiesWithHistory = undefined;
      const associations = undefined;
      const archived = false;
    
      do {
        const response = await hubspotClient.crm.contacts.basicApi.getPage(
          limit,
          after,
          properties,
          propertiesWithHistory,
          associations,
          archived
        );
        // do something with results
        console.log(response.results); // contacts list
    
        // pick after from response and store it outside of current scope
        after = response.paging?.next?.after;
      } while (after);
    }
    

    I rewrote the sample code to use async/await so it better works with do...while loop and omitted error handling.

    If you are dealing with reasonable small amount of data and have enough of memory, you can also skip the pagination and use the getAll method to load all the data. (In fact, this method does internally a loop similar to the one above.)