arbol-sdk es la API de Arbol sobre HTTPS para servicios en Rust. Sus tipos, sus operaciones y los métodos de su cliente se generan a partir del documento OpenAPI público de la API; usa reqwest con rustls, serde y thiserror, corre en cualquier runtime de Tokio y necesita Rust 1.85 o posterior. El código fuente está en GitHub bajo la licencia Apache 2.0.
Instalar
El crate todavía no está en crates.io. Agrégalo como dependencia de git, fijado a un commit para tener builds reproducibles:
[dependencies]
arbol-sdk = { git = "https://github.com/getarbol/project-arbol-sdk-rust", rev = "<commit>" }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }La biblioteca es arbol_sdk. Tokio aparece solo por el #[tokio::main] del ejemplo; el crate corre en cualquier runtime de Tokio.
Crear un cliente y llamar a una operación
use arbol_sdk::{Client, Credential, types};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let arbol = Client::new(Credential::ApiKey(std::env::var("ARBOL_API_KEY")?))?;
let input = types::AgendaAppointmentsListInput {
from: Some("2026-10-12T00:00:00Z".into()),
to: Some("2026-10-19T00:00:00Z".into()),
..Default::default()
};
let page = arbol.agenda().appointments().list(&input).await?;
println!("{page:?}");
Ok(())
}Cada operación es un método con el nombre de su operation id: account.apiKeys.create es arbol.account().api_keys().create(&input), con types::AccountApiKeysCreateInput de entrada y types::AccountApiKeysCreateOutput de salida.
- Una credencial.
Credential::ApiKeyrecibe una API key (arb_live_…) para una máquina;Credential::AccessTokenrecibe el token de acceso de una persona para la audienciahttps://api.getarbol.com. Consulta Autenticación. - Solo HTTPS.
Client::newllama ahttps://api.getarbol.com, y no sigue ninguna redirección. - Los datos, sin envoltorio. Un método devuelve el
datadel envoltorio de éxito. Una respuesta más grande que el límite de su operación se rechaza.
Tipos
Los tipos siguen el esquema:
- Un campo opcional es
Option<T>y se omite de la solicitud cuando esNone. - Un campo opcional que también puede ser null es
Option<Option<T>>:Some(None)envíanull. - Una unión es un enum sin etiqueta cuyos miembros se distinguen por sus campos literales.
- Lo que Rust no puede expresar con exactitud es un
serde_json::Value.
Errores
Todo fallo es un arbol_sdk::Error:
| Campo | Significado |
|---|---|
code |
El código de error estable de la API, como FORBIDDEN, o uno propio del cliente: NETWORK_ERROR, REDIRECT_REFUSED, INVALID_RESPONSE. |
message, status, retryable, data |
El mensaje del error, el estado HTTP, la indicación de reintento de la API y los datos declarados del error. |
request_id |
El id de solicitud que debes citar cuando reportes un problema. |
outcome |
Refused: no pasó nada. NotSent: se detuvo antes de que saliera la solicitud. Unknown: una escritura o una eliminación que puede haber ocurrido. |
Nada se reintenta. Una lectura que falla es Refused o NotSent; solo una escritura o una eliminación puede terminar en Unknown, y entonces lees el estado actual antes de repetirla:
use arbol_sdk::{Error, Outcome};
fn report(error: &Error) {
match error.outcome {
Outcome::Unknown => eprintln!(
"{} may have been applied; read its state before repeating (request {:?})",
error.code, error.request_id
),
Outcome::Refused | Outcome::NotSent => eprintln!("{}: {}", error.code, error.message),
}
}Consulta Reintentos.
Versiones
El crate se regenera a mano, así que puede ir por detrás de la API. arbol_sdk::RELEASE nombra el release de la API a partir del que se generó, como 1.20261019.4056, y Cargo.toml lo registra en [package.metadata.arbol.openapi]. Compáralo con el info.version de https://api.getarbol.com/openapi.json: las operaciones agregadas desde entonces no están en el crate hasta que se regenere. La API va en el release 1.20261104.21009 (ver Versiones y actualizaciones).