Categories sort your discussions by topic, such as Problems, Questions and Billing. Every discussion is in one category, and that's where you create discussions through the API. Categories are set up in Tender; the API reads them.
Listing categories
GET /yoursite/categories
curl -H "Accept: application/vnd.tender-v1+json" \
-H "Authorization: Bearer $TENDER_TOKEN" \
https://api.tenderapp.com/yoursite/categories
{
"offset": 0,
"total": 5,
"per_page": 30,
"categories": [
{
"name": "Problems",
"permalink": "problems",
"public": true,
"visible": true,
"open_discussions_count": 3,
"href": "https://api.tenderapp.com/yoursite/categories/8",
"discussions_href": "https://api.tenderapp.com/yoursite/categories/8/discussions{/state}{?page,user_email}",
"html_href": "https://yoursite.tenderapp.com/discussions/problems"
},
{
"name": "Billing",
"permalink": "billing",
"public": false,
"visible": true,
"open_discussions_count": 1,
"href": "https://api.tenderapp.com/yoursite/categories/11",
"discussions_href": "https://api.tenderapp.com/yoursite/categories/11/discussions{/state}{?page,user_email}",
"html_href": "https://yoursite.tenderapp.com/discussions/billing"
}
]
}
You get every category, the private and hidden ones included, with all the category fields (trimmed here). More than 30 come in pages: ?page=2.
A single category
GET /yoursite/categories/{category}
{category} is the category's id or its permalink:
curl -H "Accept: application/vnd.tender-v1+json" \
-H "Authorization: Bearer $TENDER_TOKEN" \
https://api.tenderapp.com/yoursite/categories/questions
{
"name": "Questions",
"permalink": "questions",
"summary": "How do I…? Ask away.",
"formatted_summary": "<div><p>How do I…? Ask away.</p></div>",
"public": true,
"visible": true,
"beta": false,
"important": false,
"force_readonly": false,
"code": "6df2b39a5",
"accept_email": null,
"heartbeat_on": "2026-10-09T06:47:09Z",
"autoresponder_id": null,
"mail_template_id": null,
"tracker_id": null,
"redirection_id": null,
"created_at": "2026-10-09T06:47:09Z",
"updated_at": "2026-10-09T06:47:24Z",
"last_updated_at": "2026-10-09T05:17:13Z",
"last_discussion_id": 18,
"last_discussion_permalink": "8-where-did-the-archive-button-go",
"last_comment_id": 40,
"last_user_id": 18,
"last_user_name": null,
"last_user_email": null,
"open_discussions_count": 2,
"assigned_discussions_count": 0,
"resolved_discussions_count": 2,
"href": "https://api.tenderapp.com/yoursite/categories/9",
"discussions_href": "https://api.tenderapp.com/yoursite/categories/9/discussions{/state}{?page,user_email}",
"html_href": "https://yoursite.tenderapp.com/discussions/questions"
}
An unknown category gets 404.
Category fields
| Field | |
|---|---|
name |
The category's name. |
permalink |
The name in the category's address: questions in yoursite.tenderapp.com/discussions/questions. |
summary |
The description customers see under the name. |
formatted_summary |
The summary as HTML. |
public |
true for a public category. In a private one (false) every discussion is private: only the customer who started it and your staff can read it. |
visible |
false hides the category from customers: they can't see it or start discussions in it. |
beta |
true: only customers marked as beta users see it. |
important |
true: only customers marked as important see it. |
force_readonly |
true: customers can't start discussions in it. |
code |
The code in the category's own email address; mail sent there becomes a discussion in this category. |
accept_email |
The support addresses that forward mail into this category, or null. |
heartbeat_on |
When Tender next checks that mail forwarded from accept_email is still arriving. |
autoresponder_id |
The autoresponder set for this category, or null. |
mail_template_id |
The mail template set for this category, or null. |
tracker_id |
The issue tracker offered first when linking a ticket to one of its discussions, or null. |
redirection_id |
Set when this entry only points at another category, after a permalink change; otherwise null. |
created_at, updated_at |
When the category was made and last changed. |
last_updated_at |
When its latest comment was posted, or null if it has none. |
last_discussion_id |
The id of the discussion with that comment. |
last_discussion_permalink |
That discussion's number and permalink. |
last_comment_id, last_user_id |
The latest comment and its author. |
last_user_name, last_user_email |
The latest comment's author, when they have no account; otherwise null. |
open_discussions_count |
Its open discussions, without a ticket. |
assigned_discussions_count |
Its open discussions with a ticket linked. |
resolved_discussions_count |
Its resolved discussions. |
href |
This category. The last part is its id. |
discussions_href |
Its discussions. |
html_href |
The category in Tender. |
Discussions in a category
GET /yoursite/categories/{category}/discussions
GET /yoursite/categories/{category}/discussions/{state}
The category's discussions, with the same states and parameters as listing discussions:
curl -H "Accept: application/vnd.tender-v1+json" \
-H "Authorization: Bearer $TENDER_TOKEN" \
https://api.tenderapp.com/yoursite/categories/questions/discussions/resolved
{
"offset": 0,
"total": 2,
"per_page": 30,
"discussions": [
{
"title": "How do I invite a contractor without giving access to everything?",
"number": 4,
"state": "resolved",
"public": true,
"author_name": "Sam Whitfield",
"href": "https://api.tenderapp.com/yoursite/discussions/12",
"html_href": "https://yoursite.tenderapp.com/discussions/questions/4"
},
{
"title": "Can I export a project timeline to PDF?",
"number": 2,
"state": "resolved",
"public": true,
"author_name": "Aiko Tanaka",
"href": "https://api.tenderapp.com/yoursite/discussions/8",
"html_href": "https://yoursite.tenderapp.com/discussions/questions/2"
}
]
}
One discussion by its number in the category:
GET /yoursite/categories/{category}/discussions/{number}
curl -H "Accept: application/vnd.tender-v1+json" \
-H "Authorization: Bearer $TENDER_TOKEN" \
https://api.tenderapp.com/yoursite/categories/questions/discussions/4
The answer is the discussion with its comments, as in a single discussion.
To start a discussion in a category, see Creating a discussion. To move one, use its change_category action.
