API testing tools for technical writers

This guide demonstrates various tools technical writers use to test and document APIs, using our Customer Management API as examples.

1. cURL (Essential - Works everywhere)

Basic operations

# Create customer
curl -X POST 'http://localhost:8080/customer' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Alice Johnson",
    "id": "CUST001",
    "phone": "555-0123",
    "type": "VIP",
    "address": {
      "street": "123 Main St",
      "city": "New York",
      "state": "NY",
      "zipCode": "10001",
      "country": "USA"
    }
  }'

# Get customer by ID
curl -X GET 'http://localhost:8080/customer/CUST001' \
  -H 'Accept: application/json'

# Search with filters
curl -X GET 'http://localhost:8080/customers/search?name=Alice&type=VIP&page=0&size=10' \
  -H 'Accept: application/json'

# Partial update (PATCH)
curl -X PATCH 'http://localhost:8080/customer/CUST001' \
  -H 'Content-Type: application/json' \
  -d '{"phone": "555-9999", "type": "PREMIUM"}'

# Batch create customers
curl -X POST 'http://localhost:8080/customers/batch' \
  -H 'Content-Type: application/json' \
  -d '[
    {
      "name": "Bob Smith",
      "id": "CUST002",
      "phone": "555-0124",
      "type": "BUSINESS",
      "address": {"street": "456 Oak Ave", "city": "Boston", "state": "MA", "zipCode": "02101", "country": "USA"}
    },
    {
      "name": "Carol Davis",
      "id": "CUST003",
      "phone": "555-0125",
      "type": "INDIVIDUAL",
      "address": {"street": "789 Pine St", "city": "Seattle", "state": "WA", "zipCode": "98101", "country": "USA"}
    }
  ]'

Collection structure for documentation:

Customer Management API/
├── Single Customer Operations/
│   ├── Create Customer (POST /customer)
│   ├── Update Customer (PUT /customer)
│   ├── Partial Update (PATCH /customer/{id})
│   ├── Get Customer (GET /customer/{id})
│   └── Delete Customer (DELETE /customer/{id})
└── Multiple Customer Operations/
    ├── Batch Create (POST /customers/batch)
    ├── Get All Customers (GET /customers)
    └── Search Customers (GET /customers/search)

Postman environment variables:

{
  "baseUrl": "http://localhost:8080",
  "customerId": "CUST001",
  "pageSize": "10"
}

Pre-request scripts (for dynamic data):

// Generate unique customer ID
pm.globals.set("customerId", "CUST" + Math.floor(Math.random() * 1000).toString().padStart(3, '0'));

// Set current timestamp
pm.globals.set("timestamp", new Date().toISOString());

3. HTTPie (Developer-friendly CLI)

Install: pip install httpie

# Clean syntax - no quotes needed
http POST localhost:8080/customer \
  name="Alice Johnson" \
  id="CUST001" \
  phone="555-0123" \
  type="VIP" \
  address:='{"street": "123 Main St", "city": "New York", "state": "NY", "zipCode": "10001", "country": "USA"}'

# GET with query parameters
http GET localhost:8080/customers/search name==Alice type==VIP page==0 size==10

# PATCH is intuitive
http PATCH localhost:8080/customer/CUST001 phone="555-9999" type="PREMIUM"

4. Insomnia (Alternative to Postman)

Workspace organization:

  • Folder: “Customer CRUD”
  • Folder: “Batch & Search Operations”
  • Environment: “Development” (localhost:8080)
  • Environment: “Production” (api.example.com)

Template variables:

/customer/
/customers?page={"layout"=>"default", "title"=>"API testing tools for technical writers", "description"=>"Comprehensive guide to tools for testing and documenting APIs with practical examples", "content"=>"# API testing tools for technical writers\n\nThis guide demonstrates various tools technical writers use to test and document APIs, using our Customer Management API as examples.\n\n## 1. **cURL** (Essential - Works everywhere)\n\n### Basic operations\n```bash\n# Create customer\ncurl -X POST 'http://localhost:8080/customer' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"name\": \"Alice Johnson\",\n    \"id\": \"CUST001\",\n    \"phone\": \"555-0123\",\n    \"type\": \"VIP\",\n    \"address\": {\n      \"street\": \"123 Main St\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"zipCode\": \"10001\",\n      \"country\": \"USA\"\n    }\n  }'\n\n# Get customer by ID\ncurl -X GET 'http://localhost:8080/customer/CUST001' \\\n  -H 'Accept: application/json'\n\n# Search with filters\ncurl -X GET 'http://localhost:8080/customers/search?name=Alice&type=VIP&page=0&size=10' \\\n  -H 'Accept: application/json'\n\n# Partial update (PATCH)\ncurl -X PATCH 'http://localhost:8080/customer/CUST001' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"phone\": \"555-9999\", \"type\": \"PREMIUM\"}'\n\n# Batch create customers\ncurl -X POST 'http://localhost:8080/customers/batch' \\\n  -H 'Content-Type: application/json' \\\n  -d '[\n    {\n      \"name\": \"Bob Smith\",\n      \"id\": \"CUST002\",\n      \"phone\": \"555-0124\",\n      \"type\": \"BUSINESS\",\n      \"address\": {\"street\": \"456 Oak Ave\", \"city\": \"Boston\", \"state\": \"MA\", \"zipCode\": \"02101\", \"country\": \"USA\"}\n    },\n    {\n      \"name\": \"Carol Davis\",\n      \"id\": \"CUST003\",\n      \"phone\": \"555-0125\",\n      \"type\": \"INDIVIDUAL\",\n      \"address\": {\"street\": \"789 Pine St\", \"city\": \"Seattle\", \"state\": \"WA\", \"zipCode\": \"98101\", \"country\": \"USA\"}\n    }\n  ]'\n```\n\n## 2. **Postman** (Most popular GUI tool)\n\n### Collection structure for documentation:\n```\nCustomer Management API/\n├── Single Customer Operations/\n│   ├── Create Customer (POST /customer)\n│   ├── Update Customer (PUT /customer)\n│   ├── Partial Update (PATCH /customer/{id})\n│   ├── Get Customer (GET /customer/{id})\n│   └── Delete Customer (DELETE /customer/{id})\n└── Multiple Customer Operations/\n    ├── Batch Create (POST /customers/batch)\n    ├── Get All Customers (GET /customers)\n    └── Search Customers (GET /customers/search)\n```\n\n### Postman environment variables:\n```json\n{\n  \"baseUrl\": \"http://localhost:8080\",\n  \"customerId\": \"CUST001\",\n  \"pageSize\": \"10\"\n}\n```\n\n### Pre-request scripts (for dynamic data):\n```javascript\n// Generate unique customer ID\npm.globals.set(\"customerId\", \"CUST\" + Math.floor(Math.random() * 1000).toString().padStart(3, '0'));\n\n// Set current timestamp\npm.globals.set(\"timestamp\", new Date().toISOString());\n```\n\n## 3. **HTTPie** (Developer-friendly CLI)\n\nInstall: `pip install httpie`\n\n```bash\n# Clean syntax - no quotes needed\nhttp POST localhost:8080/customer \\\n  name=\"Alice Johnson\" \\\n  id=\"CUST001\" \\\n  phone=\"555-0123\" \\\n  type=\"VIP\" \\\n  address:='{\"street\": \"123 Main St\", \"city\": \"New York\", \"state\": \"NY\", \"zipCode\": \"10001\", \"country\": \"USA\"}'\n\n# GET with query parameters\nhttp GET localhost:8080/customers/search name==Alice type==VIP page==0 size==10\n\n# PATCH is intuitive\nhttp PATCH localhost:8080/customer/CUST001 phone=\"555-9999\" type=\"PREMIUM\"\n```\n\n## 4. **Insomnia** (Alternative to Postman)\n\n### Workspace organization:\n- Folder: \"Customer CRUD\"\n- Folder: \"Batch & Search Operations\"\n- Environment: \"Development\" (localhost:8080)\n- Environment: \"Production\" (api.example.com)\n\n### Template variables:\n```\n{{ baseUrl }}/customer/{{ customerId }}\n{{ baseUrl }}/customers?page={{ page }}&size={{ size }}\n```\n\n## 5. **VS Code REST Client extension**\n\nCreate `.http` files for documentation:\n\n```http\n### Variables\n@baseUrl = http://localhost:8080\n@customerId = CUST001\n\n### Create Customer\nPOST {{baseUrl}}/customer\nContent-Type: application/json\n\n{\n  \"name\": \"Alice Johnson\",\n  \"id\": \"{{customerId}}\",\n  \"phone\": \"555-0123\",\n  \"type\": \"VIP\",\n  \"address\": {\n    \"street\": \"123 Main St\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"zipCode\": \"10001\",\n    \"country\": \"USA\"\n  }\n}\n\n### Get Customer\nGET {{baseUrl}}/customer/{{customerId}}\nAccept: application/json\n\n### Search Customers\nGET {{baseUrl}}/customers/search?name=Alice&type=VIP&page=0&size=10\nAccept: application/json\n\n### Update Customer Phone\nPATCH {{baseUrl}}/customer/{{customerId}}\nContent-Type: application/json\n\n{\n  \"phone\": \"555-9999\"\n}\n```\n\n## 6. **Browser testing** (for GET requests)\n\nDirect browser URLs for quick testing:\n```\nhttp://localhost:8080/customers\nhttp://localhost:8080/customers?page=0&size=5\nhttp://localhost:8080/customers/search?type=VIP\nhttp://localhost:8080/customers/search?name=Alice&city=New%20York\nhttp://localhost:8080/customer/CUST001\n```\n\n## 7. **OpenAPI/Swagger tools**\n\n### Swagger UI (Built-in)\n```\nhttp://localhost:8080/swagger-ui/index.html\n```\n\n### Swagger Editor (Online)\n- Import: `http://localhost:8080/v3/api-docs.yaml`\n- Test directly in editor\n\n### ReDoc (Alternative documentation)\n- Cleaner docs format\n- Can be integrated into documentation sites\n\n## 8. **Bruno** (Open source Postman alternative)\n\nLightweight, fast alternative with collections stored as files:\n```\ncollections/\n├── customer-management.json\n├── environments/\n│   ├── development.json\n│   └── production.json\n```\n\n## 9. **Paw** (Mac-only, Premium)\n\nAdvanced features for technical writers:\n- Dynamic values and variables\n- Code generation in multiple languages\n- Beautiful documentation export\n\n## 10. **Testing in documentation**\n\n### Example response documentation:\n```json\n// GET /customer/CUST001 Response (200 OK)\n{\n  \"name\": \"Alice Johnson\",\n  \"id\": \"CUST001\",\n  \"phone\": \"555-0123\",\n  \"type\": \"VIP\",\n  \"address\": {\n    \"street\": \"123 Main St\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"zipCode\": \"10001\",\n    \"country\": \"USA\",\n    \"formattedAddress\": \"123 Main St, New York, NY 10001\"\n  },\n  \"businessCustomer\": false,\n  \"highValueCustomer\": true,\n  \"city\": \"New York\"\n}\n```\n\n### Error response examples:\n```json\n// GET /customer/INVALID (404 Not Found)\n{\n  \"error\": \"Customer not found\",\n  \"customerID\": \"INVALID\",\n  \"timestamp\": \"2024-01-21T10:30:00Z\"\n}\n```\n\n## **Recommendations for technical writers:**\n\n1. **Master cURL first** - Works everywhere, easy to document\n2. **Use Postman/Insomnia for complex workflows** - GUI makes testing faster\n3. **HTTPie for cleaner CLI examples** - More readable than cURL in docs\n4. **VS Code REST Client for living documentation** - Keep tests with code\n5. **Browser for quick GET testing** - Fastest for simple checks\n6. **Swagger UI for interactive docs** - Great for user-facing documentation\n\n## **Testing checklist for documentation:**\n\n- [ ] Test all HTTP methods (GET, POST, PUT, PATCH, DELETE)\n- [ ] Verify all query parameters work as documented\n- [ ] Test error conditions (404, 400, 500)\n- [ ] Validate request/response examples\n- [ ] Check pagination and filtering\n- [ ] Test with various data types and edge cases\n- [ ] Verify authentication (if applicable)\n- [ ] Test rate limiting (if applicable)\n\nEach tool has its strengths - technical writers often use multiple tools depending on the task: cURL for documentation examples, Postman for complex testing workflows, and browser testing for quick verification.", "dir"=>"/tech-writer-reference/reference/", "name"=>"tools-comparison.md", "path"=>"tech-writer-reference/reference/tools-comparison.md", "url"=>"/tech-writer-reference/reference/tools-comparison.html"}&size=

5. VS Code REST Client extension

Create .http files for documentation:

### Variables
@baseUrl = http://localhost:8080
@customerId = CUST001

### Create Customer
POST /customer
Content-Type: application/json

{
  "name": "Alice Johnson",
  "id": "",
  "phone": "555-0123",
  "type": "VIP",
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "state": "NY",
    "zipCode": "10001",
    "country": "USA"
  }
}

### Get Customer
GET /customer/
Accept: application/json

### Search Customers
GET /customers/search?name=Alice&type=VIP&page=0&size=10
Accept: application/json

### Update Customer Phone
PATCH /customer/
Content-Type: application/json

{
  "phone": "555-9999"
}

6. Browser testing (for GET requests)

Direct browser URLs for quick testing:

http://localhost:8080/customers
http://localhost:8080/customers?page=0&size=5
http://localhost:8080/customers/search?type=VIP
http://localhost:8080/customers/search?name=Alice&city=New%20York
http://localhost:8080/customer/CUST001

7. OpenAPI/Swagger tools

Swagger UI (Built-in)

http://localhost:8080/swagger-ui/index.html

Swagger Editor (Online)

  • Import: http://localhost:8080/v3/api-docs.yaml
  • Test directly in editor

ReDoc (Alternative documentation)

  • Cleaner docs format
  • Can be integrated into documentation sites

8. Bruno (Open source Postman alternative)

Lightweight, fast alternative with collections stored as files:

collections/
├── customer-management.json
├── environments/
│   ├── development.json
│   └── production.json

9. Paw (Mac-only, Premium)

Advanced features for technical writers:

  • Dynamic values and variables
  • Code generation in multiple languages
  • Beautiful documentation export

10. Testing in documentation

Example response documentation:

// GET /customer/CUST001 Response (200 OK)
{
  "name": "Alice Johnson",
  "id": "CUST001",
  "phone": "555-0123",
  "type": "VIP",
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "state": "NY",
    "zipCode": "10001",
    "country": "USA",
    "formattedAddress": "123 Main St, New York, NY 10001"
  },
  "businessCustomer": false,
  "highValueCustomer": true,
  "city": "New York"
}

Error response examples:

// GET /customer/INVALID (404 Not Found)
{
  "error": "Customer not found",
  "customerID": "INVALID",
  "timestamp": "2024-01-21T10:30:00Z"
}

Recommendations for technical writers:

  1. Master cURL first - Works everywhere, easy to document
  2. Use Postman/Insomnia for complex workflows - GUI makes testing faster
  3. HTTPie for cleaner CLI examples - More readable than cURL in docs
  4. VS Code REST Client for living documentation - Keep tests with code
  5. Browser for quick GET testing - Fastest for simple checks
  6. Swagger UI for interactive docs - Great for user-facing documentation

Testing checklist for documentation:

  • Test all HTTP methods (GET, POST, PUT, PATCH, DELETE)
  • Verify all query parameters work as documented
  • Test error conditions (404, 400, 500)
  • Validate request/response examples
  • Check pagination and filtering
  • Test with various data types and edge cases
  • Verify authentication (if applicable)
  • Test rate limiting (if applicable)

Each tool has its strengths - technical writers often use multiple tools depending on the task: cURL for documentation examples, Postman for complex testing workflows, and browser testing for quick verification.