List articles in a portal
The portal’s articles, newest update first — or in position order when you filter by category_slug. The counts in meta are deliberately computed before status and author_id are applied, so they stay stable as you move between the draft, published and mine views.
curl --request GET \
--url https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles \
--header 'api_access_token: <api-key>'import requests
url = "https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles"
headers = {"api_access_token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {api_access_token: '<api-key>'}};
fetch('https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));require 'uri'
require 'net/http'
url = URI("https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api_access_token"] = '<api-key>'
response = http.request(request)
puts response.read_bodypackage main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api_access_token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"payload": [
{
"id": 7,
"slug": "understanding-your-invoice",
"title": "Understanding your invoice",
"content": "Every invoice breaks down into three parts: your seat count, your resolution usage for the period, and any channel fees for numbers or messaging capacity you have provisioned.\n\nThe resolution line itemizes by channel, so you can see whethe…",
"description": "The three parts of every Tied invoice, and how to trace a line back to a conversation.",
"status": "published",
"position": 30,
"account_id": 1,
"updated_at": 1789851404,
"meta": {},
"category": {
"id": 3,
"name": "Billing",
"slug": "billing",
"locale": "en"
},
"views": null,
"author": {
"id": 1,
"account_id": 1,
"availability_status": "offline",
"auto_offline": true,
"confirmed": true,
"email": "you@example.com",
"provider": "email",
"available_name": "Alex Rivera",
"name": "Alex Rivera",
"role": "administrator",
"thumbnail": "/dashboard/images/default-contact-avatars/031.svg",
"avatar_url": "",
"illustration_avatar": true,
"accent_color": null,
"custom_role_id": null
}
},
{
"id": 6,
"slug": "add-and-remove-seats",
"title": "Add and remove seats",
"content": "Seats control how many agents can be assigned conversations and log in to the dashboard; they are separate from the resolution-based usage charges on your account.\n\nAdding a seat is prorated for the rest of the current billing period, so y…",
"description": "How seats are priced and prorated, separate from resolution-based usage.",
"status": "published",
"position": 20,
"account_id": 1,
"updated_at": 1789851404,
"meta": {},
"category": {
"id": 3,
"name": "Billing",
"slug": "billing",
"locale": "en"
},
"views": null,
"author": {
"id": 1,
"account_id": 1,
"availability_status": "offline",
"auto_offline": true,
"confirmed": true,
"email": "you@example.com",
"provider": "email",
"available_name": "Alex Rivera",
"name": "Alex Rivera",
"role": "administrator",
"thumbnail": "/dashboard/images/default-contact-avatars/031.svg",
"avatar_url": "",
"illustration_avatar": true,
"accent_color": null,
"custom_role_id": null
}
}
],
"meta": {
"all_articles_count": 7,
"archived_articles_count": 0,
"articles_count": 7,
"current_page": 1,
"draft_articles_count": 0,
"mine_articles_count": 7,
"published_count": 7
}
}{
"error": "Resource could not be found"
}{
"error": "Resource could not be found"
}Authorizations
This token can be obtained by visiting the profile page or via rails console. Provides access to endpoints based on the user permissions levels. This token can be saved by an external system when user is created via API, to perform activities on behalf of the user.
Path Parameters
The slug identifier of the portal
Query Parameters
Return only articles in this locale.
Free-text search across title and content.
Restrict to one category, and order by position rather than by last update.
Filter by publication state.
draft, published, archived Restrict to one author.
Page number.
Was this page helpful?
curl --request GET \
--url https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles \
--header 'api_access_token: <api-key>'import requests
url = "https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles"
headers = {"api_access_token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {api_access_token: '<api-key>'}};
fetch('https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));require 'uri'
require 'net/http'
url = URI("https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api_access_token"] = '<api-key>'
response = http.request(request)
puts response.read_bodypackage main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.tied.com/api/v1/accounts/{account_id}/portals/{id}/articles"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api_access_token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"payload": [
{
"id": 7,
"slug": "understanding-your-invoice",
"title": "Understanding your invoice",
"content": "Every invoice breaks down into three parts: your seat count, your resolution usage for the period, and any channel fees for numbers or messaging capacity you have provisioned.\n\nThe resolution line itemizes by channel, so you can see whethe…",
"description": "The three parts of every Tied invoice, and how to trace a line back to a conversation.",
"status": "published",
"position": 30,
"account_id": 1,
"updated_at": 1789851404,
"meta": {},
"category": {
"id": 3,
"name": "Billing",
"slug": "billing",
"locale": "en"
},
"views": null,
"author": {
"id": 1,
"account_id": 1,
"availability_status": "offline",
"auto_offline": true,
"confirmed": true,
"email": "you@example.com",
"provider": "email",
"available_name": "Alex Rivera",
"name": "Alex Rivera",
"role": "administrator",
"thumbnail": "/dashboard/images/default-contact-avatars/031.svg",
"avatar_url": "",
"illustration_avatar": true,
"accent_color": null,
"custom_role_id": null
}
},
{
"id": 6,
"slug": "add-and-remove-seats",
"title": "Add and remove seats",
"content": "Seats control how many agents can be assigned conversations and log in to the dashboard; they are separate from the resolution-based usage charges on your account.\n\nAdding a seat is prorated for the rest of the current billing period, so y…",
"description": "How seats are priced and prorated, separate from resolution-based usage.",
"status": "published",
"position": 20,
"account_id": 1,
"updated_at": 1789851404,
"meta": {},
"category": {
"id": 3,
"name": "Billing",
"slug": "billing",
"locale": "en"
},
"views": null,
"author": {
"id": 1,
"account_id": 1,
"availability_status": "offline",
"auto_offline": true,
"confirmed": true,
"email": "you@example.com",
"provider": "email",
"available_name": "Alex Rivera",
"name": "Alex Rivera",
"role": "administrator",
"thumbnail": "/dashboard/images/default-contact-avatars/031.svg",
"avatar_url": "",
"illustration_avatar": true,
"accent_color": null,
"custom_role_id": null
}
}
],
"meta": {
"all_articles_count": 7,
"archived_articles_count": 0,
"articles_count": 7,
"current_page": 1,
"draft_articles_count": 0,
"mine_articles_count": 7,
"published_count": 7
}
}{
"error": "Resource could not be found"
}{
"error": "Resource could not be found"
}