Un contacto.
La agenda, encadenando páginas.
La agenda de la organización, de la más reciente a la más antigua.
social_network acota a los contactos localizables en esa red. Devolvía siempre una lista
vacía —el servidor comparaba el array entero de social_identifiers contra el nombre de la
red— hasta que se arregló el 2026-08-24; hasta la 0.3.0 este método no lo exponía.
const { data } = await pv.contacts.list(orgId, { social_network: "whatsapp", limit: 50 });
Como update, pero leyendo el contacto antes para no perder su extra_data.
Son DOS peticiones y no es gratis; existe porque el borrado silencioso de extra_data es el
fallo que se comete una vez y se descubre semanas después. Lo que se pase en extra_data se
funde sobre lo que había, campo a campo; para vaciarlo de verdad, update() con
extra_data: {}.
Optionalextra_data?: {Optionaladdress?: stringOptionalboolean_property?: booleanOptionalboolean_property2?: booleanOptionalbuilding?: string | numberOptionalcity?: stringOptionalcoords?: number[]Optionalcountry?: stringOptionalcountry_code?: stringOptionaldoor?: string | numberOptionalfloor?: string | numberOptionalnumber?: string | numberOptionalnumber_property?: numberOptionalnumber_property2?: numberOptionalplace_id?: stringOptionalstate?: stringOptionalstring_property?: stringOptionalstring_property2?: stringOptionalzip_code?: string | numberOptionalname?: stringOptionalprofile_image?: stringOptionalsocial_identifiers?: {Borra el contacto y todos sus mensajes.
Borra TODOS los contactos de la organización y TODOS sus mensajes.
No pide confirmación y no hay vuelta atrás. Está aquí porque la API lo tiene, no porque sea una operación de todos los días.
Cambia un contacto. No devuelve el contacto: la API contesta {success: true}, así que
este método no devuelve nada y hay que volver a pedirlo si se quiere ver el resultado.
CUIDADO CON extra_data: es el único campo que NO se conserva al omitirlo. El servidor lo
escribe con lo que traiga el cuerpo, así que un update() sin extra_data deja el contacto
sin ninguno de sus campos propios. name, profile_image y social_identifiers sí se
respetan cuando no viajan. Para no tener que acordarse, merge.
social_identifiers REEMPLAZA la lista entera, no se funde con ella.
Optionalextra_data?: {Optionaladdress?: stringOptionalboolean_property?: booleanOptionalboolean_property2?: booleanOptionalbuilding?: string | numberOptionalcity?: stringOptionalcoords?: number[]Optionalcountry?: stringOptionalcountry_code?: stringOptionaldoor?: string | numberOptionalfloor?: string | numberOptionalnumber?: string | numberOptionalnumber_property?: numberOptionalnumber_property2?: numberOptionalplace_id?: stringOptionalstate?: stringOptionalstring_property?: stringOptionalstring_property2?: stringOptionalzip_code?: string | numberOptionalname?: stringOptionalprofile_image?: stringOptionalsocial_identifiers?: {
Da de alta un contacto, o devuelve el que ya había.
Hace falta al menos un identificador (error 1601): un contacto sin canal es un contacto al que nadie puede escribir. Y si ya existe uno con el primer canal y el mismo
external_identifier, vuelve ÉSE tal cual, sin aplicar nada de lo que se mandó.