Frequent questions: empty lists, what a key sees, the IP allowlist, imports and more.
Why is my list empty?
An empty data usually means that filters or scopes exclude everything, not that the API is broken. Check:
- Archived items are hidden.
GET /meetingsandGET /library/transcriptsreturn only non-archived items by default. Addarchived=all. - Filters.
status,q,created_after,source_typeand other parameters narrow the result. Try without them. - Another user. A key sees only its owner’s data. Call
GET /meand check the maskeduser.email(for examplej***@example.com; the full address is never returned to a key): is it the account that holds your meetings? - Scopes.
GET /eventsshows only the events of the families the key can read and returns an empty list, not 403, when it can read none. Check the key’sscopes. cursor=latest. The firstGET /eventswithlatestalways returns an empty page: it is only a starting point. Use thenext_cursorit returns.- Events from before your first key. Diko records events only while the account has a key that is not revoked or an enabled webhook endpoint. Meetings that finished earlier produce no events, so a first run does not back-fill them. Read them with
GET /meetings. - Paging. A page can be short while
has_moreis stilltrue. See Pagination.
What does a key see?
A key sees only the meetings and the library (YouTube videos and uploaded files) of its owner. Teams do not share data, so a teammate’s meetings are not visible to your key. Another account’s or a non-existent ID returns 404 not_found, not 403. The scopes decide which endpoints a key can call.
What happens to keys when someone leaves a team?
Keys belong personally to you, so they are not removed. But every request checks the plan again: if you no longer have a Verslas plan, you get 403 plan_required. A team owner or administrator no longer sees the key metadata of a former member, because that person is no longer a current member. More: Security guidelines.
Why do I get ip_not_allowed?
The key has an IP allowlist and your request IP is not on it, or Diko does not believe the IP (a key with a list is accepted only from a reliably determined IP). The usual causes:
- you call
https://studio.diko.app/api/v1. Diko never trusts the client IP on that domain, so a key with an allowlist is always refused there. Usehttps://api.diko.app/api/v1; - your server calls from a different outbound address (NAT, a cloud platform, another region);
- the request goes over IPv6 while the list holds only IPv4 (or the other way round);
- the address changed after a redeploy.
The fix: call GET /me with a key that has no IP restriction and read request.ip and request.ip_trusted. If ip_trusted is false, check the base URL. If it is true, update the list in the app. See IP allowlist.
Why do I get 403 plan_required or 402 subscription_required?
The API is available only on the Verslas plan (required_plans lists verslas). subscription_required means the account has no paid access at all, plan_required means the plan does not include the API. GET /me is not subject to the plan and shows access.allowed and access.reason, so it is the right call for diagnostics.
Why does an import stay queued for a long time?
An import waits in the internal processing queue. When the queue is busy, the import stays queued and is tried again later. That is not an error. Check queue_position and stage (GET /library/imports/{import_id}). An import that stays queued for more than 24 hours, or processing for more than 6 hours, ends as failed with transcription_timeout. Use webhooks instead of polling. All statuses, stages and failure codes are in the quickstart.
Does an import cost credits?
If the transcript is already in your library or in the shared cache, the import finishes at once with reused: true and no credits are used. In other cases the credit balance is checked before it starts: if it is not enough, you get 402 insufficient_credits. GET /me shows the balance (credits.available) to a key with the library:write scope; for other keys credits is null. Read requests use no credits. Credit rates are on the pricing page (in Lithuanian).
Can I use a key in the browser?
No. The API sends no Access-Control-* headers and OPTIONS returns 405. Besides, a key in browser code is visible to everyone. Call the API from your own server and give the client only what it needs.
How do I get SRT or VTT?
GET /meetings/{meeting_id}/transcript?format=srt (or vtt, text). The same works for library transcripts: GET /library/transcripts/{transcript_id}/transcript. These formats return the whole transcript and use the stricter export limit.
Why do I get transcript_changed?
The transcript changed between your page requests (for example somebody approved grammar corrections). Read again without a cursor, or use format=text. See Pagination.
Why do I get resource_not_ready?
The meeting transcript does not exist yet because the meeting is still being processed. Wait for the meeting.ready event or check transcript.status in the meeting object.
Why route_not_found when the path looks right?
A trailing / counts as a different path: /api/v1/me/ returns 404. Also check that the base URL is https://api.diko.app/api/v1.
Can I create webhooks through the API?
No. You manage webhook endpoints only in the Diko app, under Nustatymai → API → Webhooks (/settings/api/webhooks). You can have at most 10 endpoints per account. This is deliberate: a leaked key cannot redirect your data to a foreign address. Webhook management through the API is planned for the future, see the Changelog.
Is there a sandbox?
No. dk_test_ keys are reserved for the future, and a v1 key always works against real data. For testing you can create a key with the Tik skaitymas (Read only) template and a short expiry.
What should I include when I contact support?
Include the response’s request_id (req_...) or the Request-Id header, the time of the request and the endpoint. Never send the key itself.