API Reference

OpenAPIRun in Postman

WKT Studio REST API

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.

Manage your API keys from Settings → API Keys.

Rate Limits

PlanCalls / monthMax features / call
Pro1,0001,000

The X-Rate-Limit-Remaining header is included on every response. Counter resets on your billing date each month.

Endpoints

Projects

POST/api/v1/projects

Create a new project. Returns the project ID immediately — use it with the layers and features endpoints.

Request body

json
{
  "name": "My project",
  "isPublic": false
}
FieldTypeDescription
namestringRequired. Project display name.
isPublicbooleanOptional. Default false. If true, the project is visible on your public profile.
curl
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}'
response
{
  "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.

Layers

GET/api/v1/projects/{projectId}/layers

List all layers in the project (metadata only, no features).

curl
curl "https://wktstudio.com/api/v1/projects/abc123/layers" \
     -H "Authorization: Bearer wkt_live_xxxxxxxx"
response
{
  "layers": [
    {
      "id": "layer_1748000000000",
      "name": "Lima polygons",
      "visible": true
    }
  ]
}
POST/api/v1/projects/{projectId}/layers

Create a new layer in a project. Optionally include features to populate the features subcollection immediately.

Request body

json
{
  "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
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"
           }
         }
       ]
     }'
response
{ "layerId": "layer_1748000000000", "name": "Lima polygons", "featuresAdded": 1 }

Features

GET/api/v1/projects/{projectId}/features

Returns all features in a project as a GeoJSON FeatureCollection with query filters.

Query parameters

ParamTypeDescription
layerstringFilter by layer ID
namestringFilter features by name (contains)
bboxstringBounding box: minLng,minLat,maxLng,maxLat
limitnumberMax results (default 100, max 1,000)
offsetnumberPagination offset (default 0)
curl
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"
response
{
  "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" }
}
POST/api/v1/projects/{projectId}/features

Append features to an existing layer. Does not replace existing features.

Request body

json
{
  "layerId": "layer_1234",
  "features": [
    {
      "type": "Feature",
      "geometry": { "type": "Point", "coordinates": [-77.03, -12.04] },
      "properties": { 
        "name": "Lima Centro",
        "color": "#ff5733"
      }
    }
  ]
}
curl
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"}}]}'
response
{ "added": 1, "total": 43, "featureIds": ["fid_1234567890abcdef"] }
DELETE/api/v1/projects/{projectId}/features

Delete a single feature by featureId (recommended) or index (deprecated).

Request body

json
{
  "layerId": "layer_1234",
  "featureId": "fid_1234567890abcdef",
  "featureIndex": 0
}

featureId is the recommended identifier. If using featureIndex, it is zero-based and deprecated.

curl
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"}'
response
{ "deleted": true, "featureId": "fid_1234567890abcdef" }

Error codes

StatusMeaning
401Missing or malformed Authorization header
403Invalid API key, wrong plan, or no access to project
404Project or layer not found
422Feature limit exceeded or invalid featureIndex
429Monthly API call limit reached

Need higher limits? Upgrade to Pro →