curl --request GET \
--url https://api.kit.com/v4/apps \
--header 'X-Kit-Api-Key: <api-key>'require 'uri'
require 'net/http'
url = URI("https://api.kit.com/v4/apps")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Kit-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_bodyconst options = {method: 'GET', headers: {'X-Kit-Api-Key': '<api-key>'}};
fetch('https://api.kit.com/v4/apps', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kit.com/v4/apps"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Kit-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kit.com/v4/apps",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Kit-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}import requests
url = "https://api.kit.com/v4/apps"
headers = {"X-Kit-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"apps": [
{
"id": 1318,
"name": "Storefront Orders",
"summary": "Tag subscribers by what they buy in your store",
"icon_url": "https://embed.filekit.com/e/storefront-orders-icon",
"categories": [
"e_commerce",
"workflows"
],
"pricing": "paid",
"plan_availability": "pro",
"installable": false,
"access_types": [
"api",
"plugin"
],
"published_at": "2026-05-19T15:40:00Z",
"app_store_url": "https://app.kit.com/apps/1318",
"owned": false,
"status": "published"
},
{
"id": 1245,
"name": "Calendar Sync",
"summary": "Let subscribers book a call from your emails",
"icon_url": "https://embed.filekit.com/e/calendar-sync-icon",
"categories": [
"scheduling"
],
"pricing": "free",
"plan_availability": "paid_plans",
"installable": true,
"access_types": [
"api",
"plugin"
],
"published_at": "2026-03-04T09:12:00Z",
"app_store_url": "https://app.kit.com/apps/1245",
"owned": false,
"status": "published"
}
],
"pagination": {
"has_previous_page": false,
"has_next_page": false,
"start_cursor": "WzEzMThd",
"end_cursor": "WzEyNDVd",
"per_page": 50
}
}{
"errors": [
"The access token is invalid"
]
}{
"errors": [
"category must be one of: advertisements, affiliate_management, analytics, content, crm, e_commerce, email_verification, events, giveaways, lead_capture, memberships_courses, scheduling, surveys_quizzes, webinar_services, website_platforms, workflows"
]
}{
"errors": [
"App search is temporarily unavailable. Try again shortly, or list apps by category without query."
]
}List apps
Returns the apps in the Kit App Store that the account can see: every app listed in the store, plus any app the account created, in any status, marked owned. Each row is a compact summary; fetch Get an app for the description, capabilities, links and install URL.
Narrow the list with category (one or more App Store categories, comma-separated), query (Kit’s App Store search), or both.
Without query, apps are ordered by install count, most installed first, with cursor pagination as for other v4 list endpoints. With query, apps are in relevance order and the cursors are search cursors: pass them back unchanged. Mixing a cursor from a search with a non-search request returns 422.
With query, pagination.total_count is the search index’s count: it is capped at 10,000 and can include an app that the page itself does not return (a stale index entry for an app that has since been disabled or unlisted). Without query it is exact.
curl --request GET \
--url https://api.kit.com/v4/apps \
--header 'X-Kit-Api-Key: <api-key>'require 'uri'
require 'net/http'
url = URI("https://api.kit.com/v4/apps")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Kit-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_bodyconst options = {method: 'GET', headers: {'X-Kit-Api-Key': '<api-key>'}};
fetch('https://api.kit.com/v4/apps', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kit.com/v4/apps"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Kit-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kit.com/v4/apps",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Kit-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}import requests
url = "https://api.kit.com/v4/apps"
headers = {"X-Kit-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"apps": [
{
"id": 1318,
"name": "Storefront Orders",
"summary": "Tag subscribers by what they buy in your store",
"icon_url": "https://embed.filekit.com/e/storefront-orders-icon",
"categories": [
"e_commerce",
"workflows"
],
"pricing": "paid",
"plan_availability": "pro",
"installable": false,
"access_types": [
"api",
"plugin"
],
"published_at": "2026-05-19T15:40:00Z",
"app_store_url": "https://app.kit.com/apps/1318",
"owned": false,
"status": "published"
},
{
"id": 1245,
"name": "Calendar Sync",
"summary": "Let subscribers book a call from your emails",
"icon_url": "https://embed.filekit.com/e/calendar-sync-icon",
"categories": [
"scheduling"
],
"pricing": "free",
"plan_availability": "paid_plans",
"installable": true,
"access_types": [
"api",
"plugin"
],
"published_at": "2026-03-04T09:12:00Z",
"app_store_url": "https://app.kit.com/apps/1245",
"owned": false,
"status": "published"
}
],
"pagination": {
"has_previous_page": false,
"has_next_page": false,
"start_cursor": "WzEzMThd",
"end_cursor": "WzEyNDVd",
"per_page": 50
}
}{
"errors": [
"The access token is invalid"
]
}{
"errors": [
"category must be one of: advertisements, affiliate_management, analytics, content, crm, e_commerce, email_verification, events, giveaways, lead_capture, memberships_courses, scheduling, surveys_quizzes, webinar_services, website_platforms, workflows"
]
}{
"errors": [
"App search is temporarily unavailable. Try again shortly, or list apps by category without query."
]
}Authorizations
Authenticate API requests via an API Key
Query Parameters
To fetch next page of results, use ?after=<end_cursor>. With query, pass the cursor back unchanged.
To fetch previous page of results, use ?before=<start_cursor>. With query, pass the cursor back unchanged.
Only apps in these App Store categories. Accepts one category or a comma-separated list; an app matches when it is listed under any of them. Values: advertisements, affiliate_management, analytics, content, crm, e_commerce, email_verification, events, giveaways, lead_capture, memberships_courses, scheduling, surveys_quizzes, webinar_services, website_platforms, workflows. An unknown value returns 422.
Set to true to include the total_count in the response. This option can cause slow responses; if paging through results, request it only on the first page and reuse the value for subsequent pages.
Number of results per page. Default 50, maximum 100; larger values are clamped to 100.
Searches app names, categories, summaries and descriptions with Kit's App Store search. Results are ranked by relevance, and recent edits to an app can take a few minutes to appear. Maximum 100 characters.
100Was this page helpful?