Introduction
Welcome to the Planly API! You can use our API to schedule posts, upload medias, manage your channels and much more.
Authentication
To authorize, use this code:
fetch('https://app.planly.com/api/...', {
headers: {
'Authorization': 'Bearer api_key'
}
})
Make sure to replace
api_key
with your API key.
Planly uses API keys to allow access to the API. You can get your Planly API key from Settings > Security.
Planly expects for the API key to be included in all API requests to the server in a header that looks like the following:
Authorization: Bearer api_key
Artificial Intelligence
Get Available Credits
fetch('https://app.planly.com/api/v2/ai/credits?teamId=874d98cd-34e4-4865-85f4-e9f16172a26f', {
method: 'GET',
headers: { 'Authorization': 'Bearer api_key' }
})
Response:
{
"data": 252
}
Get available AI credits left in a team.
HTTP Request
GET https://app.planly.com/api/v2/ai/credits
Query Parameters
Name | Required | Description |
---|---|---|
teamId | yes | Id of team |
Complete Prompt
fetch('https://app.planly.com/api/v2/ai/complete', {
method: 'POST',
headers: { 'Authorization': 'Bearer api_key' },
body: JSON.stringify({
teamId: "874d98cd-34e4-4865-85f4-e9f16172a26f",
prompt: "Who is the first president of USA?",
n: 1
})
})
Response:
{
"data": {
"id": "cmpl-7CUN5FhBapPkwAFRtKNhszvT9fxow",
"choices": [
{
"text": "The first president of the United States was George Washington."
}
]
}
}
Complete text prompt.
HTTP Request
POST https://app.planly.com/api/v2/ai/complete
Parameters
Name | Required | Description |
---|---|---|
teamId | yes | Id of team |
prompt | yes | Prompt as a text |
n | yes | How many results to generate |
Channels
List Channels
fetch('https://app.planly.com/api/v2/channels/list', {
method: 'POST',
headers: { 'Authorization': 'Bearer api_key' },
body: JSON.stringify({
"team_id": "874d98cd-34e4-4865-85f4-e9f16172a26f"
})
})
Response:
{
"data": [
{
"id": "42d7cd7d-943f-49fc-bb3c-b75ea79d5dc4",
"picture": "https://cdn.planly.com/cpp/7bbd06b3f4697a4c2fb2646b184cc4da.jpg",
"name": "iamsanche",
"social_network": "tiktok_business",
"method": "app",
"granted_scopes": [],
"declined_scopes": [],
"scopes": null,
"features": null,
"status": 0,
"schedules": 3,
"is_group": false,
"type": null,
"external_id": "_000jZG5smL9kzSbK0ipjAhnBkOWMUo1o3Ey",
"url": "https://www.tiktok.com/@iamsanche"
}
],
"error": null
}
HTTP Request
POST https://app.planly.com/api/v2/channels/list
Parameters
Name | Required | Description |
---|---|---|
team_id | yes | ID of the team to retrieve its channels |
Delete Channel
fetch('https://app.planly.com/api/v2/channels/delete?id=CHANNEL_ID', {
method: 'GET',
headers: { 'Authorization': 'Bearer api_key' }
})
Response:
{
"data": true,
"error": null
}
HTTP Request
GET https://app.planly.com/api/v2/channels/delete
Query Parameters
Name | Required | Description |
---|---|---|
id | yes | Channel ID to delete |
Media
Overview
To upload media files to Planly you need to first send request to start-upload
endpoint with your file size to get uploadUrl
.
Then upload your files to that url with HTTP PUT
request. After your upload finishes, call finish-upload
endpoint.
Start Upload
fetch('https://app.planly.com/api/v2/media/start-upload', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer api_key'
},
body: JSON.stringify({
teamId: "1ed3a4fa-ff8f-6166-a14e-6850a91715e8",
contentLength: 3431948,
contentType: "video/mp4",
fileName: "hello.mp4",
})
})
Response:
{
"mediaId": "8deb9b93-38ad-448b-ac4b-3bfbc7307214",
"uploadUrl": "https://planly.s3-accelerate.amazonaws.com/tmp/738536fa54e06b3db16faf726aa6b4913b150e083ceb73669eef4c12ad27dbc7.mp4?X-Amz-Expires=3600&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA46UUZUWCMLGVL6FO%2F20241008%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20241008T081906Z&X-Amz-SignedHeaders=content-length%3Bhost&X-Amz-Signature=d2913f3dae59fd9de669928cd6b01c40c5dd0c042499318e472bfeef1e0273ab",
"verb": "PUT",
"headers": {
"Content-Type": "video/mp4",
"Content-Length": "3431948"
}
}
To initiate the upload process for your media file to Planly, call the start-upload
endpoint. The fields teamId
and contentLength
are mandatory. Additionally, you must provide at least one of the contentType
or fileName
fields. If both contentType
and fileName
are provided, only contentType
will be honored.
As a response, this endpoint returns a unique mediaId
and a pre-signed uploadUrl
to which you can upload your file using a PUT
request.
Important: The file size (contentLength
) will be validated during the upload. For example, if you specify a size of 10MB but attempt to upload a 15MB file, the upload will be rejected.
HTTP Request
POST https://app.planly.com/api/v2/media/start-upload
Parameters
Name | Required | Description |
---|---|---|
teamId | yes | ID of the team to which the media will be uploaded |
contentLength | yes | Size of the file in bytes |
contentType | yes, if fileName is not provided |
MIME type of the file (e.g., video/mp4 ) |
fileName | yes, if contentType is not provided |
Name of the file being uploaded |
Finish Upload
fetch('https://app.planly.com/api/v2/media/finish-upload', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer api_key'
},
body: JSON.stringify({
mediaId: "8deb9b93-38ad-448b-ac4b-3bfbc7307214"
})
})
Response:
{
"data": {
"id": "8deb9b93-38ad-448b-ac4b-3bfbc7307214",
"note": null,
"contentType": 0,
"contentLength": 3431948,
"thumbnailUri": "https://cdn.planly.com/media/1ed3a4faff8f6166a14e6850a91715e8/B15188655D80028A-thumb.jpg",
"contentUri": "https://cdn.planly.com/media/1ed3a4faff8f6166a14e6850a91715e8/B15188655D80028A.mp4",
"labels": [],
"starred": false,
"duration": 30150,
"resolution": {
"width": 1920,
"height": 1200
},
"width": 1920,
"height": 1200,
"createdAt": "2024-10-08T08:19:09.1257662Z",
"createdBy": {
"id": "1ed3a4fa-ff8f-615d-a14e-9b251da9cf9a",
"fullname": "Mister Feature",
"picture": "https://cdn.planly.com/upp/1E41D8FE08430484.jpg"
}
},
"error": null
}
To complete the upload process for your media file, call the finish-upload
endpoint. This step is necessary to confirm that the file was successfully uploaded and to finalize its storage on the server. You must provide the mediaId
that was returned in the response of the start-upload
request.
As a response, this endpoint returns metadata for the uploaded file, including the file's direct URL, resolution, duration (for videos), and creation details.
HTTP Request
POST https://app.planly.com/api/v2/media/finish-upload
Parameters
Name | Required | Description |
---|---|---|
mediaId | yes | The unique ID of the media file returned from the start-upload response |
Import Media from URL
fetch('https://app.planly.com/api/v2/media/import-from-url', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer api_key'
},
body: JSON.stringify({
teamId: "1ed3a4fa-ff8f-6166-a14e-6850a91715e8",
url: "https://http.cat/200.jpg",
})
})
The response is identical to
/media/finish-upload
To import media from URL to your team use this endpoint. Supported media content types are video/mp4
, image/png
, image/jpeg
, image/webp
.
HTTP Request
POST https://app.planly.com/api/v2/media/import-from-url
Parameters
Name | Required | Description |
---|---|---|
teamId | yes | ID of team |
url | yes | URL to import media |
List Media
fetch('https://app.planly.com/api/v2/media/list', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"teamId": "1ed3a4fa-ff8f-6166-a14e-6850a91715e8",
"pagination": {
"orderBy": ["CreatedAt", "asc"],
"pageSize": 1
}
})
})
Response:
{
"data": {
"next": "WyIyMDI1LTA1LTIyVDEzOjQ4OjM0LjE3NDI2M1oiLCJlYTIyNzc1OC1jYmJmLTRkNWUtODE0ZS1iNDYwNGFmZjIwOWMiXQ==",
"totalNumberOfRows": 18,
"rows": [
{
"id": "868e0307-ea7b-4760-8bc0-89b807bbae16",
"note": null,
"contentType": 1,
"mimeType": "image/png",
"contentLength": 4481276,
"thumbnailUri": "https://cdn.planly.com/media/3f61365ea26d418a8e9032b5ea610dcb/CB9D8E41FB0D4211-thumb.jpg",
"contentUri": "https://cdn.planly.com/media/3f61365ea26d417a8e9032b5e0610dcb/CB9D8E41FB0D4211.png",
"labels": [],
"starred": false,
"duration": 0,
"resolution": {
"width": 1366,
"height": 2048
},
"width": 1366,
"height": 2048,
"createdAt": "2025-05-07T07:54:32.489203Z",
"createdBy": {
"id": "81db9662-def1-4770-9ea0-d8f16c4ff312",
"fullname": "Some User",
"picture": null
}
}
]
},
"error": null
}
This endpoint retrieves medias in a specified team.
HTTP Request
POST https://app.planly.com/api/v2/media/list
Parameters
Name | Required | Description |
---|---|---|
teamId | yes | ID of the team to retrieve media for |
pagination.cursor | no | Pagination cursor returned from the previous response’s next field |
pagination.orderBy | no | Sorting array of two elements: index 0 = CreatedAt or ContentLength , index 1 = asc or desc |
pagination.pageSize | no | Number of media items to return. Defaults to 50 |
Delete Media
fetch('https://app.planly.com/api/v2/media/delete', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"ids": ["1ede9882-1d09-6fc1-8c32-20e1401dc7b6"]
})
})
Response:
{
"data": true,
"error": null
}
HTTP Request
POST https://app.planly.com/api/v2/media/delete
Parameters
Name | Required | Description |
---|---|---|
ids | yes | Array of media IDs to delete. |
Schedule Groups
Create/Update Schedule Group
Providing an id
will update the existing group, while omitting it will create a new group.
fetch('https://app.planly.com/api/v2/schedule-groups/create', {
method: 'POST',
headers: {'Authorization': 'Bearer api_key'},
body: JSON.stringify({
"teamId": "3f61365e-a26d-417a-8e90-32b5ea610dcb",
"scheduleGroups": [
{
"publishOn": "2025-11-29T20:00:00.356Z",
"schedules": [
{
"channelId": "a9945805-47bf-4ab9-ac3c-ef8a8b8d5bbf",
"content": "Hello world",
"media": [
{
"options": {},
"id": "23b27d93-107e-4750-a87e-ccf4eb97e92a"
}
],
"options": {
"postType": 0,
"firstComment": true,
"firstCommentContent": "My comment for Instagram"
}
}
]
}
]
})
})
Response:
{
"data": {
"upsert": [
{
"id": "1ffcaf15-9652-4b30-8b77-6821c4f37958",
"publishOn": "2025-11-29T20:00:00.356Z",
"createdAt": "2025-06-27T08:30:43.7027784Z",
"status": "scheduled",
"syncEnabled": true,
"schedules": [
{
"id": "e49e6d5b-aee5-4111-a353-dc6d4a88453f",
"channel": {
"id": "a9945805-47bf-4ab9-ac3c-ef8a8b8d5bbf",
"name": "iamsanchee",
"picture": "https://cdn.planly.com/cpp/503d987d3672d5c648a50a123a981628.jpg",
"social_network": "instagram",
"method": "app"
},
"media": [
{
"id": "23b27d93-107e-4750-a87e-ccf4eb97e92a",
"contentUri": "https://cdn.planly.com/media/3f61365ea26d417a8e9032b5ea610dcb/4F80FEA136DEDD7B.jpg",
"thumbnailUri": "https://cdn.planly.com/media/3f61365ea26d417a8e9032b5ea610dcb/4F80FEA136DEDD7B-thumb.jpg",
"contentType": 1,
"mimeType": "image/jpeg",
"resolution": {
"width": 4032,
"height": 3024
},
"options": {},
"duration": 0
}
],
"content": "Hello world",
"status": 1,
"url": null,
"options": {
"postType": 0,
"firstComment": true,
"firstCommentContent": "My comment for Instagram"
},
"externalId": null,
"errorMessage": null
}
]
}
]
},
"error": null
}
HTTP Request
POST https://app.planly.com/api/v2/schedule-groups/create
Parameters
Name | Required | Description |
---|---|---|
teamId | yes | ID of the team to create schedule groups for |
validateOnly | no | If true , validates the schedule group without creating it. Default is false |
scheduleGroups | yes | Array of schedule group objects |
scheduleGroups[].id | no | ID of existing schedule group to update. If null , creates a new group |
scheduleGroups[].publishOn | no | Planly will publish schedules at this date and time. If not specified, schedules should be published immediately |
scheduleGroups[].status | no | Status of the schedule group. Possible values: draft or scheduled . Defaults to scheduled |
scheduleGroups[].schedules | yes | Array of schedule objects |
Schedule Object
Name | Required | Description |
---|---|---|
channelId | yes | ID of the channel to post to |
content | no | Text content for the post |
media | no | Array of media to include in the post |
media[].id | yes | ID of media |
options | no | Platform-specific options (see Options section) |
List Schedule Groups
fetch('https://app.planly.com/api/v2/schedule-groups/list', {
method: 'POST',
headers: {'Authorization': 'Bearer api_key'},
body: JSON.stringify({
"teamId": "1ed3a4fa-ff8f-6166-a14e-6850a91715e8",
"pagination": {
"cursor": null,
"orderBy": ["CreatedAt", "desc"],
"pageSize": 1
}
})
})
HTTP Request
POST https://app.planly.com/api/v2/schedule-groups/list
Parameters
Name | Required | Description |
---|---|---|
teamId | yes | ID of the team to retrieve schedule groups |
ids | no | Array of specific schedule group IDs to retrieve |
filter.channels | no | Array of channel IDs to filter schedule groups by specific channels |
filter.status | no | Array of schedule status values to filter by. Possible values: 0 = Draft, 1 = Scheduled, 3 = Published, 4 = Failed |
filter.socialNetworks | no | Array of social network names to filter by. Possible values: threads , youtube , instagram , tiktok , tiktok_business , twitter , pinterest , facebook , linkedin , mastodon , bluesky |
filter.mediaType | no | Array of media types to filter by. Possible values: 0 = Image, 1 = Video |
dateRange.since | no | Start date for filtering schedule groups |
dateRange.until | no | End date for filtering schedule groups |
pagination.cursor | no | A cursor string used for pagination to get the next set of results. This value is retrieved from previous response's next field |
pagination.orderBy | no | Array specifying sort order by property and direction. Possible values: ["CreatedAt", "desc"] or ["ContentLength", "asc"] |
pagination.pageSize | no | The maximum number of results to return in a single response. If omitted, the API defaults to 50 |
Delete Schedule Groups
Delete schedule groups by their IDs. All schedules within the groups will also be deleted.
fetch('https://app.planly.com/api/v2/schedule-groups/delete', {
method: 'POST',
headers: {'Authorization': 'Bearer api_key'},
body: JSON.stringify({
"ids": ["3f61365e-a26d-417a-8e90-32b5ea610dcb"]
})
})
HTTP Request
POST https://app.planly.com/api/v2/schedule-groups/delete
Parameters
Name | Required | Description |
---|---|---|
ids | yes | Array of schedule group IDs to delete |
Schedules
Create Schedule
fetch('https://app.planly.com/api/v2/schedules/create', {
method: 'POST',
headers: { 'Authorization': 'Bearer api_key' },
body: JSON.stringify({
"schedules": [
{
"channelId": "48e092b8-1d45-4736-acb2-3717218c0f52",
"publishOn": "2025-11-29T20:00:00.356Z",
"status": 1,
"content": "Hello world",
"media": [
{
"options": {},
"id": "f9560569-3089-49de-9b17-b1f52bc03588"
}
],
"options": {
"selfDeclaredMadeForKids": true,
"notifySubscribers": true,
"allowEmbedding": true,
"title": "My YouTube video",
"categoryId": "28",
"privacyStatus": "public",
"firstCommentEnabled": true,
"firstComment": "My comment"
}
},
{
"channelId": "c44ed066-a234-4a1d-a1ba-86acca71ae4b",
"publishOn": "2025-11-29T20:00:00.356Z",
"status": 1,
"content": "Hello world",
"media": [
{
"options": {},
"id": "f9560569-3089-49de-9b17-b1f52bc03588"
}
],
"options": {
"postType": 0,
"firstComment": true,
"firstCommentContent": "My comment for Instagram"
}
}
]
})
})
The response is identical to
/schedule-groups/create
HTTP Request
POST https://app.planly.com/api/v2/schedules/create
Parameters
Name | Required | Description |
---|---|---|
channelId | yes | |
publishOn | no | Planly will publish schedule at this date and time. If not specified, schedule should be published immediately |
status | no | Status of schedule. 0 for Draft, 1 for Scheduled. Default is 1 (Scheduled) |
content | no | Text content for post |
media[] | no | An array of media (video, image or gif) |
options | no | Social network specific options. (See options section) |
List Schedules
fetch('https://app.planly.com/api/v2/schedules/list', {
method: 'POST',
headers: { 'Authorization': 'Bearer api_key' },
body: JSON.stringify({
"teamId": "1ed3a4fa-ff8f-6166-a14e-6850a91715e8",
"pagination": {
"cursor": null,
"orderBy": ["CreatedAt", "desc"]
}
})
})
Response:
{
"data": {
"rows": [
{
"id": "c5005d92-e0db-4678-bdf9-2d71a5dc0e55",
"channel": {
"id": "6e6483c2-a4de-4f8c-994a-dca63c816b73",
"name": "username1675726",
"picture": "https://cdn.planly.com/cpp/04ee68cbbe40763a1d730424cb8f86d4.jpg",
"social_network": "twitter",
"method": "app"
},
"media": [],
"content": "hi @PlanlySocial",
"content_headline": null,
"status": 0,
"url": null,
"options": {
"threads": []
},
"external_id": null,
"publish_on": "0001-01-01T00:00:00",
"created_at": "0001-01-01T00:00:00",
"error_message": null
}
],
"next": "WyIwMDAxLTAxLTAxVDAwOjAwOjAwIiwiYzUwMDVkOTItZTBkYi00Njc4LWJkZjktMmQ3MWE1ZGMwZTU1Il0="
},
"error": null
}
This endpoint retrieves schedules in a specified team.
For pagination, include next
field returned from response in next request's pagination.cursor
field.
HTTP Request
POST https://app.planly.com/api/v2/schedules/list
Parameters
Name | Required | Description |
---|---|---|
teamId | yes | ID of the team to retrieve its schedules. This ID can be obtained from Teams List |
pagination.cursor | no | A cursor string used for pagination to retrieve the next set of results. This value is returned in the next field of the previous successful response |
pagination.orderBy | no | Array specifying sort order by property and direction. Possible values: ["CreatedAt", "desc"] or ["ContentLength", "asc"] |
pagination.pageSize | no | The maximum number of results to return in a single response. If omitted, the API defaults to 50 |
Social Network Options
Facebook Options
Name | Description |
---|---|
postType | Defines the type of Facebook post. Possible values: REELS , STORY , or default |
firstComment | Whether to add a first comment to the post |
firstCommentContent | The text content of the first comment |
link | A URL to embed in the post |
Instagram Options
Name | Description |
---|---|
postType | Defines the type of Instagram post: 0 = Post, 2 = Story. Reels are automatically handled by API |
firstComment | Whether to add a first comment to the post |
firstCommentContent | The text content of the first comment |
location | Whether to attach a location to the post |
locationId | The ID of the location to attach |
shareToFeed | Set to true if you want the Reel to appear in both the Feed and Reels tabs. This requires the Reel to meet Instagram’s requirements for duration, length, and encoding |
collaborators | An array of up to three Instagram account usernames to add as collaborators on the post |
LinkedIn Options
Name | Description |
---|---|
firstComment | Whether to add a first comment to the post |
firstCommentContent | The text content of the first comment |
link | A URL to embed in the post |
Mastodon Options
Name | Description |
---|---|
visibility | Privacy level of the post. Possible values: public , unlisted , private , or direct |
firstCommentEnabled | Whether to add a first comment to the post |
firstCommentContent | The text content of the first comment |
pollOptions | String array of poll options. You can add up to 4 choices. Each choice can be up to 25 characters |
pollExpiresIn | Expiration time for poll. Possible values: 300 = 5 minutes, 900 = 30 minutes, 3600 = 1 hour, 18000 = 6 hours, 86400 = 1 day, 259200 = 3 days, 432000 = 7 days |
pollMultiple | If set to true , multiple-choice is allowed |
Pinterest Options
Name | Description |
---|---|
boardId | ID of the board to which this Pin belongs. To get the list of boards, use POST https://app.planly.com/api/v2/pinterest/get-board-list/:channelId |
title | Pin title |
link | A URL to embed in the Pin |
Threads Options
Name | Description |
---|---|
link | A URL to embed in the post |
TikTok Options
Name | Description |
---|---|
title | The video caption. Hashtags (# ) and mentions (@ ) will be detected automatically if separated by spaces or new lines |
privacyLevel | The privacy level of the post. Possible values: PUBLIC_TO_EVERYONE , MUTUAL_FOLLOW_FRIENDS , FOLLOWER_OF_CREATOR , or SELF_ONLY |
disableDuet | If true , other TikTok users will not be allowed to create Duets with this post |
disableStitch | If true , other TikTok users will not be allowed to create Stitches with this post |
disableComment | If true , comments will be disabled for this post |
photoCoverIndex | The index (starting from 0 ) of the photo to use as the cover |
Twitter Options
Name | Description |
---|---|
threads | Array of threads to post in a single tweet chain |
threads[].content | Text content of the thread |
threads[].media | List of media items to include |
threads[].media[].id | ID of the media |
YouTube Options
Name | Description |
---|---|
title | The title of the YouTube video |
selfDeclaredMadeForKids | Whether the video is made for kids |
notifySubscribers | If true , subscribers will be notified of the newly uploaded video |
allowEmbedding | Whether to allow others to embed the video on their sites |
categoryId | The ID of the YouTube category for the video |
privacyStatus | The privacy status of the video. Possible values: public , unlisted , or private |
firstCommentEnabled | Whether to enable posting a first comment when the video is published |
firstComment | The text content of the first comment to post with the video |
Teams
Create Team
fetch('https://app.planly.com/api/v2/team/create', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: "New Team"
})
})
Response:
{
"data": {
"teamId": "a20a6413-0498-48da-9e55-eb284c2efe35"
},
"error": null
}
HTTP Request
POST https://app.planly.com/api/v2/team/create
Body Parameters
Name | Required | Description |
---|---|---|
name | yes | Name of the team |
List Teams
fetch('https://app.planly.com/api/teams/list', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key'
},
})
Response:
{
"data": [
{
"id": "874d98cd-34e4-4865-85f4-e9f16172a26f",
"name": "My team",
"picture": "...",
"role": 1,
"users": 7,
"channels": 4
}
]
}
This endpoint retrieves all teams that you belong.
HTTP Request
POST https://app.planly.com/api/teams/list
Get Team
fetch('https://app.planly.com/api/v2/team/get', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
id: "3f61365e-a26d-417a-8e90-32b5ea610dcb"
})
})
Response:
{
"id": "a20a6413-0498-48da-9e55-eb284c2efe35",
"name": "a new team",
"picture": null,
"role": 1,
"members_count": 1,
"channels_count": 0,
"disconnected_channels_count": 0,
"permissions": {
"ai_credits": 300,
"can_access_to_analytics": true,
"can_post_to_tiktok": true,
"team_limit_per_user": 10,
"member_limit_per_user": 8,
"channel_limit_per_user": 100,
"can_update_instagram_bio": true,
"filesize_limit_per_image": 31457280,
"can_pin_post_to_instagram": true,
"file_size_limit_per_video": 10737418240,
"can_post_to_instagram_feed": true,
"can_comment_to_instagram_feed": true,
"can_post_album_to_instagram_feed": true,
"monthly_schedule_limit_per_channel": 800,
"pages_can_disable_branding": true,
"pages_custom_domain_limit": 5,
"pages_max_count": 5,
"needs_payment": false,
"twitter_analytics": true,
"first_comment": true,
"story_scheduling": true,
"analyticsWidgets": [
"all"
],
"can_tag_instagram_users": true,
"csv_upload": true,
"can_create_custom_reports": true,
"can_export_reports": true,
"can_access_to_competitor_analytics": true,
"can_access_to_social_engagement": true
},
"limits": {
"ai_credits": 0,
"pages_max_count": 0,
"member_limit": 0,
"channel_limit": 97,
"filesize_limit_per_image": 0,
"file_size_limit_per_video": 0,
"pages_custom_domain_limit": 0,
"monthly_schedule_limit_per_channel": 0
},
"integrations": {}
}
HTTP Request
POST https://app.planly.com/api/v2/team/get
Body Parameters
Name | Required | Description |
---|---|---|
id | yes | Team ID |
Edit Team
fetch('https://app.planly.com/api/v2/team/edit', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
teamId: "3f61365e-a26d-417a-8e90-32b5ea610dcb",
name: "Updated Name"
})
})
HTTP Request
POST https://app.planly.com/api/v2/team/edit
Body Parameters
Name | Required | Description |
---|---|---|
teamId | yes | Team ID |
name | yes | New name for team |
Delete Team
fetch('https://app.planly.com/api/v2/team/delete?id=TEAM_ID', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key'
}
})
Response:
true
HTTP Request
POST https://app.planly.com/api/v2/team/delete
Query Parameters
Name | Required | Description |
---|---|---|
id | yes | Team ID |
List Team Users
fetch('https://app.planly.com/api/v2/team/users', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
id: "b2544ac4-bb0c-4a04-ae16-74d82fd1a179"
})
})
Response:
[
{
"id": "81db9662-def1-4770-9ea0-d8f16c4ff312",
"fullname": "Someone",
"picture": null,
"email": "[email protected]",
"role": 1
},
{
"id": "b2544ac4-bb0c-4a04-ae16-74d82fd1a179",
"fullname": "Someone else",
"picture": null,
"email": "[email protected]",
"role": 0
}
]
HTTP Request
POST https://app.planly.com/api/v2/team/users
Body Parameters
Name | Required | Description |
---|---|---|
id | yes | Team ID |
Transfer Team Ownership
fetch('https://app.planly.com/api/v2/team/transfer-ownership', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
teamId: "3f61365e-a26d-417a-8e90-32b5ea610dcb",
userId: "062abd50-182c-42b4-9f33-1bc07af64372"
})
})
Response:
{
"data": "Successfully Transferred",
"error": null
}
HTTP Request
POST https://app.planly.com/api/v2/team/transfer-ownership
Body Parameters
Name | Required | Description |
---|---|---|
teamId | yes | Team ID |
userId | yes | User ID |
Remove User from Team
fetch('https://app.planly.com/api/v2/team/users/remove', {
method: 'POST',
headers: {
'Authorization': 'Bearer api_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
teamId: "3f61365e-a26d-417a-8e90-32b5ea610dcb",
userId: "062abd50-182c-42b4-9f33-1bc07af64372"
})
})
Response:
{
"data": "User removed from team",
"error": null
}
HTTP Request
POST https://app.planly.com/api/v2/team/users/remove
Body Parameters
Name | Required | Description |
---|---|---|
teamId | yes | Team ID |
userId | yes | User ID |