NAV
javascript

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