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

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

Parameters

Parameter Required Description

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

Expanded shapes

When using the expand parameter, related objects are returned inline instead of as IDs.

Expanded user object:

Attribute Type Description

Expanded feature_request object:

Attribute Type Description

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

When expand is used, each Feedback result also includes:

Attribute Type Description

HTTP Response Codes

Result Response Code

Parameters

Parameter Required Description

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

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

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.
  • company and company_internal_id must 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

HTTP Response Codes

Result Response Code

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

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

If Product or Product Area is enabled on your account, the following fields are also always included:

Attribute Type Description

Additionally, the response includes dynamic fields based on the columns displayed on your Feature Request list. These may include:

Attribute Type Description

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

HTTP Response Codes

Result Response Code

Parameters

Parameter Required Description

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

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

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

HTTP Response Codes

Result Response Code Value

Parameters

Parameter Required Description

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

HTTP Response Codes

Result Response Code Value

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

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

HTTP Response Codes

Result Response Code Value

Parameters

Parameter Required Description

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

HTTP Response Codes

Result Response Code Value

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"
      }

  }'