> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/contributor/contributor-es/contenido/snapshots.md).

# Instantáneas

Los content servers compilarán periódicamente resúmenes de las entities activas que alojan, llamados *instantáneas*. Son files normales [files](https://github.com/decentraland/docs/tree/main/contributor/filesystem.md) y se pueden descargar usando su identificador.

Las instantáneas se crean diariamente, semanalmente, mensualmente y anualmente. Cada una contiene el conjunto de entities activas que cambiaron desde la instantánea anterior para ese rango.

Las instantáneas contendrán versiones en conflicto de las mismas entities (es decir, distintos [manifest files](https://github.com/decentraland/docs/tree/main/contributor/entities.md#properties) asociados al mismo pointer) a medida que se actualizan. Al analizarlas, los clients deben conservar la versión de la instantánea más reciente. Dado que los content servers pueden eliminar files inactivos, no se garantiza que las versiones obsoletas de las entities estén disponibles para descarga.

Cuando una nueva instantánea *reemplaza* a las anteriores (p. ej., una instantánea semanal que combina una serie de diarias), sus metadata indican qué files anteriores se reemplazan para que los clients no necesiten descargarlos.

El conjunto completo de entities activas puede descubrirse combinando todas las instantáneas disponibles (más sobre esto a continuación), conservando la entity más reciente referenciada por cada [pointer](https://github.com/decentraland/docs/tree/main/contributor/pointers.md) descubierto en el camino.

Puedes experimentar con las instantáneas usando código funcional en la sección de [práctica](https://github.com/decentraland/docs/tree/main/contributor/practice.md) .

### Descubrir instantáneas <a href="#discover" id="discover"></a>

Para localizar el conjunto actual de instantáneas, usa el [`instantáneas` endpoint](https://decentraland.github.io/catalyst-api-specs/#tag/Content-Server/operation/getSnapshots). La respuesta contiene un array de items con estos campos:

| Campo                     | Valor                                                                                     |
| ------------------------- | ----------------------------------------------------------------------------------------- |
| `generationTimestamp`     | La marca de tiempo Unix UTC cuando se creó esta instantánea.                              |
| `hash`                    | El [file](https://github.com/decentraland/docs/tree/main/contributor/filesystem.md).      |
| `numberOfEntities`        | El número de entradas en el file de la instantánea.                                       |
| `replacedSnapshotHashes`  | Un array con los `hash` de cualquier instantánea reemplazada por esta.                    |
| `timeRange.initTimestamp` | La marca de tiempo Unix UTC (en milisegundos) para el inicio del rango de la instantánea. |
| `timerange.endTimestamp`  | La marca de tiempo Unix UTC (en milisegundos) para el final del rango de la instantánea.  |

Por ejemplo:

```json
{
  "generationTimestamp": 1684979298844,
  "hash": "bafybeiflmm46nr4vv2h3wuzbx3pukcz7ju4fhbfzt6yxmoo533uktlgru4",
  "numberOfEntities": 12345,
  "replacedSnapshotHashes": [ "bafybeicw6x75ieaxfwynekbyhpcsgctpjkt6cb4j6oa7s57qjj6e4b5phd" ],
  "timeRange": {
     "initTimestamp": 1684281600000,
     "endTimestamp": 1684886400000
  }
}
```

### Descargando instantáneas <a href="#download" id="download"></a>

Usando el `hash` campo de una instantánea, los clients pueden descargar las entities contenidas asociadas creadas o actualizadas en ese rango de tiempo.

Los files de instantánea comienzan con esta línea exacta:

```
### instantánea JSON de Decentraland
```

Después de eso, cada línea es un documento JSON que describe una [entity](https://github.com/decentraland/docs/tree/main/contributor/entities.md) con los siguientes campos:

| Campo             | Valor                                                                                                                                     |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `entityId`        | El identificador inmutable de esta [entity](https://github.com/decentraland/docs/tree/main/contributor/entities.md).                      |
| `entityType`      | Uno de `escena`, `perfil`, `wearable`, `emote`, `store` o `outfits`.                                                                      |
| `pointers`        | Un array de [pointers](https://github.com/decentraland/docs/tree/main/contributor/pointers.md) que resuelven (o resolvían) a esta entity. |
| `entityTimestamp` | La marca de tiempo Unix UTC (en milisegundos) cuando se subió esta entity.                                                                |
| `authChain`       | El [cadena de autenticación](https://github.com/decentraland/docs/tree/main/contributor/entities.md#ownership) para esta entity.          |

Una entrada típica se ve así:

```json
{
  "entityId": "bafkreigrvaqynmiglpvewwhn2yd63q5dvagrrt5jbhimzvbrn5kimj5zne",
  "entityType": "wearable",
  "pointers": ["urn:decentraland:matic:collections-v2:0x11a6879861f36cbad632a4e7226816a16139fb33:0"],
  "entityTimestamp": 1671117456129,
  "authChain": [
    // ... cargas útiles y firmas de la cadena de autenticación
  ]
}
```

{% hint style="info" %}
Si vas a analizar una instantánea línea por línea, recuerda omitir (o mejor aún, validar) la primera con el encabezado, y prepárate para manejar una línea vacía al final del file.
{% endhint %}

#### Iniciando un índice de entities <a href="#index-start" id="index-start"></a>

Los clients que quieran indexar el conjunto completo de entities activas deben procesar todas las instantáneas actualmente disponibles y conservar la más reciente [entity](https://github.com/decentraland/docs/tree/main/contributor/entities.md) para cada [pointer](https://github.com/decentraland/docs/tree/main/contributor/pointers.md).

La estrategia más sencilla es procesar las instantáneas en orden cronológico inverso (es decir, primero la más reciente), ignorando los pointers que ya se hayan descubierto, para conservar la referencia a la entity más reciente.

En pseudocódigo:

```py
# Descarga el conjunto actual de instantáneas y ordénalas de la más nueva a la más antigua:
snapshots = get_snapshots()
snapshots.sort('timeRange.initTimestamp', DESCENDING)

seen_pointers = set()

# Procesa las instantáneas, conservando la entity más nueva para cada pointer:
for snapshot in snapshots:
    items = get_snapshot_items(snapshot) 

    for item in items:
        if any(pointer in seen_pointers for pointer in item.pointers):
            discard(item)
        else:
            keep(item)
            seen_pointers.update(item.pointers)
```

Dado que entities individuales pueden ser referenciadas por múltiples pointers (como suele ocurrir con [escenas](/contributor/contributor-es/contenido/tipos-de-entidad/scenes.md)), todos ellos deben comprobarse antes de decidir conservar o descartar el item.

{% hint style="info" %}
Los files de instantánea para los rangos de tiempo más largos pueden ser muy grandes. Para fines de desarrollo y experimentación que no requieren indexar todo el conjunto de entities, se recomienda usar las instantáneas más pequeñas. El conjunto resultante de entities será incompleto pero válido.
{% endhint %}

#### Actualizando un índice de entities <a href="#index-update" id="index-update"></a>

Los clients que mantengan un índice de entities actualizado pueden hacer llamadas periódicas al [`instantáneas`](https://decentraland.github.io/catalyst-api-specs/#tag/Content-Server/operation/getSnapshots) endpoint, y determinar si descargar cada file considerando:

* ¿La instantánea identificada por `hash` ya se descargó?
* ¿Está `hash` en la `replacedSnapshotHashes` lista de otra instantánea que ya se descargó?
* ¿Es la `timeRange` relevante para los propósitos actuales?

Si es necesario procesar nuevas instantáneas, se puede usar la misma estrategia que arriba para actualizar un conjunto de datos existente.

### Ejemplos

En la [práctica](https://github.com/decentraland/docs/tree/main/contributor/practice.md) sección, encontrarás ejemplos de código que funcionan con el sistema de instantáneas.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.decentraland.org/contributor/contributor-es/contenido/snapshots.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
