Class DashboardResource

Hierarchy

  • Resource
    • DashboardResource

Constructors

Methods

  • Las métricas de CUENTA agregadas: seguidores, impresiones, alcance, visitas al perfil.

    group_by decide el eje —day para una serie, network o account para un desglose, total para un solo número— y en total cada fila trae group: null. Los nombres son los del vocabulario común, no los crudos de cada red.

    Parameters

    Returns Promise<
        {
            group_by: "account"
            | "total"
            | "day"
            | "network";
            range: {
                from_date: string;
                previous_from_date: string;
                previous_to_date: string;
                to_date: string;
            };
            stats: {
                group: null
                | string;
                name:
                    | "reach"
                    | "impressions"
                    | "followers"
                    | "comments"
                    | "engagement"
                    | "likes"
                    | "shares"
                    | "saves"
                    | "clicks"
                    | "video_views"
                    | "profile_views"
                    | "followers_gained";
                value: number;
            }[];
        },
    >

  • Conteos de publicaciones del rango: por estado, por red y por día.

    Ojo con las dos series, que responden a preguntas distintas y sobre conjuntos distintos: by_day cuenta lo CREADO cada día (trabajo hecho, incluidas las programadas y los borradores) y published_by_day cuenta lo que SALIÓ cada día, sólo sended. Una publicación creada el mes pasado y publicada ayer sale en la segunda y no en la primera.

    El día se calcula en UTC: un post de madrugada puede caer en el día anterior.

    Parameters

    Returns Promise<
        {
            range: {
                from_date: string;
                previous_from_date: string;
                previous_to_date: string;
                to_date: string;
            };
        } & {
            by_day: { day?: string; state?: string; total?: number }[];
            by_network: {
                social_network?:
                    | "facebook"
                    | "instagram"
                    | "linkedin"
                    | "tiktok"
                    | "twitter"
                    | "whatsapp"
                    | "youtube"
                    | "google_business"
                    | "bluesky"
                    | "discord";
                total?: number;
            }[];
            by_state: { state?: string; total?: number }[];
            published_by_day: {
                day?: string;
                social_network?:
                    | "facebook"
                    | "instagram"
                    | "linkedin"
                    | "tiktok"
                    | "twitter"
                    | "whatsapp"
                    | "youtube"
                    | "google_business"
                    | "bluesky"
                    | "discord";
                total?: number;
            }[];
            total: number;
        },
    >

  • El listado de publicaciones del rango CON sus métricas, paginado y ordenado por la métrica pedida. Es la pantalla de estadísticas entera en una llamada.

    Dos cosas que se pagan caras si se ignoran:

    • summary cubre siempre la organización entera; social_network y accounts filtran sólo el listado. La cabecera no cambia al filtrar por Instagram, y eso es deliberado.
    • Al paginar, summary: false. Los agregados sólo dependen del rango, así que recalcularlos en cada página son tres agregaciones tiradas.

    A diferencia de topPublications, aquí SÍ salen las publicaciones sin medir, con metrics ausente. Ordenando en descendente caen al final solas.

    Parameters

    Returns Promise<
        {
            metric?: string;
            publications?: {
                _id: string;
                creation_date: string;
                engagement_base?: "reach"
                | "impressions"
                | "followers";
                external_identifier?: string;
                files: {
                    _id: string;
                    cover_image?: { _id: string; cover_image?: ...; cover_offset?: number; creation_date: string; file_externals: { external_identifier: string; external_url: string; social_network: "facebook" | "instagram" | ... 7 more ... | "discord"; }[]; ... 6 more ...; public_path: string; };
                    cover_offset?: number;
                    creation_date: string;
                    file_externals: {
                        external_identifier: string;
                        external_url: string;
                        social_network:
                            | "facebook"
                            | "instagram"
                            | "linkedin"
                            | "tiktok"
                            | "twitter"
                            | "whatsapp"
                            | "youtube"
                            | "google_business"
                            | "bluesky"
                            | "discord";
                    }[];
                    file_format: "mp4"
                    | "jpeg"
                    | "gif"
                    | "png"
                    | "jpg";
                    file_properties: {
                        allowed_social_networks: string[];
                        aspect_ratio: { text: string; value: number };
                        duration: number;
                        height: number;
                        size_in_bytes: number;
                        width: number;
                    };
                    file_type: "video"
                    | "image";
                    id_organization: string;
                    is_temporal: boolean;
                    name: string;
                    public_path: string;
                }[];
                id_account: | string
                | {
                    _id: string;
                    creation_date: string;
                    error_code: number;
                    followers_count?: number;
                    id_client: string;
                    id_organization: string;
                    image?: string;
                    name: string;
                    next_comments_update?: string;
                    next_stats_update?: string;
                    private_message_link?: string;
                    social_network: | "facebook"
                    | "instagram"
                    | "linkedin"
                    | "tiktok"
                    | "twitter"
                    | "whatsapp"
                    | "youtube"
                    | "google_business"
                    | "bluesky"
                    | "discord";
                    username?: string;
                };
                id_integration?: string;
                id_organization: string;
                metrics?: {
                    clicks?: number;
                    comments?: number;
                    engagement?: number;
                    followers?: number;
                    followers_gained?: number;
                    impressions?: number;
                    likes?: number;
                    profile_views?: number;
                    reach?: number;
                    saves?: number;
                    shares?: number;
                    video_views?: number;
                };
                name?: string;
                next_stats_update?: string;
                publication_errors: {
                    code: number;
                    data?: { [key: string]: unknown };
                    message: string;
                }[];
                publication_type: | "profile"
                | "page"
                | "group"
                | "reels"
                | "stories"
                | "message";
                publish_date?: string;
                retries: number;
                social_network: | "facebook"
                | "instagram"
                | "linkedin"
                | "tiktok"
                | "twitter"
                | "whatsapp"
                | "youtube"
                | "google_business"
                | "bluesky"
                | "discord";
                state: "ready"
                | "withErrors"
                | "sended"
                | "draft"
                | "publishing";
                statistics?: {
                    angers?: number;
                    bookmarks?: number;
                    clicks?: number;
                    comments?: number;
                    engagement?: number;
                    follows?: number;
                    hahas?: number;
                    impressions?: number;
                    likes?: number;
                    loves?: number;
                    negative_feedback?: number;
                    page_likes?: number;
                    playback_0_count?: number;
                    playback_100_count?: number;
                    playback_25_count?: number;
                    playback_50_count?: number;
                    playback_75_count?: number;
                    profile_activity?: number;
                    profile_visits?: number;
                    quotes?: number;
                    reach?: number;
                    replys?: number;
                    retwets?: number;
                    saved?: number;
                    share?: number;
                    shareMentions?: number;
                    shares?: number;
                    sorrys?: number;
                    url_link_clicks?: number;
                    user_profile_clicks?: number;
                    video_views?: number;
                    views?: number;
                    wows?: number;
                };
                stats_updated_date?: string;
                text?: string;
                title?: string;
                url?: string;
            }[];
            range?: {
                from_date?: string;
                previous_from_date?: string;
                previous_to_date?: string;
                to_date?: string;
            };
            summary?: {
                by_network?: {
                    metrics?: {
                        clicks?: number;
                        comments?: number;
                        engagement?: number;
                        followers?: number;
                        followers_gained?: number;
                        impressions?: number;
                        likes?: number;
                        profile_views?: number;
                        reach?: number;
                        saves?: number;
                        shares?: number;
                        video_views?: number;
                    };
                    publications?: number;
                    social_network?: string;
                }[];
                previous_total?: {
                    clicks?: number;
                    comments?: number;
                    engagement?: number;
                    followers?: number;
                    followers_gained?: number;
                    impressions?: number;
                    likes?: number;
                    profile_views?: number;
                    reach?: number;
                    saves?: number;
                    shares?: number;
                    video_views?: number;
                };
                total?: {
                    clicks?: number;
                    comments?: number;
                    engagement?: number;
                    followers?: number;
                    followers_gained?: number;
                    impressions?: number;
                    likes?: number;
                    profile_views?: number;
                    reach?: number;
                    saves?: number;
                    shares?: number;
                    video_views?: number;
                };
            };
            total?: number;
        },
    >

  • La pantalla de inicio entera en UN viaje: salud operativa, publicaciones, métricas de publicación y de cuenta, consumo del plan, planes de IA y mensajes sin leer.

    Un bloque que falta no es un error. Cada uno se comprueba contra su propio permiso y se omite si quien llama no puede leerlo, en vez de tumbar la petición entera; available_blocks dice cuáles se permitieron. Un bloque en true que no viene en el cuerpo significa que no había datos — salvo messages, que también se apaga cuando el plan no incluye chat.

    Parameters

    Returns Promise<
        {
            account_metrics?: {
                by_day: {
                    group: null
                    | string;
                    name:
                        | "reach"
                        | "impressions"
                        | "followers"
                        | "comments"
                        | "engagement"
                        | "likes"
                        | "shares"
                        | "saves"
                        | "clicks"
                        | "video_views"
                        | "profile_views"
                        | "followers_gained";
                    value: number;
                }[];
                by_network: {
                    group: null
                    | string;
                    name:
                        | "reach"
                        | "impressions"
                        | "followers"
                        | "comments"
                        | "engagement"
                        | "likes"
                        | "shares"
                        | "saves"
                        | "clicks"
                        | "video_views"
                        | "profile_views"
                        | "followers_gained";
                    value: number;
                }[];
                previous_total: {
                    clicks?: number;
                    comments?: number;
                    engagement?: number;
                    followers?: number;
                    followers_gained?: number;
                    impressions?: number;
                    likes?: number;
                    profile_views?: number;
                    reach?: number;
                    saves?: number;
                    shares?: number;
                    video_views?: number;
                };
                total: {
                    clicks?: number;
                    comments?: number;
                    engagement?: number;
                    followers?: number;
                    followers_gained?: number;
                    impressions?: number;
                    likes?: number;
                    profile_views?: number;
                    reach?: number;
                    saves?: number;
                    shares?: number;
                    video_views?: number;
                };
            };
            ai_plans?: {
                by_state: { state?: string; total?: number }[];
                credits_spent: number;
                generated_publications: number;
                last_plan?: {
                    _id: string;
                    creation_date: string;
                    credits_spent?: number;
                    error?: {
                        code: number;
                        data?: { [key: string]: unknown };
                        message: string;
                    };
                    generation_end_date?: string;
                    prompt?: string;
                    publications?: string[];
                    state: | "pending"
                    | "generating"
                    | "generated"
                    | "validated"
                    | "failed"
                    | "cancelled";
                };
                pending_validation: number;
                total: number;
            };
            available_blocks: {
                account_metrics: boolean;
                ai_plans: boolean;
                health: boolean;
                messages: boolean;
                plan_use: boolean;
                publication_metrics: boolean;
                publications: boolean;
            };
            health?: {
                accounts_with_errors?: {
                    _id: string;
                    error_code: number;
                    image?: string;
                    name: string;
                    social_network: | "facebook"
                    | "instagram"
                    | "linkedin"
                    | "tiktok"
                    | "twitter"
                    | "whatsapp"
                    | "youtube"
                    | "google_business"
                    | "bluesky"
                    | "discord";
                    username?: string;
                }[];
                publications_with_errors?: {
                    _id: string;
                    creation_date?: string;
                    name?: string;
                    publication_errors?: {
                        code: number;
                        data?: (...)
                        | (...);
                        message: string;
                    }[];
                    publish_date?: string;
                    social_network: | "facebook"
                    | "instagram"
                    | "linkedin"
                    | "tiktok"
                    | "twitter"
                    | "whatsapp"
                    | "youtube"
                    | "google_business"
                    | "bluesky"
                    | "discord";
                    text?: string;
                }[];
                total_drafts?: number;
                upcoming_publications?: {
                    _id: string;
                    creation_date?: string;
                    name?: string;
                    publication_errors?: {
                        code: number;
                        data?: (...)
                        | (...);
                        message: string;
                    }[];
                    publish_date?: string;
                    social_network: | "facebook"
                    | "instagram"
                    | "linkedin"
                    | "tiktok"
                    | "twitter"
                    | "whatsapp"
                    | "youtube"
                    | "google_business"
                    | "bluesky"
                    | "discord";
                    text?: string;
                }[];
            };
            messages?: { unread: number };
            plan_use?: {
                actual_asigned: {
                    accounts: number;
                    ai_credits?: number;
                    artificial_inteligence?: boolean;
                    integrations: number;
                    publications: number;
                    space: number;
                    stats?: boolean;
                    twitter_credits?: number;
                    users: number;
                    whatsapp?: boolean;
                };
                actual_use: {
                    accounts: number;
                    ai_credits?: number;
                    artificial_inteligence?: boolean;
                    integrations: number;
                    publications: number;
                    space: number;
                    stats?: boolean;
                    twitter_credits?: number;
                    users: number;
                    whatsapp?: boolean;
                };
                limits: {
                    accounts: number;
                    ai_credits?: number;
                    artificial_inteligence?: boolean;
                    integrations: number;
                    publications: number;
                    space: number;
                    stats?: boolean;
                    twitter_credits?: number;
                    users: number;
                    whatsapp?: boolean;
                };
            };
            publication_metrics?: {
                by_network: {
                    metrics?: {
                        clicks?: number;
                        comments?: number;
                        engagement?: number;
                        followers?: number;
                        followers_gained?: number;
                        impressions?: number;
                        likes?: number;
                        profile_views?: number;
                        reach?: number;
                        saves?: number;
                        shares?: number;
                        video_views?: number;
                    };
                    publications?: number;
                    social_network?: | "facebook"
                    | "instagram"
                    | "linkedin"
                    | "tiktok"
                    | "twitter"
                    | "whatsapp"
                    | "youtube"
                    | "google_business"
                    | "bluesky"
                    | "discord";
                }[];
                previous_total: {
                    clicks?: number;
                    comments?: number;
                    engagement?: number;
                    followers?: number;
                    followers_gained?: number;
                    impressions?: number;
                    likes?: number;
                    profile_views?: number;
                    reach?: number;
                    saves?: number;
                    shares?: number;
                    video_views?: number;
                };
                top: {
                    collected_date?: string;
                    engagement_base?: "reach"
                    | "impressions"
                    | "followers";
                    id_publication: string;
                    metrics: {
                        clicks?: number;
                        comments?: number;
                        engagement?: number;
                        followers?: number;
                        followers_gained?: number;
                        impressions?: number;
                        likes?: number;
                        profile_views?: number;
                        reach?: number;
                        saves?: number;
                        shares?: number;
                        video_views?: number;
                    };
                    publication: {
                        external_identifier?: string;
                        files?: {
                            _id: string;
                            cover_image?: (...)
                            | (...);
                            cover_offset?: (...) | (...);
                            creation_date: string;
                            file_externals: (...)[];
                            file_format: (...) | (...) | (...) | (...) | (...);
                            file_properties: {
                                allowed_social_networks: ...;
                                aspect_ratio: ...;
                                duration: ...;
                                height: ...;
                                size_in_bytes: ...;
                                width: ...;
                            };
                            file_type: (...)
                            | (...);
                            id_organization: string;
                            is_temporal: boolean;
                            name: string;
                            public_path: string;
                        }[];
                        publication_type?: string;
                        text?: string;
                        title?: string;
                        url?: string;
                    };
                    publish_date?: string;
                    social_network: | "facebook"
                    | "instagram"
                    | "linkedin"
                    | "tiktok"
                    | "twitter"
                    | "whatsapp"
                    | "youtube"
                    | "google_business"
                    | "bluesky"
                    | "discord";
                }[];
                total: {
                    clicks?: number;
                    comments?: number;
                    engagement?: number;
                    followers?: number;
                    followers_gained?: number;
                    impressions?: number;
                    likes?: number;
                    profile_views?: number;
                    reach?: number;
                    saves?: number;
                    shares?: number;
                    video_views?: number;
                };
            };
            publications?: {
                by_day: { day?: string; state?: string; total?: number }[];
                by_network: {
                    social_network?:
                        | "facebook"
                        | "instagram"
                        | "linkedin"
                        | "tiktok"
                        | "twitter"
                        | "whatsapp"
                        | "youtube"
                        | "google_business"
                        | "bluesky"
                        | "discord";
                    total?: number;
                }[];
                by_state: { state?: string; total?: number }[];
                published_by_day: {
                    day?: string;
                    social_network?:
                        | "facebook"
                        | "instagram"
                        | "linkedin"
                        | "tiktok"
                        | "twitter"
                        | "whatsapp"
                        | "youtube"
                        | "google_business"
                        | "bluesky"
                        | "discord";
                    total?: number;
                }[];
                total: number;
            } & { previous_total?: number };
            range: {
                from_date: string;
                previous_from_date: string;
                previous_to_date: string;
                to_date: string;
            };
        },
    >

  • El ranking de publicaciones del rango por una métrica.

    Sólo entra lo que ya se ha medido: una publicación que la red aún no ha reportado, o de una red que no publica esa métrica, no compite — no es que haya sacado un 0. Para verlas todas con su hueco, publicationStats.

    Cuidado con la forma: una fila no es una Publication. No tiene _id —el identificador es id_publication— y el contenido viaja anidado en publication.

    Parameters

    Returns Promise<
        {
            metric: | "reach"
            | "impressions"
            | "followers"
            | "comments"
            | "engagement"
            | "likes"
            | "shares"
            | "saves"
            | "clicks"
            | "video_views"
            | "profile_views"
            | "followers_gained";
            publications: {
                collected_date?: string;
                engagement_base?: "reach"
                | "impressions"
                | "followers";
                id_publication: string;
                metrics: {
                    clicks?: number;
                    comments?: number;
                    engagement?: number;
                    followers?: number;
                    followers_gained?: number;
                    impressions?: number;
                    likes?: number;
                    profile_views?: number;
                    reach?: number;
                    saves?: number;
                    shares?: number;
                    video_views?: number;
                };
                publication: {
                    external_identifier?: string;
                    files?: {
                        _id: string;
                        cover_image?: { _id: string; cover_image?: ...; cover_offset?: number; creation_date: string; file_externals: { external_identifier: string; external_url: string; social_network: "facebook" | "instagram" | ... 7 more ... | "discord"; }[]; ... 6 more ...; public_path: string; };
                        cover_offset?: number;
                        creation_date: string;
                        file_externals: {
                            external_identifier: string;
                            external_url: string;
                            social_network: | (...)
                            | (...)
                            | (...)
                            | (...)
                            | (...)
                            | (...)
                            | (...)
                            | (...)
                            | (...)
                            | (...);
                        }[];
                        file_format: "mp4"
                        | "jpeg"
                        | "gif"
                        | "png"
                        | "jpg";
                        file_properties: {
                            allowed_social_networks: string[];
                            aspect_ratio: { text: string; value: number };
                            duration: number;
                            height: number;
                            size_in_bytes: number;
                            width: number;
                        };
                        file_type: "video"
                        | "image";
                        id_organization: string;
                        is_temporal: boolean;
                        name: string;
                        public_path: string;
                    }[];
                    publication_type?: string;
                    text?: string;
                    title?: string;
                    url?: string;
                };
                publish_date?: string;
                social_network: | "facebook"
                | "instagram"
                | "linkedin"
                | "tiktok"
                | "twitter"
                | "whatsapp"
                | "youtube"
                | "google_business"
                | "bluesky"
                | "discord";
            }[];
            range: {
                from_date: string;
                previous_from_date: string;
                previous_to_date: string;
                to_date: string;
            };
        },
    >

  • El consumo del plan de la organización: lo que gasta, lo que ha repartido entre sus hijas y los límites que le aplican.

    Una organización sin plan propio hereda el del primer padre que tenga uno, así que limits puede no ser suyo. Es la forma barata de pintar una barra de progreso: antes había que bajarse el listado entero de organizaciones del cliente.

    Parameters

    Returns Promise<
        {
            actual_asigned: {
                accounts: number;
                ai_credits?: number;
                artificial_inteligence?: boolean;
                integrations: number;
                publications: number;
                space: number;
                stats?: boolean;
                twitter_credits?: number;
                users: number;
                whatsapp?: boolean;
            };
            actual_use: {
                accounts: number;
                ai_credits?: number;
                artificial_inteligence?: boolean;
                integrations: number;
                publications: number;
                space: number;
                stats?: boolean;
                twitter_credits?: number;
                users: number;
                whatsapp?: boolean;
            };
            limits: {
                accounts: number;
                ai_credits?: number;
                artificial_inteligence?: boolean;
                integrations: number;
                publications: number;
                space: number;
                stats?: boolean;
                twitter_credits?: number;
                users: number;
                whatsapp?: boolean;
            };
        },
    >