Why use the Savio API?
You can use the Savio API to:
- Send feedback to Savio programmatically.
- Connect Savio with integration services like Zapier.
- Sync customer data from system Savio doesn't integrate with so you can easily assign and filter feedback.
Copy API Reference for AI
Copy and paste the text below into ChatGPT, Claude, or another AI assistant to give it full context about the Savio API.
Authentication
The Savio API uses token based authentication. You can find your API token on your API Settings page.
When using the API as a webhook target in Zapier or similar service you need to include your API Token as an HTTP header:
| HTTP Header | Value |
|---|---|
Authorization |
Token YOUR_TOKEN_VALUE |
Note that the value of the Authorization header must include the word Token followed by a space and then your API token.
Roles
Each call checks your role in Savio, and needs the same role Savio needs for that action:
- Read feedback, feature requests, tags, contacts and companies: Owner, Admin, Manager, Contributor, or Viewer.
- Log feedback: Owner, Admin, Manager, or Contributor. Naming a different company for a contact that already exists moves the contact, which needs Owner, Admin, or Manager.
- Update or delete feedback, and add or update contacts and companies: Owner, Admin, or Manager.
Calls from other roles get a 403 that says why. If your role changes, your token follows the new role on its next call.
API Reference
Feedback
Feedback can be created, listed, retrieved, updated, and deleted.
Create Feedback
Feedback can be created via a POST to https://www.savio.io/app/api/create-feedback/.
HTTP Response Codes
| Result | Response Code | Value |
|---|---|---|
| Success | 201 | {"id": id_of_new_feedback} |
| Failed to authenticate | 401 | |
| Failed to create feedback | 400 |
Parameters
| Parameter | Required | Description |
|---|---|---|
| problem | Yes | The text describing the problem the user is having. |
| feedback_type | No |
The type of customer that provided the feedback. Valid values are:
|
| state | No Defaults to ACTIVE |
The triage state of this piece of feedback. Valid values are:
|
| source_url | No | An optional URL that links back to the original source of the feedback. |
| source_username | No | Username of the person who logged the feedback in the source tool, or an empty string. |
| person_email | No | The email address of the person the feedback came from. If there is an existing person with that email address the feedback will be linked to that person. If there isn't an existing person with that email address a new person will be created. |
| person_name | No | The full name of the person the feedback came from. If there isn't a person with that a new person will be created. |
| company_name | No | The name of the company the person is associated with. If there is an existing company with that name the person will be linked to that company. If there isn't an existing company with that name a new company will be created. If person_name or person_email isn't included company_name will be ignored. |
| feature_request_title | No | The title of the feature request to link the new piece of feedback to. If a feature request with that title already exists the existing feature request will be used. Otherwise a new feature request will be created. |
| tags | No | A list of strings that are the titles of the tags you link to the new piece of feedback. If the tags don't exist they will be created. |
Example
curl https://www.savio.io/app/api/create-feedback/ \
-X POST \
-H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' -d '
{
"problem": "You need a Zapier integration so I can wire up Google Forms.",
"feedback_type": "ACTIVE",
"person_email": "bob@example.com",
"state": "ACTIVE",
"feature_request_title": "Feedback API",
"tags": ["red", "green"]
}'
Feedback model
| Attribute | Type | Description |
|---|---|---|
| id | integer | The unique identifier for the Feedback. |
| problem | string | The feedback text. |
| feature_request | integer | The ID of the linked Feature Request, or null. |
| feedback_type | string | The feedback type slug (if enabled on account). |
| feedback_type_display | string | The human-readable feedback type label. |
| user | integer | The ID of the associated Contact, or null. |
| company | integer | The Savio Company ID of the Feedback's company (always its Contact's company), or null. |
| company_name | string | The name of the Feedback's company, or null. |
| created_by_name | string | Name of the person who logged the Feedback (from the source tool username if available, otherwise the Savio team member name), or empty string. |
| created_by_email | string | Email of the team member who logged the Feedback, or empty string if logged via integration. |
| source_tool | string | Where the Feedback was logged from (e.g. API, Chrome Extension, Intercom, Slack, etc). |
| source_url | string | URL where the Feedback originated, or empty string. |
| source_username | string | Username of the person who logged the Feedback in the source tool, or empty string. |
| created | string | ISO 8601 timestamp when the Feedback was created. |
| updated | string | ISO 8601 timestamp when the Feedback was last updated. |
| notified_at | string | ISO 8601 timestamp when the Contact was notified, or null. |
| state | string | Triage state: ACTIVE, PENDING, or ARCHIVED. |
| product | string | Product slug (if enabled on account). |
| product_area | string | Product area slug (if enabled on account). |
| importance | string | Importance slug (if enabled on account). |
Expanded shapes
When using the expand parameter, related objects are returned inline instead of as IDs.
Expanded user object:
| Attribute | Type | Description |
|---|---|---|
| id | integer | The Contact's Savio ID. |
| string | The Contact's email. | |
| internal_id | string | Your system's ID for this Contact. |
| name | string | The Contact's name. |
| company | integer | The Savio Company ID. |
| company_internal_id | string | Your system's Company ID. |
| company_name | string | The Company name. |
| filterable_attributes | object | Custom attributes for this Contact. Account attributes are configured in Attribute Settings. |
Expanded feature_request object:
| Attribute | Type | Description |
|---|---|---|
| id | integer | The Feature Request ID. |
| title | string | The Feature Request title. |
| description | string | The Feature Request description. |
| state | string | Status value (e.g. PLANNED, SHIPPED). |
| state_display | string | Human-readable status label. |
| priority | string | Priority value. |
| priority_display | string | Human-readable priority label. |
| effort | string | Effort value. |
| effort_display | string | Human-readable effort label. |
| product | string | Product slug. |
| product_area | string | Product area slug. |
| shipped_at | string | Date shipped, or null. |
List Feedback
You can get a paged list of Feedback by issuing a GET to https://www.savio.io/app/api/feedback/.
Response
Returns a paginated list of Feedback objects.
| Attribute | Type | Description |
|---|---|---|
| count | integer | The total number of results available. |
| next | url | A url to the next page of results or null. |
| previous | url | A url to the previous page of results or null. |
| results | list | A list of Feedback objects. |
| _meta | object | When expand is used, includes attribute schema metadata. Contains attributes: a list of attribute definitions with:
|
When expand is used, each Feedback result also includes:
| Attribute | Type | Description |
|---|---|---|
| company_attributes | object | The company's custom attributes (e.g. MRR, plan). Empty object if no company or no attributes. Account attributes are configured in Attribute Settings. |
| opportunity_attributes | object | The opportunity's custom attributes (e.g. deal stage, amount). Empty object if no opportunity or no attributes. Account attributes are configured in Attribute Settings. |
HTTP Response Codes
| Result | Response Code |
|---|---|
| Success | 200 |
| Failed to authenticate | 401 |
Parameters
| Parameter | Required | Description |
|---|---|---|
| search | No | Filters Feedback by feedback text or company name. |
| state | No |
Filters Feedback by triage state.
|
| product | No | Filter by product slug. |
| product_area | No | Filter by product area slug. |
| ordering | No |
Order the results by the specified field. Prefix with - for descending.
|
| expand | No |
Expand related objects inline instead of returning IDs. Comma-separated list of fields to expand.
?expand=user,feature_request
|
Example
curl 'https://www.savio.io/app/api/feedback/?state=ACTIVE&ordering=-updated' \ -X GET \ -H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json'
With expanded objects:
curl 'https://www.savio.io/app/api/feedback/?expand=user,feature_request' \ -X GET \ -H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json'
Get Feedback
You can get a single Feedback item by issuing a GET to https://www.savio.io/app/api/feedback/{id}/.
Supports the expand parameter (same as List Feedback). Add ?include_meta=1 to include _meta.attributes in the response (attribute schema metadata). Works with or without expand.
HTTP Response Codes
| Result | Response Code |
|---|---|
| Success | 200 |
| Failed to authenticate | 401 |
| Not found | 404 |
Example
curl 'https://www.savio.io/app/api/feedback/123/?expand=user,feature_request' \ -X GET \ -H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json'
Update Feedback
You can update a Feedback item by issuing a PATCH to https://www.savio.io/app/api/feedback/{id}/. Only the fields you send change. The response is the full Feedback object, the same as Get Feedback.
Parameters
| Parameter | Type | Description |
|---|---|---|
| problem | string | The feedback text. |
| feature_request | integer | The ID of a Feature Request to link. |
| user | integer | The ID of a Contact. The Feedback's company becomes the Contact's company. |
| company | integer | A Savio Company ID. Moves the Feedback to that company (see the rules below). |
| company_internal_id | string | Your system's Company ID. Works the same way as company. |
| state | string | Triage state: ACTIVE, PENDING, or ARCHIVED. |
| feedback_type | string | The feedback type slug (if enabled on account). |
| product | string | Product slug (if enabled on account). |
| product_area | string | Product area slug (if enabled on account). |
| importance | string | Importance slug (if enabled on account). |
A Feedback's company is always its Contact's company. When you send a company:
- With a
user: the Contact must work at that company. If not, you get a 400 and nothing is saved. - Without a
user: the Feedback moves to that company with no specific person, unless its Contact already works there (then nothing changes). The Contact's other Feedback stays where it is. companyandcompany_internal_idmust name a company in your workspace. A null or empty value counts as not sent.- Update Feedback never moves the Contact to another Company. To move a Contact, and all of their Feedback, to another Company, use Upsert Contact.
Examples: moving Feedback to the right company
- Feedback 123 was logged from Dana (Contact 456).
- Dana works at Northwind: Savio Company ID 501, your Company ID
CRM-NORTHWIND. - The Feedback really came from Acme: Savio Company ID 502, your Company ID
CRM-ACME. Sam (Contact 789) works there.
| PATCH /feedback/123/ with | What happens |
|---|---|
{"company": 502} |
Feedback 123 moves to Acme (company 502), with no specific person. Dana (contact 456) still works at Northwind (company 501), and her other Feedback stays at Northwind. |
{"company_internal_id": "CRM-ACME"} |
Feedback 123 moves to Acme (company internal id CRM-ACME), with no specific person. Dana (contact 456) still works at Northwind (company internal id CRM-NORTHWIND), and her other Feedback stays at Northwind. |
{"user": 789, "company": 502} |
Feedback 123 moves to Sam (contact 789) at Acme (company 502). |
{"user": 456, "company": 502} |
400: "Contact 456 belongs to Northwind (501), not Acme (502). Send either user or company, or a contact at Acme (502)." Nothing is saved. Dana (contact 456) works at Northwind (company 501), so she can't be the Contact on Feedback 123 at Acme (company 502). |
{"company": 501} |
Nothing changes. Dana (contact 456) already works at Northwind (company 501). |
{"company": "", "problem": "Fixed a typo"} |
The empty company is ignored. Only the problem text of Feedback 123 changes. |
HTTP Response Codes
| Result | Response Code |
|---|---|
| Success | 200 |
| Invalid request | 400 |
| Failed to authenticate | 401 |
| Your role can't update Feedback | 403 |
| Not found | 404 |
Example
curl https://www.savio.io/app/api/feedback/123/ \
-X PATCH \
-H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' -d '
{
"company_internal_id": "CRM-ACME"
}'
Delete Feedback
You can delete a Feedback item by issuing a DELETE to https://www.savio.io/app/api/feedback/{id}/. Only Owners, Admins and Managers can delete Feedback.
Delete is permanent and can't be undone: Savio can't recover the feedback or its highlights. It's the same as deleting in Savio. It removes the feedback's highlights, and feature request counts update.
HTTP Response Codes
| Result | Response Code |
|---|---|
| Success (no body) | 204 |
| Failed to authenticate | 401 |
| Your role can't delete Feedback | 403 |
| Not found | 404 |
Example
curl https://www.savio.io/app/api/feedback/123/ \ -X DELETE \ -H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN'
Feature Requests
Feature Requests can be listed and retrieved individually. The fields returned are driven by the columns you have configured on your Feature Request list.
Feature Request model
Every Feature Request always includes the following fields:
| Attribute | Type | Description |
|---|---|---|
| id | integer | The unique identifier for the Feature Request. |
| title | string | The Feature Request title. |
| description | string | The Feature Request description. |
| tags | list | A list of tag objects, each with id and title. |
| roadmaps | list | A list of roadmap placements, each with roadmap (name) and column (name). |
| shipped_at | string | The date the Feature Request was marked as shipped, or null. |
If Product or Product Area is enabled on your account, the following fields are also always included:
| Attribute | Type | Description |
|---|---|---|
| product / product_display | string | The product value and its human-readable label. Included if your plan supports Products and the feature is enabled. |
| product_area / product_area_display | string | The product area value and its human-readable label. Included if your plan supports Product Areas and the feature is enabled. |
Additionally, the response includes dynamic fields based on the columns displayed on your Feature Request list. These may include:
| Attribute | Type | Description |
|---|---|---|
| state / state_display | string | The status value and its human-readable label. |
| priority / priority_display | string | The priority value and its human-readable label. |
| effort / effort_display | string | The effort value and its human-readable label. |
| Requests, Feedback, Companies, Votes | integer | Count columns, if configured. The field name matches the column display name. |
| is_public | boolean | Whether the Feature Request is displayed on voting boards. |
| created / updated | string | Timestamps, if configured as columns. |
| Custom attributes | number | Any numeric filterable attribute columns (e.g. MRR). The field name matches the column display name. |
List Feature Requests
You can get a paged list of Feature Requests by issuing a GET to https://www.savio.io/app/api/feature-requests/.
Response
Returns a paginated list of Feature Request objects.
| Attribute | Type | Description |
|---|---|---|
| next | url | A url to the next page of results or null. |
| previous | url | A url to the previous page of results or null. |
| results | list | A list of Feature Request objects. |
| _meta | object | Column schema metadata. Contains columns: a list of column definitions with:
|
HTTP Response Codes
| Result | Response Code |
|---|---|
| Success | 200 |
| Failed to authenticate | 401 |
Parameters
| Parameter | Required | Description |
|---|---|---|
| search | No | Filters Feature Requests by title. |
| state | No |
Filters Feature Requests by status. Default values (may vary by account):
|
| ordering | No |
Order the results by the specified field. Prefix the field name with - to sort descending.
Allowed values are:
|
| product | No |
Filter by product slug (exact match). Requires the Product feature to be enabled; ignored otherwise.
Values may vary by account. |
| product_area | No |
Filter by product area slug (exact match). Requires the Product Area feature to be enabled; ignored otherwise.
Values may vary by account. |
| tag | No | Filter by tag title (exact match). Values may vary by account. |
| roadmap | No | Filter by roadmap title (exact match). Values may vary by account. |
Note: The product and product_area filters require the respective feature to be enabled on your account. If the feature is not available on your plan, these filters are silently ignored.
Example
curl 'https://www.savio.io/app/api/feature-requests/?state=PLANNED&ordering=-updated' \ -X GET \ -H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json'
Get Feature Request
You can get a single Feature Request by issuing a GET to https://www.savio.io/app/api/feature-requests/{id}/.
Add ?include_meta=1 to include _meta.columns in the response (column schema metadata).
Response
Returns a single Feature Request object.
HTTP Response Codes
| Result | Response Code |
|---|---|
| Success | 200 |
| Failed to authenticate | 401 |
| Not found | 404 |
Example
curl 'https://www.savio.io/app/api/feature-requests/123/' \ -X GET \ -H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json'
Contacts
Contacts can be listed, created and updated.
Contact model
| Attribute | Type | Description |
|---|---|---|
| id | integer | The unique identifier for the Contact which is given by Savio. |
| string | The Contact's email. | |
| name | string | The Contact's name. |
| company | integer | The unique identifier for the associated Company which is given by Savio. |
| company_name | string | The name of the associated company. |
| filterable_attributes | Object | The user supplied attributes which are set for this Contact. Account attributes are configured in Attribute Settings. |
| created | String | The date the Contact was created in Savio. |
| updated | String | The date the Contact was created in Savio |
List Contacts
You can get a paged list of Contacts by issuing a GET to https://www.savio.io/app/api/users/.
Response
Returns a paginated list of Contact Objects.
| Attribute | Type | Description |
|---|---|---|
| count | integer | The total number of results available. |
| next | url | A url to the next page or results or null. |
| previous | url | A url to the previous page of results or null. |
| results | list | A list of Contact objects. |
HTTP Response Codes
| Result | Response Code | Value |
|---|---|---|
| Success | 201 | |
| Failed to authenticate | 401 |
Parameters
| Parameter | Required | Description |
|---|---|---|
| search | No | Filters list of Contacts by email or name |
| ordering | No |
Order the results by the specified field. Prefix the field name with - to sort descending.
Allowed values are:
|
Example
curl 'https://www.savio.io/app/api/users/?search=example.com&ordering=-updated' \ -X GET \ -H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json'
Upsert Contact
You can create or update a Contact by issuing a POST to https://www.savio.io/app/api/users/.
If a contact with that email address or internal_id already exists in Savio the contact will be updated.
Response
Returns the newly created Contact.
| Attribute | Type | Required | Description |
|---|---|---|---|
| string | No | The Contact's email. | |
| internal_id | string | Yes | The id for the Contact in your system. |
| name | string | Yes | The Contact's full name. |
| company | integer | No | The id of the Company assocated with this contact in Savio. |
| company_internal_id | string | No | The id of the Company associated with this contact in your system. |
| filterable_attributes | object | No | The contact supplied attributes which are set for this Contact. Account attributes are configured in Attribute Settings. |
HTTP Response Codes
| Result | Response Code | Value |
|---|---|---|
| Success | 201 | |
| Failed to authenticate | 401 |
Example
curl https://www.savio.io/app/api/users/ \
-X POST \
-H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' -d '
{
"name": "New Contact",
"email": "new.contact@example.com",
"internal_id": "1234567",
"company_internal_id": "6",
"filterable_attributes": {
"region": "na"
}
}'
Companies
Companies can be listed, created and updated.
Company model
| Attribute | Type | Description |
|---|---|---|
| id | integer | The unique identifier for the Company which is given by Savio. |
| name | string | The Company's name. |
| internal_id | string | The id of the Company in your system. |
| filterable_attributes | Object | The user supplied attributes which are set for this Company. Account attributes are configured in Attribute Settings. |
| created | String | The date the Company was created in Savio. |
| updated | String | The date the Company was created in Savio |
List Companies
You can get a paged list of Companies by issuing a GET to https://www.savio.io/app/api/companies/.
Response
Returns a paginated list of Company Objects.
| Attribute | Type | Description |
|---|---|---|
| count | integer | The total number of results available. |
| next | url | A url to the next page or results or null. |
| previous | url | A url to the previous page of results or null. |
| results | list | A list of Company objects. |
HTTP Response Codes
| Result | Response Code | Value |
|---|---|---|
| Success | 201 | |
| Failed to authenticate | 401 |
Parameters
| Parameter | Required | Description |
|---|---|---|
| search | No | Filters list of Companies by name |
| ordering | No |
Order the results by the specified field. Prefix the field name with - to sort descending.
Allowed values are:
|
Example
curl 'https://www.savio.io/app/api/companies/?search=acme&ordering=-updated' \ -X GET \ -H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json'
Upsert Company
You can create or update a Company by issuing a POST to https://www.savio.io/app/api/companies/.
If a company with that internal_id already exists in Savio the Company will be updated.
Response
Returns the newly created Company.
| Attribute | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | The Company's name. |
| internal_id | string | Yes | The id for the Compnay in your system. |
| filterable_attributes | object | No | The user supplied attributes which are set for this Company. Account attributes are configured in Attribute Settings. |
HTTP Response Codes
| Result | Response Code | Value |
|---|---|---|
| Success | 201 | |
| Failed to authenticate | 401 |
Example
curl https://www.savio.io/app/api/companies/ \
-X POST \
-H 'Authorization:Token REPLACE_WITH_YOUR_API_TOKEN' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' -d '
{
"name": "Acme Corp",
"internal_id": "1234567",
"filterable_attributes": {
"region": "na"
}
}'