Skip to content

SDK architecture

The SDK separates public API ergonomics from transport behavior.

OkatanaClient
  ├── OrganizationsApi
  ├── ProjectsApi
  ├── BoardsApi
  ├── TicketsApi
  └── DocumentsApi
  OkatanaHttpTransport
          ├── URL normalization and path escaping
          ├── bearer/Accept/User-Agent headers
          ├── JSON serialization/deserialization
          ├── timeouts and cancellation
          ├── safe-read retry policy
          ├── error mapping
          └── pagination URL boundary checks
               HttpClient

Request types validate OpenAPI limits and convert C# properties into the API's snake_case payload. Response models use JsonPropertyName attributes and JsonExtensionData, which allows typed access to stable fields while preserving unknown additions.

The main client owns its HttpClient only when it creates the HTTP stack itself. If an application injects a caller-managed HttpClient or resolves the SDK as a typed client through IHttpClientFactory, disposing the SDK does not dispose that external client.

The direct-client constructor uses a long-lived SocketsHttpHandler with a finite pooled connection lifetime. The dependency-injection constructor works with IHttpClientFactory, which manages handler lifetime on behalf of the application.