{"id":48540210,"url":"https://github.com/panoramicdata/joker.api","last_synced_at":"2026-04-08T04:01:57.437Z","repository":{"id":323541275,"uuid":"1093674324","full_name":"panoramicdata/Joker.Api","owner":"panoramicdata","description":"A comprehensive .NET library for the Joker DMAPI API","archived":false,"fork":false,"pushed_at":"2026-03-29T21:28:15.000Z","size":17009,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-29T21:41:13.035Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/panoramicdata.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-10T17:27:33.000Z","updated_at":"2026-03-29T21:28:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/panoramicdata/Joker.Api","commit_stats":null,"previous_names":["panoramicdata/joker.api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/panoramicdata/Joker.Api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FJoker.Api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FJoker.Api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FJoker.Api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FJoker.Api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/panoramicdata","download_url":"https://codeload.github.com/panoramicdata/Joker.Api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FJoker.Api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31539229,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"online","status_checked_at":"2026-04-08T02:00:06.127Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-08T04:01:55.215Z","updated_at":"2026-04-08T04:01:57.418Z","avatar_url":"https://github.com/panoramicdata.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Joker DMAPI .NET Library\n\n[![NuGet Version](https://img.shields.io/nuget/v/Joker.Api)](https://www.nuget.org/packages/Joker.Api)\n[![NuGet Downloads](https://img.shields.io/nuget/dt/Joker.Api)](https://www.nuget.org/packages/Joker.Api)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/panoramicdata/Joker.Api/publish-nuget.yml)](https://github.com/panoramicdata/Joker.Api/actions)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/c790c2232f2745eca8b5b47a145e37b9)](https://app.codacy.com/gh/panoramicdata/Joker.Api/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_grade)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA comprehensive, modern .NET library for interacting with the Joker DMAPI API. This library provides full coverage of the Joker DMAPI API with a clean, intuitive interface using modern C# patterns and best practices.\n\n## Features\n\n- 🎯 **Complete API Coverage** - Full support for all Joker DMAPI endpoints\n- 🔓 **SVC Support** - DNS management without reseller account (Dynamic DNS)\n- 🚀 **Modern .NET** - Built for .NET 9 with modern C# features\n- 🔒 **Type Safety** - Strongly typed models and responses\n- 📝 **Comprehensive Logging** - Built-in logging and request/response interception\n- 🔄 **Retry Logic** - Automatic retry with exponential backoff\n- 📖 **Rich Documentation** - IntelliSense-friendly XML documentation\n- ✅ **Thoroughly Tested** - Comprehensive unit and integration tests\n- ⚡ **High Performance** - Optimized for efficiency and low memory usage\n\n## Installation\n\nInstall the package via NuGet Package Manager:\n\n```bash\ndotnet add package Joker.Api\n```\n\nOr via Package Manager Console:\n\n```powershell\nInstall-Package Joker.Api\n```\n\n## Quick Start\n\n### Authentication Methods\n\nJoker.Api supports multiple authentication methods:\n\n1. **SVC (Dynamic DNS)** - For DNS management without a reseller account\n2. **DMAPI with API Key** - Recommended for reseller accounts\n3. **DMAPI with Username/Password** - Alternative for reseller accounts\n\n#### API Key Permission Levels\n\nJoker.com supports different API key types with varying permission levels:\n\n- **Full Access** - Complete read and write access to all API operations\n- **Read-Only** - Can only query and retrieve information, cannot make modifications\n- **Modify-Only** - Can modify existing resources but cannot create new ones\n- **Whois-Only** - Can only perform WHOIS queries, no other operations allowed\n\nWhen creating API keys in your Joker.com reseller dashboard, select the appropriate permission level based on your security requirements. For automated systems that only need to query information (e.g., monitoring tools), use read-only or whois-only keys to minimize security risk.\n\n### 1. SVC Client (DNS Management - No Reseller Account Required)\n\nPerfect for automating DNS updates, ACME DNS-01 challenges (Let's Encrypt), and managing DNS records.\n\n```csharp\nusing Joker.Api;\nusing Joker.Api.Models;\n\n// Get SVC credentials from Joker.com dashboard:\n// 1. Go to DNS settings for your domain\n// 2. Enable Dynamic DNS\n// 3. Copy the shown username and password\n\nvar options = new JokerSvcClientOptions\n{\n    Domain = \"yourdomain.com\",\n    SvcUsername = \"svc-username-from-dashboard\",\n    SvcPassword = \"svc-password-from-dashboard\"\n};\n\nusing var client = new JokerSvcClient(options);\n\n// Add a TXT record (e.g., for Let's Encrypt DNS-01 challenge)\nawait client.SetTxtRecordAsync(\n    \"_acme-challenge\", \n    \"verification-token-here\",\n    ttl: 300,\n    cancellationToken);\n\n// Get current DNS zone\nvar zone = await client.GetDnsZoneAsync(cancellationToken);\nConsole.WriteLine($\"Current DNS zone:\\n{zone.Body}\");\n\n// Delete a TXT record\nawait client.DeleteTxtRecordAsync(\"_acme-challenge\", cancellationToken);\n\n// Set multiple DNS records at once\nvar records = new[]\n{\n    DnsRecord.CreateARecord(\"www\", \"123.45.67.89\"),\n    DnsRecord.CreateCnameRecord(\"blog\", \"blog.provider.com\"),\n    DnsRecord.CreateTxtRecord(\"@\", \"v=spf1 include:_spf.provider.com ~all\")\n};\nawait client.SetDnsZoneAsync(records, cancellationToken);\n```\n\n### 2. DMAPI Client (Reseller Account Required)\n\n#### Option 1: API Key (Recommended for reseller automation)\n\n```csharp\nusing Joker.Api;\n\nvar options = new JokerClientOptions\n{\n    ApiKey = \"your-api-key\"\n};\n\nvar client = new JokerClient(options);\n```\n\n#### Option 2: Username and Password (Reseller accounts)\n\n```csharp\nusing Joker.Api;\n\nvar options = new JokerClientOptions\n{\n    Username = \"user@joker.com\",\n    Password = \"your-password\"\n};\n\nvar client = new JokerClient(options);\n```\n\n### 3. Basic Usage Examples\n\n```csharp\n// Use a CancellationToken for all async operations\nusing var cts = new CancellationTokenSource();\nvar cancellationToken = cts.Token;\n\n// DMAPI operations (reseller account required)\nvar loginResponse = await client.LoginAsync(cancellationToken);\nConsole.WriteLine($\"Logged in with session: {loginResponse.AuthSid}\");\n```\n\n### 4. Advanced Configuration\n\n#### Custom HTTP Configuration\n\n```csharp\nvar options = new JokerClientOptions\n{\n    ApiKey = \"your-api-key\",\n    \n    // Custom timeout\n    RequestTimeout = TimeSpan.FromSeconds(30),\n    \n    // Custom retry policy\n    MaxRetryAttempts = 3,\n    RetryDelay = TimeSpan.FromSeconds(1)\n};\n\nvar client = new JokerClient(options);\n```\n\n#### Logging Configuration\n\n```csharp\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.DependencyInjection;\n\n// Create a service collection with logging\nvar services = new ServiceCollection();\nservices.AddLogging(builder =\u003e builder.AddConsole().SetMinimumLevel(LogLevel.Debug));\n\nvar serviceProvider = services.BuildServiceProvider();\nvar logger = serviceProvider.GetRequiredService\u003cILogger\u003cJokerClient\u003e\u003e();\n\nvar options = new JokerClientOptions\n{\n    ApiKey = \"your-api-key\",\n    Logger = logger,\n    EnableRequestLogging = true,\n    EnableResponseLogging = true\n};\n\nvar client = new JokerClient(options);\n```\n\n### 4. Error Handling\n\n```csharp\ntry\n{\n    // API call example\n}\ncatch (JokerNotFoundException ex)\n{\n    Console.WriteLine($\"Resource not found: {ex.Message}\");\n}\ncatch (JokerAuthenticationException ex)\n{\n    Console.WriteLine($\"Authentication failed: {ex.Message}\");\n}\ncatch (JokerApiException ex)\n{\n    Console.WriteLine($\"API error: {ex.Message}\");\n    Console.WriteLine($\"Status code: {ex.StatusCode}\");\n}\n```\n\n## API Coverage\n\nThis library provides comprehensive coverage of the Joker DMAPI API. Documentation will be expanded as endpoints are implemented.\n\n## Configuration Options\n\nThe `JokerClientOptions` class provides extensive configuration:\n\n```csharp\npublic class JokerClientOptions\n{\n    // Authentication (choose one method)\n    public string? ApiKey { get; init; }              // Option 1: API Key (recommended)\n    public string? Username { get; init; }            // Option 2: Username\n    public string? Password { get; init; }            // Option 2: Password\n    \n    // Optional configuration\n    public string BaseUrl { get; init; } = \"https://dmapi.joker.com\";\n    public TimeSpan RequestTimeout { get; init; } = TimeSpan.FromSeconds(30);\n    public int MaxRetryAttempts { get; init; } = 3;\n    public TimeSpan RetryDelay { get; init; } = TimeSpan.FromSeconds(1);\n    public ILogger? Logger { get; init; } = null;\n    \n    // Advanced options\n    public bool EnableRequestLogging { get; init; } = false;\n    public bool EnableResponseLogging { get; init; } = false;\n    public bool UseExponentialBackoff { get; init; } = true;\n    public TimeSpan MaxRetryDelay { get; init; } = TimeSpan.FromSeconds(30);\n}\n```\n\n## Contributing\n\nWe welcome contributions from the community! Here's how you can help:\n\n### Development Setup\n\n1. **Clone the repository**:\n   ```bash\n   git clone https://github.com/panoramicdata/Joker.Api.git\n   cd Joker.Api\n   ```\n\n2. **Install .NET 9 SDK**:\n   Download from [dotnet.microsoft.com](https://dotnet.microsoft.com/download)\n\n3. **Set up User Secrets for testing**:\n   \n   The test suite supports different API key permission levels. You can configure one or more:\n   \n   Using API Key (recommended):\n   ```bash\n   cd Joker.Api.Test\n   dotnet user-secrets init\n   # Default API key for most tests\n   dotnet user-secrets set \"JokerApi:ApiKey\" \"your-api-key\"\n   \n   # Optional: Configure specific permission levels for permission testing\n   dotnet user-secrets set \"JokerApi:ApiKey:Full\" \"your-full-access-key\"\n   dotnet user-secrets set \"JokerApi:ApiKey:ReadOnly\" \"your-read-only-key\"\n   dotnet user-secrets set \"JokerApi:ApiKey:ModifyOnly\" \"your-modify-only-key\"\n   dotnet user-secrets set \"JokerApi:ApiKey:WhoisOnly\" \"your-whois-only-key\"\n   ```\n   \n   Or using Username/Password:\n   ```bash\n   cd Joker.Api.Test\n   dotnet user-secrets init\n   dotnet user-secrets set \"JokerApi:Username\" \"user@joker.com\"\n   dotnet user-secrets set \"JokerApi:Password\" \"your-password\"\n   ```\n   \n   For SVC (Dynamic DNS) testing:\n   ```bash\n   dotnet user-secrets set \"JokerSvc:Domain\" \"yourdomain.com\"\n   dotnet user-secrets set \"JokerSvc:SvcUsername\" \"svc-username\"\n   dotnet user-secrets set \"JokerSvc:SvcPassword\" \"svc-password\"\n   ```\n\n4. **Build and test**:\n   ```bash\n   dotnet build\n   dotnet test\n   ```\n\n### Coding Standards\n\n- **Follow the project's coding standards** as defined in `.editorconfig`\n- **Use modern C# patterns** (primary constructors, collection expressions, etc.)\n- **Maintain zero warnings policy** - all code must compile without warnings\n- **Write comprehensive tests** - both unit and integration tests\n- **Document public APIs** - use XML documentation comments\n\n### Pull Request Process\n\n1. **Fork the repository** and create a feature branch\n2. **Write tests** for all new functionality\n3. **Ensure all tests pass** including integration tests\n4. **Update documentation** as needed\n5. **Submit a pull request** with a clear description of changes\n\n## Support\n\n- **GitHub Issues**: [Report Issues](https://github.com/panoramicdata/Joker.Api/issues)\n- **GitHub Discussions**: [Community Support](https://github.com/panoramicdata/Joker.Api/discussions)\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Copyright\n\nCopyright © 2025 Panoramic Data Limited. All rights reserved.\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for a detailed history of changes and releases.\n\n---\n\n### Development\n\nThis project was created entirely at the command line using:\n- **[GitHub Copilot CLI](https://githubnext.com/projects/copilot-cli)** - AI-powered command-line assistant\n- **[Claude Sonnet 4.5](https://www.anthropic.com/claude)** - Advanced AI coding assistant\n\nNo traditional IDE was used in the development of this library. All code was written, tested, and debugged using AI-assisted command-line tools, demonstrating the power of modern AI development workflows.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpanoramicdata%2Fjoker.api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpanoramicdata%2Fjoker.api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpanoramicdata%2Fjoker.api/lists"}