Enriquecer datos de contacto usando ZoomInfo en Jitterbit Studio
Introducción
ZoomInfo proporciona datos de contactos y empresas B2B a través de una API REST. Esta guía muestra cómo usar el conector HTTP v2 para autenticarse con ZoomInfo, construir un enrutador de recursos reutilizable que asigne tipos de puntos finales nombrados a rutas de API, y usar ese enrutador para buscar contactos, enriquecer registros de contactos existentes y recuperar datos de empresas.
El patrón clave en esta guía es un enrutador de recursos basado en Case: un único script asigna un nombre de recurso como contact o company a la ruta de API de ZoomInfo correspondiente, y una operación central HTTP v2 POST maneja todas las llamadas de API. Esto hace que la integración sea reutilizable: agregar un nuevo punto final de ZoomInfo requiere solo una adición de una línea al script del enrutador, sin configuración adicional de conexión o actividad.
Esta guía asume una cuenta de ZoomInfo con credenciales de acceso a la API (nombre de usuario y contraseña).
Nota
Un conector ZoomInfo nativo también está disponible como alternativa al enfoque HTTP v2 que se muestra en esta guía. Proporciona actividades de Enrich, Search y Lookup que cubren operaciones comunes de contactos y empresas sin necesidad de construir llamadas de API manualmente.
Patrón de diseño
La autenticación se ejecuta una sola vez al inicio del flujo de trabajo para obtener un JWT. Todas las llamadas posteriores a ZoomInfo siguen la misma secuencia:
Set $core.zoom.resource"] --> B["Script
Resource router
→ sets $core.zoom.object"] B --> C["Build request
transformation"] C --> D["HTTP v2 POST
Posts to [$core.zoom.object]"] D --> E["Process response
transformation"]
| Paso | Propósito |
|---|---|
| Establecer recurso | La persona que hace la llamada establece core.zoom.resource en un tipo de punto final nombrado (por ejemplo, contact). |
| Enrutador de recursos | El script del enrutador asigna el nombre a la ruta de API y la almacena en core.zoom.object. |
| Construir solicitud | La transformación construye el cuerpo de solicitud JSON para el punto final específico. |
| HTTP v2 POST | Una actividad POST central envía la solicitud a [$core.zoom.object]. |
| Procesar respuesta | La transformación analiza la respuesta en variables o registros para uso posterior. |
El enrutador y la actividad POST se comparten en todas las llamadas de API de ZoomInfo.
La tabla muestra el flujo conceptual. En la implementación, el enrutador de recursos y la actividad POST son pasos dentro de una operación compartida (la operación POST central en Parte 3), mientras que la construcción de solicitud y el procesamiento de respuesta son operaciones separadas y reutilizables que se crean por tipo de recurso e se invocan con RunOperation (ver Parte 4).
Parte 1: Configurar variables de proyecto y la conexión HTTP v2
Paso 1: Crear variables de proyecto
Almacena credenciales y el JWT en tiempo de ejecución en variables de proyecto para que los valores sensibles no estén codificados en scripts o en la configuración de actividades.
Abre el menú de acciones del proyecto y selecciona Variables de Proyecto. Luego agrega:
| Nombre | Valor predeterminado | Descripción |
|---|---|---|
zoom.username |
(tu nombre de usuario de ZoomInfo) | Nombre de usuario o dirección de correo electrónico de la cuenta de ZoomInfo |
zoom.password |
(tu contraseña de ZoomInfo) | Contraseña de la cuenta de ZoomInfo |
zoom.jwt |
(vacío) | JWT poblado en tiempo de ejecución por la operación de autenticación |
Marca zoom.password y zoom.jwt como ocultos. Para obtener orientación sobre cómo almacenar credenciales de forma segura, consulta Gestionar credenciales de puntos finales.
Paso 2: Configurar la conexión HTTP v2
-
En Studio, abre tu proyecto y haz clic en la pestaña Puntos finales y conectores del proyecto en la paleta de componentes de diseño.
-
Haz clic en el conector HTTP v2 para abrir la pantalla de configuración de la conexión.
-
Nombre de conexión: Ingresa
ZoomInfo API. -
URL base: Ingresa
https://api.zoominfo.com. -
Autorización: Selecciona Bearer Token e ingresa
[$zoom.jwt]como el valor del token. La variable de proyectozoom.jwtestá vacía cuando el proyecto se ejecuta por primera vez. La operación de autenticación en Parte 2 la completa antes de que se realice cualquier otra llamada de ZoomInfo. El punto final/authenticateen sí no valida el encabezadoAuthorization, por lo que un token vacío en la llamada inicial no causa un error. -
Haz clic en Test para verificar la conexión y después en Save Changes.
Parte 2: Autenticar y almacenar el JWT
ZoomInfo utiliza un modelo de autenticación basado en JWT. Antes de cualquier llamada a la API, una operación publica credenciales en el endpoint /authenticate y almacena el JWT devuelto en zoom.jwt.
Paso 1: Crear la operación de autenticación
-
Crea una operación nueva y asígnale el nombre
core.ZoomInfo - Get Auth Token. -
Añade un paso de Transformation. En la transformación, define un esquema de destino JSON con dos campos:
usernameypassword. Asigna[$zoom.username]y[$zoom.password]a los campos respectivos. -
Desde la conexión ZoomInfo API, arrastra una actividad POST después de la transformación como destino.
-
Haz doble clic en la actividad POST para abrir su configuración.
-
Name: Escribe
ZoomInfo - Authenticate. -
Path: Escribe
/authenticate. -
En la pestaña Request, añade un encabezado Content-Type con el valor
application/json. -
Haz clic en Finished.
Paso 2: Extraer y almacenar el JWT
Añade un paso de Script después de la actividad POST. El script lee el JWT de $jitterbit.response, que contiene el cuerpo de respuesta sin procesar de la actividad HTTP anterior, y lo almacena en la variable del proyecto:
$zoom.jwt = TrimChars(GetJSONString($jitterbit.response, "/jwt"), "\"");
If(length(trim($zoom.jwt)) == 0,
RaiseError("ZoomInfo authentication failed. Response: " + $jitterbit.response)
);
WriteToOperationLog("ZoomInfo JWT obtained successfully.");
GetJSONString extrae un valor de campo por ruta JSON. TrimChars elimina las comillas de cierre que GetJSONString incluye en valores de cadena.
Paso 3: Llamar a la operación de autenticación al inicio de cada flujo de trabajo
En cualquier flujo de trabajo que use ZoomInfo, llama a la operación de autenticación como primer paso:
$core.zoom.resource = "authenticate";
RunOperation("<TAG>operation:core.ZoomInfo - Get Auth Token</TAG>");
Si el mismo flujo de trabajo ejecuta múltiples llamadas a ZoomInfo, autentica una sola vez al inicio en lugar de antes de cada llamada individual.
Parte 3: Construir el enrutador de recursos
El enrutador de recursos asigna un tipo de recurso nombrado a la ruta correspondiente de la API de ZoomInfo. Una operación POST central reutiliza esta ruta para cada endpoint.
Paso 1: Crear el script del enrutador
Crea un componente de Script llamado core. Load Zoom API Resource. Este script lee core.zoom.resource, establecido por quien lo llama, y escribe la ruta de la API en core.zoom.object:
$core.zoom.resource = ToLower($core.zoom.resource);
If(length($core.zoom.resource) == 0,
RaiseError("$core.zoom.resource is empty. Set a resource type before running this script.")
);
Case(
$core.zoom.resource == "contact",
$core.zoom.object = "/search/contact";
,
$core.zoom.resource == "enrich_contact",
$core.zoom.object = "/enrich/contact";
,
$core.zoom.resource == "company",
$core.zoom.object = "/search/company";
,
$core.zoom.resource == "scoop",
$core.zoom.object = "/search/scoop";
,
true,
RaiseError("Unknown ZoomInfo resource: [" + $core.zoom.resource + "]")
);
WriteToOperationLog("ZoomInfo resource: " + $core.zoom.resource
+ " → path: " + $core.zoom.object);
La sentencia Case enruta los cuatro tipos de recursos compatibles. Añade una rama nueva para cualquier endpoint adicional de ZoomInfo sin cambiar la operación POST o la conexión.
Paso 2: Crear la operación POST central
-
Crea una operación nueva y asígnale el nombre
core. ZoomInfo POST API CALL. -
Añade el script
core. Load Zoom API Resourcecomo primer paso para quecore.zoom.objectse establezca antes de que se ejecute la actividad. -
Desde la conexión ZoomInfo API, arrastra una actividad POST después del script.
-
Name: Escribe
ZoomInfo - POST. -
Path: Escribe
[$core.zoom.object]. Studio resuelve la variable en tiempo de ejecución usando el valor establecido por el script del enrutador. -
En la pestaña Request, añade un encabezado Content-Type con el valor
application/json. -
Haz clic en Finished.
Los tipos de recursos compatibles y sus rutas correspondientes son:
Valor de core.zoom.resource |
Ruta de API | Propósito |
|---|---|---|
contact |
/search/contact |
Busca contactos en una empresa, opcionalmente filtrados por puesto de trabajo |
enrich_contact |
/enrich/contact |
Recupera detalles completos de contacto (correo electrónico, teléfono directo, puesto actualizado) |
company |
/search/company |
Busca un registro de empresa por nombre o dominio del sitio web |
scoop |
/search/scoop |
Recupera noticias recientes y cambios de liderazgo para una empresa |
Parte 4: Buscar contactos
Con autenticación y el router en su lugar, cada llamada a ZoomInfo sigue la misma secuencia: establecer core.zoom.resource, construir el cuerpo de la solicitud en una transformación y ejecutar la operación POST central.
Crear las operaciones de solicitud de compilación y respuesta de proceso
Las operaciones de solicitud de compilación y respuesta de proceso mencionadas en los pasos siguientes no son la operación POST central: se crea un par para cada tipo de recurso (contact, enrich_contact, company, scoop). Cada una es una operación pequeña y de propósito único construida alrededor de una transformación:
- Operación de solicitud de compilación: Contiene una transformación que asigna las variables de entrada (por ejemplo,
zoom.companyNameozoom.query_jobTitle) al cuerpo de solicitud JSON que espera el endpoint de ZoomInfo de destino. Ejecutarla antes de la operación POST central para que el cuerpo de la solicitud esté preparado antes de que la actividad POST lo envíe. - Operación de respuesta de proceso: Lee la respuesta de ZoomInfo y extrae los campos devueltos en variables o registros para su uso posterior. Analizar la respuesta ya sea con una transformación que asigne el esquema de respuesta a un destino, o con un paso de script que llame a
GetJSONStringen$jitterbit.response(el mismo enfoque utilizado para extraer el JWT en la Parte 2).
Las tres operaciones se ejecutan en secuencia: solicitud de compilación, luego la operación POST central, luego respuesta de proceso. Para el esquema de solicitud y respuesta de cada endpoint, consulta la documentación de la API de ZoomInfo.
Búsqueda de contactos por nombre de empresa
Para recuperar contactos asociados a una empresa, establece el tipo de recurso y el nombre de la empresa, construye el cuerpo de la solicitud y ejecuta la operación POST:
// Authenticate (skip if already done earlier in the workflow)
RunOperation("<TAG>operation:core.ZoomInfo - Get Auth Token</TAG>");
// Set the resource type and search parameters
$core.zoom.resource = "contact";
$zoom.companyName = $salesforce.accountName;
// Build and submit the search
RunOperation("<TAG>operation:Zoominfo - Build Request - Contact Info</TAG>");
RunOperation("<TAG>operation:core. ZoomInfo POST API CALL</TAG>");
RunOperation("<TAG>operation:Zoominfo - Process Request - Contact Info</TAG>");
La operación de solicitud de compilación (Zoominfo - Build Request - Contact Info) asigna zoom.companyName y cualquier filtro de título de trabajo opcional al formato de solicitud de la API de Búsqueda de ZoomInfo. La operación de respuesta de proceso extrae los registros de contacto devueltos en variables para su uso posterior.
Para el esquema de solicitud y respuesta de la API de Búsqueda de ZoomInfo, consulta la documentación de la API de ZoomInfo.
Filtrar contactos por título de trabajo
Para limitar los resultados a roles específicos, establece zoom.query_jobTitle antes del paso de solicitud de compilación:
$zoom.query_jobTitle = "Chief Executive Officer";
$core.zoom.resource = "contact";
RunOperation("<TAG>operation:Zoominfo - Build Request - Contact Info</TAG>");
RunOperation("<TAG>operation:core. ZoomInfo POST API CALL</TAG>");
RunOperation("<TAG>operation:Zoominfo - Process Request - Contact Info</TAG>");
Para buscar en varios títulos de trabajo, pasa una lista separada por comas en zoom.query_jobTitle e itera sobre los valores en la operación de solicitud de compilación, realizando una llamada de búsqueda por título y acumulando resultados.
Parte 5: Enriquecer datos de contacto
El enriquecimiento de contactos recupera datos detallados (direcciones de correo directo, números de teléfono y títulos de trabajo actuales) para contactos ya identificados mediante una búsqueda u obtenidos de un registro de Salesforce existente. Utiliza enriquecimiento cuando una búsqueda de contacto básica devuelve información de contacto limitada.
Establece core.zoom.resource en enrich_contact y ejecuta la operación POST central:
$core.zoom.resource = "enrich_contact";
RunOperation("<TAG>operation:Zoominfo - Build Enrich Request</TAG>");
RunOperation("<TAG>operation:core. ZoomInfo POST API CALL</TAG>");
RunOperation("<TAG>operation:Zoominfo - Process Enrich Response</TAG>");
El cuerpo de la solicitud de enriquecimiento típicamente identifica el contacto por nombre y empresa, o por un ID de contacto de ZoomInfo devuelto de una búsqueda anterior. Después del enriquecimiento, utiliza los datos devueltos para actualizar el registro de contacto correspondiente de Salesforce. Para fusionar campos enriquecidos en Salesforce, consulta Consultar registros de Salesforce usando SOQL.
Parte 6: Recuperar datos de empresa y scoop
El mismo router maneja búsquedas a nivel de empresa. La búsqueda de empresa devuelve un ID de empresa de ZoomInfo que se puede utilizar en llamadas posteriores a /search/scoop para recuperar noticias recientes y datos de cambios de liderazgo.
// Search for the company record
$zoom.companyName = $salesforce.accountName;
RunOperation("<TAG>operation:core.ZoomInfo Build Request - Get Company</TAG>");
$core.zoom.resource = "company";
RunOperation("<TAG>operation:core. ZoomInfo POST API CALL</TAG>");
RunOperation("<TAG>operation:core.ZoomInfo - Read Response - Get Company Id</TAG>");
// Retrieve scoop data using the company ID from the previous step
RunOperation("<TAG>operation:Build Request - Get Scoop for a Company</TAG>");
$core.zoom.resource = "scoop";
RunOperation("<TAG>operation:core. ZoomInfo POST API CALL</TAG>");
RunOperation("<TAG>operation:Read Response - Scoop for a Company</TAG>");
Los datos de scoop incluyen anuncios de cambios en el liderazgo, como nuevas contrataciones ejecutivas o cambios de rol. Esto es útil para flujos de trabajo de inteligencia de cuentas que alertan a los equipos de ventas o de cuentas cuando cambian contactos clave en una empresa.
Verificar la integración
-
Ejecuta
core.ZoomInfo - Get Auth Tokende forma aislada. Agrega una llamada aWriteToOperationLogdespués del script de extracción de JWT para confirmar quezoom.jwtno está vacío. Consulta los registros de operaciones para ver la entrada de registro. -
Ejecuta una búsqueda de contactos para un nombre de empresa que sepas que existe en ZoomInfo. Confirma en los registros que:
core.zoom.objectse establece en/search/contactpor el script del router.- La actividad POST devuelve un estado 200.
- La operación de respuesta del proceso genera registros de contactos.
-
Si la llamada a
/authenticatedevuelve un estado diferente de 200, confirma que las variables de proyectozoom.usernameyzoom.passwordestén configuradas correctamente. Las credenciales de ZoomInfo distinguen mayúsculas de minúsculas. -
Si las llamadas posteriores a la API devuelven 401 No autorizado, es posible que la extracción de JWT haya fallado silenciosamente. Confirma que el guard
RaiseErroren el script de autenticación esté activo y quezoom.jwtno esté vacío antes de que se ejecute la siguiente cadena de operaciones. -
Si el router genera un error de "Recurso ZoomInfo desconocido", verifica que
core.zoom.resourceesté configurado en uno de los valores admitidos (contact,enrich_contact,company,scoop) y que no haya espacios en blanco al principio ni al final del valor.