Skip to content

API Reference ​

Complete reference for all itty-fetcher methods, options, and types.

fetcher() ​

The main factory function that creates a fetcher instance.

Syntax ​

ts
fetcher(baseUrl?: string, options?: FetcherOptions): Fetcher
fetcher(options?: FetcherOptions): Fetcher

Parameters ​

  • baseUrl (optional): Base URL to prepend to all requests
  • options (optional): Configuration options

Returns ​

A Fetcher instance with HTTP method functions.

Examples ​

ts
// Basic usage
const api = fetcher()

// With base URL
const api = fetcher('https://api.example.com')

// With options
const api = fetcher({
  headers: { 'Authorization': 'Bearer token' }
})

// With base URL and options
const api = fetcher('https://api.example.com', {
  headers: { 'Authorization': 'Bearer token' }
})

HTTP Methods ​

All HTTP methods support flexible argument patterns for maximum convenience.

.get() ​

Make GET requests.

ts
.get(url?: string, options?: FetcherOptions): Promise<Response>
.get(options?: FetcherOptions): Promise<Response>

Examples:

ts
await api.get('/users')
await api.get('/users', { headers: { 'Accept': 'text/xml' } })
await api.get({ headers: { 'Accept': 'text/xml' } }) // uses base URL

.post() ​

Make POST requests with optional payload.

ts
.post(url?: string, payload?: any, options?: FetcherOptions): Promise<Response>
.post(payload?: any, options?: FetcherOptions): Promise<Response>
.post(options?: FetcherOptions): Promise<Response>

Examples:

ts
await api.post('/users', { name: 'Alice' })
await api.post('/users', { name: 'Alice' }, { headers: { 'X-Custom': 'value' } })
await api.post({ name: 'Alice' }) // uses base URL
await api.post() // no payload, uses base URL

.put() ​

Make PUT requests with optional payload.

ts
.put(url?: string, payload?: any, options?: FetcherOptions): Promise<Response>
.put(payload?: any, options?: FetcherOptions): Promise<Response>

Examples:

ts
await api.put('/users/1', { name: 'Bob' })
await api.put({ name: 'Bob' }) // uses base URL

.patch() ​

Make PATCH requests with optional payload.

ts
.patch(url?: string, payload?: any, options?: FetcherOptions): Promise<Response>
.patch(payload?: any, options?: FetcherOptions): Promise<Response>

Examples:

ts
await api.patch('/users/1', { email: '[email protected]' })
await api.patch({ email: '[email protected]' }) // uses base URL

.delete() ​

Make DELETE requests with optional payload.

ts
.delete(url?: string, payload?: any, options?: FetcherOptions): Promise<Response>
.delete(payload?: any, options?: FetcherOptions): Promise<Response>

Examples:

ts
await api.delete('/users/1')
await api.delete('/users/1', { reason: 'Account closed' })
await api.delete({ reason: 'Account closed' }) // uses base URL

Configuration Options ​

Options can be provided at the fetcher level or per-request.

Core Options ​

OptionTypeDefaultDescription
basestring | URL''Base URL to prepend to requests
headersHeadersInit{}Default headers for requests
parsefalse | 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData''json'How to parse responses
encodefalsetrueAutomatically encode request payloads

Advanced Options ​

OptionTypeDefaultDescription
fetchtypeof fetchglobalThis.fetchCustom fetch implementation
queryRecord<string, any>{}Query parameters for requests
afterResponseHandler[][]Response interceptors/transformers
arraytruefalseReturn [error, response] tuples

Native RequestInit Options ​

All standard RequestInit options are supported:

  • method (set automatically by HTTP method)
  • body (set automatically from payload)
  • cache
  • credentials
  • integrity
  • keepalive
  • mode
  • redirect
  • referrer
  • referrerPolicy
  • signal

TypeScript Types ​

Fetcher ​

The main fetcher instance type:

ts
interface Fetcher<DefaultRequestShape = any, DefaultResponseShape = any> {
  get: GetFetchCall<DefaultResponseShape>
  post: FetchCall<DefaultRequestShape, DefaultResponseShape>
  put: FetchCall<DefaultRequestShape, DefaultResponseShape>
  patch: FetchCall<DefaultRequestShape, DefaultResponseShape>
  delete: FetchCall<DefaultRequestShape, DefaultResponseShape>
}

FetcherOptions ​

Configuration options interface:

ts
interface FetcherOptions extends RequestInit {
  after?: ResponseHandler[]
  array?: true
  base?: string | URL
  encode?: false
  fetch?: typeof fetch
  parse?: false | 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData'
  query?: Record<string, any>
}

ResponseHandler ​

Function type for response interceptors:

ts
type ResponseHandler = <ResponseShape>(
  response?: ResponseShape,
) => Promise<ResponseShape | void> | ResponseShape | void

Error Types ​

When requests fail, errors include these properties:

ts
interface FetcherError extends Error {
  status: number           // HTTP status code
  message: string         // Status text
  response: Response      // Original Response object
  // ... plus any JSON error body properties
}

Usage Examples ​

Basic Configuration ​

ts
const api = fetcher('https://api.example.com', {
  headers: {
    'Authorization': 'Bearer token',
    'Content-Type': 'application/json'
  },
  parse: 'json'
})

With Response Interceptors ​

ts
const api = fetcher({
  after: [
    // Transform all responses
    async (response) => ({
      ...response,
      timestamp: Date.now()
    }),
    
    // Log responses (returning undefined leaves unchanged)
    async (response) => {
      console.log('API Response:', response)
    }
  ]
})

Tuple Mode (Go-style Error Handling) ​

ts
const api = fetcher({ array: true })

const [error, users] = await api.get('/users')
if (error) {
  console.log('Request failed:', error.status)
} else {
  console.log('Users:', users)
}

Custom Fetch Implementation ​

ts
import fetch from 'node-fetch'

const api = fetcher({
  fetch,  // Use custom fetch
  base: 'https://api.example.com'
})

TypeScript with Generics ​

ts
type User = { id: number; name: string; email: string }
type CreateUser = { name: string; email: string }

const api = fetcher<CreateUser, User>('https://api.example.com')

// TypeScript knows the types
const user = await api.get<User>('/users/1')
const newUser = await api.post('/users', { name: 'Alice', email: '[email protected]' })