# List external writing links



Operation: getWriting
GET /api/writing.json

Access: anonymous. Automatic retries: none. Redirects: manual. Request body limit: 0 bytes.
Default timeout: 30 seconds. Response limit: 16 MiB. Pagination is opt-in and bounded; an exhausted bound reports incomplete execution.

[HTML reference](/developers/api/getWriting) · [Authoritative schemas](/api/openapi.json)

## Wire contract

```json
{
  "operationId": "getWriting",
  "summary": "List external writing links",
  "tags": [
    "writing"
  ],
  "parameters": [
    {
      "name": "API-Version",
      "in": "header",
      "required": false,
      "description": "Header-based API version selection. Omit it, send an empty value, or send 1.0.0; surrounding whitespace is ignored.",
      "schema": {
        "type": "string",
        "pattern": "^[ \\t]*(1\\.0\\.0)?[ \\t]*$",
        "default": "1.0.0"
      }
    },
    {
      "name": "Idempotency-Key",
      "in": "header",
      "required": false,
      "description": "Accepted for clients that attach a key uniformly. GET, HEAD, and OPTIONS are already safe and intrinsically idempotent, so read responses are not stored in an idempotency replay cache.",
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "limit",
      "in": "query",
      "description": "Requested page size (default 50). Numeric values are floored and clamped to 1–100.",
      "schema": {
        "type": "number",
        "default": 50
      }
    },
    {
      "name": "cursor",
      "in": "query",
      "description": "Opaque cursor copied from a returned pagination link. Arbitrary strings are rejected with 400; windowed feed cursors must retain their original filters.",
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "sort",
      "in": "query",
      "description": "Sort field and direction (e.g., \"year:desc\", \"addedAt:asc\")",
      "schema": {
        "type": "string",
        "pattern": "^(date|title|source):(asc|desc)(,(date|title|source):(asc|desc))*$"
      }
    },
    {
      "name": "facets",
      "in": "query",
      "description": "Include facet metadata in response meta (set to 1)",
      "schema": {
        "type": "string",
        "description": "Values 1, true, and yes enable facets (case-insensitive, ignoring surrounding whitespace); other strings leave them disabled."
      }
    },
    {
      "name": "source",
      "in": "query",
      "description": "Filter by publication source",
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "q",
      "in": "query",
      "description": "Case-insensitive search across writing fields",
      "schema": {
        "type": "string"
      }
    }
  ],
  "x-idempotency": "intrinsic-safe-method",
  "responses": {
    "200": {
      "description": "List response for writing",
      "headers": {
        "Content-Usage": {
          "description": "IETF AIPREF usage preferences for this public content",
          "schema": {
            "type": "string",
            "examples": [
              "train-ai=y, search=y"
            ]
          }
        },
        "Content-Signal": {
          "description": "Compatibility AI usage preferences for deployed crawlers",
          "schema": {
            "type": "string",
            "examples": [
              "ai-train=yes, search=yes, ai-input=yes"
            ]
          }
        },
        "API-Version": {
          "description": "Selected public REST contract version",
          "schema": {
            "type": "string",
            "enum": [
              "1.0.0"
            ]
          }
        },
        "RateLimit-Policy": {
          "description": "Public REST quota policy: 1000 Worker requests per 60 seconds for each source and Cloudflare location",
          "schema": {
            "type": "string"
          }
        },
        "RateLimit-Limit": {
          "description": "Compatibility form of the current public REST request limit",
          "schema": {
            "type": "integer",
            "enum": [
              1000
            ]
          }
        },
        "ETag": {
          "description": "Entity tag for conditional requests",
          "schema": {
            "type": "string"
          }
        },
        "Cache-Control": {
          "description": "Caching directives",
          "schema": {
            "type": "string"
          }
        },
        "X-Total-Count": {
          "description": "Total number of items",
          "schema": {
            "type": "integer"
          }
        },
        "Link": {
          "description": "RFC 8288 Web Linking header with pagination links",
          "schema": {
            "type": "string"
          }
        },
        "Link-Template": {
          "description": "RFC 9652 Link-Template header with query parameter templates",
          "schema": {
            "type": "string"
          }
        },
        "Deprecation": {
          "description": "RFC 9745 lifecycle deprecation signal",
          "schema": {
            "type": "string"
          }
        },
        "Sunset": {
          "description": "RFC 8594 lifecycle sunset date (HTTP IMF-fixdate)",
          "schema": {
            "type": "string",
            "pattern": "^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), [0-9]{2} (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2} GMT$",
            "examples": [
              "Sun, 06 Sep 2026 17:40:13 GMT"
            ]
          }
        }
      },
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/WritingItem"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              },
              "links": {
                "$ref": "#/components/schemas/PaginationLinks"
              }
            },
            "required": [
              "data",
              "meta",
              "links"
            ]
          }
        },
        "text/csv": {
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "304": {
      "description": "Not Modified"
    },
    "400": {
      "description": "Bad Request",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/ProblemDetails"
          }
        }
      }
    },
    "406": {
      "description": "Not Acceptable",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/ProblemDetails"
          }
        }
      }
    },
    "429": {
      "description": "Public REST request limit exceeded",
      "headers": {
        "Retry-After": {
          "description": "Seconds before the request should be retried",
          "schema": {
            "type": "integer",
            "enum": [
              60
            ]
          }
        },
        "RateLimit": {
          "description": "Current quota state for the exhausted public-rest policy",
          "schema": {
            "type": "string"
          }
        },
        "Content-Usage": {
          "description": "IETF AIPREF usage preferences for this public content",
          "schema": {
            "type": "string",
            "examples": [
              "train-ai=y, search=y"
            ]
          }
        },
        "Content-Signal": {
          "description": "Compatibility AI usage preferences for deployed crawlers",
          "schema": {
            "type": "string",
            "examples": [
              "ai-train=yes, search=yes, ai-input=yes"
            ]
          }
        },
        "API-Version": {
          "description": "Selected public REST contract version",
          "schema": {
            "type": "string",
            "enum": [
              "1.0.0"
            ]
          }
        },
        "RateLimit-Policy": {
          "description": "Public REST quota policy: 1000 Worker requests per 60 seconds for each source and Cloudflare location",
          "schema": {
            "type": "string"
          }
        },
        "RateLimit-Limit": {
          "description": "Compatibility form of the current public REST request limit",
          "schema": {
            "type": "integer",
            "enum": [
              1000
            ]
          }
        }
      },
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/ProblemDetails"
          }
        }
      }
    },
    "503": {
      "description": "Portable location provenance is incomplete, so the export is unavailable",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/ProblemDetails"
          }
        }
      }
    }
  }
}
```

## Synthetic examples

### curl

```bash
curl --fail-with-body --max-time 30 --max-filesize 16777216 --request GET 'https://irvinebroque.com/api/writing.json' --header 'Accept: application/json'
```

### TypeScript

```typescript
import { PublicApi } from '@irvinebroque/public-api';
const api = new PublicApi();
const result = await api.writing.list({});
console.log(result.status, result.headers.get('content-type')); // Keep transient capabilities in memory.
```

### CLI

```bash
irvinebroque writing list
```
