Beta
This API is in beta. Endpoints and response shapes may change as we iterate. For questions or feedback, email support@smartpricingtable.com.
Include your API key in the Authorization header:
You can create and manage API keys from your profile settings.
List endpoints return paginated results. Include page and limit query parameters to control which page of results you receive.
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | integer | 1 | Page number (starts at 1) |
| limit | integer | 20 | Items per page (1–100) |
Every list response includes a pagination object alongside the data array:
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 20,
"total": 150,
"pages": 8
}
}Retrieve a paginated list of proposals for the authenticated user's organization. Templates are excluded by default. Pass `is_template=true` to list reusable templates instead of regular proposals (not both). Use a returned template's `id` with `POST /api/proposals` (`templateId`) to create a proposal from that template.
falsedefaulttrueanydescdefaultasccreated_atdefaultupdated_atnamestatusclient_namesentexpiring_oncompletedlast_activitydraftsentwonlostcancelledDRAFTSENTPENDINGCANCELLEDON_HOLDWONLOSTEXPIRED{
"data": [
{
"created_at": "example-string",
"created_by": {
"email": "example-string",
"id": "example-string",
"name": "example-string",
"avatar_url": "example-string"
},
"id": "example-string",
"name": "example-string",
"status": "DRAFT",
"updated_at": "example-string",
"updated_by": {
"email": "example-string",
"id": "example-string",
"name": "example-string",
"avatar_url": "example-string"
},
"allRecipientsSigned": true,
"archived": true,
"archived_at": "example-string",
"cached_totals": {
"annually": {
"max": 100,
"min": 100
},
"currency": "example-string",
"monthly": {
"max": 100,
"min": 100
},
"once": {
"max": 100,
"min": 100
},
"quarterly": {
"max": 100,
"min": 100
},
"updated_at": "example-string"
},
"completed_at": "example-string",
"crm_linked": {
"provider": "example-string",
"recipient_name": "example-string"
},
"is_starred": true,
"is_template": true,
"last_activity_at": "example-string",
"notes": "example-string",
"proposal_number": "example-string",
"sent_at": "example-string",
"settings": {
"avoid_line_item_page_breaks": true,
"currency": "example-string",
"disable_proposal_access": true,
"email_draft": {
"last_saved": "example-string",
"message": "example-string",
"recipients": "example-string",
"subject": "example-string"
},
"expiring_on": "example-string",
"hide_pdf_download": true,
"hide_unselected_from_recipient": true,
"include_modifications_in_line_item_price": true,
"lock_selections_from_recipient": true,
"notifications": {
"override_account_defaults": true,
"rules": [
{}
]
},
"proposal_continuous_scroll": true,
"recipient": {
"address": "example-string",
"contact": {
"email": "example-string",
"name": "example-string",
"phone": "example-string"
},
"name": "example-string",
"website": "example-string"
},
"signing": {
"acceptance_method": "digital_signatures",
"additional_signers": [
{}
],
"company_signer": "example-string",
"custom_company_signer_email": "example-string",
"custom_company_signer_name": "example-string",
"is_contact_signer": true,
"is_multiple_signers": true,
"override_signature_page_defaults": true,
"recipient_signer": {
"email": "example-string",
"full_name": "example-string"
},
"signature_page_agreement_text": "example-string",
"signature_page_business_label": "example-string",
"signature_page_client_label": "example-string",
"signature_page_company_label": "example-string",
"signature_page_date_label": "example-string",
"signature_page_labels_captured": true,
"use_accept": true
}
},
"status_detail": {
"marked_as_won_method": "manual"
},
"tags": [
"example-string"
]
}
]
}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Create a new proposal for the user's organization. To create from a template, pass `templateId` with a template public ID from `GET /api/proposals?is_template=true`. To create a reusable template instead of a proposal, set `is_template` to true.
null{
"data": {
"id": "example-string"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Retrieve detailed information about a specific proposal including all items and groups. For an importable backup matching More → Export as JSON in the app, use GET /api/proposals/{id}/export instead.
null{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "example-string",
"message": "example-string"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Update proposal details such as name, description, or client information
nullDRAFTSENTPENDINGCANCELLEDON_HOLDWONLOSTEXPIRED{
"created_at": "example-string",
"created_by": {
"email": "example-string",
"id": "example-string",
"name": "example-string",
"avatar_url": "example-string"
},
"id": "example-string",
"name": "example-string",
"status": "DRAFT",
"updated_at": "example-string",
"updated_by": {
"email": "example-string",
"id": "example-string",
"name": "example-string",
"avatar_url": "example-string"
},
"allRecipientsSigned": true,
"archived": true,
"archived_at": "example-string",
"cached_totals": {
"annually": {
"max": 100,
"min": 100
},
"currency": "example-string",
"monthly": {
"max": 100,
"min": 100
},
"once": {
"max": 100,
"min": 100
},
"quarterly": {
"max": 100,
"min": 100
},
"updated_at": "example-string"
},
"completed_at": "example-string",
"crm_linked": {
"provider": "example-string",
"recipient_name": "example-string"
},
"is_starred": true,
"is_template": true,
"last_activity_at": "example-string",
"notes": "example-string",
"proposal_number": "example-string",
"sent_at": "example-string",
"settings": {
"avoid_line_item_page_breaks": true,
"currency": "example-string",
"disable_proposal_access": true,
"email_draft": {
"last_saved": "example-string",
"message": "example-string",
"recipients": "example-string",
"subject": "example-string"
},
"expiring_on": "example-string",
"hide_pdf_download": true,
"hide_unselected_from_recipient": true,
"include_modifications_in_line_item_price": true,
"lock_selections_from_recipient": true,
"notifications": {
"override_account_defaults": true,
"rules": [
{
"emails": [
"example-string"
],
"event": "proposal_sent",
"id": "example-string"
}
]
},
"proposal_continuous_scroll": true,
"recipient": {
"address": "example-string",
"contact": {
"email": "example-string",
"name": "example-string",
"phone": "example-string"
},
"name": "example-string",
"website": "example-string"
},
"signing": {
"acceptance_method": "digital_signatures",
"additional_signers": [
{
"email": "example-string",
"full_name": "example-string",
"id": "example-string",
"role": "example-string"
}
],
"company_signer": "example-string",
"custom_company_signer_email": "example-string",
"custom_company_signer_name": "example-string",
"is_contact_signer": true,
"is_multiple_signers": true,
"override_signature_page_defaults": true,
"recipient_signer": {
"email": "example-string",
"full_name": "example-string"
},
"signature_page_agreement_text": "example-string",
"signature_page_business_label": "example-string",
"signature_page_client_label": "example-string",
"signature_page_company_label": "example-string",
"signature_page_date_label": "example-string",
"signature_page_labels_captured": true,
"use_accept": true
}
},
"status_detail": {
"marked_as_won_method": "manual"
},
"tags": [
"example-string"
]
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Delete a proposal and all its associated items. The proposal will no longer appear in listings.
{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "NOT_FOUND",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Retrieve analytics events for a specific proposal. Requires authentication and membership in the proposal's organization (or platform admin).
proposal_viewedproposal_sentstatus_changedproposal_signedpdf_viewedsignature_request_sent{
"data": [
{
"event_timestamp": "2024-01-20T15:30:00Z",
"event_type": "example-string",
"id": "example-string",
"metadata": {},
"user": {
"email": "example-string",
"full_name": "example-string",
"public_id": "example-string"
}
}
]
}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Archive a proposal by setting its archived_at timestamp. Archived proposals are excluded from default listings and become read-only.
{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": "example-string"
}{
"error": "example-string"
}{
"error": "example-string"
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Archive multiple items (line items, groups) from a proposal
{
"itemIds": [
"example-string"
]
}{
"errors": [
"example-string"
],
"message": "example-string"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Create a complete copy of an existing proposal with all its groups, items, and pages
{
"name": "example-string"
}{
"data": {
"id": "example-string"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Download a proposal or template as the same importable JSON file produced by More → Export as JSON in the app. Save the response body and import it with Create Proposal → Import from JSON — no transformation needed. The response is the export object itself (not wrapped in a data envelope). Non-portable fields such as signature state, payment sessions, and email drafts are stripped, and status is set to DRAFT, matching the in-app export.
{
"name": "example-string",
"pages": [
{}
],
"design": {},
"id": "example-string",
"is_template": true,
"settings": {},
"status": "example-string"
}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "example-string",
"message": "example-string"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Create a brand-new line item, group, or side-by-side directly inside a proposal (not copied from the library). A line item is added to a group (target_group_id, or the first group by default); a group or side-by-side is added under a Scope of Work page (scope_of_work_page_id, or the first one by default). Pass after_item_id / before_item_id to position the new item relative to an existing one — it then inherits that item's parent.
line_itemgroupside_by_sidesinglemultipleloosestandardcomparison{
"name": "example-string",
"type": "line_item",
"after_item_id": "example-string",
"before_item_id": "example-string",
"columns": [
{
"name": "example-string",
"description": "example-string",
"feeType": "fixed",
"frequency": "example-string",
"includedFeatures": [
"example-string"
],
"isSelected": true,
"price": 100
}
],
"description": "example-string",
"features": [
{
"name": "example-string",
"order_key": 100
}
],
"optional": true,
"order_key": 100,
"price": {
"frequency": "once",
"model": "fixed",
"quantity": {
"current": 100,
"max": 100,
"min": 100,
"unitLabel": "example-string"
},
"value": 100
},
"scope_of_work_page_id": "example-string",
"selected": true,
"selection_type": "single",
"style": "standard",
"tags": [
"example-string"
],
"target_group_id": "example-string"
}{
"data": {
"id": "example-string",
"name": "example-string",
"order_key": 100,
"type": "example-string"
},
"success": true
}Copies a saved library item (line item, group, page, or side-by-side) into the specified proposal. The library item and the target proposal must belong to the same organization. The copy is always a deep, autonomous copy — it does not stay linked to or synced with the library source. Library content is never modified by this operation.
line_itemgrouppageside_by_side{
"library_item_id": "example-string",
"type": "line_item",
"after_item_id": "example-string",
"before_item_id": "example-string",
"order_key": 100,
"scope_of_work_page_id": "example-string",
"target_group_id": "example-string"
}{
"data": {
"id": "example-string",
"name": "example-string",
"order_key": 100,
"type": "example-string"
},
"success": true
}Generate a PDF document for the specified proposal. Returns the PDF as a binary download.
{}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Star a proposal for the current user. Starred proposals appear first in listings. This operation is idempotent - starring an already-starred proposal has no effect.
{
"is_starred": true
}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "NOT_FOUND",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Unarchive a proposal by clearing its archived_at timestamp. The proposal will return to active status and become editable again.
{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": "example-string"
}{
"error": "example-string"
}{
"error": "example-string"
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Remove the star from a proposal for the current user. This operation is idempotent - unstarring a proposal that is not starred has no effect.
{
"is_starred": true
}{
"error": {
"code": "UNAUTHORIZED",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "NOT_FOUND",
"message": "example-string",
"details": {}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "example-string",
"details": {}
}
}Summary of a proposal for use in list views
DRAFTSENTPENDINGCANCELLEDON_HOLDWONLOSTEXPIRED{
"created_at": "example-string",
"created_by": {
"email": "example-string",
"id": "example-string",
"name": "example-string",
"avatar_url": "example-string"
},
"id": "example-string",
"name": "example-string",
"status": "DRAFT",
"updated_at": "example-string",
"updated_by": {
"email": "example-string",
"id": "example-string",
"name": "example-string",
"avatar_url": "example-string"
},
"allRecipientsSigned": true,
"archived": true,
"archived_at": "example-string",
"cached_totals": {
"annually": {
"max": 100,
"min": 100
},
"currency": "example-string",
"monthly": {
"max": 100,
"min": 100
},
"once": {
"max": 100,
"min": 100
},
"quarterly": {
"max": 100,
"min": 100
},
"updated_at": "example-string"
},
"completed_at": "example-string",
"crm_linked": {
"provider": "example-string",
"recipient_name": "example-string"
},
"is_starred": true,
"is_template": true,
"last_activity_at": "example-string",
"notes": "example-string",
"proposal_number": "example-string",
"sent_at": "example-string",
"settings": {
"avoid_line_item_page_breaks": true,
"currency": "example-string",
"disable_proposal_access": true,
"email_draft": {
"last_saved": "example-string",
"message": "example-string",
"recipients": "example-string",
"subject": "example-string"
},
"expiring_on": "example-string",
"hide_pdf_download": true,
"hide_unselected_from_recipient": true,
"include_modifications_in_line_item_price": true,
"lock_selections_from_recipient": true,
"notifications": {
"override_account_defaults": true,
"rules": [
{
"emails": [
"example-string"
],
"event": "proposal_sent",
"id": "example-string"
}
]
},
"proposal_continuous_scroll": true,
"recipient": {
"address": "example-string",
"contact": {
"email": "example-string",
"name": "example-string",
"phone": "example-string"
},
"name": "example-string",
"website": "example-string"
},
"signing": {
"acceptance_method": "digital_signatures",
"additional_signers": [
{
"email": "example-string",
"full_name": "example-string",
"id": "example-string",
"role": "example-string"
}
],
"company_signer": "example-string",
"custom_company_signer_email": "example-string",
"custom_company_signer_name": "example-string",
"is_contact_signer": true,
"is_multiple_signers": true,
"override_signature_page_defaults": true,
"recipient_signer": {
"email": "example-string",
"full_name": "example-string"
},
"signature_page_agreement_text": "example-string",
"signature_page_business_label": "example-string",
"signature_page_client_label": "example-string",
"signature_page_company_label": "example-string",
"signature_page_date_label": "example-string",
"signature_page_labels_captured": true,
"use_accept": true
}
},
"status_detail": {
"marked_as_won_method": "manual"
},
"tags": [
"example-string"
]
}A price range with minimum and maximum values
{
"max": 100,
"min": 100
}User profile embedded in proposal responses (used for both created_by and updated_by)
{
"email": "example-string",
"id": "example-string",
"name": "example-string",
"avatar_url": "example-string"
}