---
title: "SDK de Rust"
description: "Agrega el crate arbol-sdk y llama a la API de Arbol desde Rust asíncrono."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.getarbol.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK de Rust

`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](https://github.com/getarbol/project-arbol-sdk-rust) 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:

```toml
[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

```rust
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::ApiKey` recibe una API key (`arb_live_…`) para una máquina; `Credential::AccessToken` recibe el token de acceso de una persona para la audiencia `https://api.getarbol.com`. Consulta [Autenticación](/developers/authentication/).
- **Solo HTTPS.** `Client::new` llama a `https://api.getarbol.com`, y no sigue ninguna redirección.
- **Los datos, sin envoltorio.** Un método devuelve el `data` del 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 es `None`.
- Un campo opcional que también puede ser null es `Option<Option<T>>`: `Some(None)` envía `null`.
- 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:

```rust
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](/developers/concepts/retries/).

## 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 (ver [Versiones y actualizaciones](/developers/concepts/versions/)).

Source: https://docs.getarbol.com/developers/sdks/rust/index.mdx
