mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2026-03-20 06:11:27 -07:00
205 lines
4.2 KiB
Markdown
205 lines
4.2 KiB
Markdown
# API Reference
|
|
|
|
## Client Initialization
|
|
|
|
### TypeScript
|
|
|
|
```typescript
|
|
import Cloudflare from 'cloudflare';
|
|
|
|
const client = new Cloudflare({
|
|
apiToken: process.env.CLOUDFLARE_API_TOKEN,
|
|
});
|
|
```
|
|
|
|
### Python
|
|
|
|
```python
|
|
from cloudflare import Cloudflare
|
|
|
|
client = Cloudflare(api_token=os.environ.get("CLOUDFLARE_API_TOKEN"))
|
|
|
|
# For async:
|
|
from cloudflare import AsyncCloudflare
|
|
client = AsyncCloudflare(api_token=os.environ["CLOUDFLARE_API_TOKEN"])
|
|
```
|
|
|
|
### Go
|
|
|
|
```go
|
|
import (
|
|
"github.com/cloudflare/cloudflare-go/v4"
|
|
"github.com/cloudflare/cloudflare-go/v4/option"
|
|
)
|
|
|
|
client := cloudflare.NewClient(
|
|
option.WithAPIToken(os.Getenv("CLOUDFLARE_API_TOKEN")),
|
|
)
|
|
```
|
|
|
|
## Authentication
|
|
|
|
### API Token (Recommended)
|
|
|
|
**Create token**: Dashboard → My Profile → API Tokens → Create Token
|
|
|
|
```bash
|
|
export CLOUDFLARE_API_TOKEN='your-token-here'
|
|
|
|
curl "https://api.cloudflare.com/client/v4/zones" \
|
|
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
|
|
```
|
|
|
|
**Token scopes**: Always use minimal permissions (zone-specific, time-limited).
|
|
|
|
### API Key (Legacy)
|
|
|
|
```bash
|
|
curl "https://api.cloudflare.com/client/v4/zones" \
|
|
--header "X-Auth-Email: user@example.com" \
|
|
--header "X-Auth-Key: $CLOUDFLARE_API_KEY"
|
|
```
|
|
|
|
**Not recommended:** Full account access, cannot scope permissions.
|
|
|
|
## Auto-Pagination
|
|
|
|
All SDKs support automatic pagination for list operations.
|
|
|
|
```typescript
|
|
// TypeScript: for await...of
|
|
for await (const zone of client.zones.list()) {
|
|
console.log(zone.id);
|
|
}
|
|
```
|
|
|
|
```python
|
|
# Python: iterator protocol
|
|
for zone in client.zones.list():
|
|
print(zone.id)
|
|
```
|
|
|
|
```go
|
|
// Go: ListAutoPaging
|
|
iter := client.Zones.ListAutoPaging(ctx, cloudflare.ZoneListParams{})
|
|
for iter.Next() {
|
|
zone := iter.Current()
|
|
fmt.Println(zone.ID)
|
|
}
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
```typescript
|
|
try {
|
|
const zone = await client.zones.get({ zone_id: 'xxx' });
|
|
} catch (err) {
|
|
if (err instanceof Cloudflare.NotFoundError) {
|
|
// 404
|
|
} else if (err instanceof Cloudflare.RateLimitError) {
|
|
// 429 - SDK auto-retries with backoff
|
|
} else if (err instanceof Cloudflare.APIError) {
|
|
console.log(err.status, err.message);
|
|
}
|
|
}
|
|
```
|
|
|
|
**Common Error Types:**
|
|
- `AuthenticationError` (401) - Invalid token
|
|
- `PermissionDeniedError` (403) - Insufficient scope
|
|
- `NotFoundError` (404) - Resource not found
|
|
- `RateLimitError` (429) - Rate limit exceeded
|
|
- `InternalServerError` (≥500) - Cloudflare error
|
|
|
|
## Zone Management
|
|
|
|
```typescript
|
|
// List zones
|
|
const zones = await client.zones.list({
|
|
account: { id: 'account-id' },
|
|
status: 'active',
|
|
});
|
|
|
|
// Create zone
|
|
const zone = await client.zones.create({
|
|
account: { id: 'account-id' },
|
|
name: 'example.com',
|
|
type: 'full', // or 'partial'
|
|
});
|
|
|
|
// Update zone
|
|
await client.zones.edit('zone-id', {
|
|
paused: false,
|
|
});
|
|
|
|
// Delete zone
|
|
await client.zones.delete('zone-id');
|
|
```
|
|
|
|
```go
|
|
// Go: requires cloudflare.F() wrapper
|
|
zone, err := client.Zones.New(ctx, cloudflare.ZoneNewParams{
|
|
Account: cloudflare.F(cloudflare.ZoneNewParamsAccount{
|
|
ID: cloudflare.F("account-id"),
|
|
}),
|
|
Name: cloudflare.F("example.com"),
|
|
Type: cloudflare.F(cloudflare.ZoneNewParamsTypeFull),
|
|
})
|
|
```
|
|
|
|
## DNS Management
|
|
|
|
```typescript
|
|
// Create DNS record
|
|
await client.dns.records.create({
|
|
zone_id: 'zone-id',
|
|
type: 'A',
|
|
name: 'subdomain.example.com',
|
|
content: '192.0.2.1',
|
|
ttl: 1, // auto
|
|
proxied: true, // Orange cloud
|
|
});
|
|
|
|
// List DNS records (with auto-pagination)
|
|
for await (const record of client.dns.records.list({
|
|
zone_id: 'zone-id',
|
|
type: 'A',
|
|
})) {
|
|
console.log(record.name, record.content);
|
|
}
|
|
|
|
// Update DNS record
|
|
await client.dns.records.update({
|
|
zone_id: 'zone-id',
|
|
dns_record_id: 'record-id',
|
|
type: 'A',
|
|
name: 'subdomain.example.com',
|
|
content: '203.0.113.1',
|
|
proxied: true,
|
|
});
|
|
|
|
// Delete DNS record
|
|
await client.dns.records.delete({
|
|
zone_id: 'zone-id',
|
|
dns_record_id: 'record-id',
|
|
});
|
|
```
|
|
|
|
```python
|
|
# Python example
|
|
client.dns.records.create(
|
|
zone_id="zone-id",
|
|
type="A",
|
|
name="subdomain.example.com",
|
|
content="192.0.2.1",
|
|
ttl=1,
|
|
proxied=True,
|
|
)
|
|
```
|
|
|
|
## See Also
|
|
|
|
- [configuration.md](./configuration.md) - SDK configuration, environment variables
|
|
- [patterns.md](./patterns.md) - Real-world patterns and workflows
|
|
- [gotchas.md](./gotchas.md) - Rate limits, troubleshooting
|