zero-bounce 1.2.0

Wrapper library over the ZeroBounce API v2
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
#### Cómo utilizar
Esta biblioteca utiliza la API de ZeroBounce, la cual requiere una clave de API. Consulta [esta guía](https://www.zerobounce.net/docs/api-dashboard#API_keys_management) para ver cómo obtener la tuya.

Revisa los [fragmentos de ejemplo](https://github.com/zerobounce/zerobounce-rust-api/tree/main/examples) para ver cómo puedes integrar esta biblioteca en tu propio proyecto.

## Opciones de Configuración

El cliente `ZeroBounce` puede ser configurado con diferentes URLs base dependiendo de tu región o requisitos.

### Configuración por Defecto

La forma más simple de crear un cliente es usando la URL de API por defecto:

```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
```

### Usando Valores de Enum

Puedes especificar una región usando el enum `ApiBaseUrl`:

```rust
use zero_bounce::{ZeroBounce, ApiBaseUrl};

// Región USA
let zb = ZeroBounce::with_base_url("tu_clave_api", ApiBaseUrl::USA);

// Región EU
let zb = ZeroBounce::with_base_url("tu_clave_api", ApiBaseUrl::EU);

// Por defecto (explícito)
let zb = ZeroBounce::with_base_url("tu_clave_api", ApiBaseUrl::Default);
```

### Usando URL Personalizada como String

También puedes proporcionar una URL base personalizada como string:

```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::with_base_url("tu_clave_api", "https://custom-api.example.com/v2/");
```

**URLs Base de API Disponibles:**
- `ApiBaseUrl::Default` - `https://api.zerobounce.net/v2/` (por defecto)
- `ApiBaseUrl::USA` - `https://api-us.zerobounce.net/v2/`
- `ApiBaseUrl::EU` - `https://api-eu.zerobounce.net/v2/`

Consulta el [ejemplo config_options](https://github.com/zerobounce/zerobounce-rust-api/tree/main/examples/config_options.rs) para una demostración completa de todas las opciones de configuración.

## Métodos de Búsqueda de Correo Electrónico

### find_email_v2 (Recomendado)

Encuentra una dirección de correo electrónico usando un dominio o nombre de empresa. Utiliza el patrón builder para llamadas API ergonómicas.

**Requisitos:**
- `first_name` es obligatorio
- Exactamente uno de `domain` o `company_name` debe ser proporcionado (requisito XOR)

**Métodos del Builder:**
- `.first_name(name: &str)` - Establece el nombre (obligatorio)
- `.domain(domain: &str)` - Establece el nombre del dominio
- `.company_name(company: &str)` - Establece el nombre de la empresa
- `.middle_name(name: &str)` - Establece el segundo nombre (opcional)
- `.last_name(name: &str)` - Establece el apellido (opcional)
- `.call()` - Ejecuta la llamada API

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");

// Usando dominio
let result = zb.find_email_v2()
    .first_name("John")
    .domain("example.com")
    .last_name("Doe")
    .call()?;

// Usando nombre de empresa
let result = zb.find_email_v2()
    .first_name("John")
    .company_name("Example Inc")
    .last_name("Doe")
    .call()?;

// Con segundo nombre
let result = zb.find_email_v2()
    .first_name("John")
    .domain("example.com")
    .middle_name("Middle")
    .last_name("Doe")
    .call()?;
```

**Retorna:** `FindEmailResponseV2` que contiene:
- `email`: La dirección de correo encontrada
- `domain`: Nombre del dominio
- `confidence`: Nivel de confianza del correo (del campo `email_confidence`)
- `company_name`: Nombre de la empresa
- `did_you_mean`: Alternativa sugerida
- `failure_reason`: Razón del fallo si existe

### find_email (Deprecado)

⚠️ **Deprecado desde la versión 1.2.0** - Usa `find_email_v2` en su lugar.

Este método se mantiene por compatibilidad hacia atrás pero será eliminado en una versión futura. El nuevo método `find_email_v2` soporta tanto parámetros de dominio como de nombre de empresa.

**Ejemplo:**
```rust
let result = zb.find_email("example.com", "John", "", "Doe")?;
```

## Métodos de Búsqueda de Dominio

### domain_search_v2 (Recomendado)

Busca formatos de correo electrónico usando un dominio o nombre de empresa. Utiliza el patrón builder para llamadas API ergonómicas.

**Requisitos:**
- Exactamente uno de `domain` o `company_name` debe ser proporcionado (requisito XOR)

**Métodos del Builder:**
- `.domain(domain: &str)` - Establece el nombre del dominio
- `.company_name(company: &str)` - Establece el nombre de la empresa
- `.call()` - Ejecuta la llamada API

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");

// Usando dominio
let result = zb.domain_search_v2()
    .domain("example.com")
    .call()?;

// Usando nombre de empresa
let result = zb.domain_search_v2()
    .company_name("Example Inc")
    .call()?;
```

**Retorna:** `DomainSearchResponseV2` que contiene:
- `domain`: Nombre del dominio
- `company_name`: Nombre de la empresa
- `format`: Formato de correo encontrado
- `confidence`: Nivel de confianza
- `other_domain_formats`: Formatos alternativos con niveles de confianza
- `did_you_mean`: Alternativa sugerida
- `failure_reason`: Razón del fallo si existe

### domain_search (Deprecado)

⚠️ **Deprecado desde la versión 1.2.0** - Usa `domain_search_v2` en su lugar.

Este método se mantiene por compatibilidad hacia atrás pero será eliminado en una versión futura. El nuevo método `domain_search_v2` soporta tanto parámetros de dominio como de nombre de empresa.

**Ejemplo:**
```rust
let result = zb.domain_search("example.com")?;
```

## Métodos de Cuenta y Uso

### get_credits

Obtiene el número de créditos restantes en tu cuenta de ZeroBounce.

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let credits = zb.get_credits()?;
println!("Créditos restantes: {}", credits);
```

**Retorna:** `i64` - El número de créditos restantes en tu cuenta

### get_api_usage

Obtiene estadísticas de uso de la API para un rango de fechas específico.

**Argumentos:**
- `start_date: NaiveDate` - Fecha de inicio del período de uso
- `end_date: NaiveDate` - Fecha de fin del período de uso

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;
use chrono::NaiveDate;

let zb = ZeroBounce::new("tu_clave_api");
let start = NaiveDate::from_ymd_opt(2024, 1, 1).unwrap();
let end = NaiveDate::from_ymd_opt(2024, 1, 31).unwrap();
let usage = zb.get_api_usage(start, end)?;
println!("Total de llamadas API: {}", usage.total);
```

**Retorna:** `ApiUsage` que contiene:
- `total`: Número total de llamadas API en el período
- `status_valid`: Número de direcciones de correo válidas
- `status_invalid`: Número de direcciones de correo inválidas
- `status_catch_all`: Número de direcciones catch-all
- `status_do_not_mail`: Número de direcciones do-not-mail
- `status_spamtrap`: Número de direcciones spamtrap
- `status_abuse`: Número de direcciones abuse
- `status_unknown`: Número de direcciones desconocidas
- `sub_status_antispam_system`: Número de respuestas del sistema antispam
- `sub_status_greylisted`: Número de respuestas greylisted
- `sub_status_mail_server_temporary_error`: Número de errores temporales del servidor de correo
- `sub_status_forcible_disconnect`: Número de desconexiones forzadas
- `sub_status_mail_server_did_not_respond`: Número de servidores de correo que no respondieron
- `sub_status_timeout_exceeded`: Número de errores de timeout
- `sub_status_failed_smtp_connection`: Número de conexiones SMTP fallidas
- `sub_status_mailbox_quota_exceeded`: Número de errores de cuota de buzón excedida
- `sub_status_exception_occurred`: Número de excepciones
- `sub_status_possible_trap`: Número de posibles trampas
- `sub_status_role_based`: Número de direcciones basadas en roles
- `sub_status_global_suppression`: Número de direcciones suprimidas globalmente
- `sub_status_mailbox_not_found`: Número de errores de buzón no encontrado
- `sub_status_no_dns_entries`: Número de errores de sin entradas DNS
- `sub_status_failed_syntax_check`: Número de verificaciones de sintaxis fallidas
- `sub_status_possible_typo`: Número de posibles errores tipográficos
- `sub_status_unroutable_ip_address`: Número de direcciones IP no enrutables
- `sub_status_leading_period_removed`: Número de períodos iniciales removidos
- `sub_status_does_not_accept_mail`: Número de direcciones que no aceptan correo
- `sub_status_alias_address`: Número de direcciones alias
- `sub_status_role_based_catch_all`: Número de direcciones catch-all basadas en roles
- `sub_status_accept_all`: Número de direcciones accept-all
- `sub_status_disposable`: Número de direcciones desechables
- `sub_status_toxic`: Número de direcciones tóxicas

### get_api_usage_overall

Obtiene estadísticas generales de uso de la API desde el 1 de enero de 2000 hasta la fecha actual.

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let overall_usage = zb.get_api_usage_overall()?;
println!("Total de llamadas API en general: {}", overall_usage.total);
```

**Retorna:** `ApiUsage` - Misma estructura que `get_api_usage`

### get_activity_data

Obtiene datos de actividad para una dirección de correo electrónico específica, incluyendo cuándo fue vista por última vez enviando correos.

**Argumentos:**
- `email: &str` - La dirección de correo electrónico a verificar

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let activity = zb.get_activity_data("valid@example.com")?;
println!("Encontrado: {}", activity.found);
if activity.found {
    println!("Estado activo: {}", activity.active_status);
}
```

**Retorna:** `ActivityData` que contiene:
- `found`: Si se encontraron datos de actividad para el correo
- `active_status`: Estado activo de la dirección de correo
- `active_date`: Fecha en que el correo estuvo activo por última vez

## Métodos de Validación de Correo

### validate_email

Valida una sola dirección de correo electrónico.

**Argumentos:**
- `email: &str` - La dirección de correo electrónico a validar

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let validation = zb.validate_email("valid@example.com")?;
println!("Estado: {}", validation.status);
println!("Sub estado: {:?}", validation.sub_status);
```

**Retorna:** `ZBValidation` que contiene:
- `address`: La dirección de correo que fue validada
- `status`: Estado de validación (`valid`, `invalid`, `catch-all`, `unknown`, `spamtrap`, `abuse`, `do_not_mail`)
- `sub_status`: Sub-estado que proporciona más detalles sobre el resultado de la validación
- `account`: Nombre de la cuenta (si está disponible)
- `domain`: Nombre del dominio
- `did_you_mean`: Dirección de correo alternativa sugerida
- `domain_age_days`: Edad del dominio en días
- `smtp_provider`: Nombre del proveedor SMTP
- `mx_found`: Si se encontraron registros MX
- `mx_record`: Valor del registro MX
- `firstname`: Nombre asociado con el correo (si está disponible)
- `lastname`: Apellido asociado con el correo (si está disponible)
- `gender`: Género asociado con el correo (si está disponible)
- `country`: País asociado con el correo (si está disponible)
- `region`: Región asociada con el correo (si está disponible)
- `city`: Ciudad asociada con el correo (si está disponible)
- `zipcode`: Código postal asociado con el correo (si está disponible)
- `processed_at`: Marca de tiempo cuando se procesó la validación

### validate_email_and_ip

Valida una dirección de correo electrónico con una dirección IP opcional para una validación más precisa.

**Argumentos:**
- `email: &str` - La dirección de correo electrónico a validar
- `ip_address: &str` - Dirección IP opcional (puede ser cadena vacía)

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let validation = zb.validate_email_and_ip("valid@example.com", "99.110.204.1")?;
println!("Estado: {}", validation.status);
```

**Retorna:** `ZBValidation` - Misma estructura que `validate_email`

### batch_validate

Valida múltiples direcciones de correo electrónico en una sola llamada API. Más eficiente que validar correos uno por uno.

**Argumentos:**
- `emails_and_ip_addresses: Vec<(String, String)>` - Vector de tuplas que contienen pares (email, ip_address). La dirección IP puede ser cadena vacía.

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let emails_and_ips = vec![
    ("valid@example.com".to_string(), "99.110.204.1".to_string()),
    ("invalid@example.com".to_string(), "".to_string()),
];
let batch_result = zb.batch_validate(emails_and_ips)?;
println!("Lote de correos: {:#?}", batch_result.email_batch);
```

**Retorna:** `ZBBatchValidation` que contiene:
- `email_batch`: Vector de resultados `ZBValidation` para cada dirección de correo

## Métodos de Validación Masiva

La validación masiva te permite subir un archivo que contiene múltiples direcciones de correo electrónico para validación. El proceso implica enviar un archivo, verificar su estado, obtener resultados y opcionalmente eliminar el archivo.

### bulk_validation_file_submit

Envía un archivo para validación masiva de correos electrónicos.

**Argumentos:**
- `zb_file: &ZBFile` - Una instancia `ZBFile` que contiene las direcciones de correo a validar

**Ejemplo:**
```rust
use zero_bounce::{ZeroBounce, ZBFile};

let zb = ZeroBounce::new("tu_clave_api");
let file_content = vec![
    "email1@example.com".to_string(),
    "email2@example.com".to_string(),
];
let zb_file = ZBFile::from_content(file_content)
    .set_has_header_row(false)
    .set_remove_duplicate(true);
let submit_result = zb.bulk_validation_file_submit(&zb_file)?;
println!("ID de archivo: {:?}", submit_result.file_id);
```

**Retorna:** `ZBFileFeedback` que contiene:
- `success`: Si el envío del archivo fue exitoso
- `message`: Mensaje de estado
- `file_id`: ID de archivo opcional para usar en verificaciones de estado y obtención de resultados

### bulk_validation_file_status_check

Verifica el estado de procesamiento de un archivo de validación masiva enviado.

**Argumentos:**
- `file_id: &str` - El ID de archivo devuelto de `bulk_validation_file_submit`

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let status = zb.bulk_validation_file_status_check("file_id_here")?;
println!("Porcentaje completo: {}%", status.complete_percentage);
println!("Conteo de éxito: {}", status.success_count);
```

**Retorna:** `ZBFileStatus` que contiene:
- `success`: Si la verificación de estado fue exitosa
- `message`: Mensaje de estado
- `file_id`: El ID de archivo
- `file_name`: Nombre del archivo
- `upload_date`: Fecha en que se subió el archivo
- `file_status`: Estado actual del archivo
- `complete_percentage`: Porcentaje de procesamiento completado
- `return_url`: URL para obtener resultados
- `success_count`: Número de correos procesados exitosamente
- `error_count`: Número de errores encontrados

### bulk_validation_result_fetch

Obtiene los resultados de un archivo de validación masiva completado.

**Argumentos:**
- `file_id: &str` - El ID de archivo devuelto de `bulk_validation_file_submit`

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;
use zero_bounce::utility::structures::bulk::ZBBulkResponse;

let zb = ZeroBounce::new("tu_clave_api");
let result = zb.bulk_validation_result_fetch("file_id_here")?;
match result {
    ZBBulkResponse::Content(bytes) => {
        // Contenido del archivo (formato CSV)
        println!("Recibidos {} bytes", bytes.len());
    },
    ZBBulkResponse::Feedback(feedback) => {
        // Error o retroalimentación de estado
        println!("Mensaje: {}", feedback.message);
    },
}
```

**Retorna:** `ZBBulkResponse` que puede ser:
- `ZBBulkResponse::Content(Vec<u8>)` - El contenido del archivo como bytes (típicamente formato CSV)
- `ZBBulkResponse::Feedback(ZBFileFeedback)` - Error o retroalimentación de estado si el archivo no está listo o ocurrió un error

### bulk_validation_result_delete

Elimina un archivo de resultados de validación masiva de los servidores de ZeroBounce.

**Argumentos:**
- `file_id: &str` - El ID de archivo devuelto de `bulk_validation_file_submit`

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let delete_result = zb.bulk_validation_result_delete("file_id_here")?;
println!("Eliminación exitosa: {}", delete_result.success);
```

**Retorna:** `ZBFileFeedback` que contiene:
- `success`: Si la eliminación fue exitosa
- `message`: Mensaje de estado

## Métodos de Puntuación IA

La Puntuación IA te permite subir un archivo que contiene direcciones de correo electrónico para obtener puntuaciones de calidad impulsadas por IA. El proceso es similar a la validación masiva: enviar un archivo, verificar estado, obtener resultados y opcionalmente eliminar el archivo.

### ai_scoring_file_submit

Envía un archivo para análisis de puntuación IA.

**Argumentos:**
- `zb_file: &ZBFile` - Una instancia `ZBFile` que contiene las direcciones de correo a puntuar

**Ejemplo:**
```rust
use zero_bounce::{ZeroBounce, ZBFile};

let zb = ZeroBounce::new("tu_clave_api");
let file_content = vec![
    "email1@example.com".to_string(),
    "email2@example.com".to_string(),
];
let zb_file = ZBFile::from_content(file_content)
    .set_has_header_row(false)
    .set_remove_duplicate(true);
let submit_result = zb.ai_scoring_file_submit(&zb_file)?;
println!("ID de archivo: {:?}", submit_result.file_id);
```

**Retorna:** `ZBFileFeedback` - Misma estructura que `bulk_validation_file_submit`

### ai_scoring_file_status_check

Verifica el estado de procesamiento de un archivo de puntuación IA enviado.

**Argumentos:**
- `file_id: &str` - El ID de archivo devuelto de `ai_scoring_file_submit`

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let status = zb.ai_scoring_file_status_check("file_id_here")?;
println!("Porcentaje completo: {}%", status.complete_percentage);
```

**Retorna:** `ZBFileStatus` - Misma estructura que `bulk_validation_file_status_check`

### ai_scoring_result_fetch

Obtiene los resultados de un archivo de puntuación IA completado.

**Argumentos:**
- `file_id: &str` - El ID de archivo devuelto de `ai_scoring_file_submit`

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;
use zero_bounce::utility::structures::bulk::ZBBulkResponse;

let zb = ZeroBounce::new("tu_clave_api");
let result = zb.ai_scoring_result_fetch("file_id_here")?;
match result {
    ZBBulkResponse::Content(bytes) => {
        println!("Recibidos {} bytes", bytes.len());
    },
    ZBBulkResponse::Feedback(feedback) => {
        println!("Mensaje: {}", feedback.message);
    },
}
```

**Retorna:** `ZBBulkResponse` - Misma estructura que `bulk_validation_result_fetch`

### ai_scoring_result_delete

Elimina un archivo de resultados de puntuación IA de los servidores de ZeroBounce.

**Argumentos:**
- `file_id: &str` - El ID de archivo devuelto de `ai_scoring_file_submit`

**Ejemplo:**
```rust
use zero_bounce::ZeroBounce;

let zb = ZeroBounce::new("tu_clave_api");
let delete_result = zb.ai_scoring_result_delete("file_id_here")?;
println!("Eliminación exitosa: {}", delete_result.success);
```

**Retorna:** `ZBFileFeedback` - Misma estructura que `bulk_validation_result_delete`