API Reference
Images API
Image upload, querying, BioImage model, and classification types.
The SDK supports uploading images and querying image data associated with users and sessions.
Uploading Images
Upload through BioSDKClient:
// Upload a UIImage
try await sdk.uploadImage(photo, userId: userId)
// Upload raw data with MIME type
try await sdk.uploadImageData(
jpegData,
mimeType: "image/jpeg",
userId: userId,
deviceId: "camera-001"
)ImageIngestClient
Low-level image upload client.
public class ImageIngestClient {
// Upload raw image data
public func uploadImageData(
_ data: Data,
mimeType: String,
userId: UUID,
deviceId: String
) async throws
// Upload a UIImage (iOS only)
public func uploadImage(
_ image: UIImage,
userId: UUID,
deviceId: String,
mimeType: String = "image/jpeg",
compression: CGFloat = 0.8
) async throws
}ImageError
public enum ImageError: Error, LocalizedError {
case compressionFailed
case uploadFailed
case server(status: Int, body: String?)
case network(underlying: Error)
case invalidResponse
}ImageQueryClient
Client for querying uploaded images.
public final class ImageQueryClient {
// List images with optional filters
public func listImages(
filter: ImageQueryFilter = ImageQueryFilter()
) async throws -> [BioImage]
// Get a single image by ID
public func getImage(id: String) async throws -> BioImage
// Download the raw image data
public func downloadImage(id: String) async throws -> Data
}ImageQueryFilter
Filter parameters for listing images.
public struct ImageQueryFilter: Equatable, Sendable {
public var xuserId: String?
public var sessionId: String?
public var dateRange: DateRangePreset?
public var limit: Int?
public var offset: Int?
public init(
xuserId: String? = nil,
sessionId: String? = nil,
dateRange: DateRangePreset? = nil,
limit: Int? = nil,
offset: Int? = nil
)
}DateRangePreset
public enum DateRangePreset: String, Sendable {
case today = "today"
case last7Days = "7days"
case last30Days = "30days"
case last90Days = "90days"
}ImageQueryError
public enum ImageQueryError: Error, LocalizedError {
case invalidHTTPResponse
case badStatus(Int)
case decodingFailed(String)
case forbidden
case notFound
case serverError(Int)
}BioImage
An uploaded image with metadata and optional classifications.
public struct BioImage: Codable, Identifiable, Equatable, Sendable {
public let id: String
public let xuserId: String
public let sessionId: String?
public let deviceId: String?
public let capturedAt: Date?
public let uploadedAt: Date
public let mimeType: String
public let sizeBytes: Int
public let width: Int?
public let height: Int?
public let imageUrl: String?
public let thumbnailUrl: String?
public let classifications: [BioImageClassification]?
}| Property | Type | Description |
|---|---|---|
id | String | Unique image identifier |
xuserId | String | User who owns the image |
sessionId | String? | Associated session (if uploaded during a session) |
deviceId | String? | Device that captured the image |
capturedAt | Date? | When the image was captured |
uploadedAt | Date | When the image was uploaded |
mimeType | String | MIME type (e.g., "image/jpeg") |
sizeBytes | Int | File size in bytes |
width / height | Int? | Image dimensions |
imageUrl | String? | Full-resolution URL |
thumbnailUrl | String? | Thumbnail URL |
classifications | [BioImageClassification]? | ML classification results |
BioImageClassification
A classification result from the backend ML pipeline.
public struct BioImageClassification: Codable, Equatable, Sendable {
public let id: String
public let imageId: String
public let classification: String
public let confidence: Double
public let processingEngine: String?
public let createdAt: Date
}| Property | Type | Description |
|---|---|---|
id | String | Classification record ID |
imageId | String | Parent image ID |
classification | String | Classification label |
confidence | Double | Confidence score (0.0–1.0) |
processingEngine | String? | ML engine that produced the result |
createdAt | Date | When the classification was generated |
Example — display classifications:
let images = try await imageClient.listImages(
filter: ImageQueryFilter(xuserId: userId, limit: 10)
)
for image in images {
if let classifications = image.classifications {
for c in classifications {
print("\(c.classification): \(Int(c.confidence * 100))%")
}
}
}