Under Construction — We're building something new for MSP quoting. Get in touch

Offerframe API

Build custom integrations with our REST API.

Getting Started

The Offerframe API is a RESTful JSON API. All requests require authentication via API key. Generate keys from Settings > API Keys in your workspace.

Authentication

All API requests require a Bearer token in the Authorization header.

Authorization: Bearer YOUR_API_KEY

Base URL

https://api.offerframe.io/v1

All endpoints are prefixed with this base URL. HTTPS is required for all requests.

Endpoints

Quotes

GET/quotes

List all quotes with optional filters (status, date range, customer)

GET/quotes/:id

Retrieve a single quote with line items and metadata

POST/quotes

Create a new quote with line items, customer info, and terms

PATCH/quotes/:id

Update quote fields, line items, or status

Products

GET/products

List catalog products with search and pagination

GET/products/:id

Retrieve a single product with custom fields

POST/products

Add a new product to the catalog

PATCH/products/:id

Update product name, price, description, or custom fields

Customers

GET/customers

List all customers with search and pagination

GET/customers/:id

Retrieve a customer profile with quote history

Team

GET/team/members

List team members with roles and status

Example: List Quotes

Request

curl -X GET "https://api.offerframe.io/v1/quotes?status=sent&limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"

Response

{
  "data": [
    {
      "id": "qt_abc123",
      "quote_number": "Q-250302-A7X",
      "status": "sent",
      "customer_name": "Acme Corp",
      "customer_email": "buyer@acme.com",
      "total": 7821.00,
      "currency": "USD",
      "valid_until": "2026-03-31",
      "created_at": "2026-03-02T14:30:00Z",
      "line_items": [
        {
          "product_name": "Enterprise License",
          "quantity": 10,
          "unit_price": 499.00,
          "total": 4990.00
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 10,
    "total": 42
  }
}

Rate Limits

API requests are limited to 100 requests per minute per API key. Rate limit headers are included in every response:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 97
X-RateLimit-Reset: 1709402400

If you exceed the limit, you'll receive a 429 Too Many Requests response. Wait until the reset time before retrying.

WebhooksEnterprise

Receive real-time notifications when events occur in your workspace. Configure webhook endpoints in Settings > Webhooks.

Event Types

quote.accepted

Fired when a customer accepts a quote via the public link

quote.rejected

Fired when a customer rejects a quote

quote.viewed

Fired when a customer views the public quote link

quote.sent

Fired when a quote is sent to a customer

quote.expired

Fired when a quote passes its valid_until date

Payload Format

{
  "event": "quote.accepted",
  "timestamp": "2026-03-02T16:45:00Z",
  "data": {
    "quote_id": "qt_abc123",
    "quote_number": "Q-250302-A7X",
    "customer_name": "Acme Corp",
    "total": 7821.00,
    "accepted_at": "2026-03-02T16:45:00Z"
  }
}

Retry Policy

Failed deliveries (non-2xx responses) are retried up to 5 times with exponential backoff: 1 min, 5 min, 30 min, 2 hours, 24 hours. After 5 failures, the endpoint is automatically disabled and you'll receive an email notification.

SDKs & Libraries

Official SDKs are coming soon. The REST API works with any HTTP client — use fetch, axios, curl, or your language's built-in HTTP library.