List projects
curl --request GET \
--url https://productlane.com/api/v2/projects \
--header 'Authorization: Bearer <token>'import requests
url = "https://productlane.com/api/v2/projects"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://productlane.com/api/v2/projects', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://productlane.com/api/v2/projects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://productlane.com/api/v2/projects"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://productlane.com/api/v2/projects")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://productlane.com/api/v2/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"color": "<string>",
"icon": "<string>",
"state": "<string>",
"progress": 123,
"sort_order": 123,
"total_score": 123,
"is_visible": true,
"portal_instance_ids": [
"<string>"
],
"created_at": "<string>",
"updated_at": "<string>",
"linear_project_id": "<string>",
"linear_team_ids": [
"<string>"
],
"linear_team_names": [
"<string>"
]
}
],
"page": {
"cursor": "<string>",
"has_more": true,
"limit": 123
}
}{
"message": "<string>",
"code": "<string>",
"issues": [
{
"message": "<string>"
}
]
}Projects
List projects
List roadmap projects in the workspace. Cursor-paginated. Requires the projects:read scope.
GET
/
projects
List projects
curl --request GET \
--url https://productlane.com/api/v2/projects \
--header 'Authorization: Bearer <token>'import requests
url = "https://productlane.com/api/v2/projects"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://productlane.com/api/v2/projects', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://productlane.com/api/v2/projects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://productlane.com/api/v2/projects"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://productlane.com/api/v2/projects")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://productlane.com/api/v2/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"color": "<string>",
"icon": "<string>",
"state": "<string>",
"progress": 123,
"sort_order": 123,
"total_score": 123,
"is_visible": true,
"portal_instance_ids": [
"<string>"
],
"created_at": "<string>",
"updated_at": "<string>",
"linear_project_id": "<string>",
"linear_team_ids": [
"<string>"
],
"linear_team_names": [
"<string>"
]
}
],
"page": {
"cursor": "<string>",
"has_more": true,
"limit": 123
}
}{
"message": "<string>",
"code": "<string>",
"issues": [
{
"message": "<string>"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Required range:
1 <= x <= 200Lifecycle category. Distinct from linear_status_id, which selects a specific status within the category.
Available options:
backlog, planned, started, completed, canceled Required string length:
1 - 255Linear team id. Matches projects pinned to that team.
Required string length:
1 - 128Filter to a single portal by its id (from GET /portal/instances). Pass __main__ for the Main (Root) portal. Omit to return items across all portals.
visible items show on their portals, hidden items were taken down, pending items were never reviewed.
Available options:
visible, hidden, pending created_at (newest first) or total_score (highest demand first). Both break ties by id.
Available options:
created_at, total_score