Project Shapefiles (Map Layers) API Reference
The project routes under /v1/projects/{projectId}/shapefiles work with the map layers in a single project. They follow the same workflows as the top-level routes. Read the Shapefiles (Map Layers) API Reference first: it covers the zip upload and GeoJSON workflows, jobs, name rules and limits.
This page covers what is different on a project route.
Differences from the Top-Level Routes
| Operation | On a project route |
|---|---|
List, get, HEAD, features | Only layers in this project. Company layers are not included. There are no scope or projectId filters; name is supported. |
| Create (zip import or GeoJSON) | The layer is always created in this project. Don't send scope or projectIds. |
| Zip uploads | An upload reserved on /v1/projects/{projectId}/shapefiles/uploads must be imported on the same project's /uploads/{uploadId}. |
Update (PATCH) | Not available. Use PATCH /v1/shapefiles to rename a layer or change its projects. |
| Delete | Removes the layer from this project, and only deletes it if no other project uses it. See below. |
| Jobs | Only upload and delete jobs that involved this project. |
projectIds on each layer still lists every project the layer belongs to, not just this one.
Name Rules in a Project
A layer created on a project route can't use a name already used by:
- another layer in this project, or
- any company layer.
A conflict returns 409. See Layer Names for the response body and how to resolve it.
Deleting from a Project
DELETE /v1/projects/66aa1b2c3d4e5f6a7b8c9d0e/shapefiles/6703e9a1b2c3d4e5f6a7b8c9
The result depends on which projects use the layer:
| The layer belongs to | Result | Response |
|---|---|---|
| Only this project | The layer is deleted, in the background | 202 with a delete jobId |
| This project and others | The layer is removed from this project and stays in the others | 200, immediately |
| Not this project, or it is a company layer | Nothing changes | 404 |
When the layer is removed from this project only:
{
"id": "6703e9a1b2c3d4e5f6a7b8c9",
"result": "unlinked",
"remainingProjectIds": ["66bb1b2c3d4e5f6a7b8c9d0f"]
}
The name is available in this project straight away, so you can create a new layer with the same name without waiting. After a 202, wait for the delete job to succeed before re-using the name.
To delete a shared layer from every project at once, use DELETE /v1/shapefiles/{id}. Company layers can only be deleted there.
Example: Upload a Zip into a Project
POST /v1/projects/{projectId}/shapefiles/uploads → uploadId, uploadUrl
PUT <uploadUrl> → upload the zip to cloud storage
POST /v1/projects/{projectId}/shapefiles/uploads/{uploadId} → 202 { jobId }
GET /v1/projects/{projectId}/shapefiles/jobs/{jobId} → poll until successful
The import body has only the layer's details:
{
"name": "DSU Outlines",
"description": "Q3 DSUs",
"color": "#a0a0a0"
}
See Workflow A: Upload a Shapefile Zip for each step in detail.