highlevel-api 0.2.0

Unofficial Rust SDK for the GoHighLevel (HighLevel) API
Documentation
use serde::{Deserialize, Serialize};

// ── Invoices ─────────────────────────────────────────────────────────────────

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ListInvoicesParams {
    pub location_id: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub limit: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub offset: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub contact_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub status: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub start_at: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub end_at: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub payment_mode: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InvoiceItem {
    pub name: String,
    pub description: Option<String>,
    pub price: f64,
    pub quantity: u32,
    pub taxes: Option<Vec<serde_json::Value>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Invoice {
    pub id: String,
    pub location_id: String,
    pub contact_id: Option<String>,
    pub status: Option<String>,
    pub items: Option<Vec<InvoiceItem>>,
    pub amount: Option<f64>,
    pub currency: Option<String>,
    pub issue_date: Option<String>,
    pub due_date: Option<String>,
    pub title: Option<String>,
    pub invoice_number: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetInvoicesResponse {
    pub invoices: Vec<Invoice>,
    pub total: Option<u64>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetInvoiceResponse {
    pub invoice: Invoice,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct CreateInvoiceParams {
    pub location_id: String,
    pub contact_id: String,
    pub items: Vec<InvoiceItem>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub title: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub issue_date: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub due_date: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub currency: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub discount: Option<serde_json::Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SendInvoiceParams {
    pub action: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecordPaymentParams {
    pub mode: String,
    pub notes: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GenerateInvoiceNumberResponse {
    #[serde(rename = "invoiceNumber")]
    pub invoice_number: String,
}

// ── Invoice Schedules (deposit/balance split) ────────────────────────────────

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InvoiceSchedule {
    pub id: String,
    pub invoice_id: String,
    pub amount: f64,
    pub due_date: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub status: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListSchedulesResponse {
    pub schedules: Vec<InvoiceSchedule>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetScheduleResponse {
    pub schedule: InvoiceSchedule,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct CreateScheduleParams {
    pub amount: f64,
    pub due_date: String,
}