---
title: "Comprobar si la entrada CDC de una importación ya es visible en el raw"
method: POST
path: "/import-sync/visibility"
tags: ["Import Sync"]
---

# Comprobar si la entrada CDC de una importación ya es visible en el raw

`POST /import-sync/visibility`

## Request

- Base URL: `http://localhost:8081`
- URL: `http://localhost:8081/import-sync/visibility`
- Auth: HTTP bearer

Endpoint servicio-a-servicio consumido por el reconciliador de importaciones de
nev-api. **No acepta JWT de usuario.**

`/import-sync/readiness` responde "¿llegó la importación al MART?", y esa pregunta
solo puede hacerse cuando una ejecución de Dataform ya ocurrió. Este endpoint responde
la pregunta anterior y más barata: **¿está ya en BigQuery la entrada que esa ejecución
leería?** El reconciliador solo despacha la ejecución cuando la respuesta le convence,
de modo que no se paga una ejecución contra datos que aún no han llegado.

Se consulta la tabla de merge de Datastream `<dataset raw>.users`, acotada por la
lista de claves. Una entrada es **visible** cuando existe su fila y su
`modifiedAt` (epoch ms; también se acepta la forma ISO, igual que `02_stg_users.sqlx`)
es mayor o igual que `sourceVersion`. `labelVisible` es cierto cuando `importLabelId`
es nulo, o cuando existe la fila de la etiqueta en `<dataset raw>.labels` y no tiene
`deletedAt`.

La clave de almacenamiento no es el hex plano: es la clave de documento en JSON
extendido de Mongo, y conviven dos codificaciones (`{"$oid": "<hex>"}` y
`{"$oid":"<hex>"}`). Se prueban ambas por cada id.

La sonda **no filtra por tenant**: la fila raw es la imagen CDC previa a la
resolución de tenant, y su única señal de tenant es `memberOf`, justo la escritura
cuyo retraso esta sonda existe para detectar. El tenant se exige en la cabecera y se
registra en el log.

El dataset raw se toma de `BIGQUERY_RAW_DATASET`; si no está definido se deriva del
sufijo del mart (`mart_nevent_prd` → `raw_prd_nevent`, `mart_nevent_dev` →
`raw_dev_nevent`).

## Headers

- `x-service` 'nev-api', required
- `x-tenant-id` string, required

## Request body

- object
  - `jobId` string, required: Job de importación al que pertenece la sonda. Obligatorio y no vacío: es lo que permite rastrear la respuesta en Cloud Logging.
  - `importLabelId` string, nullable: Etiqueta aplicada por la importación. Si viene, se comprueba además que su fila raw exista y no esté borrada. Si es nula, `labelVisible` es cierto y no se consulta la tabla de etiquetas.
  - `entries` object[], required: Claves aceptadas de la importación. No puede ir vacío: una sonda sin nada que demostrar se rechaza con 400, porque `visible: 0 de 0` se leería como "todo visible" en una regla de umbral.
    - `userId` string, required
    - `sourceVersion` integer, required: modifiedAt esperado en la imagen CDC, en epoch ms

## Response `200`

Sonda ejecutada

- object
  - `success` boolean
  - `data` object
    - `total` integer: Entradas sondeadas
    - `visible` integer: Entradas cuya fila raw ya alcanza la versión esperada
    - `labelVisible` boolean: Cierto si `importLabelId` es nulo, o si su fila raw existe y no está borrada
    - `missingSample` string[]: Hasta 50 ids todavía no visibles, para diagnóstico. La magnitud está en `total - visible`.
  - `timestamp` string, date-time

## Other responses

- `400`: Petición inválida: `jobId` ausente o vacío, `entries` que no es un array, vacío o con más de 1000 entradas, una entrada sin `userId` o con `sourceVersion` no numérico, o `importLabelId` que no es cadena ni nulo. El mensaje nombra siempre el campo. No se ejecuta ninguna consulta.
- `401`: Token de servicio, x-service o x-tenant-id ausentes o inválidos
- `500`: Error interno del servidor
- `503`: SERVICE_TOKEN no configurado en el servicio

---

[API](https://skmtc.dev/nevent/apis/nevent-data-api.md) · [All operations](https://skmtc.dev/nevent/apis/nevent-data-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nevent/apis/nevent-data-api/revisions/81035d32c1c1?raw)
