Paquetes sin conexión
Un paquete sin conexión es una traducción completa en un único archivo SQLite comprimido con gzip. Se descarga una vez y después se puede leer, buscar y consultar la concordancia en el dispositivo, sin red y sin llamadas a la API.
El archivo se sirve desde una CDN, no desde /graphql, así que la descarga no cuenta para los
límites de uso ni para la cuota diaria de tu clave de API. La API solo
se usa para saber dónde está el archivo.
Encontrar el paquete
- GraphQL
- cURL
- Ruby
- Node.js
- Python
query {
translation(identifier: "spa-rv1909") {
identifier
note
offlineDownloadable
offlinePackage(schemaVersion: 1) {
url
sha256
sizeBytes
uncompressedSizeBytes
schemaVersion
verseCount
updatedAt
}
}
}
curl https://bibleql.org/graphql \
-H "Authorization: Bearer $BIBLEQL_API_KEY" \
-H "Content-Type: application/json" \
--data '{"query":"query { translation(identifier: \"spa-rv1909\") { identifier note offlineDownloadable offlinePackage(schemaVersion: 1) { url sha256 sizeBytes uncompressedSizeBytes schemaVersion verseCount updatedAt } } }"}'
Esta query no tiene un método propio en bibleql-ruby en su versión actual. Usa la pestaña GraphQL o cURL, o envía el documento con cualquier cliente HTTP.
Esta query no tiene un método propio en bibleql-js en su versión actual. Usa la pestaña GraphQL o cURL, o envía el documento con cualquier cliente HTTP.
Esta query no tiene un método propio en bibleql en su versión actual. Usa la pestaña GraphQL o cURL, o envía el documento con cualquier cliente HTTP.
Una respuesta tiene este aspecto:
{
"data": {
"translation": {
"identifier": "spa-rv1909",
"note": "Public Domain",
"offlineDownloadable": true,
"offlinePackage": {
"url": "https://downloads.bibleql.org/translations/spa-rv1909/v1/a868db2d…9019d.sqlite.gz",
"sha256": "a868db2d…9019d",
"sizeBytes": 3355443,
"uncompressedSizeBytes": 7549747,
"schemaVersion": 1,
"verseCount": 31084,
"updatedAt": "2026-09-29T14:03:11Z"
}
}
}
}
Para listar todos los paquetes a la vez:
query {
translations {
identifier
offlinePackage { url sha256 sizeBytes }
}
}
Cuando offlinePackage es null
offlineDownloadable: false: la licencia de la traducción no permite redistribuirla. Muchas traducciones están disponibles en la API pero no como descarga. Para esas, sigue usando la API.offlineDownloadable: true: todavía no se ha publicado ningún paquete. Vuelve a intentarlo más tarde.
Pasa el schemaVersion más alto que tu cliente sepa leer. Las versiones anteriores siguen
publicadas mientras haya clientes que puedan pedirlas.
Descargar de forma segura
- Descarga
urlen un archivo temporal. UsasizeBytespara mostrar el progreso yuncompressedSizeBytespara comprobar antes el espacio libre en disco. - Comprueba que el SHA-256 de los bytes descargados coincide con
sha256. Si no coincide, borra el archivo. - Descomprímelo y confirma que
PRAGMA application_ides1112624177(0x42514C31, "BQL1") y quePRAGMA user_versiones elschemaVersionque pediste. - Renómbralo a su nombre final, p. ej.
spa-rv1909.v1.sqlite, y guarda elsha256junto a él. - Ábrelo en modo de solo lectura.
Las URL de los paquetes nunca cambian: cada nueva exportación tiene una URL nueva. Para saber si
hay una actualización, compara el sha256 que guardaste con el offlinePackage.sha256 actual.
Si son distintos, hay una versión nueva.
Qué contiene el archivo
| Tabla | Contenido |
|---|---|
meta | Pares key/value: translation_identifier, translation_name, language_code, license_note, exported_at, verse_count, … |
books | id (posición canónica 1–66), code (GEN, JHN, igual que bookId), name (localizado, p. ej. Juan), testament (OT/NT), chapters |
verses | id, book_id, chapter, verse, text. id sigue el orden canónico. |
verses_fts | Índice de texto completo (SQLite FTS5) sobre verses.text. Ignora los acentos: espiritu encuentra espíritu. |
-- Juan 3:16
SELECT v.text FROM verses v JOIN books b ON b.id = v.book_id
WHERE b.code = 'JHN' AND v.chapter = 3 AND v.verse = 16;
-- Concordancia: todos los versículos que contienen una palabra, en orden canónico
SELECT b.name, v.chapter, v.verse, v.text
FROM verses_fts f
JOIN verses v ON v.id = f.rowid
JOIN books b ON b.id = v.book_id
WHERE verses_fts MATCH 'espiritu'
ORDER BY v.id;
Muestra meta.license_note allí donde aparezca la traducción, igual que harías con el campo
note de la API.