An unofficial TypeScript SDK for the Gandi API v5. This package provides a clean, type-safe interface for interacting with Gandi's domain management services.
Disclaimer: This is an unofficial SDK and is not affiliated with or endorsed by Gandi.
- π TypeScript Support: Full type definitions for all API endpoints
- π Authentication: Support for both API Key and Personal Access Token (PAT) authentication
- π Domain Management: Complete domain lifecycle management
- π Comprehensive API Coverage: All major Gandi API v5 domain endpoints
- π‘οΈ Type Safety: Strongly typed request/response interfaces
- π¦ Zero Dependencies: Built on top of axios with minimal overhead
npm install @qualesme/gandi-sdkimport { GandiClient, DomainsResource } from '@qualesme/gandi-sdk';
import { AxiosAdapter } from '@qualesme/http-axios';
// Initialize the client with your API key or PAT
const http = new AxiosAdapter({
baseURL: "https://api.gandi.net/v5",
defaultHeaders: {
"Authorization": "Bearer your-personal-access-token",
},
timeoutMs: 30000,
});
const sdk = new GandiSDK(http);
// List your domains
const domainList = await sdk.domains.listDomains({
page: 1,
per_page: 10
});
console.log(domainList);import { GandiClient, DomainsResource } from '@qualesme/gandi-sdk';
import { AxiosAdapter } from '@qualesme/http-axios';
// Initialize the client with your API key or PAT
const http = new AxiosAdapter({
baseURL: "https://api.sandbox.gandi.net/v5",
defaultHeaders: {
"Authorization": "Bearer your-personal-access-token",
},
timeoutMs: 30000,
});
const sdk = new GandiSDK(http);// Get all domains
const domains = await sdk.domains.listDomains({
page: 1,
per_page: 50,
tld: 'com'
});
// Get domains as CSV
const csvData = await sdk.domains.listDomains({}, true);const availability = await sdk.domains.checkDomainAvailability({
name: 'example.com',
country: 'US'
});const newDomain = await sdk.domains.createNewDomain({
fqdn: 'example.com',
owner: {
country: 'US',
email: 'owner@example.com',
family: 'Doe',
given: 'John',
streetaddr: '123 Main St',
type: 'individual'
},
duration: 1
});const domain = await sdk.domains.getDomain('example.com');await sdk.domains.updateDomainContacts('example.com', {
owner: {
country: 'US',
email: 'newowner@example.com',
family: 'Smith',
given: 'Jane',
streetaddr: '456 Oak Ave',
type: 'individual'
}
});// Get renewal information
const renewalInfo = await sdk.domains.getDomainRenewalInfo('example.com');
// Renew domain
await sdk.domains.renewDomain('example.com', 1); // 1 year renewal// Enable auto-renewal
await sdk.domains.editAutoRenew('example.com', {
enabled: true,
duration: 1
});// Get DNSSEC status
const dnssec = await sdk.domains.getDNSSECWithLiveDNS('example.com');
// Activate DNSSEC
await sdk.domains.activateDNSSECWithLiveDNS('example.com');
// Deactivate DNSSEC
await sdk.domains.disableDNSSECWithLiveDNS('example.com');// Get current nameservers
const nameservers = await sdk.domains.getNameservers('example.com');
// Set nameservers
await sdk.domains.setNameservers('example.com', {
nameservers: ['ns1.example.com', 'ns2.example.com']
});const transfer = await sdk.domains.transferDomainToGandi({
fqdn: 'example.com',
owner: {
country: 'US',
email: 'owner@example.com',
family: 'Doe',
given: 'John',
streetaddr: '123 Main St',
type: 'individual'
},
authinfo: 'your-auth-code'
});const availability = await sdk.domains.checkTransferAvailability(
'example.com',
'your-auth-code'
);const redirections = await sdk.domains.listWebRedirections('example.com');await sdk.domains.createWebRedirection('example.com', {
host: 'www',
type: 'http301',
url: 'https://example.com',
protocol: 'https',
override: false
});// Get domain tags
const tags = await sdk.domains.getDomainTags('example.com');
// Add tag to domain
await sdk.domains.attachTagToDomain('example.com', 'production');
// Update all tags
await sdk.domains.updateAllTagsForDomain('example.com', ['production', 'important']);
// Update some tags
await sdk.domains.updateSomeTagsForDomain('example.com', ['new-tag'], ['old-tag']);const tlds = await sdk.domains.listAvailableTlds({
category: 'generic',
page: 1,
per_page: 20
});const tldInfo = await sdk.domains.getTldInfo('com');The SDK uses axios for HTTP requests, so errors are thrown as axios error objects:
try {
const domain = await sdk.domains.getDomain('example.com');
} catch (error) {
if (error.response) {
// Server responded with error status
console.error('API Error:', error.response.status, error.response.data);
} else if (error.request) {
// Request was made but no response received
console.error('Network Error:', error.message);
} else {
// Something else happened
console.error('Error:', error.message);
}
}The SDK is written in TypeScript and provides comprehensive type definitions:
import {
GandiClient,
DomainsResource,
CreateDomainPayload,
DomainContacts,
CountryCode
} from '@qualesme/gandi-sdk';
const client = new GandiClient({
baseURL: "https://api.gandi.net/v5",
authMode: "pat",
pat: "your-pat"
});
const domains = new DomainsResource(client);
const payload: CreateDomainPayload = {
fqdn: 'example.com',
owner: {
country: CountryCode.US,
email: 'owner@example.com',
family: 'Doe',
given: 'John',
streetaddr: '123 Main St',
type: 'individual'
}
};Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
This is an unofficial SDK for the Gandi API. It is not affiliated with, endorsed by, or connected to Gandi in any way. Use at your own risk.
For issues and questions:
- π Report a bug
- π‘ Request a feature
- π Gandi API Documentation
- Finished Certificate management implementation
- Added unit tests
- Added Billing resource (https://api.gandi.net/docs/billing/)
- Started Certificate management implementation
- Renamed Utils to utils
- Changed some functions arguments to have dryRun then sharingId everywhere
- Initial release
- Domain management functionality
- TypeScript support
- Authentication with API key and PAT