Skip to documentation

API reference

API base URL

https://app.glingo.ru/api
REST API · JSON

01

Quick start

Read your first page of time entries. Replace the placeholder with your API key.

  1. Create a key with read permissions.
  2. Send a request to the app host with the x-api-key header.
  3. Check ok in the response. The data field holds the result; error explains a failure.
cURL
curl "https://app.glingo.ru/api/time?page=1&page_size=50" \
  -H "x-api-key: <glk_...>"
Response excerpt
{
  "ok": true,
  "data": {
    "entries": [],
    "totalCount": 0
  }
}

Authentication

Create an API key in Settings → API and MCP. Each key belongs to one workspace and uses the permissions of its owner. Send it with every request.

HTTP
x-api-key: <glk_...>
Content-Type: application/json

Keep keys on your server. Do not place them in browser code or public repositories. Revoke a key in settings when it is no longer needed.

Manage API keys

Scopes and access

Key presets set the available operations. Your workspace role still determines which records and reports you can see.

read

Read data

Read existing records without changing them.

full

Read and write

Read, create, update and delete records.

reports:read

Read analytics

Included in new read and full keys. Older keys without reports:read need to be recreated for analytics. Team, activity and debtor reports require the owner or admin role.

02

API reference

Request and response examples are excerpts. Download the OpenAPI schema for the complete contract.

OpenAPI schema

PUT requests follow the endpoint’s update contract. Check the schema for required fields before sending a partial update.

Time

GET/api/timeList time entries with stats, chart_by_day and chart_by_hour.

Scope: read

Parameters
page, page_size, accrual_from, accrual_to, created_from, created_to, counteragent_id, project_id, sort_by, sort_dir

Request
curl -X GET "https://app.glingo.ru/api/time?page=1&page_size=50" \
  -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": {
    "entries": [{ "id": "uuid", "description": "Консультация" }],
    "totalCount": 42
  }
}
POST/api/timeCreate a time entry.

Scope: full

Parameters
body: description, accrual_date, duration_minutes_total, cost, currency, counteragent_id?, project_id?

Request
curl -X POST "https://app.glingo.ru/api/time" \
  -H "x-api-key: <api_key>" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "Работа по проекту",
    "accrual_date": "2026-03-19",
    "duration_minutes_total": 90,
    "cost": 3500,
    "currency": "RUB"
  }'
Response excerpt
{
  "ok": true,
  "data": { "entry": { "id": "uuid" } }
}
PUT/api/time/:idUpdate a time entry.

Scope: full

Parameters
path: id, body: description, accrual_date, duration_minutes_total, cost, currency, counteragent_id?, project_id?

Request
curl -X PUT "https://app.glingo.ru/api/time/<id>" \
  -H "x-api-key: <api_key>" \
  -H "Content-Type: application/json" \
  -d '{ "description": "Обновленное описание" }'
Response excerpt
{
  "ok": true,
  "data": { "entry": { "id": "uuid" } }
}
DELETE/api/time/:idDelete a time entry.

Scope: full

Parameters
path: id

Request
curl -X DELETE "https://app.glingo.ru/api/time/<id>" \
  -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": { "id": "uuid" }
}

Money

GET/api/moneyList payments with totals and chart_by_day.

Scope: read

Parameters
page, page_size, search, inflow_from, inflow_to, counteragent_id, project_id, include_totals, totals_only, sort_by, sort_dir

Request
curl -X GET "https://app.glingo.ru/api/money?page=1&page_size=50" \
  -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": {
    "inflows": [{ "id": "uuid", "amount": 5000 }],
    "totalCount": 12
  }
}
POST/api/moneyCreate a payment.

Scope: full

Parameters
body: inflow_date, amount, currency, comment?, counteragent_id?, project_id?

Request
curl -X POST "https://app.glingo.ru/api/money" \
  -H "x-api-key: <api_key>" \
  -H "Content-Type: application/json" \
  -d '{
    "inflow_date": "2026-03-20",
    "amount": 15000,
    "currency": "RUB",
    "comment": "Оплата этапа #2"
  }'
Response excerpt
{
  "ok": true,
  "data": { "inflow": { "id": "uuid", "amount": 15000 } }
}
PUT/api/money/:idUpdate a payment.

Scope: full

Parameters
path: id, body: inflow_date, amount, currency, comment?, counteragent_id?, project_id?

Response excerpt
{
  "ok": true,
  "data": { "inflow": { "id": "uuid" } }
}
DELETE/api/money/:idDelete a payment.

Scope: full

Parameters
path: id

Response excerpt
{
  "ok": true,
  "data": { "id": "uuid" }
}

Projects

GET/api/projectsList projects and financial totals.

Scope: read

Parameters
page, page_size, search, for_select, include_totals, totals_only, accrual_from, accrual_to, sort_by, sort_dir

Response excerpt
{
  "ok": true,
  "data": { "projects": [{ "id": "uuid", "name": "Лендинг" }], "totalCount": 4 }
}
POST/api/projectsCreate a project.

Scope: full

Parameters
body: name, counteragent_id?

Response excerpt
{
  "ok": true,
  "data": { "project": { "id": "uuid" } }
}
PUT/api/projects/:idUpdate a project.

Scope: full

Parameters
path: id, body: name, counteragent_id?

Response excerpt
{
  "ok": true,
  "data": { "project": { "id": "uuid" } }
}
DELETE/api/projects/:idDelete a project.

Scope: full

Parameters
path: id

Response excerpt
{
  "ok": true,
  "data": { "id": "uuid" }
}

Clients

GET/api/counteragentsList clients and totals.

Scope: read

Parameters
page, page_size, search, for_select, include_totals, totals_only, accrual_from, accrual_to, sort_by, sort_dir

Response excerpt
{
  "ok": true,
  "data": { "counteragents": [{ "id": "uuid", "name": "ООО Ромашка" }], "totalCount": 7 }
}
POST/api/counteragentsCreate a client.

Scope: full

Parameters
body: name

Response excerpt
{
  "ok": true,
  "data": { "counteragent": { "id": "uuid" } }
}
PUT/api/counteragents/:idUpdate a client.

Scope: full

Parameters
path: id, body: name

Response excerpt
{
  "ok": true,
  "data": { "counteragent": { "id": "uuid" } }
}
DELETE/api/counteragents/:idDelete a client.

Scope: full

Parameters
path: id

Response excerpt
{
  "ok": true,
  "data": { "id": "uuid" }
}

Calendar

GET/api/calendarGet the calendar for a month.

Scope: read

Parameters
month=YYYY-MM-01

Response excerpt
{
  "ok": true,
  "data": {
    "month": "2026-03-01",
    "rows": [{ "accrual_date": "2026-03-10", "total_cost": "5000.00" }]
  }
}

Access

GET/api/me/accessGet the current access and workspace context.

Scope: read

Parameters
-

Response excerpt
{
  "ok": true,
  "data": {
    "workspace": { "id": "uuid", "slug": "ivanochek", "role": "owner" }
  }
}

Analytics

GET/api/reports/teamMember time, earnings, receipts and debt. full returns rows and summary; summary omits rows; table returns only rows and period. ID filters are comma-separated. A response excerpt follows.

Scope: reports:read

Parameters
accrual_from, accrual_to, project_id, counteragent_id, user_id, view=full|summary|table, sort_key=worked|earned|received|debt, sort_dir=asc|desc

Request
curl "https://app.glingo.ru/api/reports/team?view=table" -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": {
    "can_manage_team": true,
    "period": {
      "accrual_from": null,
      "accrual_to": null
    },
    "rows": []
  }
}
GET/api/reports/activityActivity summary, period comparison, members, projects, clients and event feed. Pagination applies only to the feed. ID filters are comma-separated. A response excerpt follows.

Scope: reports:read

Parameters
date_from, date_to, project_id, counteragent_id, user_id, feed_limit (1–100, default 30), feed_offset (default 0)

Request
curl "https://app.glingo.ru/api/reports/activity" -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": {
    "can_manage_team": true,
    "feed": [],
    "feed_pagination": {
      "offset": 0,
      "limit": 30,
      "total": 0,
      "has_more": false
    }
  }
}
GET/api/reports/debtorsClient or project debt, risk metrics and previous-period comparison. ID filters are comma-separated. A response excerpt follows.

Scope: reports:read

Parameters
accrual_from, accrual_to, project_id, counteragent_id, user_id, view=counteragents|projects, sort_key=name|client|debt|earned|received|last_paid|age|projects_count, sort_dir=asc|desc, overdue_only=1

Request
curl "https://app.glingo.ru/api/reports/debtors" -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": {
    "can_manage_team": true,
    "view": "counteragents",
    "rows": [],
    "comparison": null
  }
}
GET/api/reports/debtors/reconciliationAccruals and receipts for one entity through accrual_to, with running debt. The JSON response can be used to generate CSV. ID filters are comma-separated. A response excerpt follows.

Scope: reports:read

Parameters
entity_id (required UUID), view=counteragents|projects, accrual_to

Request
curl "https://app.glingo.ru/api/reports/debtors/reconciliation?entity_id=00000000-0000-4000-8000-000000000001" -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": {
    "view": "counteragents",
    "entity_id": "00000000-0000-4000-8000-000000000001",
    "entity_name": "Acme",
    "period": {
      "accrual_to": null
    },
    "rows": [],
    "totals": {
      "worked_minutes_total": 0,
      "earned_total": 0,
      "received_total": 0,
      "debt_total": 0
    }
  }
}
GET/api/timesheet-matrixDaily minutes grouped by project, client or team. Defaults to the current UTC month. ID filters are comma-separated. A response excerpt follows.

Scope: reports:read

Parameters
accrual_from, accrual_to, project_id, counteragent_id, user_id, view=project|counteragent|team

Request
curl "https://app.glingo.ru/api/timesheet-matrix?accrual_from=2026-09-01&accrual_to=2026-09-01" -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": {
    "view": "project",
    "can_manage_team": true,
    "unique_counteragents_count": 0,
    "period": {
      "accrual_from": "2026-09-01",
      "accrual_to": "2026-09-01",
      "days": [
        "2026-09-01"
      ]
    },
    "rows": [],
    "holidays": []
  }
}
GET/api/moneysheet-matrixDaily earned or received amounts grouped by entity. Defaults to earned and the current UTC month. ID filters are comma-separated. A response excerpt follows.

Scope: reports:read

Parameters
accrual_from, accrual_to, project_id, counteragent_id, user_id, view=project|counteragent|team, metric=earned|received

Request
curl "https://app.glingo.ru/api/moneysheet-matrix?accrual_from=2026-09-01&accrual_to=2026-09-01" -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": {
    "view": "project",
    "can_manage_team": true,
    "unique_counteragents_count": 0,
    "period": {
      "accrual_from": "2026-09-01",
      "accrual_to": "2026-09-01",
      "days": [
        "2026-09-01"
      ]
    },
    "rows": [],
    "holidays": []
  }
}
GET/api/dashboard/overviewTime and money KPIs, trends, debtors, risks and recent entries within the caller’s data visibility. ID filters are comma-separated. A response excerpt follows.

Scope: reports:read

Parameters
date_from, date_to, project_id, counteragent_id, user_id

Request
curl "https://app.glingo.ru/api/dashboard/overview" -H "x-api-key: <api_key>"
Response excerpt
{
  "ok": true,
  "data": {
    "can_manage_team": true,
    "workspace_currency": "RUB",
    "period": {
      "from": null,
      "to": null,
      "previous_from": null,
      "previous_to": null
    }
  }
}

03

MCP for AI assistants

Connect a compatible AI assistant to your workspace using the remote MCP endpoint. Configure the connection and review access in GlinGo settings.

MCP
https://app.glingo.ru/api/mcp

Cloud clients require a publicly reachable HTTPS address. OAuth must be enabled on the target environment; API keys work with clients that support custom headers.

Configure MCP

Errors

Responses use the same envelope. Check ok even when handling an HTTP response.

JSON
{
  "ok": false,
  "error": {
    "code": "unauthorized",
    "message": "Unauthorized"
  }
}
HTTPcodeMeaning
401unauthorizedMissing or invalid credentials.
403forbiddenInsufficient scope or permissions.
400invalid_paramInvalid query or path parameter.
400invalid_bodyInvalid JSON or request body.
400validation_errorBusiness validation failed.
404not_foundRecord not found in the workspace.
429rate_limitedToo many requests.
500api_errorInternal API error.

Limits and retries

The default general API limit is 2,000 requests per 10 seconds per client identity (IP + auth subject). A 429 response includes Retry-After.

For reads, respect Retry-After or use exponential backoff with jitter on 429/5xx. Fix the request or permissions before retrying 400/401/403/404.

After an uncertain write result, check whether it succeeded before repeating it: a repeated request can create a duplicate.