{"id":31,"library":"kakao","title":"Kakao API","description":"Kakao REST API provides access to Kakao Login, KakaoTalk messaging, friends list, maps, and AI features. Primary documentation is in Korean. English docs exist but are incomplete and lag behind Korean versions. No official Python/Node package — all integrations use REST API directly with app keys.","status":"active","version":"2025-latest","language":"python","source_language":"ko","source_url":"https://developers.kakao.com/docs/latest/en/rest-api/getting-started","tags":["kakao","kakaotalk","oauth","korea","rest-api","social-login","messaging"],"install":[{"cmd":"pip install requests","lang":"bash","label":"Python (no official SDK — use requests)"},{"cmd":"npm install axios","lang":"bash","label":"Node.js (no official SDK — use axios or fetch)"}],"dependencies":[{"reason":"Official SDK for Flutter/Android/iOS only. No official Python or Node SDK exists.","package":"kakao_flutter_sdk","optional":true}],"imports":[{"note":"Kakao uses KakaoAK prefix for app-level auth, not Bearer. Bearer is only for user access tokens.","wrong":"Authorization: Bearer {REST_API_KEY}","symbol":"Authorization header","correct":"Authorization: KakaoAK {REST_API_KEY}"},{"note":"Use Bearer only when authenticating as a user with an access token from OAuth flow.","symbol":"User token auth","correct":"Authorization: Bearer {ACCESS_TOKEN}"}],"quickstart":{"code":"import requests\n\n# Get user info with access token\nheaders = {\n    'Authorization': f'Bearer {ACCESS_TOKEN}'\n}\nresponse = requests.get(\n    'https://kapi.kakao.com/v2/user/me',\n    headers=headers\n)\nprint(response.json())","lang":"python","description":"Retrieve Kakao user info using a valid access token."},"warnings":[{"fix":"Include client_secret parameter in all Get token API calls, or disable Client secret in app settings","message":"Client secret is now enabled by default for all new REST API keys. Omitting client_secret in token requests causes KOE101 error.","severity":"breaking","affected_versions":"all"},{"fix":"Implement token refresh using refresh_token before expiry. Check error code -401 and refresh proactively.","message":"Access tokens expire in 6 hours. Refresh tokens expire in 60 days (extendable to 2 months). Expired access token returns error code -401.","severity":"breaking","affected_versions":"all"},{"fix":"Always read the msg field in error responses, not just the code","message":"Error codes are negative integers with no consistent pattern. code:-401 can mean token expired, token not found, or app key deactivated — check msg field for the actual cause.","severity":"gotcha","affected_versions":"all"},{"fix":"For complete specs use Korean docs at developers.kakao.com/docs/latest/ko/ — use translation tools if needed","message":"Primary documentation is in Korean at developers.kakao.com. English docs exist but are incomplete and often lag Korean versions by weeks.","severity":"gotcha","affected_versions":"all"},{"fix":"Implement exponential backoff on KOE237. Check Korean troubleshooting docs for current limits.","message":"Token issuance rate limit returns KOE237 error. Not documented clearly in English docs.","severity":"gotcha","affected_versions":"all"},{"fix":"Configure all required consent items in app settings at developers.kakao.com before going to production","message":"Scope/consent items must be pre-configured in Kakao Developers app settings before requesting. Missing scope returns -402 insufficient scopes error.","severity":"gotcha","affected_versions":"all"},{"fix":"Use Admin key only in server-side code. Store in environment variables only.","message":"Admin key has full permissions and must never be exposed client-side. Reissuing app keys is irreversible — all existing keys stop working immediately.","severity":"gotcha","affected_versions":"all"},{"fix":"Ensure ACCESS_TOKEN is properly defined and assigned a valid value (such as by loading it from an environment variable or obtaining it via an authentication flow) before it is referenced in API calls.","message":"The ACCESS_TOKEN variable must be defined and populated (e.g., from an environment variable, configuration file, or a successful token retrieval API call) before being used in API requests.","severity":"breaking","affected_versions":"all"},{"fix":"Define or assign a value to 'ACCESS_TOKEN' before it is used, for example, by loading it from an environment variable, a configuration file, or directly assigning it in the script.","message":"A NameError: name 'ACCESS_TOKEN' is not defined indicates that the variable was used without being assigned a value. Ensure all variables are defined before use.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-12T05:02:37.147Z","next_check":"2026-05-28T00:00:00.000Z","problems":[{"fix":"Go to Kakao Developers, navigate to your app's 'Platform Key' settings, and ensure the `redirect_uri` used in your API request is precisely registered, including scheme (http/https), domain, path, and port.","cause":"The `redirect_uri` parameter sent in the API request does not exactly match one of the Redirect URIs registered in your Kakao Developers application settings (App > Platform Key > REST API Key or JavaScript Key).","error":"{\"error\":\"redirect_uri_mismatch\"}"},{"fix":"Ensure you are using a fresh authorization code for each token request. If refreshing tokens, obtain new tokens through the full Kakao Login process if the refresh token has expired or is invalid.","cause":"This error occurs when the authorization code is expired, has already been used, or is invalid, or if the refresh token used to get a new access token is expired or missing.","error":"{\"error\":\"invalid_grant\"}"},{"fix":"Verify that the `REST API Key` used in your request matches the one in your Kakao Developers app settings (App > Platform Key). If 'Client secret' is enabled, ensure it's correctly included in your token issuance requests.","cause":"The `client_id` (REST API Key) provided in the request is incorrect, has a typo, or the `client_secret` is missing or incorrect when the Client secret feature is activated for your app.","error":"{\"error\":\"invalid_client\"}"},{"fix":"Reissue a new access token through the Kakao Login flow. Also, check your Kakao Developers app's 'Advanced Settings' for 'Allowed IP Addresses' and register the server IP making the API calls if applicable.","cause":"The access token provided in the request header is invalid, expired, or does not exist. It can also occur if the IP address making the request is not registered in your Kakao Developers app's allowed IP addresses.","error":"{\"msg\":\"this access token does not exist\",\"code\":-401}"},{"fix":"Carefully review the Kakao API documentation for the specific endpoint you are calling. Ensure all required parameters are present, their types are correct, and their values conform to the specified ranges or formats.","cause":"The API request contains missing required parameters, parameters with incorrect data types, or values outside the acceptable range.","error":"{\"code\":-2,\"msg\":\"invalid parameters\"}"}],"ecosystem":"pypi","meta_description":null,"install_score":0,"install_tag":"stale","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":null,"install_checks":{"last_tested":"2026-05-12","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null}]},"quickstart_checks":{"last_tested":"2026-05-12","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]}}