revenuecat-api
Version:
Type-safe RevenueCat API client using fetch with automatic rate limiting
194 lines (148 loc) • 5.22 kB
Markdown
# RevenueCat API Client
A type-safe, isomorphic API client for the RevenueCat v2 REST API.
## Overview
This package provides a lightweight, fully-typed client for interacting with the RevenueCat API. It's generated from the [official RevenueCat OpenAPI specification](https://www.revenuecat.com/docs/api-v2) and built on top of [`openapi-typescript`](https://openapi-ts.dev/) and [`openapi-fetch`](https://openapi-ts.dev/openapi-fetch/), offering significantly smaller bundle sizes compared to traditional code generators like `openapi-generator`.
## Features
- **Type Safety**: Full TypeScript support with generated types from the official OpenAPI spec
- **Automatic Rate Limiting**: Built-in rate limiting that respects RevenueCat's `Retry-After` headers
- **Isomorphic**: Works in both server-side (Node.js, Deno) and browser environments
- **Lightweight**: Minimal bundle size using modern fetch-based architecture
- **Queue Management**: Intelligent request queuing to handle rate limits gracefully
- **Configurable**: Customizable options for different use cases
## Installation
```bash
pnpm add revenuecat-api
# or
yarn add revenuecat-api
# or
npm install revenuecat-api
```
## Quick Start
```typescript
import { createRevenueCatClient } from 'revenuecat-api';
// Create a client with your RevenueCat API key
const client = createRevenueCatClient('your-api-key-here');
// Example: Fetch subscription information
// (Note all API endpoint strings are type-safe and discoverable via IntelliSense!)
const { data, error } = await client[
"/projects/{project_id}/customers/{customer_id}/subscriptions"
].GET({
params: {
// Request path, query, and body are type checked
path: {
project_id: "proj1ab2c3d4",
customer_id: "19b8de26-77c1-49f1-aa18-019a391603e2",
},
},
});
// Response data is typed as well
if (error) {
console.error(`Error of type ${error.type}:`, error.message);
} else {
console.log('Subscription data:', data);
}
```
## Rate Limiting
The client can optionally handle RevenueCat's rate limiting by:
- Respecting `Retry-After` headers from 429 responses
- Queuing requests when rate limits are hit
- Automatically retrying failed requests (up to 3 times by default)
- Managing per-endpoint rate limit states
_Note that automatic rate limiting functionality is still in early development stages and may not be production ready_
You can opt into automatic rate limiting if desired:
```typescript
const client = createRevenueCatClient('your-api-key', {
automaticRateLimit: true
});
```
For more details on RevenueCat's rate limiting, see the [official documentation](https://www.revenuecat.com/docs/api-v2#tag/Rate-Limit).
## API Reference
### `createRevenueCatClient(accessToken, options?)`
Creates a new RevenueCat API client instance.
**Parameters:**
- `accessToken` (string, required): Your RevenueCat API key
- `options` (object, optional): Configuration options
**Options:**
- `automaticRateLimit` (boolean, default: true): Enable/disable automatic rate limiting
- `baseUrl` (string, default: `"https://api.revenuecat.com/v2"`): API base URL
- All other [options from `openapi-fetch`](https://openapi-ts.dev/openapi-fetch/api#createclient) are supported
**Returns:** A configured API client
## Examples
### Managing Subscriptions / Entitlements
```typescript
// Get subscriptions information
const { data: subscriptions } = await client[
"/projects/{project_id}/customers/{customer_id}/subscriptions"
].GET({
params: {
path: {
project_id: "proj1ab2c3d4",
customer_id: "19b8de26-77c1-49f1-aa18-019a391603e2",
},
query: {
limit: 20,
starting_after: "ent12354",
},
},
});
// Create entitlement
const { data: entitlement } = await client[
"/projects/{project_id}/entitlements"
].POST({
params: {
path: {
project_id: "proj1ab2c3d4",
},
},
body: {
lookup_key: "premium",
display_name: "Premium",
},
});
```
### Handling Errors
```typescript
const { data, error } = await client[
"/projects/{project_id}/customers/{customer_id}"
].GET({
params: {
path: {
project_id: "proj1ab2c3d4",
customer_id: "19b8de26-77c1-49f1-aa18-019a391603e2",
},
},
});
if (error) {
switch (error.type) {
case "resource_missing":
console.log("Resource not found");
break;
case "rate_limit_error":
console.log("Rate limit exceeded");
break;
default:
console.log("Unknown error", error.message, error.doc_url);
break;
}
}
```
## Development
### Prerequisites
- Node.js 20+
- pnpm (recommended) or npm
### Setup
1. Clone the repository
2. Install dependencies: `pnpm install`
3. Generate types: `pnpm generate:openapi`
4. Run tests: `pnpm test`
### Scripts
- `pnpm generate:openapi` - Generate TypeScript types and client from OpenAPI spec
- `pnpm update:openapi` - Redownload the latest RevenueCat OpenAPI spec and then regenerate the client
- `pnpm test` - Run test suite
- `pnpm test:watch` - Run tests in watch mode
- `pnpm lint` - Run ESLint
- `pnpm types:check` - Check TypeScript types
## License
MIT
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.