> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://mediakind.ferndocs.com/platform/getting-started/first-api-call/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://mediakind.ferndocs.com/_mcp/server. # Your first API call Before you build a larger integration, confirm your setup with one request. The goal is to make a single authenticated call against a project-scoped endpoint, inspect the response, and prove that your token and project access work. ## Prerequisites You need: * An MK.IO account with access to at least one project. * A personal API token. * The name of the project you want to query. If you still need a token, follow [Authentication and tokens](/platform/getting-started/authentication). ## Set the values you reuse Export the values the request needs, so the command stays readable and retries are less error-prone: * Terminal window ```bash export MKIO_BASE_URL="https://app.mk.io" export MKIO_PROJECT="" export MKIO_TOKEN="" ``` ## Send the request Run the Media API list-assets operation: ```bash curl -X GET "$MKIO_BASE_URL/api/v1/projects/$MKIO_PROJECT/media/assets" \ -H "Authorization: Bearer $MKIO_TOKEN" \ -H "Accept: application/json" ``` To see the HTTP status line as well, add `-i`: ```bash curl -i -X GET "$MKIO_BASE_URL/api/v1/projects/$MKIO_PROJECT/media/assets" \ -H "Authorization: Bearer $MKIO_TOKEN" \ -H "Accept: application/json" ``` ## Check the response A successful response is HTTP `200` with a list body. List endpoints return two top-level fields: `value`: the returned assets. * `supplemental`: list metadata, including `supplemental.pagination` with the record counts. ```json { "value": [ { "name": "example-asset" } ], "supplemental": { "count": 1, "kind": "Asset", "operation": "list", "pagination": { "start": 0, "end": 1, "records": 1, "total": 1 } } } ``` Many MK.IO list endpoints use this same shape, so it is worth recognising now. See [Pagination and filtering](/platform/understanding/pagination) for how to page and narrow these responses. ## If the call does not succeed This endpoint returns the platform’s standard error responses: | Status code | Meaning | What to check next | | ----------- | --------------------- | ---------------------------------------------------------------------- | | `400` | Bad Request | Recheck the URL, query parameters, and request syntax. | | `401` | Unauthorized | Recheck the bearer token and `Authorization` header. | | `403` | Forbidden | Recheck that the user has access to the target project and operation. | | `404` | Not Found | Recheck the project name and path. | | `429` | Too Many Requests | Slow down and retry later. | | `500` | Internal Server Error | Record the response `ref` value before retrying or contacting support. | The error body carries `error.code` for programmatic handling, `error.detail` for logs, and `ref` for support follow-up. See [Error handling](/platform/understanding/error-handling) for the full model. ## What this confirms A successful request proves that your token is valid, your base URL is correct, your project name is correct, and you can reach a real project-scoped endpoint. That is enough to move on to resource creation with far less guesswork. ## Next steps * Which API to use: choose the API that owns your workflow. * API overview: the patterns shared across the APIs. * Build with the Media API: move into storage, assets, transforms, jobs, and publishing.