LogoLogo
Sign upHelp CenterContactSocial
Home
Home
  • Overview
  • REST API
    • Getting started
    • Navigating maps and workspaces
    • Uploading files and URLs
    • Styling layers
    • Refreshing live data layers
    • Working with elements
    • Listening to updates using webhooks
    • API Reference
      • Authentication
      • Maps
      • Layers
      • Elements
      • Users
      • Comments
      • Embed Tokens
      • Sources
      • Projects
  • JS SDK
    • Getting started
    • General concepts
    • Controlling maps
    • Working with selection
    • Reading entities
    • Drawing elements
    • Working with layers
    • Layer filters
    • Building custom charts
    • Map interactions and viewport
    • Hiding and showing
    • Integrating with React
    • Sample application
    • Examples
    • API Reference
  • Felt Style Language
    • Getting started
    • Style definition blocks
      • The config block
      • The paint block
      • The label block
      • The legend block
      • The popup block
      • The attributes block
      • The filters block
    • Types of visualizations
      • Simple visualizations
      • Categorical visualizations
      • Numeric visualizations (color & size)
      • Heatmaps
      • Hillshade
    • Zoom-based Styling
      • Interpolators
    • Legends
    • Errors
    • Examples
Powered by GitBook
On this page

Was this helpful?

Export as PDF
  1. REST API
  2. API Reference

Layers

PreviousMapsNextElements

Last updated 14 days ago

Was this helpful?

Uploading a file or URL

Check our docs to see what URLs are supported.

The /upload endpoint can be used for both URL and file uploads:

  • For URL uploads, simply making a single POST request to the upload endpoint is enough

  • For file uploads, the response of the initial POST request will include a target URL and some pre-signed attributes, which will be used to upload the new file to Amazon S3.

This endpoint is used to create a layer, and obtain a pre-signed url to upload the layer files to S3.

Uploading the file to Amazon S3

Uploading a file is a single function call using the felt-python library.

Layer files aren’t uploaded directly to the Felt API. Instead, they are uploaded by your client directly to an S3 bucket.

You will receive a single set of URL and pre-signed params to upload the file. Only a single file may be uploaded — if you wish to upload several files at once, consider wrapping them in a zip file.

To upload the file using the pre-signed params, you must perform a multipart upload, and include the file contents in the file field:

# Requires requests library to be installed with: pip install requests
import requests

# Your API token should look like this:
# api_token = "felt_pat_ABCDEFUDQPAGGNBmX40YNhkCRvvLI3f8/BCwD/g8"
api_token = "<YOUR_API_TOKEN>"
map_id = "<YOUR_MAP_ID>"
path_to_file = "<YOUR_FILE_WITH_EXTENSION>" # Example: features.geojson

# Request  a pre-signed URL from Felt
layer_response = requests.post(
    f"https://felt.com/api/v2/maps/{map_id}/upload",
    headers={
        "authorization": f"Bearer {api_token}",
        "content-type": "application/json",
    },
    json={"name": "My new layer"},
)
presigned_upload = layer_response.json()
url = presigned_upload["data"]["attributes"]["url"]
presigned_attributes = presigned_upload["data"]["attributes"]["presigned_attributes"]
# A 204 response indicates that the upload was successful
with open(path_to_file, "rb") as file_obj:
    output = requests.post(
        url,
        # Order is important, file should come at the end
        files={**presigned_attributes, "file": file_obj},
    )
from felt_python import upload_file

map_id = "<YOUR_MAP_ID>"
path_to_file = "<YOUR_FILE_WITH_EXTENSION>" # Example: features.geojson

upload_file(
  map_id=map_id,
  file_name=path_to_file,
  layer_name="My new layer",
)

Refreshing a layer

Refreshing a file is a single function call using the felt-python library.

After uploading a file or URL, you may want to update the resulting layer with some new data. The process is quite similar to the above:

  • For URL uploads, simply making a single POST request to the refresh endpoint is enough

  • For file uploads, the response of the initial POST request will include a URL and some presigned attributes, which will be used to upload the new file to Amazon S3. See Uploading the file to Amazon S3 for more details.

Deleting a layer

Styling layers

Update a layer's style

A layer's style may be updated by providing a new Felt Style Language object. Learn more in the guide:

Managing layers

Get all the layers on a map

Get the details of all the layer on the map that are not within a layer group.

Get a single layer

Get the details of a single layer on the map. These details include:

  • Name of the layer

  • Upload status and progress

  • Other metadata, such as the geometry type, visibility state in the legend, etc

Updating a layer's details

Update a layer's name or move it into or out of a layer group.

To move a layer into a group, set the layer_group_id to the id of the layer group you want to move the layer into. To move a layer out of a group, set the layer_group_id to null.

Layer groups

Get details of a layer group

Delete a layer group

Create or update layer groups

Provide an array of layer group objects to create new groups or update existing ones.

For each layer group object, including an existing ID will result in the group's details (name, subtitle and legend order) being updated. If no layer group ID is provided (or a non-existent one is provided), a new layer group will be created.

Layer library

Listing layers

List all layers in your workspace's library, or the felt layer library. You can add a layer from the library to a map by using the duplicate_layers API endpoint and the layer ID provided by this endpoint.

Publishing a layer

Publish a layer to your workspace's library

Publishing a layer group

Publish a layer group to your workspace's library

Downloading layers

Get a link to export a layer as a GeoPackage (vector layers) or GeoTIFF (raster layers)

Create Custom Export Request

Create an export request of a layer as a GeoPackage, GeoJSON, or CSV. Optionally include filters with the layer. Export requests are asynchronous. A successful response will return a poll_endpoint to check the status of the export.

Poll Custom Export Request

Check the status of an Custom Export. If successful, the response will include a download_url

Duplicating layers

Duplicate an array of layers or layer groups to a map

Style, expressed in the

Styling layers
Felt Style Language
post
Authorizations
Path parameters
map_idstringRequired

The ID of the map hosting the layer to refresh

layer_idstringRequired

The ID of the layer to refresh

Responses
200
Refresh response
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
post
POST /api/v2/maps/{map_id}/layers/{layer_id}/refresh HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Accept: */*
{
  "layer_group_id": "luCHyMruTQ6ozGk3gPJfEB",
  "layer_id": "luCHyMruTQ6ozGk3gPJfEB",
  "presigned_attributes": {},
  "type": "upload_response",
  "url": "text"
}
delete
Authorizations
Path parameters
map_idstringRequired

The ID of the map to delete the layer from

layer_idstringRequired

The ID of the layer to delete

Responses
204
No Content
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
delete
DELETE /api/v2/maps/{map_id}/layers/{layer_id} HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Accept: */*

No content

get
Authorizations
Path parameters
map_idstringRequired
Responses
200
Layers list
application/json
401
UnauthorizedError
application/json
404
NotFoundError
application/json
500
InternalServerError
application/json
get
GET /api/v2/maps/{map_id}/layers HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Accept: */*
[
  {
    "caption": "text",
    "geometry_type": "Line",
    "hide_from_legend": true,
    "id": "luCHyMruTQ6ozGk3gPJfEB",
    "is_spreadsheet": true,
    "links": {
      "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
    },
    "metadata": {
      "attribution_text": "text",
      "attribution_url": "text",
      "description": "text",
      "license": "text",
      "source_abbreviation": "text",
      "source_name": "text",
      "source_url": "text",
      "updated_at": "2025-03-24"
    },
    "name": "text",
    "ordering_key": 1,
    "progress": 1,
    "refresh_period": "15 min",
    "status": "uploading",
    "style": {},
    "tile_url": "text",
    "type": "layer"
  }
]
get
Authorizations
Path parameters
map_idstringRequired
layer_idstringRequired
Responses
200
Layer
application/json
401
UnauthorizedError
application/json
404
NotFoundError
application/json
500
InternalServerError
application/json
get
GET /api/v2/maps/{map_id}/layers/{layer_id} HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Accept: */*
{
  "caption": "text",
  "geometry_type": "Line",
  "hide_from_legend": true,
  "id": "luCHyMruTQ6ozGk3gPJfEB",
  "is_spreadsheet": true,
  "links": {
    "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
  },
  "metadata": {
    "attribution_text": "text",
    "attribution_url": "text",
    "description": "text",
    "license": "text",
    "source_abbreviation": "text",
    "source_name": "text",
    "source_url": "text",
    "updated_at": "2025-03-24"
  },
  "name": "text",
  "ordering_key": 1,
  "progress": 1,
  "refresh_period": "15 min",
  "status": "uploading",
  "style": {},
  "tile_url": "text",
  "type": "layer"
}
get
Authorizations
Path parameters
map_idstringRequired
layer_group_idstringRequired
Responses
200
Layer Group
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
get
GET /api/v2/maps/{map_id}/layer_groups/{layer_group_id} HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Accept: */*
{
  "caption": "text",
  "id": "luCHyMruTQ6ozGk3gPJfEB",
  "layers": [
    {
      "caption": "text",
      "geometry_type": "Line",
      "hide_from_legend": true,
      "id": "luCHyMruTQ6ozGk3gPJfEB",
      "is_spreadsheet": true,
      "links": {
        "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
      },
      "metadata": {
        "attribution_text": "text",
        "attribution_url": "text",
        "description": "text",
        "license": "text",
        "source_abbreviation": "text",
        "source_name": "text",
        "source_url": "text",
        "updated_at": "2025-03-24"
      },
      "name": "text",
      "ordering_key": 1,
      "progress": 1,
      "refresh_period": "15 min",
      "status": "uploading",
      "style": {},
      "tile_url": "text",
      "type": "layer"
    }
  ],
  "links": {
    "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layer_groups/v13k4Ae9BRjCHHdPP5Fcm6D"
  },
  "name": "text",
  "ordering_key": 1,
  "type": "layer_group"
}
delete
Authorizations
Path parameters
map_idstringRequired

The ID of the map to delete the layer group from

layer_group_idstringRequired

The ID of the layer group to delete

Responses
204
No Content
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
delete
DELETE /api/v2/maps/{map_id}/layer_groups/{layer_group_id} HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Accept: */*

No content

get
Authorizations
Query parameters
sourcestring · enumOptional

Defaults to listing library layers for your "workspace". Use "felt" to list layers from the Felt data library. Use "all" to list layers from both sources.

Default: workspacePossible values:
Responses
200
LayerLibrary
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
get
GET /api/v2/library HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Accept: */*
{
  "layer_groups": [
    {
      "caption": "text",
      "id": "luCHyMruTQ6ozGk3gPJfEB",
      "layers": [
        {
          "caption": "text",
          "geometry_type": "Line",
          "hide_from_legend": true,
          "id": "luCHyMruTQ6ozGk3gPJfEB",
          "is_spreadsheet": true,
          "links": {
            "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
          },
          "metadata": {
            "attribution_text": "text",
            "attribution_url": "text",
            "description": "text",
            "license": "text",
            "source_abbreviation": "text",
            "source_name": "text",
            "source_url": "text",
            "updated_at": "2025-03-24"
          },
          "name": "text",
          "ordering_key": 1,
          "progress": 1,
          "refresh_period": "15 min",
          "status": "uploading",
          "style": {},
          "tile_url": "text",
          "type": "layer"
        }
      ],
      "links": {
        "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layer_groups/v13k4Ae9BRjCHHdPP5Fcm6D"
      },
      "name": "text",
      "ordering_key": 1,
      "type": "layer_group"
    }
  ],
  "layers": [
    {
      "caption": "text",
      "geometry_type": "Line",
      "hide_from_legend": true,
      "id": "luCHyMruTQ6ozGk3gPJfEB",
      "is_spreadsheet": true,
      "links": {
        "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
      },
      "metadata": {
        "attribution_text": "text",
        "attribution_url": "text",
        "description": "text",
        "license": "text",
        "source_abbreviation": "text",
        "source_name": "text",
        "source_url": "text",
        "updated_at": "2025-03-24"
      },
      "name": "text",
      "ordering_key": 1,
      "progress": 1,
      "refresh_period": "15 min",
      "status": "uploading",
      "style": {},
      "tile_url": "text",
      "type": "layer"
    }
  ],
  "type": "layer_library"
}
get
Authorizations
Path parameters
map_idstringRequired

The ID of the map where the layer is located

layer_idstringRequired

The ID of the layer to export

Responses
200
Export link
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
503
ServiceUnavailableError
application/json
get
GET /api/v2/maps/{map_id}/layers/{layer_id}/get_export_link HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Accept: */*
{
  "export_link": "text"
}
get
Authorizations
Path parameters
map_idstringRequired

The ID of the map where the layer is located

layer_idstringRequired

The ID of the layer to export

export_idstringRequired

The ID of the export

Responses
200
Custom export request status
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
get
GET /api/v2/maps/{map_id}/layers/{layer_id}/custom_exports/{export_id} HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Accept: */*
{
  "download_url": "https://us1.data-pipeline.felt.com/fcdfd96c-06fa-40b9-9ae9-ad034b5a66df/Felt-Export.zip",
  "export_id": "FZWQjWZJSZWvW3yn9BeV9AyA",
  "filters": [],
  "status": "completed"
}
  • Uploading a file or URL
  • POST/api/v2/maps/{map_id}/upload
  • Refreshing a layer
  • POST/api/v2/maps/{map_id}/layers/{layer_id}/refresh
  • Deleting a layer
  • DELETE/api/v2/maps/{map_id}/layers/{layer_id}
  • Styling layers
  • POST/api/v2/maps/{map_id}/layers/{layer_id}/update_style
  • Managing layers
  • GET/api/v2/maps/{map_id}/layers
  • GET/api/v2/maps/{map_id}/layers/{layer_id}
  • POST/api/v2/maps/{map_id}/layers
  • Layer groups
  • GET/api/v2/maps/{map_id}/layer_groups/{layer_group_id}
  • DELETE/api/v2/maps/{map_id}/layer_groups/{layer_group_id}
  • POST/api/v2/maps/{map_id}/layer_groups
  • Layer library
  • GET/api/v2/library
  • POST/api/v2/maps/{map_id}/layers/{layer_id}/publish
  • POST/api/v2/maps/{map_id}/layer_groups/{layer_group_id}/publish
  • Downloading layers
  • GET/api/v2/maps/{map_id}/layers/{layer_id}/get_export_link
  • Create Custom Export Request
  • POST/api/v2/maps/{map_id}/layers/{layer_id}/custom_export
  • Poll Custom Export Request
  • GET/api/v2/maps/{map_id}/layers/{layer_id}/custom_exports/{export_id}
  • Duplicating layers
  • POST/api/v2/duplicate_layers
post
Authorizations
Path parameters
map_idstringRequired

The ID of the map where the layer is located

layer_idstringRequired

The ID of the layer to update the style of

Body
styleobjectRequired

The new layer style, specified in Felt Style Language format

Responses
200
Layer
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
post
POST /api/v2/maps/{map_id}/layers/{layer_id}/update_style HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 12

{
  "style": {}
}
{
  "caption": "text",
  "geometry_type": "Line",
  "hide_from_legend": true,
  "id": "luCHyMruTQ6ozGk3gPJfEB",
  "is_spreadsheet": true,
  "links": {
    "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
  },
  "metadata": {
    "attribution_text": "text",
    "attribution_url": "text",
    "description": "text",
    "license": "text",
    "source_abbreviation": "text",
    "source_name": "text",
    "source_url": "text",
    "updated_at": "2025-03-24"
  },
  "name": "text",
  "ordering_key": 1,
  "progress": 1,
  "refresh_period": "15 min",
  "status": "uploading",
  "style": {},
  "tile_url": "text",
  "type": "layer"
}
post
Authorizations
Path parameters
map_idstringRequired
Body
captionstringOptionalExample: A very interesting dataset
idstring · felt_idRequiredExample: luCHyMruTQ6ozGk3gPJfEB
layer_group_idstring · felt_id | nullableOptionalExample: luCHyMruTQ6ozGk3gPJfEB
namestringOptionalExample: My Layer
ordering_keyintegerOptional
refresh_periodstring · enumOptionalPossible values:
subtitlestringOptionalDeprecated

Deprecated: use caption instead.

Responses
200
Layer list
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
post
POST /api/v2/maps/{map_id}/layers HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 373

[
  {
    "caption": "A very interesting dataset",
    "id": "luCHyMruTQ6ozGk3gPJfEB",
    "layer_group_id": "luCHyMruTQ6ozGk3gPJfEB",
    "metadata": {
      "attribution_text": "text",
      "attribution_url": "text",
      "description": "text",
      "license": "text",
      "source_abbreviation": "text",
      "source_name": "text",
      "source_url": "text",
      "updated_at": "2025-03-24"
    },
    "name": "My Layer",
    "ordering_key": 1,
    "refresh_period": "15 min"
  }
]
[
  {
    "caption": "text",
    "geometry_type": "Line",
    "hide_from_legend": true,
    "id": "luCHyMruTQ6ozGk3gPJfEB",
    "is_spreadsheet": true,
    "links": {
      "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
    },
    "metadata": {
      "attribution_text": "text",
      "attribution_url": "text",
      "description": "text",
      "license": "text",
      "source_abbreviation": "text",
      "source_name": "text",
      "source_url": "text",
      "updated_at": "2025-03-24"
    },
    "name": "text",
    "ordering_key": 1,
    "progress": 1,
    "refresh_period": "15 min",
    "status": "uploading",
    "style": {},
    "tile_url": "text",
    "type": "layer"
  }
]
post
Authorizations
Path parameters
map_idstringRequired
Body
captionstringOptionalDeprecatedExample: A very interesting group
idstring · felt_idOptionalExample: luCHyMruTQ6ozGk3gPJfEB
namestringRequiredExample: My Layer Group
ordering_keyintegerOptional
subtitlestringOptionalDeprecated

Deprecated: use caption instead.

Responses
200
LayerGroup list
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
post
POST /api/v2/maps/{map_id}/layer_groups HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 74

[
  {
    "id": "luCHyMruTQ6ozGk3gPJfEB",
    "name": "My Layer Group",
    "ordering_key": 1
  }
]
[
  {
    "caption": "text",
    "id": "luCHyMruTQ6ozGk3gPJfEB",
    "layers": [
      {
        "caption": "text",
        "geometry_type": "Line",
        "hide_from_legend": true,
        "id": "luCHyMruTQ6ozGk3gPJfEB",
        "is_spreadsheet": true,
        "links": {
          "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
        },
        "metadata": {
          "attribution_text": "text",
          "attribution_url": "text",
          "description": "text",
          "license": "text",
          "source_abbreviation": "text",
          "source_name": "text",
          "source_url": "text",
          "updated_at": "2025-03-24"
        },
        "name": "text",
        "ordering_key": 1,
        "progress": 1,
        "refresh_period": "15 min",
        "status": "uploading",
        "style": {},
        "tile_url": "text",
        "type": "layer"
      }
    ],
    "links": {
      "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layer_groups/v13k4Ae9BRjCHHdPP5Fcm6D"
    },
    "name": "text",
    "ordering_key": 1,
    "type": "layer_group"
  }
]
post
Authorizations
Path parameters
map_idstringRequired

The ID of the map where the layer is located

layer_idstringRequired

The ID of the layer to publish

Body
namestringOptional

The name to publish the layer under

Example: My Layer
Responses
200
Publish layer response
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
post
POST /api/v2/maps/{map_id}/layers/{layer_id}/publish HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 19

{
  "name": "My Layer"
}
{
  "caption": "text",
  "geometry_type": "Line",
  "hide_from_legend": true,
  "id": "luCHyMruTQ6ozGk3gPJfEB",
  "is_spreadsheet": true,
  "links": {
    "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
  },
  "metadata": {
    "attribution_text": "text",
    "attribution_url": "text",
    "description": "text",
    "license": "text",
    "source_abbreviation": "text",
    "source_name": "text",
    "source_url": "text",
    "updated_at": "2025-03-24"
  },
  "name": "text",
  "ordering_key": 1,
  "progress": 1,
  "refresh_period": "15 min",
  "status": "uploading",
  "style": {},
  "tile_url": "text",
  "type": "layer"
}
post
Authorizations
Path parameters
map_idstringRequired

The ID of the map where the layer group is located

layer_group_idstringRequired

The ID of the layer group to publish

Body
namestringOptional

The name to publish the layer group under

Example: My Layer
Responses
200
Publish layer group response
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
post
POST /api/v2/maps/{map_id}/layer_groups/{layer_group_id}/publish HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 19

{
  "name": "My Layer"
}
{
  "caption": "text",
  "id": "luCHyMruTQ6ozGk3gPJfEB",
  "layers": [
    {
      "caption": "text",
      "geometry_type": "Line",
      "hide_from_legend": true,
      "id": "luCHyMruTQ6ozGk3gPJfEB",
      "is_spreadsheet": true,
      "links": {
        "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
      },
      "metadata": {
        "attribution_text": "text",
        "attribution_url": "text",
        "description": "text",
        "license": "text",
        "source_abbreviation": "text",
        "source_name": "text",
        "source_url": "text",
        "updated_at": "2025-03-24"
      },
      "name": "text",
      "ordering_key": 1,
      "progress": 1,
      "refresh_period": "15 min",
      "status": "uploading",
      "style": {},
      "tile_url": "text",
      "type": "layer"
    }
  ],
  "links": {
    "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layer_groups/v13k4Ae9BRjCHHdPP5Fcm6D"
  },
  "name": "text",
  "ordering_key": 1,
  "type": "layer_group"
}
post
Authorizations
Path parameters
map_idstringRequired

The ID of the map where the layer is located

layer_idstringRequired

The ID of the layer to export

Body
email_on_completionbooleanOptional

Send an email to the requesting user when the export completes. Defaults to true

output_formatstring · enumRequiredExample: csvPossible values:
Responses
200
Custom export response
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
503
ServiceUnavailableError
application/json
post
POST /api/v2/maps/{map_id}/layers/{layer_id}/custom_export HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 63

{
  "email_on_completion": true,
  "filters": [],
  "output_format": "csv"
}
{
  "export_request_id": "luCHyMruTQ6ozGk3gPJfEB",
  "poll_endpoint": "http://felt.com/api/v2/maps/vAbZ5eKqRoGe4sCH8nHW8D/layers/7kF9Cfz45TUWIiuuWV8uZ7A/custom_exports/auFxn9BO4RrGGiKrGfaS7ZB"
}
post
Authorizations
Body
itemsone ofOptional
or
Responses
200
Duplicate Layers Response
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
post
POST /api/v2/duplicate_layers HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 92

[
  {
    "destination_map_id": "luCHyMruTQ6ozGk3gPJfEB",
    "source_layer_id": "luCHyMruTQ6ozGk3gPJfEB"
  }
]
{
  "layer_groups": [
    {
      "caption": "text",
      "id": "luCHyMruTQ6ozGk3gPJfEB",
      "layers": [
        {
          "caption": "text",
          "geometry_type": "Line",
          "hide_from_legend": true,
          "id": "luCHyMruTQ6ozGk3gPJfEB",
          "is_spreadsheet": true,
          "links": {
            "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
          },
          "metadata": {
            "attribution_text": "text",
            "attribution_url": "text",
            "description": "text",
            "license": "text",
            "source_abbreviation": "text",
            "source_name": "text",
            "source_url": "text",
            "updated_at": "2025-03-24"
          },
          "name": "text",
          "ordering_key": 1,
          "progress": 1,
          "refresh_period": "15 min",
          "status": "uploading",
          "style": {},
          "tile_url": "text",
          "type": "layer"
        }
      ],
      "links": {
        "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layer_groups/v13k4Ae9BRjCHHdPP5Fcm6D"
      },
      "name": "text",
      "ordering_key": 1,
      "type": "layer_group"
    }
  ],
  "layers": [
    {
      "caption": "text",
      "geometry_type": "Line",
      "hide_from_legend": true,
      "id": "luCHyMruTQ6ozGk3gPJfEB",
      "is_spreadsheet": true,
      "links": {
        "self": "https://felt.com/api/v2/maps/V0dnOMOuTd9B9BOsL9C0UjmqC/layers/k441enUxQUOnZqc1ZvNsDA"
      },
      "metadata": {
        "attribution_text": "text",
        "attribution_url": "text",
        "description": "text",
        "license": "text",
        "source_abbreviation": "text",
        "source_name": "text",
        "source_url": "text",
        "updated_at": "2025-03-24"
      },
      "name": "text",
      "ordering_key": 1,
      "progress": 1,
      "refresh_period": "15 min",
      "status": "uploading",
      "style": {},
      "tile_url": "text",
      "type": "layer"
    }
  ]
}
post
Authorizations
Path parameters
map_idstringRequired

The ID of the map to upload the layer to.

Body
import_urlstringOptional

A public URL containing geodata to import, in place of uploading a file.

latnumberOptional

(Image uploads only) The latitude of the image center.

lngnumberOptional

(Image uploads only) The longitude of the image center.

namestringRequired

The display name for the new layer.

zoomnumberOptional

(Image uploads only) The zoom level of the image.

Responses
200
Upload layer response
application/json
401
UnauthorizedError
application/json
403
UnauthorizedError
application/json
404
NotFoundError
application/json
422
Unprocessable Entity
application/json
429
Unprocessable Entity
application/json
500
InternalServerError
application/json
post
POST /api/v2/maps/{map_id}/upload HTTP/1.1
Host: felt.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 311

{
  "hints": [
    {
      "attributes": {
        "lat": "text",
        "lng": "text"
      }
    }
  ],
  "import_url": "text",
  "lat": 1,
  "lng": 1,
  "metadata": {
    "attribution_text": "text",
    "attribution_url": "text",
    "description": "text",
    "license": "text",
    "source_abbreviation": "text",
    "source_name": "text",
    "source_url": "text",
    "updated_at": "2025-03-24"
  },
  "name": "text",
  "zoom": 1
}
{
  "layer_group_id": "luCHyMruTQ6ozGk3gPJfEB",
  "layer_id": "luCHyMruTQ6ozGk3gPJfEB",
  "presigned_attributes": {},
  "type": "upload_response",
  "url": "text"
}
Upload Anything