Felt Maps API

Maps are the centerpiece of Felt. With these APIs, you can create, retrieve, update, delete, move, and duplicate maps programmatically.

OpenAPI Specification

felt-maps-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  description: Felt REST API v2.0
  title: Felt Comments Maps API
  version: '2.0'
servers:
- url: https://felt.com
  variables: {}
security: []
tags:
- description: 'Maps are the centerpiece of Felt.


    With these APIs, you can create, retrieve, update, delete, move, and duplicate maps programmatically.

    '
  name: Maps
  x-page-description: APIs for building maps
  x-page-icon: map-location
paths:
  /api/v2/maps/{map_id}/move:
    post:
      callbacks: {}
      description: Move a map to a different project or folder within the same workspace. Project IDs and Folder IDs can be found inside map settings.
      operationId: move_map
      parameters:
      - description: ''
        in: path
        name: map_id
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MapMoveParams'
        description: Map move params
        required: false
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Map'
          description: Map
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
          description: NotFoundError
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
          description: InternalServerError
      security:
      - bearerAuth: []
      summary: Move map
      tags:
      - Maps
  /api/v2/maps/{map_id}/duplicate:
    post:
      callbacks: {}
      description: Create a copy of a map with all its layers, elements, and configuration.
      operationId: duplicate_map
      parameters:
      - description: The ID of the map to duplicate
        in: path
        name: map_id
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MapDuplicateParams'
        description: Map duplicate params
        required: false
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Map'
          description: Duplicated Map
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
          description: NotFoundError
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
          description: InternalServerError
      security:
      - bearerAuth: []
      summary: Duplicate map
      tags:
      - Maps
  /api/v2/maps:
    post:
      callbacks: {}
      description: 'Create a new map with optional customization options.


        Several aspects can be customized when creating a new map, including:


        * Title

        * Initial location (latitude, longitude and zoom level)

        * Sharing permissions (defaults to viewing and commenting for users with the map URL)

        * An array of URLs to import on map creation

        '
      operationId: create_map
      parameters: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MapCreateParams'
        description: Map create params
        required: false
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Map'
          description: Map
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
          description: NotFoundError
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
          description: InternalServerError
      security:
      - bearerAuth: []
      summary: Create map
      tags:
      - Maps
      x-sort-order: 0
  /api/v2/maps/{map_id}/update:
    post:
      callbacks: {}
      description: Update map properties including title, description, and access permissions.
      operationId: update_map
      parameters:
      - description: The ID of the map to update
        in: path
        name: map_id
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MapUpdateParams'
        description: Map update params
        required: false
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Map'
          description: Map
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
          description: NotFoundError
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
          description: InternalServerError
      security:
      - bearerAuth: []
      summary: Update map
      tags:
      - Maps
  /api/v2/maps/{map_id}:
    delete:
      callbacks: {}
      description: 'Permanently delete a map and all its associated data.


        {% hint style="warning" %}

        This action cannot be undone. The map and all its layers, elements, and comments will be permanently removed.

        {% endhint %}

        '
      operationId: delete_map
      parameters:
      - description: The ID of the map to delete
        in: path
        name: map_id
        required: true
        schema:
          type: string
      responses:
        '204':
          description: No Content
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
          description: NotFoundError
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
          description: InternalServerError
      security:
      - bearerAuth: []
      summary: Delete map
      tags:
      - Maps
    get:
      callbacks: {}
      description: Retrieve a map with its metadata including title, URL, thumbnail, and timestamps.
      operationId: show_map
      parameters:
      - description: ''
        in: path
        name: map_id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Map'
          description: Map
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
          description: UnauthorizedError
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
          description: NotFoundError
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonErrorResponse'
          description: Unprocessable Entity
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
          description: InternalServerError
      security:
      - bearerAuth: []
      summary: Get map
      tags:
      - Maps
components:
  schemas:
    GeoJSON:
      properties:
        features:
          items:
            properties:
              geometry:
                properties:
                  felt:id:
                    $ref: '#/components/schemas/FeltID'
                  felt:parentId:
                    example: luCHyMruTQ6ozGk3gPJfEB
                    format: felt_id
                    nullable: true
                    type: string
                type: object
              properties:
                type: object
              type:
                enum:
                - Feature
                type: string
            type: object
          type: array
        type:
          enum:
          - FeatureCollection
          type: string
      required:
      - type
      - features
      title: GeoJSON
      type: object
    MapMoveParams:
      oneOf:
      - properties:
          project_id:
            $ref: '#/components/schemas/FeltID'
        required:
        - project_id
        title: MoveMapProjectParams
        type: object
      - properties:
          folder_id:
            $ref: '#/components/schemas/FeltID'
        required:
        - folder_id
        title: MoveMapFolderParams
        type: object
      title: MapMoveParams
      type: object
    FeltID:
      example: luCHyMruTQ6ozGk3gPJfEB
      format: felt_id
      nullable: false
      title: FeltID
      type: string
    MapCreateParams:
      additionalProperties: false
      properties:
        basemap:
          description: 'The basemap to use for the new map. Defaults to "default". Valid values are "default", "light", "dark", "satellite", a valid raster tile URL with {x}, {y}, and {z} parameters, or a hex color string like #ff0000.'
          type: string
        description:
          description: A description to display in the map legend
          type: string
        lat:
          description: If no data has been uploaded to the map, the initial latitude to center the map display on.
          type: number
        layer_urls:
          description: An array of urls to use to create layers in the map. Only tile URLs for raster layers are supported at the moment.
          items:
            type: string
          type: array
        lon:
          description: If no data has been uploaded to the map, the initial longitude to center the map display on.
          type: number
        public_access:
          description: The level of access to grant to the map. Defaults to "view_only".
          enum:
          - private
          - view_only
          - view_and_comment
          - view_comment_and_edit
          type: string
        title:
          description: The title to be used for the map. Defaults to "Untitled Map"
          type: string
        workspace_id:
          description: The workspace to create the map in. Defaults to the latest used workspace
          type: string
        zoom:
          description: If no data has been uploaded to the map, the initial zoom level for the map to display.
          type: number
      title: MapCreateParams
      type: object
    MapViewerPermissions:
      additionalProperties: false
      properties:
        can_duplicate_map:
          description: Whether viewers can duplicate the map and data
          type: boolean
        can_export_data:
          description: Whether viewers can export map data
          type: boolean
        can_see_map_presence:
          description: Whether viewers can see who else is viewing the map
          type: boolean
      title: MapViewerPermissions
      type: object
    UnauthorizedError:
      properties:
        errors:
          items:
            properties:
              detail:
                type: string
              source:
                properties:
                  header:
                    enum:
                    - authorization
                    type: string
                type: object
              title:
                type: string
            type: object
          type: array
      title: UnauthorizedError
      type: object
    MapTableSettings:
      additionalProperties: false
      properties:
        default_table_layer_id:
          example: luCHyMruTQ6ozGk3gPJfEB
          format: felt_id
          nullable: true
          type: string
        viewers_can_open_table:
          description: Whether viewers can open the data table
          type: boolean
      title: MapTableSettings
      type: object
    MapDuplicateParams:
      additionalProperties: false
      properties:
        destination:
          oneOf:
          - additionalProperties: false
            properties:
              project_id:
                $ref: '#/components/schemas/FeltID'
            required:
            - project_id
            type: object
          - additionalProperties: false
            properties:
              folder_id:
                $ref: '#/components/schemas/FeltID'
            required:
            - folder_id
            type: object
          type: object
        title:
          description: Title for the duplicated map. If not provided, will default to '[Original Title] (copy)'
          type: string
      title: MapDuplicateParams
      type: object
    InternalServerError:
      properties:
        errors:
          items:
            properties:
              detail:
                type: string
              source:
                properties:
                  parameter:
                    type: string
                type: object
              title:
                type: string
            type: object
          type: array
      title: InternalServerError
      type: object
    Map:
      additionalProperties: false
      properties:
        basemap:
          type: string
        created_at:
          example: '2024-05-25T15:51:34'
          format: date_time
          type: string
        element_groups:
          items:
            properties:
              elements:
                $ref: '#/components/schemas/GeoJSON'
              id:
                $ref: '#/components/schemas/FeltID'
              name:
                nullable: true
                type: string
            type: object
          type: array
        elements:
          $ref: '#/components/schemas/GeoJSON'
        folder_id:
          nullable: true
          type: string
        id:
          $ref: '#/components/schemas/FeltID'
        layer_groups:
          items:
            $ref: '#/components/schemas/LayerGroup'
          type: array
        layers:
          items:
            $ref: '#/components/schemas/Layer'
          type: array
        links:
          properties:
            self:
              example: https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC
              type: string
          type: object
        project_id:
          nullable: false
          type: string
        public_access:
          enum:
          - private
          - view_only
          - view_and_comment
          - view_comment_and_edit
          type: string
        table_settings:
          $ref: '#/components/schemas/MapTableSettings'
        thumbnail_url:
          description: A static thumbnail image of the map
          nullable: true
          type: string
        title:
          type: string
        type:
          enum:
          - map
          type: string
        url:
          type: string
        viewer_permissions:
          $ref: '#/components/schemas/MapViewerPermissions'
        visited_at:
          format: date_time
          nullable: true
          type: string
      required:
      - id
      - type
      - url
      - title
      - thumbnail_url
      - created_at
      - visited_at
      - layers
      - layer_groups
      - elements
      - element_groups
      - project_id
      - public_access
      title: Map
      type: object
    LayerMetadata:
      additionalProperties: false
      properties:
        attribution_text:
          nullable: true
          type: string
        attribution_url:
          nullable: true
          type: string
        description:
          nullable: true
          type: string
        license:
          nullable: true
          type: string
        source_abbreviation:
          nullable: true
          type: string
        source_name:
          nullable: true
          type: string
        source_url:
          nullable: true
          type: string
        updated_at:
          example: '2025-03-24'
          format: date
          nullable: true
          type: string
      title: LayerMetadata
      type: object
    Layer:
      additionalProperties: false
      properties:
        attributes:
          description: List of the attributes on the layer
          items:
            properties:
              name:
                description: The name of the attribute
                type: string
              type:
                description: The type of the attribute
                enum:
                - INTEGER
                - REAL
                - TEXT
                - BOOLEAN
                - DATE
                - DATETIME
                - GEOMETRY
                type: string
            required:
            - name
            type: object
          nullable: true
          type: array
        caption:
          nullable: true
          type: string
        geometry_type:
          enum:
          - Line
          - Point
          - Polygon
          - Raster
          nullable: true
          type: string
        hide_from_legend:
          nullable: false
          type: boolean
        id:
          $ref: '#/components/schemas/FeltID'
        is_spreadsheet:
          nullable: true
          type: boolean
        last_refreshed_at:
          description: ISO 8601 timestamp of when the layer's data was last updated. This includes scheduled refreshes, manual refreshes, and direct feature edits.
          format: date-time
          nullable: true
          type: string
        legend_display:
          description: Controls how the layer is displayed in the legend.
          enum:
          - default
          - name_only
          nullable: true
          type: string
        legend_visibility:
          description: Controls whether or not the layer is displayed in the legend. Defaults to "show".
          enum:
          - hide
          - show
          nullable: true
          type: string
        links:
          properties:
            self:
              example: https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA
              type: string
          type: object
        metadata:
          $ref: '#/components/schemas/LayerMetadata'
        name:
          nullable: false
          type: string
        next_refresh_at:
          description: ISO 8601 timestamp of when the next scheduled refresh will occur. Null if refresh is disabled or paused.
          format: date-time
          nullable: true
          type: string
        ordering_key:
          description: A sort order key used for ordering layers and layer groups in the legend
          nullable: true
          type: integer
        paused_reason:
          description: Why the layer's refresh is paused. Null when not paused.
          enum:
          - consecutive_failures
          nullable: true
          type: string
        progress:
          format: float
          nullable: false
          type: number
        refresh_period:
          enum:
          - 15 min
          - 30 min
          - hour
          - 3 hours
          - 6 hours
          - 12 hours
          - day
          - week
          - month
          - disabled
          type: string
        refresh_status:
          description: Whether scheduled refresh is active, paused (due to failures), or disabled
          enum:
          - active
          - paused
          - disabled
          type: string
        status:
          enum:
          - uploading
          - processing
          - failed
          - completed
          nullable: false
          type: string
        style:
          description: The Felt Style Language style for the layer
          type: object
        subtitle:
          deprecated: true
          description: 'Deprecated: use `caption` instead.'
          nullable: true
          type: string
        tile_url:
          description: The tile URL for this layer
          nullable: true
          type: string
        type:
          enum:
          - layer
          type: string
      required:
      - id
      - type
      - hide_from_legend
      - status
      - caption
      - name
      - progress
      - geometry_type
      - style
      - refresh_period
      - refresh_status
      title: Layer
      type: object
    NotFoundError:
      properties:
        errors:
          items:
            properties:
              detail:
                type: string
              source:
                properties:
                  parameter:
                    type: string
                type: object
              title:
                type: string
            type: object
          type: array
      title: NotFoundError
      type: object
    MapUpdateParams:
      additionalProperties: false
      properties:
        basemap:
          description: 'The basemap to use for the map. Defaults to "default". Valid values are "default", "light", "dark", "satellite", a valid raster tile URL with {x}, {y}, and {z} parameters, or a hex color string like #ff0000.'
          type: string
        description:
          description: A description to display in the map legend
          type: string
        public_access:
          description: The level of access to grant to the map. Defaults to "view_only".
          enum:
          - private
          - view_only
          - view_and_comment
          - view_comment_and_edit
          type: string
        table_settings:
          $ref: '#/components/schemas/MapTableSettings'
        title:
          description: The new title for the map
          type: string
        viewer_permissions:
          $ref: '#/components/schemas/MapViewerPermissions'
      title: MapUpdateParams
      type: object
    JsonErrorResponse:
      properties:
        errors:
          items:
            properties:
              detail:
                example: null value where string expected
                type: string
              source:
                properties:
                  pointer:
                    example: /data/attributes/petName
                    type: string
                required:
                - pointer
                type: object
              title:
                example: Invalid value
                type: string
            required:
            - title
            - source
            - detail
            type: object
          type: array
      required:
      - errors
      title: JsonErrorResponse
      type: object
    LayerGroup:
      additionalProperties: false
      properties:
        caption:
          nullable: true
          type: string
        id:
          $ref: '#/components/schemas/FeltID'
        layers:
          items:
            $ref: '#/components/schemas/Layer'
          type: array
        legend_visibility:
          description: Controls how the layer group is displayed in the legend. Defaults to "show".
          enum:
          - hide
          - show
          nullable: true
          type: string
        links:
          properties:
            self:
              example: https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layer_groups/v13k4Ae9BRjCHHdPP5Fcm6D
              type: string
          type: object
        name:
          nullable: false
          type: string
        ordering_key:
          description: A sort order key used for ordering layers and layer groups in the legend
          nullable: false
          type: integer
        subtitle:
          deprecated: true
          description: 'Deprecated: use `caption` instead.'
          nullable: true
          type: string
        type:
          enum:
          - layer_group
          type: string
        visibility_interaction:
          description: Controls how the layer group is displayed in the legend. Defaults to `"default"`.
          enum:
          - default
          - slider
          - select
          - multi_select
          nullable: false
          type: string
      required:
      - id
      - type
      - name
      - caption
      - visibility_interaction
      - layers
      title: LayerGroup
      type: object
  securitySchemes:
    bearerAuth:
      bearerFormat: YOUR_API_KEY
      scheme: bearer
      type: http