Versioned API v1 reference
Versioned API v1 endpoint authentication, parameters, request and response contracts.
Last updated:
On this page
GET /api/v1/openapi.jsonGET /api/v1/docsGET /api/v1/meGET /api/v1/projectsGET /api/v1/projects/{pid}GET /api/v1/projects/{pid}/featuresGET /api/v1/projects/{pid}/features/{fid}GET /api/v1/projects/{pid}/equipmentGET /api/v1/projects/{pid}/connectionsGET /api/v1/projects/{pid}/circuitsGET /api/v1/projects/{pid}/changesPOST /api/v1/projects/{pid}/editPaths, methods, parameters and available schemas are generated from the OpenAPI document in the repository.
Download the OpenAPI definition · Download the Postman collection · Quick start
GET /api/v1/openapi.json
v1 OpenAPI schema
Download the installation OpenAPI document containing only v1 endpoints.
Authentication: Authentication not required Scope: None
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
openapi | string | Yes | |
info | object | Yes | |
paths | object | Yes | |
components | object | No |
For error meanings and client actions, see the error code glossary.
Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/openapi.json"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/openapi.json',
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/openapi.json`, {
method: "GET",
headers: {},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"openapi": "3.1.0",
"info": {
"title": "SoSoMaps API",
"version": "1"
},
"paths": {}
}GET /api/v1/docs
v1 usage documentation
Read the installation v1 usage documentation as HTML.
Authentication: Authentication not required Scope: None
Responses
HTTP 200
text/html
Type: string.
{
"type": "string"
}For error meanings and client actions, see the error code glossary.
Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/docs"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/docs',
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/docs`, {
method: "GET",
headers: {},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
<!doctype html><html lang="tr">…</html>GET /api/v1/me
Key identity
Read the user identity and safe metadata for the key in use; the response does not include the key secret.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku; current user permissions and the key project scope
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
user | object | Yes | |
anahtar | object | Yes |
Error handling
[
"401 anahtar",
"403 yetki/kapsam",
"404 bulunamadi",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/me" -H "Authorization: Bearer $ERISIM_ANAHTARI"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/me',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/me`, {
method: "GET",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"user": {
"id": 42,
"username": "ornek-kullanici",
"full_name": "Örnek Kullanıcı",
"org_id": 7
},
"anahtar": {
"id": 9,
"ad": "Envanter okuma",
"kapsam": [
"oku"
],
"proje_ids": [
123
],
"bitis_at": null
}
}GET /api/v1/projects
Accessible projects
Read main projects in the intersection of key project scope and current owner access. The response is a direct array.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku; current user permissions and the key project scope
Responses
HTTP 200
application/json
Type: array.
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | |
org_id | integer | Yes | |
name | string | Yes | |
description | string | null | Yes | |
archived | boolean | Yes | |
modules | string[] | Yes | |
updated_at | string | Yes | |
erisim | string | Yes |
Error handling
[
"401 anahtar",
"403 yetki/kapsam",
"404 bulunamadi",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/projects" -H "Authorization: Bearer $ERISIM_ANAHTARI"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/projects',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/projects`, {
method: "GET",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
[
{
"id": 123,
"org_id": 7,
"name": "Örnek fiber projesi",
"description": "Eğitim kaydı",
"archived": false,
"modules": [
"saha",
"fiber"
],
"updated_at": "2026-11-10T09:00:00+00:00",
"erisim": "kurum"
}
]GET /api/v1/projects/{pid}
Project information
Read project metadata and feature counts by visible type.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku; current user permissions and the key project scope
Parameters
| Name | Location | Type | Required |
|---|---|---|---|
pid | path | integer | Yes |
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | |
org_id | integer | Yes | |
name | string | Yes | |
description | string | null | Yes | |
archived | boolean | Yes | |
modules | string[] | Yes | |
updated_at | string | Yes | |
erisim | string | Yes | |
counts | object | Yes |
HTTP 422
application/json
| Field | Type | Required | Description |
|---|---|---|---|
detail | ValidationError[] | No |
Error handling
[
"401 anahtar",
"403 yetki/kapsam",
"404 bulunamadi",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/projects/1" -H "Authorization: Bearer $ERISIM_ANAHTARI"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/projects/1',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/projects/1`, {
method: "GET",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"id": 123,
"org_id": 7,
"name": "Örnek fiber projesi",
"description": "Eğitim kaydı",
"archived": false,
"modules": [
"saha",
"fiber"
],
"updated_at": "2026-11-10T09:00:00+00:00",
"erisim": "kurum",
"counts": {
"cabinet": {
"n": 1,
"len": 0
}
}
}GET /api/v1/projects/{pid}/features
Project features
Read visible, non-deleted features as GeoJSON. Save the first page cursor for change tracking.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku; current user permissions and the key project scope
Parameters
| Name | Location | Type | Required |
|---|---|---|---|
pid | path | integer | Yes |
type | query | string | null | No |
bbox | query | string | null | No |
after | query | string | No |
limit | query | integer | No |
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Allowed values: FeatureCollection |
features | object[] | Yes | |
next | string | null | Yes | |
cursor | integer | Yes |
HTTP 422
application/json
| Field | Type | Required | Description |
|---|---|---|---|
detail | ValidationError[] | No |
Error handling
[
"401 anahtar",
"403 yetki/kapsam",
"404 bulunamadi",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/projects/1/features" -H "Authorization: Bearer $ERISIM_ANAHTARI"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/projects/1/features',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/projects/1/features`, {
method: "GET",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "DOL-123",
"geometry": {
"type": "Point",
"coordinates": [
32.0,
39.0
]
},
"properties": {
"name": "Örnek dolap",
"status": "planned",
"id": "DOL-123",
"type": "cabinet",
"v": 1
}
}
],
"next": null,
"cursor": 25
}GET /api/v1/projects/{pid}/features/{fid}
Single feature
Read one visible feature. The record version is in properties.v.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku; current user permissions and the key project scope
Parameters
| Name | Location | Type | Required |
|---|---|---|---|
pid | path | integer | Yes |
fid | path | string | Yes |
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Allowed values: Feature |
id | string | Yes | |
geometry | object | Yes | GeoJSON geometry appropriate to the feature type. |
properties | object | Yes |
HTTP 422
application/json
| Field | Type | Required | Description |
|---|---|---|---|
detail | ValidationError[] | No |
Error handling
[
"401 anahtar",
"403 yetki/kapsam",
"404 bulunamadi",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/projects/1/features/ORNEK_KIMLIK" -H "Authorization: Bearer $ERISIM_ANAHTARI"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/projects/1/features/ORNEK_KIMLIK',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/projects/1/features/ORNEK_KIMLIK`, {
method: "GET",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"type": "Feature",
"id": "DOL-123",
"geometry": {
"type": "Point",
"coordinates": [
32.0,
39.0
]
},
"properties": {
"name": "Örnek dolap",
"status": "planned",
"id": "DOL-123",
"type": "cabinet",
"v": 1
}
}GET /api/v1/projects/{pid}/equipment
Fiber equipment
Page through equipment in identifier order; use node_id to select a particular node.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku; current user permissions and the key project scope
Parameters
| Name | Location | Type | Required |
|---|---|---|---|
pid | path | integer | Yes |
node_id | query | string | null | No |
after | query | string | No |
limit | query | integer | No |
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
items | object[] | Yes | |
next | string | null | Yes |
HTTP 422
application/json
| Field | Type | Required | Description |
|---|---|---|---|
detail | ValidationError[] | No |
Error handling
[
"401 anahtar",
"403 yetki/kapsam",
"404 bulunamadi",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/projects/1/equipment" -H "Authorization: Bearer $ERISIM_ANAHTARI"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/projects/1/equipment',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/projects/1/equipment`, {
method: "GET",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"items": [
{
"id": "E-123",
"node_id": "DOL-123",
"kind": "odf",
"version": 1,
"deleted": false,
"parent_id": null,
"props": {
"ports": 24,
"label": "Örnek panel"
}
}
],
"next": null
}GET /api/v1/projects/{pid}/connections
Fiber connections
Page through connection metadata. This read response does not include endpoint details a and b.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku; current user permissions and the key project scope
Parameters
| Name | Location | Type | Required |
|---|---|---|---|
pid | path | integer | Yes |
node_id | query | string | null | No |
after | query | string | No |
limit | query | integer | No |
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
items | object[] | Yes | |
next | string | null | Yes |
HTTP 422
application/json
| Field | Type | Required | Description |
|---|---|---|---|
detail | ValidationError[] | No |
Error handling
[
"401 anahtar",
"403 yetki/kapsam",
"404 bulunamadi",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/projects/1/connections" -H "Authorization: Bearer $ERISIM_ANAHTARI"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/projects/1/connections',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/projects/1/connections`, {
method: "GET",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"items": [
{
"id": "C-123",
"node_id": "DOL-123",
"version": 1,
"deleted": false,
"location_id": null,
"slot": null,
"props": {
"kind": "splice"
}
}
],
"next": null
}GET /api/v1/projects/{pid}/circuits
Fiber circuits
Page through technical circuits. When the address module is disabled, related technical endpoint information is filtered according to visibility rules.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku; current user permissions and the key project scope
Parameters
| Name | Location | Type | Required |
|---|---|---|---|
pid | path | integer | Yes |
after | query | string | No |
limit | query | integer | No |
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
items | object[] | Yes | |
next | string | null | Yes |
HTTP 422
application/json
| Field | Type | Required | Description |
|---|---|---|---|
detail | ValidationError[] | No |
Error handling
[
"401 anahtar",
"403 yetki/kapsam",
"404 bulunamadi",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/projects/1/circuits" -H "Authorization: Bearer $ERISIM_ANAHTARI"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/projects/1/circuits',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/projects/1/circuits`, {
method: "GET",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"items": [],
"next": null
}GET /api/v1/projects/{pid}/changes
Project change stream
Read changes in increasing numeric identifier order. Save the last successfully applied identifier as after.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku; current user permissions and the key project scope
Parameters
| Name | Location | Type | Required |
|---|---|---|---|
pid | path | integer | Yes |
after | query | integer | No |
limit | query | integer | No |
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
items | object[] | Yes | |
next | integer | null | Yes |
HTTP 422
application/json
| Field | Type | Required | Description |
|---|---|---|---|
detail | ValidationError[] | No |
Error handling
[
"401 anahtar",
"403 yetki/kapsam",
"404 bulunamadi",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X GET "$TEMEL_URL/api/v1/projects/1/changes" -H "Authorization: Bearer $ERISIM_ANAHTARI"import os
import requests
response = requests.request(
'GET',
os.environ["TEMEL_URL"] + '/api/v1/projects/1/changes',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/projects/1/changes`, {
method: "GET",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"items": [],
"next": null
}POST /api/v1/projects/{pid}/edit
Edit project
Apply operations together. request_id is required; for updates and deletions, send the last-read record version as version.
Authentication: Authorization: Bearer ERISIM_ANAHTARI Scope: oku and yaz; current project, region, module and licence permissions
Parameters
| Name | Location | Type | Required |
|---|---|---|---|
pid | path | integer | Yes |
Request body
application/json
| Field | Type | Required | Description |
|---|---|---|---|
ops | Op[] | Yes | |
note | string | null | No | |
request_id | string | null | No |
Responses
HTTP 200
application/json
| Field | Type | Required | Description |
|---|---|---|---|
ok | boolean | Yes | |
batch | string | Yes | |
ids | string | null[] | Yes | |
tmp | object | Yes | |
features | object[] | Yes | |
replayed | boolean | No | |
equipment | object | No | |
connections | object | No | |
fiber_items | object | No | |
circuits | object | No | |
optik_items | object | No | |
uyarilar | nesne[] | No |
HTTP 422
application/json
| Field | Type | Required | Description |
|---|---|---|---|
detail | ValidationError[] | No |
Error handling
[
"400 alan",
"401 anahtar",
"403 kapsam/yetki/lisans_salt_okunur",
"404 bulunamadi",
"409 hata",
"422 hata",
"429 sinir"
]Request example
TEMEL_URL represents your installation URL; ERISIM_ANAHTARI represents your stored access key. Replace identifiers with those from your own records.
curl --fail-with-body -X POST "$TEMEL_URL/api/v1/projects/1/edit" -H "Authorization: Bearer $ERISIM_ANAHTARI" -H 'Content-Type: application/json' --data '{"request_id":"ornek-duzenleme-20261110-01","note":"Örnek nokta kaydı","ops":[{"op":"create","entity":"feature","id":"gecici-dolap","type":"cabinet","geometry":{"type":"Point","coordinates":[32.0,39.0]},"props":{"name":"Örnek dolap","status":"planned"}}]}'import os
import requests
response = requests.request(
'POST',
os.environ["TEMEL_URL"] + '/api/v1/projects/1/edit',
headers={"Authorization": "Bearer " + os.environ["ERISIM_ANAHTARI"]},
json={'request_id': 'ornek-duzenleme-20261110-01', 'note': 'Örnek nokta kaydı', 'ops': [{'op': 'create', 'entity': 'feature', 'id': 'gecici-dolap', 'type': 'cabinet', 'geometry': {'type': 'Point', 'coordinates': [32.0, 39.0]}, 'props': {'name': 'Örnek dolap', 'status': 'planned'}}]},
timeout=30,
)
response.raise_for_status()
print(response.text)const response = await fetch(`${TEMEL_URL}/api/v1/projects/1/edit`, {
method: "POST",
headers: {"Authorization": `Bearer ${ERISIM_ANAHTARI}`, "Content-Type": "application/json"},
body: JSON.stringify({"request_id": "ornek-duzenleme-20261110-01", "note": "Örnek nokta kaydı", "ops": [{"op": "create", "entity": "feature", "id": "gecici-dolap", "type": "cabinet", "geometry": {"type": "Point", "coordinates": [32.0, 39.0]}, "props": {"name": "Örnek dolap", "status": "planned"}}]}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());Response example
Fields have been checked against the product source; this example is not a response from a live installation.
{
"ok": true,
"batch": "ornek-islem",
"ids": [
"DOL-123"
],
"tmp": {
"gecici-dolap": "DOL-123"
},
"features": [
{
"type": "Feature",
"id": "DOL-123",
"geometry": {
"type": "Point",
"coordinates": [
32.0,
39.0
]
},
"properties": {
"name": "Örnek dolap",
"status": "planned",
"id": "DOL-123",
"type": "cabinet",
"v": 1,
"_deleted": false
}
}
]
}