Programmatically read and write geographic features from your projects. Available on the Pro plan. All responses are GeoJSON or JSON. All requests must include an Authorization: Bearer <api-key> header.
| Plan | Calls / month | Max features / call |
|---|---|---|
| Pro | 1,000 | 1,000 |
The X-Rate-Limit-Remaining header is included on every response. Counter resets on your billing date each month.
/api/v1/projectsCreate a new project. Returns the project ID immediately — use it with the layers and features endpoints.
Request body
{
"name": "My project",
"isPublic": false
}| Field | Type | Description |
|---|---|---|
| name | string | Required. Project display name. |
| isPublic | boolean | Optional. Default false. If true, the project is visible on your public profile. |
curl -X POST "https://wktstudio.com/api/v1/projects" \
-H "Authorization: Bearer wkt_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"name":"Lima boundaries","isPublic":false}'{
"id": "vDiwpjtwJ4Ci4LspDjFF",
"name": "Lima boundaries",
"ownerId": "uid_1234",
"isPublic": false,
"createdAt": "2026-06-03T22:00:00.000Z"
}The new project comes with one empty default layer. Use POST /api/v1/projects/{id}/layers to add more layers or populate them with features.
/api/v1/projects/{projectId}/layersList all layers in the project (metadata only, no features).
curl "https://wktstudio.com/api/v1/projects/abc123/layers" \
-H "Authorization: Bearer wkt_live_xxxxxxxx"{
"layers": [
{
"id": "layer_1748000000000",
"name": "Lima polygons",
"visible": true
}
]
}/api/v1/projects/{projectId}/layersCreate a new layer in a project. Optionally include features to populate the features subcollection immediately.
Request body
{
"name": "My layer",
"features": [
{
"type": "Feature",
"geometry": { "type": "Polygon", "coordinates": [[...]] },
"properties": {
"name": "Zone A",
"color": "#6366f1"
}
}
]
}features is optional — omit it to create an empty layer.
curl -X POST "https://wktstudio.com/api/v1/projects/abc123/layers" \
-H "Authorization: Bearer wkt_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Lima polygons",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [[[-77.0428,-12.0464],[-77.0328,-12.0464],[-77.0328,-12.0364],[-77.0428,-12.0364],[-77.0428,-12.0464]]]
},
"properties": {
"name": "Plaza Mayor",
"color": "#ff5733"
}
}
]
}'{ "layerId": "layer_1748000000000", "name": "Lima polygons", "featuresAdded": 1 }/api/v1/projects/{projectId}/featuresReturns all features in a project as a GeoJSON FeatureCollection with query filters.
Query parameters
| Param | Type | Description |
|---|---|---|
| layer | string | Filter by layer ID |
| name | string | Filter features by name (contains) |
| bbox | string | Bounding box: minLng,minLat,maxLng,maxLat |
| limit | number | Max results (default 100, max 1,000) |
| offset | number | Pagination offset (default 0) |
curl "https://wktstudio.com/api/v1/projects/abc123/features?bbox=-77.1,-12.1,-76.9,-11.9&limit=50" \
-H "Authorization: Bearer wkt_live_xxxxxxxx"{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "fid_1234567890abcdef",
"geometry": { "type": "Polygon", "coordinates": [[...]] },
"properties": {
"name": "Zona 1",
"_layerId": "layer_1234",
"_layerName": "Lima polygons",
"_wkt": "POLYGON((-77.03 -12.04, ...))"
}
}
],
"meta": { "total": 42, "limit": 50, "offset": 0, "hasMore": false, "projectId": "abc123", "projectName": "My Project" }
}/api/v1/projects/{projectId}/featuresAppend features to an existing layer. Does not replace existing features.
Request body
{
"layerId": "layer_1234",
"features": [
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [-77.03, -12.04] },
"properties": {
"name": "Lima Centro",
"color": "#ff5733"
}
}
]
}curl -X POST "https://wktstudio.com/api/v1/projects/abc123/features" \
-H "Authorization: Bearer wkt_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"layerId":"layer_1234","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-77.03,-12.04]},"properties":{"name":"Lima Centro","color":"#ff5733"}}]}'{ "added": 1, "total": 43, "featureIds": ["fid_1234567890abcdef"] }/api/v1/projects/{projectId}/featuresDelete a single feature by featureId (recommended) or index (deprecated).
Request body
{
"layerId": "layer_1234",
"featureId": "fid_1234567890abcdef",
"featureIndex": 0
}featureId is the recommended identifier. If using featureIndex, it is zero-based and deprecated.
curl -X DELETE "https://wktstudio.com/api/v1/projects/abc123/features" \
-H "Authorization: Bearer wkt_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"layerId":"layer_1234","featureId":"fid_1234567890abcdef"}'{ "deleted": true, "featureId": "fid_1234567890abcdef" }| Status | Meaning |
|---|---|
| 401 | Missing or malformed Authorization header |
| 403 | Invalid API key, wrong plan, or no access to project |
| 404 | Project or layer not found |
| 422 | Feature limit exceeded or invalid featureIndex |
| 429 | Monthly API call limit reached |
Need higher limits? Upgrade to Pro →