Most technical documentation templates fail for the same reason: they begin with a page layout instead of a reader's job.
A quickstart and an API reference can use the same visual components, but they are not interchangeable. One gets a developer to a first success. The other answers exact questions after the developer has already started building.
This guide covers twelve technical documentation examples, the structure each one needs, and the common mistake that makes it less useful.
Technical Documentation Examples at a Glance
| Document type | Primary job | Success test |
|---|---|---|
| README | Explain the project and the first path | A new reader knows whether to continue |
| Quickstart | Produce one successful result | The result works from a clean environment |
| Concept guide | Build a correct mental model | The reader can predict system behavior |
| API endpoint reference | Define one operation precisely | A request can be built without guessing |
| Authentication guide | Get a valid credential into a request | The first authenticated request succeeds |
| Error catalog | Turn failures into next actions | The reader can diagnose and recover |
| SDK guide | Show the idiomatic language workflow | Code runs with the documented version |
| CLI reference | Make commands discoverable and scriptable | Flags, output, and exit behavior are clear |
| Webhook guide | Explain an asynchronous contract | Events can be verified, retried, and deduplicated |
| Migration guide | Move between versions safely | Breaking changes and rollback are explicit |
| Changelog | Explain what changed and who is affected | A team can decide whether to act |
| Troubleshooting runbook | Shorten recovery from known failures | Symptoms lead to checks and fixes |
The rest of the article gives a compact template for each.
1. README Example
A README is an orientation document, not the complete manual. It should answer four questions quickly:
- What is this?
- Who is it for?
- What is the shortest working path?
- Where does deeper documentation live?
1# Acme Events SDK2
3Send product events from Node.js services to Acme.4
5## Install6
7```bash8npm install @acme/events9```10
11## First event12
13```ts14import { Acme } from "@acme/events";15
16const client = new Acme({ apiKey: process.env.ACME_API_KEY });17await client.track("account.created", { accountId: "acc_123" });18```19
20## Next21
22- [Authentication](/authentication)23- [Event schema](/events/schema)24- [Retries](/events/retries)Common failure: turning the README into a copy of the marketing page. A developer opening a repository usually needs an install command and a verified example, not another value proposition.
2. Quickstart Example
A quickstart should optimize for one complete result. It should not teach every concept on the way.
1# Send your first event2
3You will create an API key, install the Node SDK, send one event,4and verify it in the dashboard.5
6## Before you start7
8- Node.js 20 or newer9- An Acme workspace with permission to create API keys10
11## 1. Create an API key12...13
14## 2. Install the SDK15...16
17## 3. Send an event18...19
20## 4. Verify the result21
22Open **Events > Live** and confirm `account.created` appears.A good quickstart names prerequisites before step one and shows how to verify the outcome at the end. Without verification, a reader cannot tell whether the tutorial worked or merely stopped producing errors.
3. Concept Guide Example
Concept pages explain how the system behaves. They should help a reader make decisions that are not reducible to one command.
1# Delivery guarantees2
3Acme accepts events at least once. A successful response means the event4was persisted, not that every downstream destination processed it.5
6## What can be duplicated7
8Retries can deliver the same event more than once. Use `event_id` as the9idempotency key in consumers.10
11## Ordering12
13Ordering is preserved within one `account_id`, but not across accounts.14
15## Choose a retry policy16
17| Failure | Retry? | Reason |18|---|---:|---|19| 429 | Yes | Temporary rate limit |20| 400 | No | Request must change |21| 503 | Yes | Temporary service failure |Common failure: writing an abstract overview with no decision rules. A useful concept page changes what the reader does.
4. API Endpoint Reference Example
An endpoint page is a contract. It needs the information required to construct, send, and interpret one operation.
1# Create an event2
3`POST /v1/events`4
5Creates one event for an account.6
7## Request8
9| Field | Type | Required | Description |10|---|---|---:|---|11| `event_id` | string | yes | Unique idempotency key |12| `name` | string | yes | Dot-separated event name |13| `account_id` | string | yes | Owning account |14| `properties` | object | no | Event-specific values |1516## Response17
18`202 Accepted` means the event was persisted for asynchronous delivery.19
20## Errors21
22- `400 invalid_event_name`23- `401 invalid_api_key`24- `409 duplicate_event_id`If the reference is generated from OpenAPI, keep the spec-backed fields generated. Put product explanation, examples, and cross-endpoint workflows around that generated contract rather than editing generated output by hand.
5. Authentication Guide Example
Authentication documentation is often spread across a dashboard tooltip, a security page, and an endpoint example. Put the whole first-request path in one place.
1# API authentication2
3Acme uses bearer API keys for server-to-server requests.4
5## Create a key6
71. Open **Settings > API keys**.82. Choose the narrowest required scopes.93. Store the secret once; Acme does not show it again.10
11## Send the key12
13```bash14curl https://api.acme.test/v1/events \15 -H "Authorization: Bearer $ACME_API_KEY"16```17
18## Environments19
20Test keys start with `test_`. Production keys start with `live_`.21
22## Common failures23
24| Status | Cause | Fix |25|---|---|---|26| 401 | Missing or invalid key | Replace the bearer token |27| 403 | Missing scope | Create a key with the required scope |Never put a real secret in an example. Explain scope, environment, rotation, and the exact failure modes next to the first request.
6. Error Documentation Example
An error catalog should connect a machine-readable error to a human next step.
1# API errors2
3Every error response includes a stable `code`, a request-specific `message`,4and a `request_id` support can use for tracing.5
6```json7{8 "code": "rate_limit_exceeded",9 "message": "Too many requests for workspace ws_123",10 "request_id": "req_456"11}12```13
14| Code | Retry | Next action |15|---|---:|---|16| `invalid_request` | no | Correct the named field |17| `rate_limit_exceeded` | yes | Back off using the response headers |18| `service_unavailable` | yes | Retry with jitter |Common failure: documenting only HTTP statuses. 400 is a transport category; a stable error code is what software and support teams can act on.
7. SDK Documentation Example
SDK documentation should show the idiomatic workflow for one language, not mechanically transliterate HTTP requests.
1# Node SDK2
3## Install4
5```bash6npm install @acme/events7```8
9## Configure one client10
11Create the client once and reuse it. The client manages connection pooling12and retries safe failures by default.13
14```ts15export const acme = new Acme({16 apiKey: process.env.ACME_API_KEY,17 timeout: 5_000,18});19```20
21## Handle an API error22
23```ts24try {25 await acme.events.create(input);26} catch (error) {27 if (error instanceof Acme.RateLimitError) {28 // Respect error.retryAfter before retrying.29 }30}31```Pin the documented SDK version or show when the example was verified. Generated SDKs still need human-written guidance about lifecycle, retries, pagination, and language-specific conventions.
8. CLI Documentation Example
CLI documentation has two readers: a person at a terminal and a script that depends on stable behavior.
1# `acme events send`2
3Send one event from a file or standard input.4
5## Usage6
7```bash8acme events send --file event.json9cat event.json | acme events send --stdin10```11
12## Flags13
14| Flag | Default | Description |15|---|---|---|16| `--file` | none | JSON input file |17| `--stdin` | false | Read JSON from standard input |18| `--output` | `text` | `text` or `json` |1920## Exit codes21
22| Code | Meaning |23|---:|---|24| 0 | Event accepted |25| 2 | Invalid arguments or input |26| 3 | Authentication failed |27| 4 | Remote API failed |See the OpenAPI-to-CLI workflow for the larger question: which parts can be generated from a spec and which behavior still needs explicit CLI design.
9. Webhook Documentation Example
Webhook docs need to explain the contract around delivery, not just list event names.
1# Receive webhooks2
3## Verify the signature4
5Use the raw request body and the `Acme-Signature` header. Reject requests6whose timestamp is more than five minutes old.7
8## Acknowledge quickly9
10Return a 2xx response within five seconds. Queue slow work for later.11
12## Handle retries13
14Acme retries for 24 hours with exponential backoff. The same `event_id`15can be delivered more than once.16
17## Test locally18
19```bash20acme webhooks listen --forward-to localhost:3000/webhooks/acme21```Include signature verification, timing, retries, ordering, deduplication, and a local test loop. An event schema alone is not a webhook guide.
10. Migration Guide Example
A migration guide should make risk visible.
1# Migrate from API v1 to v22
3## What changed4
5- `customer` is now `account`6- timestamps use RFC 3339 strings instead of Unix seconds7- list responses use cursor pagination8
9## Migration order10
111. Accept both timestamp formats in consumers.122. Move list calls to cursor pagination.133. Replace `customer_id` with `account_id`.144. Switch traffic to v2.155. Remove the compatibility code after verification.16
17## Rollback18
19Keep the v1 key active until v2 traffic has passed production checks.Do not hide breaking changes inside a changelog. A migration document needs sequence, compatibility window, verification, and rollback.
11. Changelog Example
A useful changelog explains impact, not only implementation.
1# 2026-08-282
3## Cursor pagination for event lists4
5`GET /v1/events` now returns `next_cursor`. Offset pagination remains6available until 2026-11-30.7
8**Who is affected:** integrations that request more than one page.9
10**Action:** update the loop to pass `next_cursor` on the next request.11
12**No action:** integrations that fetch only the first page.The key fields are who is affected, what action is required, and the deadline. A Git commit message is not a release note.
12. Troubleshooting Runbook Example
Troubleshooting pages work best when they start with symptoms and observable checks.
1# Events do not appear in the dashboard2
3## 1. Check the response4
5- `202`: continue to delivery checks6- `401`: replace the API key7- `429`: wait for the reset time8
9## 2. Confirm the environment10
11Test events and production events appear in separate workspaces.12
13## 3. Search by request ID14
15Run:16
17```bash18acme requests get req_45619```20
21## 4. Contact support22
23Send the request ID. Do not send the API key or full authorization header.Common failure: organizing troubleshooting around internal components. Readers arrive with symptoms, not your service topology.
A Reusable Technical Documentation Template
When no specialized format fits, use this small structure:
1# [Task or concept]2
3[One paragraph defining the outcome or behavior.]4
5## Before you start6
7- [Requirement]8- [Permission]9- [Supported version]10
11## [First meaningful step or concept]12
13[Exact instruction or explanation.]14
15```language16[Verified example]17```18
19## Verify the result20
21[Observable success condition.]22
23## Failures and recovery24
25| Symptom or error | Cause | Next action |26|---|---|---|2728## Related documentation29
30- [One prerequisite]31- [One next task]32- [One reference page]Use the template as a review checklist, not as a reason to force every page into the same shape.
How to Evaluate Your Own Examples
Pick one task and test it from a clean environment. Check whether the page includes:
- the intended outcome in the first paragraph
- prerequisites before the instructions
- a complete, current example
- an observable success condition
- named failures and recovery steps
- links to one prerequisite and one next task
Then run the page through DocsAgent Score, check its crawlability and search signals with the Docs SEO Checker, or compare its delivery and structure with the public documentation benchmark.
For API-specific patterns, continue with API documentation examples scored for onboarding and AI readability. For the workflow behind generated references, SDKs, and CLIs, see API documentation automation.