All integrations

Felt

DATA · DATA & ANALYTICS

Maps, layers, layer groups, elements, comments, and projects in the workspace they connected.

Acts as the person, not as itself

Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.

Credentials never touch the agent

Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.

Every call on the record

Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.

What an agent can do

Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.

felt_delete_maps_by_map_idWRITE

Delete map via DELETE /maps/{map_id}. Felt answers 204 with no body, so a successful call returns an empty object. DESTRUCTIVE and not reversible through this API: the contract publishes no undelete.

api
felt_delete_maps_by_map_id_comments_by_comment_idWRITE

Delete map comment via DELETE /maps/{map_id}/comments/{comment_id}. Felt answers 204 with no body, so a successful call returns an empty object. DESTRUCTIVE and not reversible through this API: the contract publishes no undelete.

api
felt_delete_maps_by_map_id_elements_by_element_idWRITE

Delete map element via DELETE /maps/{map_id}/elements/{element_id}. Felt answers 204 with no body, so a successful call returns an empty object. DESTRUCTIVE and not reversible through this API: the contract publishes no undelete.

api
felt_delete_maps_by_map_id_layer_groups_by_layer_group_idWRITE

Delete map layer group via DELETE /maps/{map_id}/layer_groups/{layer_group_id}. Felt answers 204 with no body, so a successful call returns an empty object. DESTRUCTIVE and not reversible through this API: the contract publishes no undelete.

api
felt_delete_maps_by_map_id_layers_by_layer_idWRITE

Delete map layer via DELETE /maps/{map_id}/layers/{layer_id}. Felt answers 204 with no body, so a successful call returns an empty object. DESTRUCTIVE and not reversible through this API: the contract publishes no undelete.

api
felt_delete_maps_by_map_id_layers_by_layer_id_components_by_component_idWRITE

Delete layer component via DELETE /maps/{map_id}/layers/{layer_id}/components/{component_id}. Felt answers 204 with no body, so a successful call returns an empty object. DESTRUCTIVE and not reversible through this API: the contract publishes no undelete.

api
felt_delete_projects_by_project_idWRITE

Delete project via DELETE /projects/{project_id}. Felt answers 204 with no body, so a successful call returns an empty object. DESTRUCTIVE and not reversible through this API: the contract publishes no undelete.

api
felt_delete_sources_by_source_idWRITE

Delete source via DELETE /sources/{source_id}. Felt answers 204 with no body, so a successful call returns an empty object. DESTRUCTIVE and not reversible through this API: the contract publishes no undelete.

api
felt_delete_sources_by_source_id_credentials_by_credential_idWRITE

Delete source credential via DELETE /sources/{source_id}/credentials/{credential_id}. Felt answers 204 with no body, so a successful call returns an empty object. DESTRUCTIVE and not reversible through this API: the contract publishes no undelete.

api
felt_get_libraryREAD

List library layers via GET /library. Lists library layers. `source` selects whose library: `workspace` (the default), `felt` for the Felt data library, or `all` for both.

api
felt_get_maps_by_map_idREAD

Show map via GET /maps/{map_id}.

api
felt_get_maps_by_map_id_comments_exportREAD

Export map comments via GET /maps/{map_id}/comments/export. Exports the map's comment threads as an array. `format` selects the export representation; Felt's contract declares the parameter without enumerating its values, so an unrecognised one is answered by Felt rather than refused here.

api
felt_get_maps_by_map_id_element_groupsREAD

List map element groups via GET /maps/{map_id}/element_groups.

api
felt_get_maps_by_map_id_element_groups_by_group_idREAD

Show map element group via GET /maps/{map_id}/element_groups/{group_id}.

api
felt_get_maps_by_map_id_elementsREAD

List map elements via GET /maps/{map_id}/elements.

api
felt_get_maps_by_map_id_layer_groupsREAD

List map layer groups via GET /maps/{map_id}/layer_groups.

api
felt_get_maps_by_map_id_layer_groups_by_layer_group_idREAD

Show map layer group via GET /maps/{map_id}/layer_groups/{layer_group_id}.

api
felt_get_maps_by_map_id_layersREAD

List map layers via GET /maps/{map_id}/layers.

api
felt_get_maps_by_map_id_layers_by_layer_idREAD

Show map layer via GET /maps/{map_id}/layers/{layer_id}.

api
felt_get_maps_by_map_id_layers_by_layer_id_componentsREAD

List layer components via GET /maps/{map_id}/layers/{layer_id}/components.

api
felt_get_maps_by_map_id_layers_by_layer_id_components_by_component_idREAD

Show layer component via GET /maps/{map_id}/layers/{layer_id}/components/{component_id}.

api
felt_get_maps_by_map_id_layers_by_layer_id_custom_exports_by_export_idREAD

Poll map layer custom export via GET /maps/{map_id}/layers/{layer_id}/custom_exports/{export_id}. Reads one custom export's current state. This is the poll for the custom-export tool.

api
felt_get_maps_by_map_id_layers_by_layer_id_get_export_linkREAD

Create map layer export link via GET /maps/{map_id}/layers/{layer_id}/get_export_link. Returns a URL (`export_link`) to fetch the layer's data from, not the data itself. The link is Felt's to issue and expire; nothing here follows it, and the connector never follows a redirect.

api
felt_get_projectsREAD

List projects via GET /projects.

api
felt_get_projects_by_project_idREAD

Show project via GET /projects/{project_id}.

api
felt_get_sourcesREAD

List sources via GET /sources.

api
felt_get_sources_by_source_idREAD

Show source via GET /sources/{source_id}.

api
felt_get_userREAD

Show current user via GET /user. Reports the authenticated Felt user (id, name, email) for the token this connection holds, which is also how a token is checked: Felt's own Authentication page uses this exact call to confirm a token works. It takes no arguments and cannot read another user.

api
felt_post_duplicate_layersWRITE

Duplicate map layers via POST /duplicate_layers. Copies layers or layer groups BETWEEN maps in one call -- each array item names a `source_layer_id` or a `source_layer_group_id` plus a `destination_map_id` -- so this is the one tool whose effect is not confined to a map named in the path. The request body is a JSON ARRAY, one object per item. Whether an item that is OMITTED from the array is left alone or REMOVED is not stated by Felt's contract and was not measurable for this build (no Felt token exists), so send the full intended set and verify with a read before relying on either behaviour.

api
felt_post_mapsWRITE

Create map via POST /maps.

api
felt_post_maps_by_map_id_add_source_layerWRITE

Add map layer from source via POST /maps/{map_id}/add_source_layer. Felt answers 202 Accepted: the work is QUEUED, not finished, when this call returns. The contract records no async-job resource for it, so read the source or the map's layers back to see the result land.

api
felt_post_maps_by_map_id_comments_by_comment_id_resolveWRITE

Resolve map comment via POST /maps/{map_id}/comments/{comment_id}/resolve.

api
felt_post_maps_by_map_id_duplicateWRITE

Duplicate map via POST /maps/{map_id}/duplicate. Copies the map and its data into a project or folder you name. The copy is a new map with a new id; nothing about the original changes.

api
felt_post_maps_by_map_id_element_groupsWRITE

Upsert map element groups via POST /maps/{map_id}/element_groups. The request body is a JSON ARRAY, one object per item. Whether an item that is OMITTED from the array is left alone or REMOVED is not stated by Felt's contract and was not measurable for this build (no Felt token exists), so send the full intended set and verify with a read before relying on either behaviour.

api
felt_post_maps_by_map_id_elementsWRITE

Upsert map elements via POST /maps/{map_id}/elements.

api
felt_post_maps_by_map_id_embed_tokenWRITE

Create map embed token via POST /maps/{map_id}/embed_token. Mints a short-lived embed token for ONE named viewer: `user_email` is required, and the response carries `token` plus `expires_at`. The token it returns is a credential for that viewer's browser, so treat the result as secret.

api
felt_post_maps_by_map_id_image_exportsWRITE

Create map image export via POST /maps/{map_id}/image_exports.

api
felt_post_maps_by_map_id_layer_groupsWRITE

Update map layer groups via POST /maps/{map_id}/layer_groups. The request body is a JSON ARRAY, one object per item. Whether an item that is OMITTED from the array is left alone or REMOVED is not stated by Felt's contract and was not measurable for this build (no Felt token exists), so send the full intended set and verify with a read before relying on either behaviour.

api
felt_post_maps_by_map_id_layer_groups_by_layer_group_idWRITE

Update map layer group via POST /maps/{map_id}/layer_groups/{layer_group_id}.

api
felt_post_maps_by_map_id_layer_groups_by_layer_group_id_publishWRITE

Publish map layer group via POST /maps/{map_id}/layer_groups/{layer_group_id}/publish.

api
felt_post_maps_by_map_id_layersWRITE

Update map layer via POST /maps/{map_id}/layers. The request body is a JSON ARRAY, one object per item. Whether an item that is OMITTED from the array is left alone or REMOVED is not stated by Felt's contract and was not measurable for this build (no Felt token exists), so send the full intended set and verify with a read before relying on either behaviour.

api
felt_post_maps_by_map_id_layers_by_layer_id_componentsWRITE

Create layer component via POST /maps/{map_id}/layers/{layer_id}/components.

api
felt_post_maps_by_map_id_layers_by_layer_id_components_by_component_idWRITE

Update layer component via POST /maps/{map_id}/layers/{layer_id}/components/{component_id}.

api
felt_post_maps_by_map_id_layers_by_layer_id_custom_exportWRITE

Create map layer custom export via POST /maps/{map_id}/layers/{layer_id}/custom_export. Starts a custom layer export and answers with the export record. Poll it with the custom-export read tool (`felt_get_maps_by_map_id_layers_by_layer_id_custom_exports_by_export_id`); the ledger records no async-job contract, so there is no other completion signal than that read.

api
felt_post_maps_by_map_id_layers_by_layer_id_publishWRITE

Publish map layer via POST /maps/{map_id}/layers/{layer_id}/publish.

api
felt_post_maps_by_map_id_layers_by_layer_id_refreshWRITE

Refresh map layer via POST /maps/{map_id}/layers/{layer_id}/refresh. Asks Felt to refresh the layer from its source now. It does not wait: read the layer back to see `last_refreshed_at` move.

api
felt_post_maps_by_map_id_layers_by_layer_id_update_styleWRITE

Update map layer style via POST /maps/{map_id}/layers/{layer_id}/update_style.

api
felt_post_maps_by_map_id_moveWRITE

Move map via POST /maps/{map_id}/move. Moves the map to another project OR another folder -- the body is a `oneOf` and exactly one of `project_id` / `folder_id` is sent. Moving a map changes who can see it, because visibility is the project's.

api
felt_post_maps_by_map_id_updateWRITE

Update map via POST /maps/{map_id}/update.

api
felt_post_maps_by_map_id_uploadWRITE

Upload map layer via POST /maps/{map_id}/upload. Creates a layer by UPLOAD and answers with the layer plus the presigned upload target Felt expects the file to be PUT to. Agentic Fabriq does not transfer the file: this tool arranges the upload, and the transfer happens against the URL Felt returns.

api
felt_post_projectsWRITE

Create project via POST /projects.

api
felt_post_projects_by_project_id_updateWRITE

Update project via POST /projects/{project_id}/update.

api
felt_post_sourcesWRITE

Create source via POST /sources. Felt answers 202 Accepted: the work is QUEUED, not finished, when this call returns. The contract records no async-job resource for it, so read the source or the map's layers back to see the result land.

api
felt_post_sources_by_source_id_credentialsWRITE

Create source credential via POST /sources/{source_id}/credentials. Stores a credential FELT will use to reach the customer's own data source (Snowflake, Postgres, BigQuery, an OAuth M2M client ...). The secret in this body is the customer's source credential, not their Felt token, and it is written to Felt rather than read back: Felt's source reads never return it. Felt answers 202 Accepted: the work is QUEUED, not finished, when this call returns. The contract records no async-job resource for it, so read the source or the map's layers back to see the result land.

api
felt_post_sources_by_source_id_credentials_by_credential_id_updateWRITE

Update source credential via POST /sources/{source_id}/credentials/{credential_id}/update. Replaces a stored source credential. Same warning as creating one: the body carries the customer's own database or OAuth secret. Felt answers 202 Accepted: the work is QUEUED, not finished, when this call returns. The contract records no async-job resource for it, so read the source or the map's layers back to see the result land.

api
felt_post_sources_by_source_id_syncWRITE

Sync source via POST /sources/{source_id}/sync. Felt answers 202 Accepted: the work is QUEUED, not finished, when this call returns. The contract records no async-job resource for it, so read the source or the map's layers back to see the result land.

api
felt_post_sources_by_source_id_updateWRITE

Update source via POST /sources/{source_id}/update. Felt answers 202 Accepted: the work is QUEUED, not finished, when this call returns. The contract records no async-job resource for it, so read the source or the map's layers back to see the result land.

api

Put Felt behind one governed endpoint.

Same permissions, same audit trail, whatever else you connect next.