mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2026-03-21 18:11:27 -07:00
update skills
This commit is contained in:
204
.agents/skills/cloudflare-deploy/references/api/api.md
Normal file
204
.agents/skills/cloudflare-deploy/references/api/api.md
Normal file
@@ -0,0 +1,204 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user