{"slug": "medium-s-api-documentation", "title": "Medium's API Documentation", "summary": "Medium's API is a JSON-based OAuth2 API that requires secure HTTPS requests to endpoints beginning with `https://api.medium.com/v1`. To publish on behalf of a user, developers need an access token, which can be obtained either through browser-based OAuth authentication or self-issued integration tokens, with the latter recommended for desktop integrations. However, Medium no longer allows new integrations with its API, and existing integrations must follow specific authentication steps, including acquiring authorization codes and exchanging them for 60-day access tokens with refresh capabilities.", "body_md": "# Medium’s API documentation\n\nThis repository contains the documentation for [Medium](https://medium.com)’s API.\n\n#### Contents\n\n- [Overview](#1-overview)\n- [Authentication](#2-authentication)\n  - [Browser-based authentication](#21-browser-based-authentication)\n  - [Self-issued access tokens](#22-self-issued-access-tokens)\n- [Resources](#3-resources)\n  - [Users](#31-users)\n  - [Publications](#32-publications)\n  - [Posts](#33-posts)\n  - [Images](#34-images)\n- [Testing](#4-testing)\n\n## 1. Overview\n\nMedium’s API is a JSON-based OAuth2 API. All requests are made to endpoints beginning:\n`https://api.medium.com/v1`\n\nAll requests must be secure, i.e. `https`, not `http`.\n\n#### Developer agreement\n\nBy using Medium’s API, you agree to our [terms of service](https://medium.com/@feerst/2b405a832a2f).\n\n## 2. Authentication\n\nIn order to publish on behalf of a Medium account, you will need an access token. An access token grants limited access to a user’s account. We offer two ways to acquire an access token: browser-based OAuth authentication, and self-issued access tokens.\n\nWe recommend using self-issued access tokens. Browser-based authentication is supported **for existing integrations only**.\n\n###  2.1. Self-issued access tokens\n\nSelf-issued access tokens (described in user-facing copy as integration tokens) are explicitly designed for desktop integrations where implementing browser-based authentication is non-trivial, or software like plugins where it is impossible to secure a client secret. You should not request that a user give you an integration token if you don’t meet these criteria. Users will be cautioned within Medium to treat integration tokens like passwords, and dissuaded from making them generally available.\n\nUsers can request an access token by emailing yourfriends@medium.com. We will then grant access on the [Settings page](https://medium.com/me/settings) of their Medium account.\n\nYou should instruct your user to visit this URL and generate an integration token from the `Integration Tokens` section. You should suggest a description for this\ntoken - typically the name of your product or feature - and use it consistently for all users.\n\nSelf-issued access tokens do not expire, though they may be revoked by the user at any time.\n\n### 2.2. Browser-based authentication\n\n**IMPORTANT:** We don't allow any new integrations with our API.\n\nIf you already have an existing integration, the first step is to acquire a short term authorization code by sending the user to our authorization URL so they can grant access to your integration.\n\n```\nhttps://medium.com/m/oauth/authorize?client_id={{clientId}}\n    &scope=basicProfile,publishPost\n    &state={{state}}\n    &response_type=code\n    &redirect_uri={{redirectUri}}\n```\n\nWith the following parameters:\n\n| Parameter       | Type     | Required?  | Description                                     |\n| -------------   |----------|------------|-------------------------------------------------|\n| `client_id`     | string   | required   | The clientId we will supply you that identifies your integration. |\n| `scope`         | string   | required   | The access that your integration is requesting, comma separated. Currently, there are three valid scope values, which are listed below. Most integrations should request `basicProfile` and `publishPost` |\n| `state`         | string   | required   | Arbitrary text of your choosing, which we will repeat back to you to help you prevent request forgery. |\n| `response_type` | string   | required   | The field currently has only one valid value, and should be `code`.  |\n| `redirect_uri`  | string   | required   | The URL where we will send the user after they have completed the login dialog. This must exactly match one of the callback URLs you provided when creating your app. This field should be URL encoded. |\n\nThe following scope values are valid:\n\n| Scope              | Description                                                             | Extended |\n| -------------------| ----------------------------------------------------------------------- | -------- |\n| basicProfile       | Grants basic access to a user’s profile (not including their email).    | No       |\n| listPublications   | Grants the ability to list publications related to the user.            | No       |\n| publishPost        | Grants the ability to publish a post to the user’s profile.             | No       |\n| uploadImage        | Grants the ability to upload an image for use within a Medium post.     | Yes      |\n\nIntegrations are not permitted to request extended scope from users without explicit prior permission from Medium. Attempting to request these permissions through the standard user authentication flow will result in an error if extended scope has not been authorized for an integration.\n\nIf the user grants your request for access, we will send them back to the specified `redirect_uri` with a state and code parameter:\n\n```\nhttps://example.com/callback/medium?state={{state}}\n    &code={{code}}\n```\n\nWith the following parameters:\n\n| Parameter       | Type     | Required?  | Description                                     |\n| -------------   |----------|------------|-------------------------------------------------|\n| `state`         | string   | required   | The state you specified in the request.         |\n| `code`          | string   | required   | A short-lived authorization code that may be exchanged for an access token. |\n\nIf the user declines access, we will send them back to the specified `redirect_uri` with an error parameter:\n\n```\nhttps://example.com/callback/medium?error=access_denied\n```\n\nOnce you have an authorization code, you may exchange it for a long-lived access token with which you can make authenticated requests on behalf of the user. To acquire an access token, make a form-encoded server-side POST request:\n\n```\nPOST /v1/tokens HTTP/1.1\nHost: api.medium.com\nContent-Type: application/x-www-form-urlencoded\nAccept: application/json\nAccept-Charset: utf-8\n\ncode={{code}}&client_id={{client_id}}&client_secret={{client_secret}}&grant_type=authorization_code&redirect_uri={{redirect_uri}}\n```\n\nWith the following parameters:\n\n| Parameter       | Type     | Required?  | Description                                     |\n| -------------   |----------|------------|-------------------------------------------------|\n| `code`          | string   | required   | The authorization code you received in the previous step. |\n| `client_id`     | string   | required   | Your integration’s `clientId` |\n| `client_secret` | string   | required   | Your integration’s `clientSecret` |\n| `grant_type`    | string   | required   | The literal string \"authorization_code\" |\n| `redirect_uri`  | string   | required   | The same redirect_uri you specified when requesting an authorization code. |\n\nIf successful, you will receive back an access token response:\n\n```\nHTTP/1.1 201 OK\nContent-Type: application/json; charset=utf-8\n\n{\n  \"token_type\": \"Bearer\",\n  \"access_token\": {{access_token}},\n  \"refresh_token\": {{refresh_token}},\n  \"scope\": {{scope}},\n  \"expires_at\": {{expires_at}}\n}\n```\n\nWith the following parameters:\n\n| Parameter       | Type         | Required?  | Description                                     |\n| -------------   |--------------|------------|-------------------------------------------------|\n| `token_type`    | string       | required   | The literal string \"Bearer\"                     |\n| `access_token`  | string       | required   | A token that is valid for 60 days and may be used to perform authenticated requests on behalf of the user. |\n| `refresh_token` | string       | required   | A token that does not expire which may be used to acquire a new `access_token`.                            |\n| `scope`         | string array | required   | The scopes granted to your integration.         |\n| `expires_at`    | int64        | required   | The timestamp in unix time when the access token will expire |\n\nEach access token is valid for 60 days. When an access token expires, you may request a new token using the refresh token. Refresh tokens do not expire. Both access tokens and refresh tokens may be revoked by the user at any time. **You must treat both access tokens and refresh tokens like passwords and store them securely.**\n\nBoth access tokens and refresh tokens are consecutive strings of hex digits, like this:\n\n```\n181d415f34379af07b2c11d144dfbe35d\n```\n\nTo acquire a new access token using a refresh token, make the following form-encoded request:\n\n```\nPOST /v1/tokens HTTP/1.1\nHost: api.medium.com\nContent-Type: application/x-www-form-urlencoded\nAccept: application/json\nAccept-Charset: utf-8\n\nrefresh_token={{refresh_token}}&client_id={{client_id}}\n&client_secret={{client_secret}}&grant_type=refresh_token\n```\n\nWith the following parameters:\n\n| Parameter       | Type     | Required?  | Description                                     |\n| -------------   |----------|------------|-------------------------------------------------|\n| `refresh_token` | string   | required   | A valid refresh token.                          |\n| `client_id`     | string   | required   | Your integration’s `clientId`                   |\n| `client_secret` | string   | required   | Your integration’s `clientSecret`               |\n| `grant_type`    | string   | required   | The literal string \"refresh_token\"              |\n\n## 3. Resources\n\nThe API is RESTful and arranged around resources. All requests must be made with an integration token. All requests must be made using `https`.\n\nTypically, the first request you make should be to acquire user details. This will confirm that your access token is valid, and give you a user id that you will need for subsequent requests.\n\n### 3.1. Users\n\n#### Getting the authenticated user’s details\nReturns details of the user who has granted permission to the application.\n\n```\nGET https://api.medium.com/v1/me\n```\n\nExample request:\n\n```\nGET /v1/me HTTP/1.1\nHost: api.medium.com\nAuthorization: Bearer 181d415f34379af07b2c11d144dfbe35d\nContent-Type: application/json\nAccept: application/json\nAccept-Charset: utf-8\n```\n\nThe response is a User object within a data envelope.\n\nExample response:\n\n```\nHTTP/1.1 200 OK\nContent-Type: application/json; charset=utf-8\n\n{\n  \"data\": {\n    \"id\": \"5303d74c64f66366f00cb9b2a94f3251bf5\",\n    \"username\": \"majelbstoat\",\n    \"name\": \"Jamie Talbot\",\n    \"url\": \"https://medium.com/@majelbstoat\",\n    \"imageUrl\": \"https://images.medium.com/0*fkfQiTzT7TlUGGyI.png\"\n  }\n}\n```\n\nWhere a User object is:\n\n| Field      | Type   | Description                                     |\n| -----------|--------|-------------------------------------------------|\n| id         | string | A unique identifier for the user.               |\n| username   | string | The user’s username on Medium.                  |\n| name       | string | The user’s name on Medium.                      |\n| url        | string | The URL to the user’s profile on Medium         |\n| imageUrl   | string | The URL to the user’s avatar on Medium          |\n\nPossible errors:\n\n| Error code           | Description                                     |\n| ---------------------|-------------------------------------------------|\n| 401 Unauthorized     | The `accessToken` is invalid or has been revoked. |\n\n\n### 3.2. Publications\n\n#### Listing the user’s publications\n\nReturns a full list of publications that the user is related to in some way: This includes all publications the user is subscribed to, writes to, or edits. This endpoint offers a set of data similar to what you’ll see at https://medium.com/me/publications when logged in.\n\nThe REST API endpoint exposes this list of publications as a collection of resources under the user. A request to fetch a list of publications for a user looks like this:\n\n```\nGET https://api.medium.com/v1/users/{{userId}}/publications\n```\n\nThe response is a list of publication objects. An empty array is returned if user doesn’t have relations to any publications. The response array is wrapped in a data envelope. This endpoint will return all publications in which a user has a role of \"editor\" or \"writer\" along with a maximum of 200 other publications the user follows or has other relationships with.\n\nExample response:\n\n```\nHTTP/1.1 200 OK\nContent-Type: application/json; charset=utf-8\n\n{\n  \"data\": [\n    {\n      \"id\": \"b969ac62a46b\",\n      \"name\": \"About Medium\",\n      \"description\": \"What is this thing and how does it work?\",\n      \"url\": \"https://medium.com/about\",\n      \"imageUrl\": \"https://cdn-images-1.medium.com/fit/c/200/200/0*ae1jbP_od0W6EulE.jpeg\"\n    },\n    {\n      \"id\": \"b45573563f5a\",\n      \"name\": \"Developers\",\n      \"description\": \"Medium’s Developer resources\",\n      \"url\": \"https://medium.com/developers\",\n      \"imageUrl\": \"https://cdn-images-1.medium.com/fit/c/200/200/1*ccokMT4VXmDDO1EoQQHkzg@2x.png\"\n    }\n  ]\n}\n```\n\nWhere a Publication object is:\n\n| Field       | Type   | Description                                     |\n| ------------|--------|-------------------------------------------------|\n| id          | string | A unique identifier for the publication.        |\n| name        | string | The publication’s name on Medium.               |\n| description | string | Short description of the publication            |\n| url         | string | The URL to the publication’s homepage           |\n| imageUrl    | string | The URL to the publication’s image/logo         |\n\nPossible errors:\n\n| Error code           | Description                                                                           |\n| ---------------------|---------------------------------------------------------------------------------------|\n| 401 Unauthorized     | The `accessToken` is invalid, lacks the `listPublications` scope or has been revoked. |\n| 403 Forbidden        | The request attempts to list publications for another user.                           |\n\n\n#### Fetching contributors for a publication\n\nThis endpoint returns a list of contributors for a given publication. In other words, a list of Medium users who are allowed to publish under a publication, as well as a description of their exact role in the publication (for now, either an editor or a writer). The API endpoint exposes the contributors as list of resources under a publication. An example request looks like this:\n\n```\nGET https://api.medium.com/v1/publications/{{publicationId}}/contributors\n```\n\nIn the response, each contributor is represented with the ID of the publication, the ID of the user as well as the role of this user in this publication. An example response looks like this:\n\n```\nHTTP/1.1 200 OK\nContent-Type: application/json; charset=utf-8\n\n{\n  \"data\": [\n    {\n      \"publicationId\": \"b45573563f5a\",\n      \"userId\": \"13a06af8f81849c64dafbce822cbafbfab7ed7cecf82135bca946807ea351290d\",\n      \"role\": \"editor\"\n    },\n    {\n      \"publicationId\": \"b45573563f5a\",\n      \"userId\": \"1c9c63b15b874d3e354340b7d7458d55e1dda0f6470074df1cc99608a372866ac\",\n      \"role\": \"editor\"\n    },\n    {\n      \"publicationId\": \"b45573563f5a\",\n      \"userId\": \"1cc07499453463518b77d31650c0b53609dc973ad8ebd33690c7be9236e9384ad\",\n      \"role\": \"editor\"\n    },\n    {\n      \"publicationId\": \"b45573563f5a\",\n      \"userId\": \"196f70942410555f4b3030debc4f199a0d5a0309a7b9df96c57b8ec6e4b5f11d7\",\n      \"role\": \"writer\"\n    },\n    {\n      \"publicationId\": \"b45573563f5a\",\n      \"userId\": \"14d4a581f21ff537d245461b8ff2ae9b271b57d9554e25d863e3df6ef03ddd480\",\n      \"role\": \"writer\"\n    }\n  ]\n}\n```\n\nWhere a contributor is:\n\n| Field         | Type   | Description                                                                                                |\n| --------------|--------|------------------------------------------------------------------------------------------------------------|\n| publicationId | string | An ID for the publication. This can be lifted from response of publications above                          |\n| userId        | string | A user ID of the contributor.                                                                              |\n| role          | string | Role of the user identified by userId in the publication identified by publicationId. 'editor' or 'writer' |\n\nPossible errors:\n\n| Error code           | Description                                                                           |\n| ---------------------|---------------------------------------------------------------------------------------|\n| 401 Unauthorized     | The `accessToken` is invalid, or has been revoked.                                    |\n\n### 3.3. Posts\n\n#### Creating a post\nCreates a post on the authenticated user’s profile.\n\n```\nPOST https://api.medium.com/v1/users/{{authorId}}/posts\n```\n\nWhere authorId is the user id of the authenticated user.\n\nExample request:\n\n```\nPOST /v1/users/5303d74c64f66366f00cb9b2a94f3251bf5/posts HTTP/1.1\nHost: api.medium.com\nAuthorization: Bearer 181d415f34379af07b2c11d144dfbe35d\nContent-Type: application/json\nAccept: application/json\nAccept-Charset: utf-8\n\n{\n  \"title\": \"Liverpool FC\",\n  \"contentFormat\": \"html\",\n  \"content\": \"<h1>Liverpool FC</h1><p>You’ll never walk alone.</p>\",\n  \"canonicalUrl\": \"http://jamietalbot.com/posts/liverpool-fc\",\n  \"tags\": [\"football\", \"sport\", \"Liverpool\"],\n  \"publishStatus\": \"public\"\n}\n```\n\nWith the following fields:\n\n| Parameter       | Type         | Required?  | Description                                     |\n| -------------   |--------------|------------|-------------------------------------------------|\n| title           | string       | required   | The title of the post. Note that this title is used for SEO and when rendering the post as a listing, but will not appear in the actual post—for that, the title must be specified in the `content` field as well. Titles longer than 100 characters will be ignored. In that case, a title will be synthesized from the first content in the post when it is published.  |\n| contentFormat   | string       | required   | The format of the \"content\" field. There are two valid values, \"html\", and \"markdown\" |\n| content         | string       | required   | The body of the post, in a valid, semantic, HTML fragment, or Markdown. Further markups may be supported in the future. For a full list of accepted HTML tags, see [here](https://medium.com/@katie/a4367010924e). If you want your title to appear on the post page, you must also include it as part of the post content.                |\n| tags            | string array | optional   | Tags to classify the post. Only the first three will be used. Tags longer than 25 characters will be ignored.                                        |\n| canonicalUrl    | string       | optional   | The original home of this content, if it was originally published elsewhere.                         |\n| publishStatus   | enum         | optional   | The status of the post. Valid values are “public”, “draft”, or “unlisted”. The default is “public”.  |\n| license         | enum         | optional   | The license of the post. Valid values are “all-rights-reserved”, “cc-40-by”, “cc-40-by-sa”, “cc-40-by-nd”, “cc-40-by-nc”, “cc-40-by-nc-nd”, “cc-40-by-nc-sa”, “cc-40-zero”, “public-domain”. The default is “all-rights-reserved”. |\n| notifyFollowers | bool         | optional   | Whether to notifyFollowers that the user has published. |\n\nThe response is a Post object within a data envelope. Example response:\n\n```\nHTTP/1.1 201 OK\nContent-Type: application/json; charset=utf-8\n\n{\n  \"data\": {\n    \"id\": \"e6f36a\",\n    \"title\": \"Liverpool FC\",\n    \"authorId\": \"5303d74c64f66366f00cb9b2a94f3251bf5\",\n    \"tags\": [\"football\", \"sport\", \"Liverpool\"],\n    \"url\": \"https://medium.com/@majelbstoat/liverpool-fc-e6f36a\",\n    \"canonicalUrl\": \"http://jamietalbot.com/posts/liverpool-fc\",\n    \"publishStatus\": \"public\",\n    \"publishedAt\": 1442286338435,\n    \"license\": \"all-rights-reserved\",\n    \"licenseUrl\": \"https://medium.com/policy/9db0094a1e0f\"\n  }\n}\n```\n\nWhere a Post object is:\n\n| Field         | Type         | Description                                     |\n| --------------|--------------|-------------------------------------------------|\n| id            | string       | A unique identifier for the post.               |\n| title         | string       | The post’s title                                |\n| authorId      | string       | The userId of the post’s author                 |\n| tags          | string array | The post’s tags                                 |\n| url           | string       | The URL of the post on Medium                   |\n| canonicalUrl  | string       | The canonical URL of the post. If canonicalUrl was not specified in the creation of the post, this field will not be present.  |\n| publishStatus | string       | The publish status of the post.                 |\n| publishedAt   | timestamp    | The post’s published date. If created as a draft, this field will not be present.                                              |\n| license       | enum         | The license of the post.                        |\n| licenseUrl    | string       | The URL to the license of the post.             |\n\nPossible errors:\n\n| Error code           | Description                                                                                                          |\n| ---------------------|----------------------------------------------------------------------------------------------------------------------|\n| 400 Bad Request      | Required fields were invalid, not specified.                                                                         |\n| 401 Unauthorized     | The access token is invalid or has been revoked.                                                                     |\n| 403 Forbidden        | The user does not have permission to publish, or the authorId in the request path points to wrong/non-existent user. |\n\n#### Creating a post under a publication\nThis API allows creating a post and associating it with a publication on Medium. The request also shows this association, considering posts a collection of resources under a publication:\n\n```\nPOST https://api.medium.com/v1/publications/{{publicationId}}/posts\n```\n\nHere `publicationId` is the id of the publication the post is being created under. The `publicationId` can be acquired from the API for listing user’s publications.\n\nExample request:\n\n```\nPOST /v1/publications/b45573563f5a/posts HTTP/1.1\nHost: api.medium.com\nAuthorization: Bearer 181d415f34379af07b2c11d144dfbe35d\nContent-Type: application/json\nAccept: application/json\nAccept-Charset: utf-8\n\n{\n  \"title\": \"Hard things in software development\",\n  \"contentFormat\": \"html\",\n  \"content\": \"<p>Cache invalidation</p><p>Naming things</p>\",\n  \"tags\": [\"development\", \"design\"],\n  \"publishStatus\": \"draft\"\n}\n```\n\nThe definition of request data is equal to the regular call to create a post above. The response is identical except for adding one additional field:\n\n| Field         | Type         | Description                                                                                                            |\n| --------------|--------------|------------------------------------------------------------------------------------------------------------------------|\n| publicationId | string       | ID of the publication this post was created under. This matches the publication ID requested in the URL of the request |\n\nThere are additional rules around publishing that each request to this API must respect:\n- If the authenticated user is an 'editor' for the publication, they can create posts with any publish status. Posts published as 'public' or 'unlisted' will appear in collection immediately, while posts created as 'draft' will remain in pending state under publication.\n- If the authenticated user is a 'writer' for the chosen publication, they can only create a post as a 'draft'. That post will remain in pending state under publication until an editor for the publication approves it.\n- If the authenticated user is neither a 'writer' nor an 'editor', they are not allowed to create any posts in a publication.\n\nPossible errors:\n\n| Error code           | Description                                                                                        |\n| ---------------------|----------------------------------------------------------------------------------------------------|\n| 400 Bad Request      | Required fields were invalid, not specified.                                                       |\n| 401 Unauthorized     | The access token is invalid or has been revoked.                                                   |\n| 403 Forbidden        | The `publicationId` in request path doesn’t point to a publication that the user can publish into. |\n\n### 3.4. Images\n\n#### Uploading an image\n\nMost integrations will not need to use this resource. **Medium will automatically side-load any images specified by the src attribute on an `<img>` tag in post content when creating a post.** However, if you are building a desktop integration and have local image files that you wish to send, you may use the images endpoint.\n\nUnlike other API endpoints, this requires multipart form-encoded data.\n\n```\nPOST https://api.medium.com/v1/images\n```\n\nExample request:\n\n```\nPOST /v1/images HTTP/1.1\nHost: api.medium.com\nAuthorization: Bearer 181d415f34379af07b2c11d144dfbe35d\nContent-Type: multipart/form-data; boundary=FormBoundaryXYZ\nAccept: application/json\nAccept-Charset: utf-8\n\n--FormBoundaryXYZ\nContent-Disposition: form-data; name=\"image\"; filename=\"filename.png\"\nContent-Type: image/png\n\nIMAGE_DATA\n--FormBoundaryXYZ--\n```\n\nThe field name must be `image`. All lines in the body must be terminated with `\\r\\n`. Only one image may be sent per request. The following image content types are supported:\n\n* `image/jpeg`\n* `image/png`\n* `image/gif`\n* `image/tiff`\n\nAnimated gifs are supported. Use your power for good.\n\nThe response is an Image object within a data envelope. Example response:\n\n```\nHTTP/1.1 201 OK\nContent-Type: application/json; charset=utf-8\n\n{\n  \"data\": {\n    \"url\": \"https://images.medium.com/0*fkfQiTzT7TlUGGyI.png\",\n    \"md5\": \"fkfQiTzT7TlUGGyI\"\n  }\n}\n```\n\nWhere an Image object is:\n\n| Field         | Type        | Description                                     |\n| --------------|-------------|-------------------------------------------------|\n| url           | string      | The URL of the image.                           |\n| md5           | string      | An MD5 hash of the image data.                  |\n\nYou may choose to persist the md5 and url of uploaded images in a local store, so that you can quickly determine in future whether an image needs to be uploaded to Medium, or if an existing URL can be reused.\n\n\n## 4. Testing\n\nWe do not have a sandbox environment yet. To test, please feel free to create a testing account. *We recommend you do this by registering using an email address rather than Facebook or Twitter, as registering with the latter two automatically creates follower relationships on Medium between your connections on those networks.*\n\nThese endpoints will perform actions on production data on `medium.com`. **Please test with care.**", "url": "https://wpnews.pro/news/medium-s-api-documentation", "canonical_source": "https://gist.github.com/extratone/4fcf13ecf3a7d550925906787d479e9d", "published_at": "2023-01-14 13:09:00+00:00", "updated_at": "2026-05-24 01:04:47.885600+00:00", "lang": "en", "topics": ["developer-tools", "enterprise-software", "products"], "entities": ["Medium"], "alternates": {"html": "https://wpnews.pro/news/medium-s-api-documentation", "markdown": "https://wpnews.pro/news/medium-s-api-documentation.md", "text": "https://wpnews.pro/news/medium-s-api-documentation.txt", "jsonld": "https://wpnews.pro/news/medium-s-api-documentation.jsonld"}}