Customer.io Folders API

Folders organize your Design Studio files. Use these endpoints to list, create, rename, move, and delete folders. Folders hold emails, SMS, and components, but these endpoints return folders only; list the [emails](/integrations/api/design-studio/tag/emails/), [SMS](/integrations/api/design-studio/tag/sms/), or [components](/integrations/api/design-studio/tag/components/) in a folder with their own endpoints.

Operations 5

GET /v1/design_studio/folders List folders #
POST /v1/design_studio/folders Create a folder #
GET /v1/design_studio/folders/{id} Get a folder #
PUT /v1/design_studio/folders/{id} Update a folder #
DELETE /v1/design_studio/folders/{id} Delete a folder #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/customer-io:customer-io-folders-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

customer-io-folders-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  version: 1.0.0
  title: Customer.io Journeys API Reference Folders API
  description: Customer.io provides REST APIs to send real-time customer data, retrieve data from your account, and trigger messages.
servers:
- url: https://track.customer.io
  description: The base URL for the Track API. Track endpoints use basic authentication with your Site ID as the user name and your secret key as the password.
- url: https://track-eu.customer.io
  description: The base URL for the Track API (EU region). Track endpoints use basic authentication with your Site ID as the user name and your secret key as the password.
- url: https://api.customer.io
  description: The base URL for broadcasts, transactional messages, and data-retrieval APIs. These endpoints use bearer authorization, and require a [token that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
- url: https://api-eu.customer.io
  description: The base URL for broadcasts, transactional messages, and data-retrieval APIs (EU region). These endpoints use bearer authorization, and require a [token that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
tags:
- name: Folders
  description: Folders organize your Design Studio files. Use these endpoints to list, create, rename, move, and delete folders. Folders hold emails, SMS, and components, but these endpoints return folders only; list the emails, SMS, or components in a folder with their own endpoints.
paths:
  /v1/design_studio/folders:
    servers:
    - url: https://api.customer.io
      description: The base URL for the Design Studio API. These endpoints use bearer authorization, and require an [App API Key that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
    - url: https://api-eu.customer.io
      description: The base URL for the Design Studio API (EU region). These endpoints use bearer authorization, and require an [App API Key that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
    get:
      tags:
      - Folders
      summary: List folders
      operationId: listFolders
      security:
      - Bearer-Auth: []
      description: Returns a paginated list of folders. This does not include files like emails, components, etc.
      parameters:
      - $ref: '#/components/parameters/Page'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/ParentFolderID'
      - $ref: '#/components/parameters/DirectDescendantsOnly'
      - $ref: '#/components/parameters/SortBy'
      - $ref: '#/components/parameters/SortOrder'
      - $ref: '#/components/parameters/CreatedBefore'
      - $ref: '#/components/parameters/CreatedAfter'
      - $ref: '#/components/parameters/UpdatedBefore'
      - $ref: '#/components/parameters/UpdatedAfter'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  folders:
                    type: array
                    items:
                      $ref: '#/components/schemas/Folder'
                  meta:
                    $ref: '#/components/schemas/ListMeta'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                errors:
                - detail: invalid query parameter
                  status: '400'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    post:
      tags:
      - Folders
      summary: Create a folder
      description: Create a new folder at the root level or under a parent folder. To create a child folder, you need the UUID of the parent folder, which you can retrieve with List folders.
      operationId: createFolder
      security:
      - Bearer-Auth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - name
              properties:
                name:
                  type: string
                  description: 'The name of the folder. Cannot contain these characters: < > : " / \ | ? * .

                    '
                  minLength: 1
                  maxLength: 170
                  example: Product Announcements
                parent_folder_id:
                  type:
                  - string
                  - 'null'
                  description: UUID of the parent folder. Omit or pass `null` to create at root.
                  format: uuid
      responses:
        '200':
          description: Folder created
          content:
            application/json:
              schema:
                type: object
                properties:
                  folder:
                    $ref: '#/components/schemas/Folder'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: object
                      properties:
                        detail:
                          description: The name is missing or invalid, the parent folder id is an empty string, or there's an unknown JSON field in the request body
                          type: string
                        status:
                          description: Response code
                          type: string
                example:
                  errors:
                  - detail: missing or invalid name
                    status: '400'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: Response not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                errors:
                - detail: parent folder not found
                  status: '404'
  /v1/design_studio/folders/{id}:
    servers:
    - url: https://api.customer.io
      description: The base URL for the Design Studio API. These endpoints use bearer authorization, and require an [App API Key that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
    - url: https://api-eu.customer.io
      description: The base URL for the Design Studio API (EU region). These endpoints use bearer authorization, and require an [App API Key that you generate in the UI](https://fly.customer.io/settings/api_credentials?keyType=app).
    get:
      tags:
      - Folders
      summary: Get a folder
      description: Get a folder by its UUID. You can retrieve the UUID of folders through List folders.
      operationId: getFolder
      security:
      - Bearer-Auth: []
      parameters:
      - $ref: '#/components/parameters/folder_id'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  folder:
                    $ref: '#/components/schemas/Folder'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      tags:
      - Folders
      summary: Update a folder
      description: 'Update part of a folder: the name and/or the folder it belongs to. If you move a folder, all files stay nested in the folder.'
      operationId: updateFolder
      security:
      - Bearer-Auth: []
      parameters:
      - $ref: '#/components/parameters/folder_id'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of the folder. Cannot contain any of these characters: < > : " / \ | ? * .

                    '
                  minLength: 1
                  maxLength: 170
                parent_folder_id:
                  $ref: '#/components/schemas/parent_folder_id'
      responses:
        '204':
          description: Successful response, no content returned
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: object
                      properties:
                        detail:
                          description: 'Possible reasons for error: No fields provided, invalid name, parent_folder_id is an empty string or not a valid place to move the folder to, or unknown JSON field in request body

                            '
                          type: string
                        status:
                          description: Response code
                          type: string
                example:
                  errors:
                  - detail: missing or invalid name
                    status: '400'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      tags:
      - Folders
      summary: Delete a folder
      description: 'Delete a folder **including subfolders and all file (components, templates, and emails)**. You cannot delete a folder with emails used in your workflows (automations, broadcasts, etc).


        However, you can delete a folder with components that are referenced in emails linked to workflows, so make sure deleting a folder with components won''t break your emails.'
      operationId: deleteFolder
      security:
      - Bearer-Auth: []
      parameters:
      - $ref: '#/components/parameters/folder_id'
      responses:
        '204':
          description: Successful response, no content returned
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
components:
  parameters:
    SortBy:
      name: sort_by
      in: query
      schema:
        type: string
        enum:
        - created
        - updated
        - name
        default: created
    Limit:
      name: limit
      in: query
      description: The maximum number of results per page.
      schema:
        type: integer
        minimum: 1
        maximum: 10000
        default: 1000
    UpdatedAfter:
      name: updated_after
      in: query
      schema:
        type: integer
        format: Unix timestamp
      description: Return records updated after this time. Must be a unix timestamp.
      example: 1773856017
    CreatedAfter:
      name: created_after
      in: query
      schema:
        type: integer
        format: Unix timestamp
      description: Return records created after this time. Must be a unix timestamp.
      example: 1773856017
    UpdatedBefore:
      name: updated_before
      in: query
      schema:
        type: integer
        format: Unix timestamp
      description: Return records updated before this time. Must be a unix timestamp.
      example: 1773856017
    Page:
      name: page
      in: query
      description: The page number of results you want to display. Use with `limit`.
      schema:
        type: integer
        minimum: 1
        default: 1
    ParentFolderID:
      name: parent_folder_id
      in: query
      schema:
        type: string
        format: uuid
      description: 'Filter by parent folder. Must reference an existing folder. If not set, the response filters by the root level directory.


        To list only items in the root folder, leave `parent_folder_id` unset and only set `direct_descendants_only` to `true`.

        '
    CreatedBefore:
      name: created_before
      in: query
      schema:
        type: integer
        format: Unix timestamp
      description: Return records created before this time. Must be a unix timestamp.
      example: 1773856017
    DirectDescendantsOnly:
      name: direct_descendants_only
      in: query
      description: When `true`, the response includes only the immediate children of the parent folder. When `false`, it includes the parent folder's entire subtree.
      schema:
        type: boolean
        default: false
    SortOrder:
      name: sort_order
      in: query
      schema:
        type: string
        enum:
        - asc
        - desc
        default: asc
    folder_id:
      name: id
      in: path
      required: true
      description: The UUID of the folder.
      schema:
        type: string
        format: uuid
  schemas:
    Error:
      type: object
      description: An error response containing one or more error details.
      properties:
        errors:
          type: array
          description: A list of errors that occurred while processing the request.
          items:
            type: object
            properties:
              detail:
                type: string
                description: A human-readable description of the error.
              status:
                type: string
                description: The HTTP status code for this error, as a string.
              source:
                type: object
                description: The request field that caused the error. Validation errors (`422`) include it.
                properties:
                  pointer:
                    type: string
                    description: The path to the field that failed, like `/data/attributes/content`.
              meta:
                type: object
                description: Additional detail about the error, when there is any. A failed publish uses this to list Liquid errors per language.
    parent_folder_id:
      type:
      - string
      - 'null'
      format: uuid
      description: 'The UUID of the parent folder.


        Omit if you want no change to where the folder or file is located. Include `null` to move it to your root directory. Or add the UUID of another folder to move it there.

        '
    ListMeta:
      type: object
      properties:
        pagination:
          type: object
          properties:
            page:
              type: integer
              description: The page number of results you're on.
            limit:
              type: integer
              description: The number of results per page.
            total:
              type: integer
              description: The total number of folders.
        filters:
          type: object
          description: The filters applied in your request.
          example:
            parent_folder_id: 123e4567-e89b-12d3-a456-426614174000
            direct_descendants_only: true
            sort_by: created
            sort_order: desc
            created_before: 1714732800
            created_after: null
            updated_before: null
            updated_after: null
    Folder:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: ID of folder
        name:
          type: string
          description: The name of the folder.
        parent_folder_id:
          type:
          - string
          - 'null'
          format: uuid
          description: The ID of the parent folder. Returns `null` if there is no parent, which means the folder is in the root directory.
        created:
          type: integer
          format: Unix timestamp
          description: Timestamp of when the folder was created.
        updated:
          type: integer
          format: Unix timestamp
          description: Timestamp of last update to the folder.
      example:
        id: 123e4567-e89b-12d3-a456-426614174000
        name: Product Announcements
        parent_folder_id: null
        created: 1714732800
        updated: 1714732800
  responses:
    Conflict:
      description: Conflict - linked resource or other constraint violation
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            errors:
            - detail: a constraint violation prevents this operation
              status: '409'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            errors:
            - detail: resource not found
              status: '404'
    Unauthorized:
      description: Authentication failed due to a missing or invalid API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            errors:
            - detail: unauthorized
              status: '401'
  securitySchemes:
    Tracking-API-Key:
      type: http
      scheme: basic
      description: 'The Track API uses a basic authentication scheme. Your credentials are your **Site ID** and your **API key**, **Base-64 encoded** in the format `site_id:api_key`.


        You can find your Site ID and API key on the [Track API Keys page](https://fly.customer.io/settings/api_credentials).

        '
    Bearer-Auth:
      type: http
      scheme: bearer
      description: 'The App API uses a bearer authentication scheme.


        You can generate a bearer token, known as an **App API Key**, with a defined scope in [your account settings](https://fly.customer.io/settings/api_credentials?keyType=app). [Learn more about bearer authorization in Customer.io](/accounts/settings/managing-credentials).

        '
    ServiceAccount-Auth:
      x-scalar-ignore: true
      type: http
      scheme: bearer
      bearerFormat: sa_live_
      description: 'Transactional send endpoints (`/v1/send/email`, `/v1/send/push`, `/v1/send/sms`, `/v1/send/whatsapp`, `/v1/send/in_app`, `/v1/send/inbox_message`) also accept a service-account bearer token, prefixed with `sa_live_`. Service-account tokens work across workspaces, so you must pass the target workspace as the `X-Workspace-Id` header on each request.


        Service-account tokens are intended for testing and one-off sends—for example, using the Customer.io CLI with an AI agent like Claude to verify that a transactional message renders correctly before wiring it into your production backend. **For the production integration that triggers the message from your application, use an App API Key instead**: it''s workspace-scoped, easier to rotate, and has a smaller blast radius.


        Service-account tokens are server-side credentials. Treat them like any API key—keep them in environment variables or a secret manager, and never embed them in client-side code, mobile apps, or other untrusted contexts.

        '
    bearerAuth:
      type: http
      scheme: bearer
      description: API key passed as a Bearer token.
x-tagGroups:
- name: Track API v2
  tags:
  - track_v2
  - Object Schemas
  - Person Schemas
  - Deliveries
- name: Track API
  tags:
  - trackOverview
  - trackJsOrBackend
  - trackLimit
  - trackRegion
  - Track Customers
  - Track Events
  - Forms
  - Track Segments
  - Track v1 Overview
- name: App API
  tags:
  - appOverview
  - appLimit
  - appAuth
  - Activities
  - Automations
  - Broadcasts
  - Collections
  - Customers
  - Data Index
  - ESP Suppression
  - Exports
  - Imports
  - Info
  - Live Notifications
  - Messages
  - Newsletters
  - Opt-outs
  - Reporting Webhooks
  - Segments
  - Sender Identities
  - Snippets
  - Subscription Center
  - Transactional
  - Workspaces
  - Send Messages
  - Objects
  - Newsletter Variants
  - Newsletter Metrics
  - Assets
- name: Design Studio API
  tags:
  - Folders
  - Components
  - Emails
  - Email link and publish
  - Email testing
  - SMS
  - SMS link and publish