Proposal API Reference
Use the SWELL API to create, update, clone, and manage proposals programmatically. This is useful for automating proposal creation from external tools, AI assistants, or custom integrations.
All endpoints require authentication via Bearer token. Base URL: https://dashboard.swellsystem.com/api/v1
Create a Proposal with Sections
POST /proposals/proposals
Create a new proposal with structured sections and line items in a single request.
Required fields:
title(string) - The proposal title
Optional fields:
contact_id(integer) - Link to a contactcompany_id(integer) - Link to a companylead_id(integer) - Link to a leadstatus(string) - One of: draft, sent, viewed, signed, rejected, expired (default: draft)expires_at(date) - Expiration datesubtotal(decimal) - Subtotal amounttax_rate(decimal) - Tax rate percentage (0-100)currency(string) - 3-letter currency code (default: USD)template_id(integer) - Apply a template to auto-populate sectionssections(array) - Array of section objects
Section Object
Each section in the sections array accepts:
type(string, required) - One of: cover, text, pricing_table, image, signature, divider, columns, video, spacertitle(string) - Section titlecontent(string) - HTML content for the sectionsettings(object) - JSON settings for section configurationsort_order(integer) - Display order (auto-assigned if omitted)is_visible(boolean) - Whether section appears in the proposal (default: true)items(array) - Array of line items (for pricing_table sections)
Item Object
Each item in a section's items array accepts:
description(string) - Item descriptionquantity(number) - Quantity (default: 1)unit_price(number) - Price per unitis_optional(boolean) - Whether the item is optional (default: false)
Example: Full Proposal
{
"title": "Website Redesign Proposal",
"contact_id": 42,
"company_id": 10,
"status": "draft",
"expires_at": "2026-12-31",
"tax_rate": 7,
"currency": "USD",
"sections": [
{
"type": "cover",
"title": "Cover Page",
"content": "<h1>Website Redesign</h1><p>Prepared for Acme Corp</p>"
},
{
"type": "text",
"title": "Project Overview",
"content": "<p>We will redesign your website with modern UI/UX best practices, mobile-first responsive design, and SEO optimization.</p>"
},
{
"type": "pricing_table",
"title": "Investment",
"items": [
{
"description": "Website Design & Development",
"quantity": 1,
"unit_price": 5000.00
},
{
"description": "SEO Setup & Optimization",
"quantity": 1,
"unit_price": 1500.00
},
{
"description": "Monthly Maintenance",
"quantity": 12,
"unit_price": 200.00,
"is_optional": true
}
]
},
{
"type": "signature",
"title": "Agreement",
"content": "<p>By signing below, you agree to the terms outlined in this proposal.</p>"
}
]
}
Create from Template
Instead of defining sections manually, pass a template_id to auto-populate sections from a saved template:
{
"title": "New Client Proposal",
"contact_id": 42,
"template_id": 1
}
The template's sections and items will be copied into the new proposal. If you pass both template_id and sections, the explicit sections take priority.
Update a Proposal
PUT /proposals/proposals/{id}
Update proposal fields and optionally replace all sections. When sections is provided, existing sections are removed and replaced with the new set.
{
"title": "Updated Proposal Title",
"status": "sent",
"sections": [
{
"type": "text",
"title": "Revised Scope",
"content": "<p>Updated project scope details.</p>"
}
]
}
Clone a Proposal
POST /proposals/proposals/{id}/clone
Creates a full copy of an existing proposal including all sections and items. The clone:
- Gets a new proposal number (PROP-XXX)
- Title is prefixed with "Copy of"
- Status is set to draft
- Client signatures and sent/viewed timestamps are cleared
- All sections and line items are duplicated
No request body is needed.
Apply Template to Existing Proposal
POST /proposals/proposals/{id}/apply-template
Replaces all sections on an existing proposal with sections from a template.
{
"template_id": 3
}
Warning: This removes all existing sections and items on the proposal.
List Proposals
GET /proposals/proposals
Query parameters:
search- Search by title or proposal numberstatus- Filter by status (draft, sent, viewed, signed, rejected, expired)contact_id- Filter by contactcompany_id- Filter by companysort- Sort field (prefix with - for descending, e.g.-created_at)per_page- Items per page (max 100)
Get a Proposal
GET /proposals/proposals/{id}
Returns the full proposal with sections, items, contact, company, lead, template, activities, and converted invoice data.
Delete a Proposal
DELETE /proposals/proposals/{id}
Section Types Reference
Type | Purpose | Supports Items |
|---|---|---|
cover | Cover page / title page | No |
text | Rich text content section | No |
pricing_table | Line items with pricing | Yes |
image | Image display section | No |
signature | E-signature capture section | No |
divider | Visual divider / separator | No |
columns | Multi-column layout | No |
video | Embedded video section | No |
spacer | Vertical spacing | No |
Template API
Templates can also be managed via the API:
- GET
/templates/templates- List templates (filter bytype=proposal) - POST
/templates/templates- Create a template (includesections_dataarray) - GET
/templates/templates/{id}- Get a template with sections_data - PUT
/templates/templates/{id}- Update a template - DELETE
/templates/templates/{id}- Delete a template
Updated on: 06/06/2026
Thank you!
