Beta: We're currently in beta and gradually updating this landing page. Some content might be missing or incomplete.

API Reference

Introduction

The Product7 API is a RESTful interface for managing feedback in your workspace. Submit posts from your own apps, internal tools, or third-party integrations, all over plain HTTPS with JSON request and response bodies.

The API is served from your workspace's subdomain on api.product7.io. Authenticate each request with a bearer token, then call the endpoint you need. Tokens are scoped to a single workspace and can be revoked at any time.

Base URL
https://{workspace}.api.product7.io
Auth header
Authorization: Bearer YOUR_API_TOKEN

Getting started

  1. Open your workspace and go to Settings, Developers to generate a token.
  2. Copy your workspace subdomain (the part before .api.product7.io).
  3. Make your first request to Create Feedback to add a post to a board.
Auth

Get current workspace

GET/api/v1/me

Returns the workspace the bearer token belongs to. Use this as your auth check — a 200 confirms the token is valid and tells you which workspace it scopes to. The only endpoint guaranteed to exist for every API key.

Authorizations

Authorizationstringrequired
Bearer token used to authenticate the request. Generate one from Settings, Developers in your workspace.

Response

200application/json
statusbooleanoptional
Always true on 2xx responses.
data.workspace.iduuidoptional
The workspace's unique identifier.
data.workspace.namestringoptional
Human-readable workspace name as shown in the dashboard.
data.workspace.domainstringoptional
The workspace's subdomain segment (e.g. acme for acme.product7.io).
Workspace · Members

Get workspace members

GET/api/v1/workspace/members

Returns the admins and members of the workspace. Use a member's id as the assignee_user_id or created_by filter on List tickets.

Authorizations

Authorizationstringrequired
Bearer token used to authenticate the request.

Response

200application/json
dataarray<object>optional
Array of members, each with id, full_name, email, and picture.
totalintegeroptional
Number of members returned.
Posts

Create Feedback

POST/api/v1/feedback

Creates a new feedback post on a board in your workspace. The post appears in the public board feed (or moderation queue, if moderation is enabled) and triggers notifications to subscribers.

Authorizations

Authorizationstringrequired
Bearer token used to authenticate the request. Generate one from Settings, API in your workspace.

Body Parameters

titlestringrequired
Short summary of the feedback. Used as the public title on the board.
contentstringrequired
Full description of the feedback. Supports plain text and markdown.
board_iduuidrequired
ID of the board the post belongs to.
category_iduuidoptional
Optional category to file the post under. Must belong to the same board.
user_iduuidoptional
Submit on behalf of another user. Admin tokens only. Defaults to the authenticated user.
attachmentsarray<object>optional
Array of attachment objects (images, files) to include with the post.

Response

200application/json

Returns the created feedback post with its server-assigned identifiers, timestamps, and the public URL on your board.

iduuidoptional
The unique ID of the created post.
urlstringoptional
Full public URL where the post can be viewed on your board.
url_slugstringoptional
URL-safe slug generated from the title.
statusstringoptional
Initial status of the post. Usually open, or pending if moderation is enabled.
created_attimestampoptional
ISO 8601 timestamp of when the post was created.
Feedback · Posts

List Feedback

GET/api/v1/feedback

Returns feedback posts across the boards your token can access, newest first. Results are cursor-paginated and can be narrowed by board, status, tag, or keyword.

Authorizations

Authorizationstringrequired
Bearer token used to authenticate the request.

Query Parameters

boardsstringoptional
Comma-separated board UUIDs to filter by. Defaults to all boards the token can access.
statusesstringoptional
Comma-separated status UUIDs.
tagsstringoptional
Comma-separated tag UUIDs.
keywordsstringoptional
Search across post title and content.
sortstringoptional
Sort order: newest, top, or trending.
limitintegeroptional
Max results per page.
cursorstringoptional
Pagination cursor from the previous page's meta.next_cursor.

Response

200application/json
dataarray<object>optional
Array of feedback posts, each with its title, content, public URL, vote and comment counts, and status.
meta.next_cursorstringoptional
Cursor to pass as cursor to fetch the next page. Empty when there are no more results.
meta.has_morebooleanoptional
Whether another page is available.
Support · Tickets

Create ticket

POST/api/v1/tickets

Creates a support ticket in the workspace — the same flow the dashboard composer uses, so the ticket gets a number, the workspace's default status and type, and shows up in the inbox immediately. The ticket is attributed to the user who created the API key, so the key must be a user-scoped key.

Body Parameters

titlestringrequired
Short summary of the issue. Shown on the ticket card.
requester_namestringrequired
Name of the person the ticket is on behalf of.
requester_emailstringoptional
Requester's email address.
descriptionstringoptional
Full description of the issue. Plain text or markdown.
prioritystringoptional
One of low, medium, high, urgent. Defaults to medium.
type_iduuidoptional
Ticket type id. Defaults to the workspace's default type.
assignee_idsarray<uuid>optional
Initial assignees — user ids from Get workspace members. Each assignee is notified.
team_iduuidoptional
Route the ticket to a team at creation.
due_datedatetimeoptional
ISO 8601 due date.
tagsarray<string>optional
Tag names to apply at creation.

Response

201application/json

Returns the full ticket, including its allocated number and the uuid used by every other ticket endpoint.

Support · Tickets

List tickets

GET/api/v1/tickets

Returns the support tickets in the workspace the token belongs to, newest activity first. Results are paginated and can be narrowed with query parameters. Every ticket is scoped to your workspace automatically.

Authorizations

Authorizationstringrequired
Bearer token used to authenticate the request. Generate one from Settings, Developers in your workspace.

Query Parameters

stagestringoptional
Filter by stage: open, in_progress, waiting_on_customer, resolved, closed.
prioritystringoptional
Filter by priority: low, medium, high, urgent.
typestringoptional
Filter by ticket type name (e.g. Bug).
searchstringoptional
Full-text search across ticket title and description.
tagstringoptional
Comma-separated tag names to filter by.
pageintegeroptional
Page number, starting at 1. Defaults to 1.
page_sizeintegeroptional
Results per page. Defaults to 50.

Response

200application/json
dataarray<object>optional
Array of tickets. Each carries id (the public T-#### label), uuid (use this in the path for the other endpoints), title, stage, priority, requester, and status.
meta.totalintegeroptional
Total number of tickets matching the filter, across all pages.
meta.total_pagesintegeroptional
Number of pages at the current page_size.
Support · Tickets

Get ticket

GET/api/v1/tickets/{id}

Returns a single ticket with its full activity timeline (comments, replies, and state changes). Returns 404 if the ticket doesn't exist or belongs to a different workspace.

Path Parameters

iduuidrequired
The ticket's uuid (from the list response), not the public T-#### label.

Authorizations

Authorizationstringrequired
Bearer token used to authenticate the request.

Response

200application/json
dataobjectoptional
The ticket, including an activities array of its timeline entries.
data.activitiesarray<object>optional
Timeline entries, oldest first. Each has a type (comment, reply, internal_note, or a state-change), content, and timestamp.
Support · Tickets

Add comment

POST/api/v1/tickets/{id}/comments

Adds an internal note to a ticket's timeline. Notes are team-only; they are never sent to the customer as an email (use the dashboard reply composer for customer-facing replies). The note is attributed to the user who created the API key, so the key must be a user-scoped key.

Path Parameters

iduuidrequired
The ticket's uuid.

Body Parameters

contentstringrequired
The comment body. Plain text or markdown.
attachmentsarray<object>optional
Optional image attachments, each { url, type, name }. Only image types are stored.

Response

201application/json

Returns the updated ticket with the new comment appended to its activities.

Support · Tickets

Set status

POST/api/v1/tickets/{id}/status

Moves a ticket to another workspace status. The change is recorded on the ticket's timeline, attributed to the key's user — so the key must be a user-scoped key. Get valid status ids from Get ticket statuses.

Path Parameters

iduuidrequired
The ticket's uuid.

Body Parameters

status_iduuidrequired
Target status id. If the status has closes_ticket set, the ticket is closed.

Response

200application/json

Returns the updated ticket with its new status.

Support · Tickets

Delete activity

DEL/api/v1/tickets/{id}/activities/{activityID}

Removes a comment or internal note that the key's user authored. Author-scoped and limited to content rows — it can never touch state-change audit entries or customer-facing replies.

Path Parameters

iduuidrequired
The ticket's uuid.
activityIDuuidrequired
The activity id of the comment or internal note (from the ticket's activities).

Response

200application/json

Returns a confirmation. Deleting an already-deleted activity returns 410 Gone.

Support · Statuses

Get ticket statuses

GET/api/v1/ticket-statuses

Returns the workspace's customizable ticket statuses (Open, In progress, Resolved, …). Pass a status id (or several, comma-separated) as the status_id filter on List tickets.

Authorizations

Authorizationstringrequired
Bearer token used to authenticate the request.

Response

200application/json
dataarray<object>optional
Array of statuses ordered by position. Each has an id, name, color_code, icon_name, and flags.
data[].closes_ticketbooleanoptional
Whether moving a ticket to this status resolves/closes it.

Errors

400Invalid request body or missing required fields.
401Missing or invalid bearer token.
403User is banned, or the board requires login for anonymous posts.
500Server error while persisting the post.