API v1
Offorte API Reference Docs - Version 1
Proposals list
Returns a paginated list of proposals by status (edit|open|won|lost|closed).
Searching can be done by using the optional query parameter, the provided status will then be ignored.
Deprecated fields:
total_price, total_price_override.
Responses
Response samples
- 201
[- {
- "account_user_id": 1234,
- "company_id": 1234,
- "company_name": "Example Inc",
- "date_created": "15 jun 2018 (06:49)",
- "id": 1234,
- "name": "Proposal you can't refuse",
- "price_total": "$999.99",
- "price_total_original": 999.99,
- "price_total_override": 999.99,
- "proposal_nr": "nr 000123",
- "status": "open",
- "version_id": 1234
}
]
Proposal details
Returns all proposal details
Deprecated fields:
type, pages_total, language, pricetable-rows: count, userinput_count, userinput_optional, userinput_optional_checked.
Responses
Response samples
- 201
{- "account_user_id": 1234,
- "account_user_name": "Elon Musk",
- "comments": [
- {
- "comment": "Are there no surprises in the costs?",
- "company_name": "Example Inc",
- "date": "15 jun 2018 (06:49)",
- "firstname": "Chuck",
- "id": 1234,
- "lastname": "Norris",
- "type": "client"
}
], - "company": {
- "city": "Breda",
- "coc_number": "12345678",
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "fax": "+31 76 12344567",
- "id": 1234,
- "internet": "www.example.com",
- "linkedin": "linkedin.com/example",
- "name": "Example Inc",
- "phone": "+31 76 12344567",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "vat_number": "NL123455678",
- "zipcode": "4800AA"
}, - "content": {
- "pricetables": [
- {
- "id": "pricetable1",
- "rows": [
- {
- "content": "<p>Product Awesome</p>",
- "discount_type": "amount",
- "discount_value": 10,
- "id": 1234,
- "price": 100,
- "product_id": 990,
- "quantity": 3,
- "recurring_include_in_totals": true,
- "recurring_type": "month",
- "selectable": "check",
- "sku": "2452345",
- "subtotal": 300,
- "type": "price",
- "unique_id": "identifier-1234",
- "user_quantity": true,
- "user_selected": true,
- "vat_percentage": 21
}
], - "settings": {
- "rows_include_vat": false,
- "vat_default_percentage": 21,
- "vat_hidden": false
}, - "subtotal": 1000,
- "total": 100,
- "vat": [
- {
- "group_name": "Vat21",
- "percentage": 21,
- "total": 100
}
]
}
]
}, - "date_modified": "15 jun 2018 (06:49)",
- "design_template_id": 1234,
- "emails": [
- {
- "date_sended": "15 jun 2018 (06:49)",
- "id": 1234,
- "message": "Dear {company_people_firstname}, hereby you receive our proposal for ...",
- "proposal_version_nr": 1234,
- "sended_by": "Johnny Vegas"
}
], - "id": 1234,
- "logs": {
- "history": [
- {
- "action": "proposal: viewed pdf",
- "date": "15 jun 2018 (06:49)",
- "person": "Chuck Norris",
- "type": "client"
}
], - "summary": {
- "last_modified_date": "15 jun 2018 (06:49)",
- "last_modified_user": "2020-06-15 18:05:59",
- "pdf": 0,
- "recent_view": "15 jun 2018 (06:49)",
- "views": 2
}
}, - "name": "Proposal you can't refuse",
- "price_total": "$999.99",
- "price_total_original": 999.99,
- "price_total_override": 999.99,
- "proposal_language": "en",
- "proposal_nr": "nr 000123",
- "receivers": [
- {
- "fullname": "Chuck Norris",
- "id": 1234,
- "signature_allowed": 1,
- "signature_required": 1
}
], - "remarks": "Make some modifications as requested by Vegan Seagal",
- "status": "won",
- "text_template_id": 1234
}
Create proposal
Create a new proposal.
Parameters
name | type | description |
---|---|---|
account_user_id | integer | The proposal is assigned to this user and will be send out in name of this user |
company_contacts | array | List with company contact id's who are going to receive the proposal; Make sure they got an email filled in |
company_id | integer | The proposal is assigned to this company |
design_template_id | integer | Design template id |
name | string | Name of the proposal |
price_total | float | Proposal value as calculated by pricetables |
status | string | Proposal status. Possible values: edit, open, won, lost, closed |
text_template_id | integer | Text template id |
content | object | Content for the proposal (see below) |
Content: Pricetables
Optionally you have the option to add rows to pricetables. Make sure you updated the 'Unique ID' field through the pricetable settings in your proposal template. Then you can target this pricetable to add rows to.
Fields per row type:
type | fields |
---|---|
price | type, content, quantity, price, vat_percentage, selectable (false, check, radio), user_selected, user_quantity, discount_type (false, percentage, amount), discount_value, recurring_type (false, month, year), recurring_include_in_totals, hide_price, hide_quantity, unique_id, product_id, sku |
discount | type, content, discount_type (percentage, amount), discount_value |
subtotal | type, content |
title | type, content |
Deprecated fields:
row-type-price: count, userinput_optional, userinput_optional_checked, userinput_count; row-type-discount: discount
Request Body schema: application/json
account_user_id | number |
automations_set_id | number |
company_contacts | Array of numbers |
company_id | number |
object | |
design_template_id | number |
name | string |
proposal_template_id | number |
text_template_id | number |
Responses
Request samples
- Payload
{- "account_user_id": 1234,
- "automations_set_id": 1234,
- "company_contacts": [
- 1
], - "company_id": 1234,
- "content": {
- "pricetables": [
- {
- "id": "pricetable1",
- "rows": [
- {
- "content": "<p>Product Awesome</p>",
- "discount_type": "amount",
- "discount_value": 10,
- "hide_price": true,
- "hide_quantity": true,
- "price": 100,
- "product_id": 990,
- "quantity": 3,
- "recurring_include_in_totals": true,
- "recurring_type": "month",
- "selectable": "check",
- "sku": "2452345",
- "type": "price",
- "unique_id": "identifier-1234",
- "user_quantity": true,
- "user_selected": true,
- "vat_percentage": 21
}
]
}
]
}, - "design_template_id": 1234,
- "name": "Proposal you can't refuse",
- "proposal_template_id": 1234,
- "text_template_id": 1234
}
Response samples
- 201
{- "id": 1234,
- "version_id": 1234
}
Send proposal
Send a proposal
Parameters
name | type | description |
---|---|---|
password_reset | boolean | Optional: Reset the existing passwords when proposal was send before |
send_method | string | Optional: Choose if you want to send it through Offorte or send the proposal your self. Defaults to 'offorte'. Possible values: offorte,self |
send_message | string | The actual message you want to send in plain text. If not provided you must provide the 'send_message_id' |
send_message_id | integer | The id of the email template you want to use as the accompanying message |
Request Body schema: application/json
send_message_id | number |
Responses
Request samples
- Payload
{- "send_message_id": 1234
}
Response samples
- 201
{- "receivers": [
- {
- "fullname": "Ainsley Shepherd",
- "id": 1234,
}, - {
- "fullname": "Adam Foreman",
- "id": 5678,
}
]
}
Update proposal
Updates the proposal details with the provided attributes. Other (unprovided) attributes remain unchanged
Parameters details
name | type | description |
---|---|---|
account_user_id | integer | The proposal is assigned to this user and will be send out in name of this user |
company_contacts | array | List with company contact id's who are going to receive the proposal; Make sure they got an email filled in |
company_id | integer | The proposal is assigned to this company |
design_template_id | integer | Design template id |
name | string | Name of the proposal |
price_total | float | Proposal value as calculated by pricetables |
status | string | Proposal status. Possible values: edit, open, won, lost, closed |
text_template_id | integer | Text template id |
Request Body schema: application/json
account_user_id | number |
company_contacts | Array of numbers |
company_id | number |
design_template_id | number |
name | string |
price_total | number |
status | string |
text_template_id | number |
Responses
Request samples
- Payload
{- "account_user_id": 1234,
- "company_contacts": [
- 1
], - "company_id": 1234,
- "design_template_id": 1234,
- "name": "Proposal you can't refuse",
- "price_total": 999.99,
- "status": "won",
- "text_template_id": 1234
}
Response samples
- 200
{- "status": "200 OK"
}
Favorite templates list
Returns a list of proposal favorites (templates).
Deprecated fields:
type,config_language_id,proposal_tpl_id
Responses
Response samples
- 200
[- {
- "automations_set_id": 1234,
- "config_language_id": 1234,
- "design_template_id": 1234,
- "id": 1234,
- "name": "My favorite proposal",
- "proposal_tpl_id": 1234,
- "text_template_id": 1234,
- "type": "magazine"
}
]
Companies list
Returns a paginated list of companies.
Searching on name can be done by using the optional query
 parameter
Responses
Response samples
- 200
[- {
- "city": "Breda",
- "coc_number": "12345678",
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "fax": "+31 76 12344567",
- "id": 1234,
- "internet": "www.example.com",
- "linkedin": "linkedin.com/example",
- "name": "Example Inc",
- "people": [
- {
- "city": "Breda",
- "company_id": 1234,
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "firstname": "Chuck",
- "fullname": "Chuck Norris",
- "id": 1234,
- "internet": "www.example.com",
- "lastname": "Norris",
- "linkedin": "linkedin.com/example",
- "mobile": "+31 76 12344567",
- "phone": "+31 76 12344567",
- "salutation": "Mr",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "zipcode": "4800AA"
}
], - "phone": "+31 76 12344567",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "vat_number": "NL123455678",
- "zipcode": "4800AA"
}
]
Create company
Creates a new company
Request Body schema: application/json
city | string |
coc_number | string |
country | string |
string | |
string | |
fax | string |
internet | string |
string | |
name | string |
phone | string |
state | string |
street | string |
string | |
vat_number | string |
zipcode | string |
Responses
Request samples
- Payload
{- "city": "Breda",
- "coc_number": "12345678",
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "fax": "+31 76 12344567",
- "internet": "www.example.com",
- "linkedin": "linkedin.com/example",
- "name": "Example Inc",
- "phone": "+31 76 12344567",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "vat_number": "NL123455678",
- "zipcode": "4800AA"
}
Response samples
- 201
{- "city": "Breda",
- "coc_number": 12345678,
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "fax": "+31 76 12344567",
- "id": 1234,
- "internet": "www.example.com",
- "linkedin": "linkedin.com/example",
- "name": "Example Inc",
- "people": [ ],
- "phone": "+31 76 12344567",
- "proposals": [ ],
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "vat_number": "NL123455678",
- "zipcode": "4800AA"
}
Company details
Returns all company details
Deprecated fields:
proposal_status, proposal_name, account_company_user_id.
Responses
Response samples
- 200
{- "city": "Breda",
- "coc_number": "12345678",
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "fax": "+31 76 12344567",
- "id": 1234,
- "internet": "www.example.com",
- "linkedin": "linkedin.com/example",
- "name": "Example Inc",
- "people": [
- {
- "city": "Breda",
- "company_id": 1234,
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "firstname": "Chuck",
- "fullname": "Chuck Norris",
- "id": 1234,
- "internet": "www.example.com",
- "lastname": "Norris",
- "linkedin": "linkedin.com/example",
- "mobile": "+31 76 12344567",
- "phone": "+31 76 12344567",
- "salutation": "Mr",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "zipcode": "4800AA"
}
], - "phone": "+31 76 12344567",
- "proposals": [
- {
- "account_user_id": null,
- "company_id": 1234,
- "company_name": "Example Inc",
- "date_created": "15 jun 2018 (06:49)",
- "id": 1234,
- "name": "Proposal you can't refuse",
- "price_total": "$999.99",
- "proposal_nr": "nr 000123",
- "status": "won",
- "version_id": 1234
}
], - "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "vat_number": "NL123455678",
- "zipcode": "4800AA"
}
Update company
Updates the company details with the provided attributes. Other (unprovided) attributes remain unchanged
Request Body schema: application/json
city | string |
coc_number | string |
country | string |
string | |
string | |
fax | string |
internet | string |
string | |
name | string |
phone | string |
state | string |
street | string |
string | |
vat_number | string |
zipcode | string |
Responses
Request samples
- Payload
{- "city": "Breda",
- "coc_number": "12345678",
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "fax": "+31 76 12344567",
- "internet": "www.example.com",
- "linkedin": "linkedin.com/example",
- "name": "Example Inc",
- "phone": "+31 76 12344567",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "vat_number": "NL123455678",
- "zipcode": "4800AA"
}
Response samples
- 200
{- "status": "200 OK"
}
Response samples
- 200
[- {
- "city": "Breda",
- "company_id": 1234,
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "firstname": "Chuck",
- "fullname": "Chuck Norris",
- "id": 1234,
- "internet": "www.example.com",
- "lastname": "Norris",
- "linkedin": "linkedin.com/example",
- "mobile": "+31 76 12344567",
- "phone": "+31 76 12344567",
- "salutation": "Mr",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "zipcode": "4800AA"
}
]
Create company person
Creates a new person in a company.
Parameters details
name | type | description |
---|---|---|
string | required | |
fullname | string | required |
Request Body schema: application/json
city | string |
country | string |
string | |
string | |
firstname | string |
fullname | string |
internet | string |
lastname | string |
string | |
mobile | string |
phone | string |
salutation | string |
state | string |
street | string |
string | |
zipcode | string |
Responses
Request samples
- Payload
{- "city": "Breda",
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "firstname": "Chuck",
- "fullname": "Chuck Norris",
- "internet": "www.example.com",
- "lastname": "Norris",
- "linkedin": "linkedin.com/example",
- "mobile": "+31 76 12344567",
- "phone": "+31 76 12344567",
- "salutation": "Mr",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "zipcode": "4800AA"
}
Response samples
- 201
{- "city": "Breda",
- "company_id": 1234,
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "firstname": "Chuck",
- "fullname": "Chuck Norris",
- "id": 1234,
- "internet": "www.example.com",
- "lastname": "Norris",
- "linkedin": "linkedin.com/example",
- "mobile": "+31 76 12344567",
- "phone": "+31 76 12344567",
- "salutation": "Mr",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "zipcode": "4800AA"
}
Response samples
- 200
{- "city": "Breda",
- "company_id": 1234,
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "firstname": "Chuck",
- "fullname": "Chuck Norris",
- "id": 1234,
- "internet": "www.example.com",
- "lastname": "Norris",
- "linkedin": "linkedin.com/example",
- "mobile": "+31 76 12344567",
- "phone": "+31 76 12344567",
- "salutation": "Mr",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "zipcode": "4800AA"
}
Update company person
Updates the person details with the provided attributes. Other (unprovided) attributes remain unchanged
Request Body schema: application/json
city | string |
country | string |
string | |
string | |
firstname | string |
fullname | string |
internet | string |
lastname | string |
string | |
mobile | string |
phone | string |
salutation | string |
state | string |
street | string |
string | |
zipcode | string |
Responses
Request samples
- Payload
{- "city": "Breda",
- "country": "the Netherlands",
- "facebook": "facebook.com/example",
- "firstname": "Chuck",
- "fullname": "Chuck Norris",
- "internet": "www.example.com",
- "lastname": "Norris",
- "linkedin": "linkedin.com/example",
- "mobile": "+31 76 12344567",
- "phone": "+31 76 12344567",
- "salutation": "Mr",
- "state": "Noord-Brabant",
- "street": "Ginnekenweg 1",
- "twitter": "twitter.com/example",
- "zipcode": "4800AA"
}
Response samples
- 200
{- "status": "200 OK"
}
Response samples
- 200
[- {
- "descr_short": "This is a description",
- "id": 1234,
- "name": "Example Inc",
- "price": "1000",
- "recurring": "month",
- "selectable": "check",
- "sku": "abc12345678",
- "vat_id": 1234,
- "vat_percentage": 21
}
]
Create product
Creates a new product.
Parameters details
name | type | description |
---|---|---|
selectable | string | Row is optional to choose by the customer. Check is multiple choice, Radio is single choice. Types: check, radio, false |
recurring | string | Row is recurring and from type: month, year |
_Deprecated fields:_optional.
Request Body schema: application/json
descr_short | string |
name | string |
price | number |
recurring | string |
selectable | string |
sku | number |
vat_id | number |
Responses
Request samples
- Payload
{- "descr_short": "Hello here is my descr",
- "name": "API some new product",
- "price": 3000,
- "recurring": "month",
- "selectable": "radio",
- "sku": 1234,
- "vat_id": 7
}
Response samples
- 200
{- "product_id": 1234
}
Update product
Updates the product with the provided attributes.
Parameters details
name | type | description |
---|---|---|
selectable | string | Row is optional to choose by the customer. Check is multiple choice, Radio is single choice. Types: check, radio, false |
recurring | string | Row is recurring and from type: month, year |
_Deprecated fields:_optional.
Request Body schema: application/json
descr_short | string |
directory_id | number |
name | string |
price | string |
recurring | string |
selectable | string |
sku | string |
vat_id | number |
Responses
Request samples
- Payload
{- "descr_short": "This is a description",
- "directory_id": 1,
- "name": "Example Inc",
- "price": "1000",
- "recurring": "month",
- "selectable": "check",
- "sku": "abc12345678",
- "vat_id": 1
}
Response samples
- 200
true
Response samples
- 200
[- {
- "date_lastlogin": "2020-06-15 18:05:59",
- "firstname": "Chuck",
- "id": 1234,
- "jobtitle": "CEO",
- "lastname": "Norris",
- "phone": "+31 76 12344567"
}
]
Response samples
- 200
[- {
- "active": true,
- "api_version": 1,
- "date_created": "2025-06-15 18:05:59",
- "date_failed": "2025-06-15 18:05:59",
- "date_modified": "2025-06-15 18:05:59",
- "events": [
- "company_created"
], - "id": 1234,
- "payload_content_type": "json",
}
]
Create webhook
Creates a new webhook
Parameters
name | type | desscription |
---|---|---|
payload_url | string | Url where the data will be posted to; must be a full https url |
payload_content_type | string | Content type header: json |
active | boolean | Is it active or not |
events | array | Events to subscribe to |
Request Body schema: application/json
active | boolean |
events | Array of strings |
payload_content_type | string |
payload_url | string |
Responses
Request samples
- Payload
{- "active": true,
- "events": [
- "company_created",
- "company_updated",
- "company_deleted",
- "company_contact_created",
- "company_contact_updated",
- "company_contact_deleted",
- "proposal_created",
- "proposal_details_updated",
- "proposal_deleted",
- "proposal_send",
- "proposal_won",
- "proposal_lost",
- "proposal_viewed",
- "proposal_comment_received",
- "product_directory_created",
- "product_directory_updated",
- "product_directory_deleted",
- "product_created",
- "product_updated",
- "product_deleted"
], - "payload_content_type": "json",
}
Response samples
- 201
{- "webhook_id": 1
}
Response samples
- 200
{- "active": true,
- "api_version": 1,
- "date_created": "2025-06-15 18:05:59",
- "date_failed": "2025-06-15 18:05:59",
- "date_modified": "2025-06-15 18:05:59",
- "events": [
- "company_created"
], - "id": 1,
- "payload_content_type": "json",
}
Update webhook
Updates the webhook details with the provided attributes. Other (unprovided) attributes remain unchanged
Parameters
name | type | desscription |
---|---|---|
payload_url | string | Url where the data will be posted to; must be a full https url |
payload_content_type | string | Content type header: json |
active | boolean | Is it active or not |
events | array | Events to subscribe to |
Request Body schema: application/json
active | boolean |
events | Array of strings |
payload_content_type | string |
payload_url | string |
Responses
Request samples
- Payload
{- "active": true,
- "events": [
- "company_created"
], - "payload_content_type": "xform",
}
Response samples
- 200
{- "status": "200 OK"
}