---
title: "lovefengis REST API reference (v1)"
description: "Reference for the lovefengis public REST API: services and prices with pagination, batch reads, idempotent POST, asynchronous jobs and a sandbox. Read-only JSON, no API key, OpenAPI 3.1."
canonical_url: https://lovefengis.com/gelistirici/api
last_updated: 2026-10-15
lang: tr
llms_txt: https://lovefengis.com/llms.txt
---

1. [Ana sayfa](https://lovefengis.com/)
2. [Developers](https://lovefengis.com/gelistirici)
3. lovefengis REST API reference (v1)

# lovefengis REST API reference (v1)

Son güncelleme: 14 Ekim 2026

The lovefengis REST API returns the services and prices shown on the website as JSON. Base URL: `https://lovefengis.com`. No authentication, no personal data, nothing is stored. Machine-readable description: [/openapi.json](https://lovefengis.com/openapi.json) (OpenAPI 3.1.0).

## Conventions

- Prices are integers in Turkish lira (`amount_try`), VAT included. `type: "from"` is a starting price; the final amount is fixed in a written offer.
- Every list response is `{ "data": [...], "meta": {...}, "next_cursor", "has_more" }`; `meta` carries currency, VAT note and the exchange rate used.
- Errors are JSON: `{ "error": { "code", "message", "hint" } }`. `code` is stable; `hint` says how to fix the request.
- Rate limit: 120 requests per minute per client. Every response carries `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` and `RateLimit-Policy`; a 429 adds `Retry-After`.
- Versioning: optional request header `API-Version: 1`; every response returns `API-Version`. See the [versioning and deprecation policy](https://lovefengis.com/gelistirici/surum-politikasi).
- CORS is open (`Access-Control-Allow-Origin: *`), so the API works from a browser.

## GET /api/v1

**API index** (`operationId: getApiIndex`). Returns the API name, version, documentation links and the list of available endpoints.

- `API-Version` (header, optional; string; one of 1): Pin the API version. Optional; the only version is 1\. Any other value returns 400 unsupported\_api\_version. Policy: https://lovefengis.com/gelistirici/surum-politikasi

Responses: 200 API index · 400 A parameter or the API-Version header is not valid. · 429 Rate limit exceeded; retry after the Retry-After header.

```
curl "https://lovefengis.com/api/v1"
```

## GET /api/v1/status

**Health check** (`operationId: getStatus`). Returns status ok, the API version and the server time. Never cached.

- `API-Version` (header, optional; string; one of 1): Pin the API version. Optional; the only version is 1\. Any other value returns 400 unsupported\_api\_version. Policy: https://lovefengis.com/gelistirici/surum-politikasi

Responses: 200 Health status · 400 A parameter or the API-Version header is not valid. · 429 Rate limit exceeded; retry after the Retry-After header.

```
curl "https://lovefengis.com/api/v1/status"
```

## GET /api/v1/hizmetler

**List services** (`operationId: listServices`). Returns services with their id, page URL, Markdown URL and prices, one page at a time (limit, cursor).

- `limit` (query, optional; integer; min 1; max 100; default 50): Maximum items per page, 1 to 100\. Default 50.
- `cursor` (query, optional; string; max 64): Opaque cursor. Pass the next\_cursor value of the previous response of the same endpoint, unchanged, to get the next page.
- `API-Version` (header, optional; string; one of 1): Pin the API version. Optional; the only version is 1\. Any other value returns 400 unsupported\_api\_version. Policy: https://lovefengis.com/gelistirici/surum-politikasi

Responses: 200 Service list page · 400 A parameter or the API-Version header is not valid. · 429 Rate limit exceeded; retry after the Retry-After header.

```
curl "https://lovefengis.com/api/v1/hizmetler"
```

## GET /api/v1/hizmetler/{id}

**Get one service** (`operationId: getService`). Returns one service with prices and, where the catalog has it, the scope list.

- `id` (path, required; string; pattern ^\[a-z0-9\]+(-\[a-z0-9\]+)\*$; max 80): Service id, the last segment of the service page path (for example kurumsal-ozel-yazilim).
- `API-Version` (header, optional; string; one of 1): Pin the API version. Optional; the only version is 1\. Any other value returns 400 unsupported\_api\_version. Policy: https://lovefengis.com/gelistirici/surum-politikasi

Responses: 200 Service · 400 A parameter or the API-Version header is not valid. · 404 No service has this id. · 429 Rate limit exceeded; retry after the Retry-After header.

```
curl "https://lovefengis.com/api/v1/hizmetler/kurumsal-ozel-yazilim"
```

## GET /api/v1/fiyatlar

**List prices** (`operationId: listPrices`). Returns a flat list of prices. Each price carries its service id. Filter by service id and billing period. Paged with limit and cursor.

- `service` (query, optional; string; pattern ^\[a-z0-9\]+(-\[a-z0-9\]+)\*$; max 80): Only prices of this service id.
- `period` (query, optional; string; one of one\_time, monthly, yearly): Only prices with this billing period.
- `limit` (query, optional; integer; min 1; max 100; default 50): Maximum items per page, 1 to 100\. Default 50.
- `cursor` (query, optional; string; max 64): Opaque cursor. Pass the next\_cursor value of the previous response of the same endpoint, unchanged, to get the next page.
- `API-Version` (header, optional; string; one of 1): Pin the API version. Optional; the only version is 1\. Any other value returns 400 unsupported\_api\_version. Policy: https://lovefengis.com/gelistirici/surum-politikasi

Responses: 200 Price list page · 400 A parameter or the API-Version header is not valid. · 429 Rate limit exceeded; retry after the Retry-After header.

```
curl "https://lovefengis.com/api/v1/fiyatlar?service=kurumsal-ozel-yazilim"
```

## POST /api/v1/batch

**Run several GET requests in one call** (`operationId: batchRead`). Takes an array of up to 20 GET operations on /api/v1/ paths (not /batch or /jobs) and returns an array of { status, body } in the same order. Always 200 when the batch itself is valid; per-operation errors are in each status. Safe to repeat: same body, same result.

- `Idempotency-Key` (header, optional; string; pattern ^\[\\x21-\\x7E\]{1,255}$; max 255): Optional key (1 to 255 printable ASCII characters, for example a UUID) that identifies a retried request. These POST operations are read-only and deterministic, so the same key and body always return the same result. The key is echoed in the response; an invalid key returns 400 invalid\_idempotency\_key.
- `API-Version` (header, optional; string; one of 1): Pin the API version. Optional; the only version is 1\. Any other value returns 400 unsupported\_api\_version. Policy: https://lovefengis.com/gelistirici/surum-politikasi

Responses: 200 Results in request order. · 400 A parameter or the API-Version header is not valid. · 413 The request body is larger than 8192 bytes. · 415 The request body is not application/json. · 429 Rate limit exceeded; retry after the Retry-After header.

```
curl -X POST "https://lovefengis.com/api/v1/batch" -H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" -d '{"operations":[{"method":"GET","path":"/api/v1/hizmetler?limit=2"},{"method":"GET","path":"/api/v1/fiyatlar?period=monthly"}]}'
```

## POST /api/v1/jobs

**Start an asynchronous price export** (`operationId: createJob`). Accepts a job and returns 202 with a Location header and status\_url. Poll GET /api/v1/jobs/{id} until status is completed. The job id encodes the request, so no state is stored; repeating the same request returns the same id.

- `Idempotency-Key` (header, optional; string; pattern ^\[\\x21-\\x7E\]{1,255}$; max 255): Optional key (1 to 255 printable ASCII characters, for example a UUID) that identifies a retried request. These POST operations are read-only and deterministic, so the same key and body always return the same result. The key is echoed in the response; an invalid key returns 400 invalid\_idempotency\_key.
- `API-Version` (header, optional; string; one of 1): Pin the API version. Optional; the only version is 1\. Any other value returns 400 unsupported\_api\_version. Policy: https://lovefengis.com/gelistirici/surum-politikasi

Responses: 202 Job accepted; poll status\_url. · 400 A parameter or the API-Version header is not valid. · 413 The request body is larger than 8192 bytes. · 415 The request body is not application/json. · 429 Rate limit exceeded; retry after the Retry-After header.

```
curl -X POST "https://lovefengis.com/api/v1/jobs" -H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" -d '{"type":"price_export","period":"monthly"}'
```

## GET /api/v1/jobs/{id}

**Get a job and its result** (`operationId: getJob`). Returns the job with status completed and its result. An unknown or malformed id returns 404 job\_not\_found.

- `id` (path, required; string; pattern ^job\_\[A-Za-z0-9\_-\]+$; max 304): Job id from POST /api/v1/jobs.
- `API-Version` (header, optional; string; one of 1): Pin the API version. Optional; the only version is 1\. Any other value returns 400 unsupported\_api\_version. Policy: https://lovefengis.com/gelistirici/surum-politikasi

Responses: 200 Job · 400 A parameter or the API-Version header is not valid. · 404 No job has this id. · 429 Rate limit exceeded; retry after the Retry-After header.

```
curl "https://lovefengis.com/api/v1/jobs/job_<id from POST /api/v1/jobs>"
```

## Pagination

`GET /api/v1/hizmetler` and `GET /api/v1/fiyatlar` are cursor paged. Send `limit` (1 to 100, default 50) and, for the next page, the `cursor` you got as `next_cursor`. Every list response has the same shape: `{ "data": [...], "meta": {...}, "next_cursor": string | null, "has_more": boolean }`. `next_cursor` is `null` on the last page. Treat the cursor as opaque.

```
curl "https://lovefengis.com/api/v1/fiyatlar?limit=10"
curl "https://lovefengis.com/api/v1/fiyatlar?limit=10&cursor=<next_cursor>"
```

## Idempotency

Both POST endpoints accept an optional `Idempotency-Key` header (1 to 255 printable ASCII characters, for example a UUID). The operations only read data and compute exports, so a retry with the same key and body always returns the same result and nothing is created twice. The key is echoed in the response header. An invalid key returns `400 invalid_idempotency_key`.

## Asynchronous jobs

`POST /api/v1/jobs` answers `202 Accepted` with a `Location` header, a `Retry-After` header and a body `{ "id", "type", "status": "queued", "status_url" }`. Poll `GET` on the Location path until `status` is `completed`; the result is in `result`. The job id encodes the validated request, so no state is stored and repeating the request returns the same id.

## Sandbox

The same API runs against fixture data at `https://lovefengis.com/api/sandbox/v1` (the base URL `https://lovefengis.com/api/sandbox` returns the same index; also listed as the second server in [openapi.json](https://lovefengis.com/openapi.json)). It has two fake services, `sandbox-ornek` and `sandbox-demo`, with made-up amounts. Every sandbox response has `X-Lovefengis-Environment: sandbox` and `meta.environment: "sandbox"`. Use it to test clients, batches, paging and jobs without touching the real catalog.

```
curl "https://lovefengis.com/api/sandbox/v1/hizmetler"
```

## Error codes

- `400 invalid_id`: The service id does not match the id format.
- `400 invalid_parameter`: A query parameter or body field is not valid.
- `400 invalid_cursor`: The cursor is not a next\_cursor value from this endpoint.
- `400 invalid_body`: The POST body is empty or has the wrong shape.
- `400 invalid_json`: The POST body is not valid JSON.
- `400 invalid_operation`: An item of a batch is not a valid GET operation.
- `400 invalid_idempotency_key`: The Idempotency-Key header is empty, too long or not printable ASCII.
- `400 unsupported_api_version`: The API-Version header is not 1.
- `404 not_found`: No such path.
- `404 service_not_found`: No service has this id.
- `404 job_not_found`: No job has this id.
- `405 method_not_allowed`: GET, HEAD and OPTIONS everywhere; POST only on /batch and /jobs. The Allow header lists the methods.
- `413 payload_too_large`: The POST body is larger than 8192 bytes.
- `415 unsupported_media_type`: The POST body is not application/json.
- `429 rate_limited`: Too many requests; wait for Retry-After seconds.

## Using the API as LLM tools

Every operation has a unique `operationId`, a description and typed parameter and response schemas, so [openapi.json](https://lovefengis.com/openapi.json) can be converted directly into function-calling tool definitions. Agents that speak MCP can use the [lovefengis MCP server](https://lovefengis.com/gelistirici/mcp) instead; it exposes the same data.

## lovefengis developer docs

- [Overview](https://lovefengis.com/gelistirici)
- [MCP server](https://lovefengis.com/gelistirici/mcp)
- [CLI (npx lovefengis)](https://lovefengis.com/gelistirici/cli)
- [Sandbox (test environment)](https://lovefengis.com/gelistirici/sandbox)
- [Versioning and deprecation policy](https://lovefengis.com/gelistirici/surum-politikasi)
- [OpenAPI 3.1 description (openapi.json)](https://lovefengis.com/openapi.json)
- [llms.txt agent guide](https://lovefengis.com/llms.txt)

Sorunuz kaldıysa kısa bir görüşme yeter.

15 dakikalık görüşme ücretsizdir ve sizi bağlamaz. İsterseniz kapsamla birlikte yazılı teklif iletiriz.

[Ücretsiz tanışma](https://lovefengis.com/gorusme) [hello@lovefengis.com](mailto:hello@lovefengis.com)

## Sitemap

See the full [sitemap](https://lovefengis.com/sitemap.md) for all pages on lovefengis.com.
