Volver al inicio
Documentación de la API
Fácil integración
API REST v1
Integra OpenProof desde backend, scripts o servicios externos para registrar hashes, consultar estados y enlazar viewers públicos con ejemplos listos para usar.
Lenguaje global de ejemplos
Base URL
https://tu-dominio-openproof.com/api/v1
Autenticación
Las rutas privadas aceptan API key bearer o sesión válida según el contexto.
Authorization: Bearer OPENPROOF_API_KEY
Viewer público
Usa la respuesta de verificación para enlazar el viewer oficial devuelto en publicProofPath.
/p/<transactionId>
Inicio rápido
Elige un lenguaje una sola vez y todos los snippets se sincronizan.
Quickstart · Rust
use reqwest::Client;
use serde_json::json;
let client = Client::new();
let payload = client
.post("https://tu-dominio-openproof.com/api/v1/documents/verify")
.json(&json!({
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"
}))
.send()
.await?
.json::<serde_json::Value>()
.await?;
println!("{:?}", payload["data"]["publicProofPath"]);use reqwest::Client;
use serde_json::json;
let client = Client::new();
let payload = client
.post("https://tu-dominio-openproof.com/api/v1/documents/verify")
.json(&json!({
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"
}))
.send()
.await?
.json::<serde_json::Value>()
.await?;
println!("{:?}", payload["data"]["publicProofPath"]);Endpoints
POSTBearer requerido
/api/v1/documentsRegistra un hash documental con nombre de archivo y metadatos opcionales.
Request · Rust
use reqwest::Client;
use serde_json::json;
let client = Client::new();
let payload = client
.post("https://tu-dominio-openproof.com/api/v1/documents")
.bearer_auth("OPENPROOF_API_KEY")
.json(&json!({
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a",
"filename": "contrato-marzo-2026.pdf",
"metadata": {
"description": "Contrato firmado con proveedor",
"tags": ["legal", "proveedores"]
}
}))
.send()
.await?
.json::<serde_json::Value>()
.await?;use reqwest::Client;
use serde_json::json;
let client = Client::new();
let payload = client
.post("https://tu-dominio-openproof.com/api/v1/documents")
.bearer_auth("OPENPROOF_API_KEY")
.json(&json!({
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a",
"filename": "contrato-marzo-2026.pdf",
"metadata": {
"description": "Contrato firmado con proveedor",
"tags": ["legal", "proveedores"]
}
}))
.send()
.await?
.json::<serde_json::Value>()
.await?;Response
{
"success": true,
"data": {
"documentId": "2fbd2479-c2b7-467a-9d85-4f1119caaf39",
"transactionId": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"status": "processing",
"createdAt": "2026-03-30T18:45:00Z"
}
}{
"success": true,
"data": {
"documentId": "2fbd2479-c2b7-467a-9d85-4f1119caaf39",
"transactionId": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"status": "processing",
"createdAt": "2026-03-30T18:45:00Z"
}
}Requiere sesión verificada o API key bearer válida.
El `transactionId` puede llegar vacío mientras el worker todavía no haya emitido la transacción on-chain.
POSTRuta pública
/api/v1/documents/verifyVerifica si un hash ya fue registrado y devuelve la ruta pública del viewer cuando existe constancia compartible.
Request · Rust
use reqwest::Client;
use serde_json::json;
let client = Client::new();
let payload = client
.post("https://tu-dominio-openproof.com/api/v1/documents/verify")
.json(&json!({
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"
}))
.send()
.await?
.json::<serde_json::Value>()
.await?;
println!("{:?}", payload["data"]["publicProofPath"]);use reqwest::Client;
use serde_json::json;
let client = Client::new();
let payload = client
.post("https://tu-dominio-openproof.com/api/v1/documents/verify")
.json(&json!({
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"
}))
.send()
.await?
.json::<serde_json::Value>()
.await?;
println!("{:?}", payload["data"]["publicProofPath"]);Response
{
"success": true,
"data": {
"exists": true,
"transactionId": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"publicProofPath": "/p/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"blockHeight": 831542,
"timestamp": "2024-01-15T10:30:00Z",
"confirmations": 1542
}
}{
"success": true,
"data": {
"exists": true,
"transactionId": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"publicProofPath": "/p/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"blockHeight": 831542,
"timestamp": "2024-01-15T10:30:00Z",
"confirmations": 1542
}
}No requiere autenticación y está sujeta a rate limiting público.
`publicProofPath` es la ruta recomendada para enlazar el viewer oficial desde tus propias aplicaciones.
GETBearer requerido
/api/v1/documents/{id}Obtiene el detalle privado de un documento perteneciente al owner autenticado.
Request · Rust
let client = reqwest::Client::new();
let payload = client
.get("https://tu-dominio-openproof.com/api/v1/documents/2fbd2479-c2b7-467a-9d85-4f1119caaf39")
.bearer_auth("OPENPROOF_API_KEY")
.send()
.await?
.json::<serde_json::Value>()
.await?;let client = reqwest::Client::new();
let payload = client
.get("https://tu-dominio-openproof.com/api/v1/documents/2fbd2479-c2b7-467a-9d85-4f1119caaf39")
.bearer_auth("OPENPROOF_API_KEY")
.send()
.await?
.json::<serde_json::Value>()
.await?;Response
{
"success": true,
"data": {
"id": "2fbd2479-c2b7-467a-9d85-4f1119caaf39",
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a",
"filename": "contract.pdf",
"metadata": {
"description": "Contrato firmado con proveedor",
"tags": ["legal", "proveedores"]
},
"transactionId": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"blockHeight": 831542,
"timestamp": "2024-01-15T10:30:00Z",
"confirmations": 1542,
"status": "confirmed",
"createdAt": "2026-03-30T18:45:00Z",
"updatedAt": "2026-03-30T18:52:00Z"
}
}{
"success": true,
"data": {
"id": "2fbd2479-c2b7-467a-9d85-4f1119caaf39",
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a",
"filename": "contract.pdf",
"metadata": {
"description": "Contrato firmado con proveedor",
"tags": ["legal", "proveedores"]
},
"transactionId": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"blockHeight": 831542,
"timestamp": "2024-01-15T10:30:00Z",
"confirmations": 1542,
"status": "confirmed",
"createdAt": "2026-03-30T18:45:00Z",
"updatedAt": "2026-03-30T18:52:00Z"
}
}Solo devuelve documentos asociados al owner autenticado o al owner de la API key.
GETBearer requerido
/api/v1/documentsLista los documentos del usuario autenticado o del owner de la API key.
Request · Rust
let client = reqwest::Client::new();
let payload = client
.get("https://tu-dominio-openproof.com/api/v1/documents")
.bearer_auth("OPENPROOF_API_KEY")
.send()
.await?
.json::<serde_json::Value>()
.await?;let client = reqwest::Client::new();
let payload = client
.get("https://tu-dominio-openproof.com/api/v1/documents")
.bearer_auth("OPENPROOF_API_KEY")
.send()
.await?
.json::<serde_json::Value>()
.await?;Response
{
"success": true,
"data": [
{
"id": "2fbd2479-c2b7-467a-9d85-4f1119caaf39",
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a",
"filename": "contrato-marzo-2026.pdf",
"transactionId": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"status": "confirmed",
"createdAt": "2026-03-30T18:45:00Z",
"updatedAt": "2026-03-30T18:52:00Z"
}
]
}{
"success": true,
"data": [
{
"id": "2fbd2479-c2b7-467a-9d85-4f1119caaf39",
"fileHash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a",
"filename": "contrato-marzo-2026.pdf",
"transactionId": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"status": "confirmed",
"createdAt": "2026-03-30T18:45:00Z",
"updatedAt": "2026-03-30T18:52:00Z"
}
]
}Útil para dashboards, backoffices o conciliación de registros ya procesados.
GETRuta pública
/api/v1/transactions/{txid}Expone información pública de una transacción Bitcoin vinculada al registro.
Request · Rust
let payload = reqwest::get(
"https://tu-dominio-openproof.com/api/v1/transactions/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
)
.await?
.json::<serde_json::Value>()
.await?;let payload = reqwest::get(
"https://tu-dominio-openproof.com/api/v1/transactions/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
)
.await?
.json::<serde_json::Value>()
.await?;Response
{
"success": true,
"data": {
"txid": "4a5e1e4baab89f3a32518a88c31bc87f...",
"blockHeight": 831542,
"blockHash": "000000000000000000029d7e3cb4c3a0...",
"timestamp": "2024-01-15T10:30:00Z",
"confirmations": 1542,
"fee": 0.00001234,
"outputs": [
{
"address": "bc1qexample...",
"value": 0.00000546,
"opReturn": "a7ffc6f8bf1ed76651c14756a061d662"
}
]
}
}{
"success": true,
"data": {
"txid": "4a5e1e4baab89f3a32518a88c31bc87f...",
"blockHeight": 831542,
"blockHash": "000000000000000000029d7e3cb4c3a0...",
"timestamp": "2024-01-15T10:30:00Z",
"confirmations": 1542,
"fee": 0.00001234,
"outputs": [
{
"address": "bc1qexample...",
"value": 0.00000546,
"opReturn": "a7ffc6f8bf1ed76651c14756a061d662"
}
]
}
}Diseñada para viewers públicos, auditorías técnicas y validación de anclaje on-chain.
Rate Limits
La API tiene los siguientes límites de uso:
100
requests/minuto
1,000
requests/hora
10,000
requests/día
Los headers de respuesta incluyen información sobre tu uso actual:
Headers de ejemplo
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1705312260X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1705312260Códigos de error
400Bad Request - Parámetros inválidos
401Unauthorized - API key inválida o ausente
404Not Found - Recurso no encontrado
429Too Many Requests - Rate limit excedido
500Server Error - Error interno del servidor
¿Listo para integrar OpenProof?