{"schema":"modkey.api-document.v1","project":{"name":"Modkey Platform","description":"Software licensing platform: key generation, device binding and client access.","website":"https://mod.wtf","development_website":"https://dev.mod.wtf","owners":[{"telegram":"@expert_catpon","url":"https://t.me/expert_catpon"},{"telegram":"@Autoritetion","url":"https://t.me/Autoritetion"},{"telegram":"@vt72983","url":"https://t.me/vt72983"}]},"document":{"name":"Modkey API and Connect","description":"Complete Modkey integration documentation: Connect and API v2.","format":"JSON","language":"English","intended_for":["software developers","AI agents"],"base_url":"https://dev.mod.wtf","public":true,"contains_real_software_data":false,"notice":"All example values are fictional. Use your own software ID, keys and domain."},"connect":{"main":{"schema":"modkey.connect.v1","name":"Modkey Connect","summary":"License validation endpoint. The client sends its key and HWID here.","software":{"id":77,"name":"Demo"},"agent_instructions":["Send an HTTPS POST request with a form-urlencoded body.","Use the field names in request.fields, configured by the Soft Owner.","After HTTP 200, check the status field in the response body.","Verify the response token before trusting the data.","This signature source includes CONNECT_SECRET, and the success response returns the source in real. To keep the secret private, use hmac-sha256 with a source without {{secret}}."],"endpoint":{"mode":"main","enabled":true,"url":"https://dev.mod.wtf/77/connect","method":"POST","content_type":"application/x-www-form-urlencoded","accept":"application/json","authentication":"License key in the request body","max_body_bytes":4096},"request":{"encoding":"Only form-urlencoded is accepted. JSON request bodies are not supported","fields":[{"name":"game","type":"string","required":true,"max_length":32,"description":"Game or product"},{"name":"user_key","type":"string","required":true,"max_length":32,"description":"License key","format":"^[A-Za-z0-9:@_-]{1,32}$"},{"name":"serial","type":"string","required":true,"max_length":255,"description":"Device identifier (HWID)","format":"No commas, quotes or control characters"}],"example":{"game":"pubg","user_key":"XXXX-XXXX-XXXX-XXXX","serial":"device-id"},"curl":"curl -sS -X POST 'https://dev.mod.wtf/77/connect' \\\n  -H 'Accept: application/json' \\\n  --data-urlencode 'game=pubg' \\\n  --data-urlencode 'user_key=XXXX-XXXX-XXXX-XXXX' \\\n  --data-urlencode 'serial=device-id'","normalization":"Leading and trailing whitespace is trimmed from game, key and serial."},"response_token":{"purpose":"Verify that the response belongs to your request and has not been substituted.","included_in_success_response":true,"algorithm":"md5","digest_encoding":"lowercase hex","source_template":"{{game}}-{{key}}-{{serial}}-{{secret}}","source_example":"pubg-XXXX-XXXX-XXXX-XXXX-device-id-<CONNECT_SECRET>","secret":{"value":"<CONNECT_SECRET>","location":"Connect Settings > Request > Secret","request_parameter":false},"verification":"hex(MD5(source))","steps":["Read the token from the response.","Build source_template from the same values sent in the request.","Calculate the selected hash.","Compare both values in constant time."]},"response":{"content_type":"application/json","placeholder_paths":{"real":["/data/real"],"token":["/data/token"],"modname":["/data/modname"],"mod_status":["/data/mod_status"],"credit":["/data/credit"],"esp":["/data/ESP"],"item":["/data/Item"],"aim":["/data/AIM"],"silent_aim":["/data/SilentAim"],"bullet_track":["/data/BulletTrack"],"floating":["/data/Floating"],"memory":["/data/Memory"],"setting":["/data/Setting"],"expires_at":["/data/EXP"],"encoding":["/data/Enc"],"max_devices":["/data/device"],"timestamp":["/data/rng"],"info":["/info"],"origin":["/domain"],"reason":["/reason"]},"success_example":{"status":true,"data":{"real":"pubg-XXXX-XXXX-XXXX-XXXX-device-id-<CONNECT_SECRET>","token":"<SIGNATURE_HEX>","modname":"","mod_status":"","credit":"","ESP":"","Item":"","AIM":"","SilentAim":"","BulletTrack":"","Floating":"","Memory":"","Setting":"","EXP":"2026-11-05 13:25:42","Enc":"List Of Games","device":1,"rng":1793269542},"info":"powered by mdk panel","domain":"https://dev.mod.wtf/"},"error_example":{"status":false,"reason":"Key not found!"},"success_condition":"The response status field is true.","error_condition":"The status field is false; the reason text is in reason.","cache":"no-store","cipher_optional":{"summary":"Optional. Enable in Connect Settings > Response > Encryption.","envelope":{"sig":"<BASE64_RSA_SIGNATURE>","payload":"<BASE64_AES_CIPHERTEXT>"},"inner_response":"The entire JSON response is encrypted, for both success and error responses.","payload":"AES-256-CBC with PKCS#7 padding, then Base64","signature":"RSA-SHA256 over the Base64 payload string, then Base64","order":["Decode sig from Base64.","Verify RSA-SHA256 over the payload string.","Decode payload from Base64.","Decrypt AES-256-CBC.","Parse the JSON and ignore the unknown random field at the root."],"client_config":{"aes_key":"<AES_KEY_FROM_CONNECT_SETTINGS>","aes_key_bytes":32,"aes_iv":"<AES_IV_FROM_CONNECT_SETTINGS>","aes_iv_bytes":16,"rsa_public_key":"<RSA_PUBLIC_KEY_FROM_CONNECT_SETTINGS>","tls_public_key_pin":"<TLS_PIN_IF_CONFIGURED>"}}},"limits":{"global_per_ip":"300 requests per minute","per_software_per_ip":"120 requests per minute","per_device":"15 requests per minute"},"device_binding":{"summary":"The key is bound to the HWID on the first successful validation.","enabled":true,"one_hwid_per_ip":false,"unlimited_keys_bypass_ip_guard":true,"existing_device_can_reconnect":true},"http_statuses":{"200":"Validation result, including normal license denials","404":"Endpoint unavailable","413":"Request body exceeds 4096 bytes","429":"Request rate limit exceeded","500":"Could not generate a response","503":"Temporary server failure; retry later"},"license_errors":{"invalid_request":"Required fields are missing or too long.","invalid_key":"The key contains invalid characters or exceeds 32 characters.","invalid_serial":"HWID is empty, too long or contains forbidden characters.","key_not_found":"Key not found!","key_paused":"Key is on pause!","key_blocked":"Key has been blocked!","key_expired":"Key has expired!","device_limit":"Device limit reached!","banned_serial":"This device is banned from this software.","rate_limit":"The request limit for the IP, software+IP pair or device was exceeded."},"behavior":["A time-limited key starts its timer on the first successful validation, not when issued.","A successful request takes a device slot if one is available.","Paused, blocked or expired keys and banned devices are denied.","A single-use key (single) is deleted immediately after successful binding."]},"test":{"schema":"modkey.connect.v1","name":"Modkey Connect","summary":"License validation endpoint. The client sends its key and HWID here.","software":{"id":77,"name":"Demo"},"agent_instructions":["Send an HTTPS POST request with a form-urlencoded body.","Use the field names in request.fields, configured by the Soft Owner.","After HTTP 200, check the status field in the response body.","Verify the response token before trusting the data.","CONNECT_SECRET stays in the client and is never sent in the request."],"endpoint":{"mode":"test","enabled":true,"url":"https://dev.mod.wtf/77/test/connect","method":"POST","content_type":"application/x-www-form-urlencoded","accept":"application/json","authentication":"License key in the request body","max_body_bytes":4096},"request":{"encoding":"Only form-urlencoded is accepted. JSON request bodies are not supported","fields":[{"name":"game","type":"string","required":true,"max_length":32,"description":"Game or product"},{"name":"user_key","type":"string","required":true,"max_length":32,"description":"License key","format":"^[A-Za-z0-9:@_-]{1,32}$"},{"name":"serial","type":"string","required":true,"max_length":255,"description":"Device identifier (HWID)","format":"No commas, quotes or control characters"}],"example":{"game":"pubg","user_key":"XXXX-XXXX-XXXX-XXXX","serial":"device-id"},"curl":"curl -sS -X POST 'https://dev.mod.wtf/77/test/connect' \\\n  -H 'Accept: application/json' \\\n  --data-urlencode 'game=pubg' \\\n  --data-urlencode 'user_key=XXXX-XXXX-XXXX-XXXX' \\\n  --data-urlencode 'serial=device-id'","normalization":"Leading and trailing whitespace is trimmed from game, key and serial."},"response_token":{"purpose":"Verify that the response belongs to your request and has not been substituted.","included_in_success_response":true,"algorithm":"hmac-sha256","digest_encoding":"lowercase hex","source_template":"modkey-connect-v2|test|{{soft_id}}|{{game}}|{{key}}|{{serial}}","source_example":"modkey-connect-v2|test|77|pubg|XXXX-XXXX-XXXX-XXXX|device-id","secret":{"value":"<CONNECT_SECRET>","location":"Connect Settings > Request > Secret","request_parameter":false},"verification":"hex(HMAC-SHA256(source, CONNECT_SECRET))","steps":["Read the token from the response.","Build source_template from the same values sent in the request.","Calculate the selected hash.","Compare both values in constant time."]},"response":{"content_type":"application/json","placeholder_paths":{"real":["/data/real"],"token":["/data/token"],"modname":["/data/modname"],"mod_status":["/data/mod_status"],"credit":["/data/credit"],"esp":["/data/ESP"],"item":["/data/Item"],"aim":["/data/AIM"],"silent_aim":["/data/SilentAim"],"bullet_track":["/data/BulletTrack"],"floating":["/data/Floating"],"memory":["/data/Memory"],"setting":["/data/Setting"],"expires_at":["/data/EXP"],"encoding":["/data/Enc"],"max_devices":["/data/device"],"timestamp":["/data/rng"],"info":["/info"],"origin":["/domain"],"reason":["/reason"]},"success_example":{"status":true,"data":{"real":"modkey-connect-v2|test|77|pubg|XXXX-XXXX-XXXX-XXXX|device-id","token":"<SIGNATURE_HEX>","modname":"","mod_status":"","credit":"","ESP":"","Item":"","AIM":"","SilentAim":"","BulletTrack":"","Floating":"","Memory":"","Setting":"","EXP":"2026-11-05 13:25:42","Enc":"List Of Games","device":1,"rng":1793269542},"info":"powered by mdk panel","domain":"https://dev.mod.wtf/"},"error_example":{"status":false,"reason":"Key not found!"},"success_condition":"The response status field is true.","error_condition":"The status field is false; the reason text is in reason.","cache":"no-store","cipher_optional":{"summary":"Optional. Enable in Connect Settings > Response > Encryption.","envelope":{"sig":"<BASE64_RSA_SIGNATURE>","payload":"<BASE64_AES_CIPHERTEXT>"},"inner_response":"The entire JSON response is encrypted, for both success and error responses.","payload":"AES-256-CBC with PKCS#7 padding, then Base64","signature":"RSA-SHA256 over the Base64 payload string, then Base64","order":["Decode sig from Base64.","Verify RSA-SHA256 over the payload string.","Decode payload from Base64.","Decrypt AES-256-CBC.","Parse the JSON and ignore the unknown random field at the root."],"client_config":{"aes_key":"<AES_KEY_FROM_CONNECT_SETTINGS>","aes_key_bytes":32,"aes_iv":"<AES_IV_FROM_CONNECT_SETTINGS>","aes_iv_bytes":16,"rsa_public_key":"<RSA_PUBLIC_KEY_FROM_CONNECT_SETTINGS>","tls_public_key_pin":"<TLS_PIN_IF_CONFIGURED>"}}},"limits":{"global_per_ip":"300 requests per minute","per_software_per_ip":"120 requests per minute","per_device":"15 requests per minute"},"device_binding":{"summary":"The key is bound to the HWID on the first successful validation.","enabled":true,"one_hwid_per_ip":false,"unlimited_keys_bypass_ip_guard":true,"existing_device_can_reconnect":true},"http_statuses":{"200":"Validation result, including normal license denials","404":"Endpoint unavailable","413":"Request body exceeds 4096 bytes","429":"Request rate limit exceeded","500":"Could not generate a response","503":"Temporary server failure, or Test Connect is disabled because its configuration is insecure"},"license_errors":{"invalid_request":"Required fields are missing or too long.","invalid_key":"The key contains invalid characters or exceeds 32 characters.","invalid_serial":"HWID is empty, too long or contains forbidden characters.","key_not_found":"Key not found!","key_paused":"Key is on pause!","key_blocked":"Key has been blocked!","key_expired":"Key has expired!","device_limit":"Device limit reached!","banned_serial":"This device is banned from this software.","rate_limit":"The request limit for the IP, software+IP pair or device was exceeded."},"behavior":["A time-limited key starts its timer on the first successful validation, not when issued.","A successful request takes a device slot if one is available.","Paused, blocked or expired keys and banned devices are denied.","A single-use key (single) is deleted immediately after successful binding."]}},"api_v2":{"name":"API","version":"v2","description":"Soft Owner API: everything the panel does for a software owner: software, Connect, Online System, files, keys, bans, domains, accounts, codes, logs and statistics.","base_url":"https://dev.mod.wtf/api/v2/action","host":"dev.mod.wtf","auth":{"scheme":"Body","header":"api_key: <api_key> in the JSON body","fallback_post":"Authorization: Bearer and X-Api-Key are also accepted","where":"Get your API key from the panel: https://dev.mod.wtf/admin/api","account_requirement":"The API key owner must have Telegram linked while Telegram authorization is enabled."},"software":{"soft_id":"soft_id takes any software your account owns. Software of another account answers not_found.","default":"Actions without a required soft_id take an optional one and work with your main software when it is omitted, whatever software is selected in the panel.","main":"Your main software is the one the account started with."},"endpoints":[{"group":"Software"},{"method":"POST","path":"/api/v2/action","desc":"List every software you own.","success_example":{"total":1,"limit":50,"offset":0,"items":[{"id":10,"name":"MyCheats","uplink":"Admin","status":1,"status_reason":"on","soft_status":1,"key_format":"{NAME}-{RANDOM:8}","price":{"1":"25","7":"100","30":"300","25000":"999"},"hwid_reset_limit":2,"err_messages":{"key_not_found":"Key not found!","key_on_pause":"Key paused!","key_blocked":"Key blocked!","expire_key":"Key expired!","device_max_slots":"Max devices!"},"test_err_messages":{"key_not_found":"Test key not found!","key_on_pause":"Test key paused!","key_blocked":"Test key blocked!","expire_key":"Test key expired!","device_max_slots":"Test max devices!"},"template_auto_generate":false,"emulator_response":"disabled","test_emulator_response":"disabled","test_connect_enabled":false,"connect_uuid":"a1b2c3d4e5f6"}]},"error_example":{"ok":false,"error":"unauthorized","message":"Invalid or missing api_key"},"action":"get-softs","params":{"q?":"substring search","limit?":"number of records to return, 1..200, default 50","offset?":"number of records to skip for pagination"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-softs"}},{"method":"POST","path":"/api/v2/action","desc":"Get software details by ID.","success_example":{"id":10,"name":"MyCheats","uplink":"Admin","status":1,"status_reason":"on","soft_status":1,"key_format":"{NAME}-{RANDOM:8}","price":{"1":"25","7":"100","30":"300","25000":"999"},"hwid_reset_limit":2,"err_messages":{"key_not_found":"Key not found!","key_on_pause":"Key paused!","key_blocked":"Key blocked!","expire_key":"Key expired!","device_max_slots":"Max devices!"},"test_err_messages":{"key_not_found":"Test key not found!","key_on_pause":"Test key paused!","key_blocked":"Test key blocked!","expire_key":"Test key expired!","device_max_slots":"Test max devices!"},"template_auto_generate":false,"emulator_response":"disabled","test_emulator_response":"disabled","test_connect_enabled":false,"connect_uuid":"a1b2c3d4e5f6"},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"action":"get-soft","params":{"soft_id":"ID of a software you own"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-soft","soft_id":123}},{"method":"POST","path":"/api/v2/action","desc":"Update software fields (allowed fields listed below).","params":{"soft_id":"ID of a software you own","name?":"up to 100 characters: Latin letters, digits, spaces, underscores and hyphens. A current name outside this rule saves only unchanged","key_format?":"for example \"{NAME}-{DURATION}-{RANDOM:8}\"","status?":"0/1 Connect availability","status_reason?":"offline message","price?":"object {duration_code: price}","hwid_reset_limit?":"int","err_key_not_found?":"msg","err_key_on_pause?":"msg","err_key_blocked?":"msg","err_expire_key?":"msg","err_device_max_slots?":"msg","test_err_key_not_found?":"Test msg","test_err_key_on_pause?":"Test msg","test_err_key_blocked?":"Test msg","test_err_expire_key?":"Test msg","test_err_device_max_slots?":"Test msg","emulator_response?":"Main Connect: disabled, success or a supported emulated error code","test_emulator_response?":"Test Connect: disabled, success or a supported emulated error code","test_connect_enabled?":"0 or 1. When 0, Test Connect returns 404","template_auto_generate?":"0/1"},"body_example":{"api_key":"YOUR_API_KEY","method":"edit-soft","soft_id":123,"name":"MyCheat","err_key_blocked":"Your key is blocked.","test_err_key_blocked":"Test key is blocked."},"success_example":{"id":10,"name":"MyCheat","uplink":"Admin","status":1,"status_reason":"on","soft_status":1,"key_format":"{NAME}-{RANDOM:8}","price":{"1":"25","7":"100","30":"300","25000":"999"},"hwid_reset_limit":2,"err_messages":{"key_not_found":"Key not found!","key_on_pause":"Key paused!","key_blocked":"Your key is blocked.","expire_key":"Key expired!","device_max_slots":"Max devices!"},"test_err_messages":{"key_not_found":"Test key not found!","key_on_pause":"Test key paused!","key_blocked":"Test key is blocked.","expire_key":"Test key expired!","device_max_slots":"Test max devices!"},"template_auto_generate":false,"emulator_response":"disabled","test_emulator_response":"disabled","test_connect_enabled":false,"connect_uuid":"a1b2c3d4e5f6"},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"action":"edit-soft"},{"action":"create-soft","desc":"Create extra software. Needs the right from the panel owner; the limit counts software you created.","params":{"name":"1-100 characters: Latin letters, numbers, spaces, _ and -"},"body_example":{"api_key":"YOUR_API_KEY","method":"create-soft","name":"My Second Mod"},"success_example":{"id":124,"name":"My Second Mod","status":1,"soft_status":1},"success_code":201,"error_example":{"ok":false,"error":"forbidden","message":"You cannot create software. Ask the panel owner for access."},"method":"POST","path":"/api/v2/action"},{"action":"delete-soft","desc":"Delete software you created. It must be empty: no keys, accounts, domains or files.","params":{"soft_id":"ID of software you created"},"body_example":{"api_key":"YOUR_API_KEY","method":"delete-soft","soft_id":124},"success_example":{"id":124,"deleted":true},"error_example":{"ok":false,"error":"validation","message":"Only empty software can be deleted. Remove its keys, accounts, domains and files first."},"method":"POST","path":"/api/v2/action"},{"action":"reset-soft-hash","desc":"Generate a new software hash.","params":{"soft_id":"ID of a software you own"},"body_example":{"api_key":"YOUR_API_KEY","method":"reset-soft-hash","soft_id":123},"success_example":{"id":123,"hash":"67c42370550433f0ed"},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"method":"POST","path":"/api/v2/action"},{"group":"Custom domains"},{"method":"POST","path":"/api/v2/action","desc":"Custom domains for this endpoint (up to 5 on Main and the same number on Test).","success_example":{"soft_id":10,"endpoint":"main","limit":5,"used":2,"items":[{"id":1,"soft_id":10,"endpoint":"main","domain":"keys.example.com","active":true,"provisioned":true,"created_at":"2025-06-01 12:00:00","created_by":"JohnDoe","public_url":"https://keys.example.com/connect"}]},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"action":"get-domains","params":{"soft_id":"ID of a software you own","endpoint?":"main or test, default main"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-domains","soft_id":123}},{"method":"POST","path":"/api/v2/action","desc":"Add a custom domain. Point it to the panel IP and add a TXT record at _modkey.<domain>: until it exists the call returns dns_txt_required with the record name and value in details.name and details.value. Then a Let's Encrypt certificate and Apache vhost are provisioned. Up to 5 create or delete operations per hour, failed TXT checks included.","params":{"soft_id":"ID of a software you own","domain":"lowercase domain that already points to the panel IP","endpoint?":"main or test, default main"},"body_example":{"api_key":"YOUR_API_KEY","method":"create-domain","soft_id":123,"domain":"keys.example.com","endpoint":"main"},"success_example":{"id":1,"soft_id":10,"endpoint":"main","domain":"keys.example.com","active":true,"provisioned":true,"created_at":"2025-06-01 12:00:00","created_by":"JohnDoe","public_url":"https://keys.example.com/connect"},"success_code":201,"error_example":{"ok":false,"error":"dns_txt_required","message":"domain ownership verification failed","details":{"name":"_modkey.keys.example.com","value":"mdk-verify-<token>"}},"action":"create-domain"},{"method":"POST","path":"/api/v2/action","desc":"Enable or disable a domain. The vhost and certificate are retained in both cases.","params":{"domain_id":"integer","soft_id":"ID of a software you own","active":"true enables the domain, false pauses it"},"body_example":{"api_key":"YOUR_API_KEY","method":"edit-domain","soft_id":123,"domain_id":1,"active":false},"success_example":{"id":1,"soft_id":10,"domain":"keys.example.com","active":false,"provisioned":true,"created_at":"2025-06-01 12:00:00","created_by":"JohnDoe","public_url":"https://keys.example.com/connect"},"error_example":{"ok":false,"error":"not_found","message":"domain not found"},"action":"edit-domain"},{"method":"POST","path":"/api/v2/action","desc":"Delete a domain. The Apache vhost is removed; the certificate remains on disk. Shares the 5 per hour quota with domain creation.","success_example":{"deleted":true,"domain":"keys.example.com"},"error_example":{"ok":false,"error":"not_found","message":"domain not found"},"action":"delete-domain","params":{"domain_id":"integer","soft_id":"ID of a software you own"},"body_example":{"api_key":"YOUR_API_KEY","method":"delete-domain","soft_id":123,"domain_id":1}},{"group":"Keys"},{"method":"POST","path":"/api/v2/action","desc":"List software keys.","success_example":{"total":150,"limit":50,"offset":0,"items":[{"id":100,"key":"MYCHEATS-7D-AB12CD34","game":"standoff2","soft_id":10,"duration":7,"expired_date":null,"max_devices":2,"devices":[],"devices_used":0,"status":1,"active":1,"single":false,"is_admin":false,"hwid_reset_limit":2,"hwid_resets_used":0,"registrator":"JohnDoe","registrator_id":1,"key_type":"APK","created_at":"2025-06-01 12:00:00","updated_at":"2025-06-01 12:00:00"}]},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"action":"get-keys","params":{"soft_id":"ID of a software you own","q?":"substring search","status?":"filter: 1 normal, 0 blocked","active?":"filter: 1 active, 0 paused","game?":"filter by game","key_type?":"filter by type: APK or INJECTOR","limit?":"number of records to return, 1..200, default 50","offset?":"number of records to skip for pagination"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-keys","soft_id":123}},{"method":"POST","path":"/api/v2/action","desc":"Generate 1 to 1000 keys. Uses the software key_format unless overridden.","params":{"soft_id":"ID of a software you own","game":"game identifier, for example \"standoff2\"","duration":"days, negative hours, or \"lifetime\" for unlimited duration","max_devices?":"integer of at least 1, default 1","key_type?":"APK or INJECTOR, default APK","count?":"default 1, maximum 1000","single?":"bool","key_format?":"pattern using {RANDOM:N}, {NAME}, {DURATION}, {UPLINK}, {GAME}","hwid_reset_limit?":"-1 for unlimited, or 0 to 1000"},"body_example":{"api_key":"YOUR_API_KEY","method":"create-keys","soft_id":123,"game":"standoff2","duration":7,"count":5,"max_devices":1},"success_example":{"count":5,"items":[{"id":100,"key":"MYCHEATS-7D-AB12CD34","game":"standoff2","soft_id":10,"duration":7,"expired_date":null,"max_devices":1,"devices":[],"devices_used":0,"status":1,"active":1,"single":false,"is_admin":false,"hwid_reset_limit":2,"hwid_resets_used":0,"registrator":"JohnDoe","registrator_id":1,"key_type":"APK","created_at":"2025-06-01 12:00:00","updated_at":"2025-06-01 12:00:00"}]},"success_code":201,"error_example":{"ok":false,"error":"validation","message":"count must be 1..1000"},"action":"create-keys"},{"method":"POST","path":"/api/v2/action","desc":"Get one key by its user_key string.","success_example":{"id":100,"key":"MYCHEATS-7D-AB12CD34","game":"standoff2","soft_id":10,"duration":7,"expired_date":null,"max_devices":2,"devices":[],"devices_used":0,"status":1,"active":1,"single":false,"is_admin":false,"hwid_reset_limit":2,"hwid_resets_used":0,"registrator":"JohnDoe","registrator_id":1,"key_type":"APK","created_at":"2025-06-01 12:00:00","updated_at":"2025-06-01 12:00:00"},"error_example":{"ok":false,"error":"not_found","message":"key not found"},"action":"get-key","params":{"key":"license key string (user_key)","soft_id":"ID of a software you own"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-key","soft_id":123,"key":"KEY-EXAMPLE"}},{"method":"POST","path":"/api/v2/action","desc":"Update one key.","params":{"key":"license key string (user_key)","soft_id":"ID of a software you own","duration?":"integer","max_devices?":"integer of at least 1","hwid_reset_limit?":"-1 for unlimited, or 0 to 1000","active?":"true or false","status?":"bool","key_type?":"APK or INJECTOR"},"body_example":{"api_key":"YOUR_API_KEY","method":"edit-key","soft_id":123,"key":"KEY-EXAMPLE","duration":30,"max_devices":5},"success_example":{"id":100,"key":"MYCHEATS-7D-AB12CD34","game":"standoff2","soft_id":10,"duration":30,"expired_date":null,"max_devices":5,"devices":[],"devices_used":0,"status":1,"active":1,"single":false,"is_admin":false,"hwid_reset_limit":2,"hwid_resets_used":0,"registrator":"JohnDoe","registrator_id":1,"key_type":"APK","created_at":"2025-06-01 12:00:00","updated_at":"2025-06-01 12:00:00"},"error_example":{"ok":false,"error":"validation","message":"invalid duration"},"action":"edit-key"},{"method":"POST","path":"/api/v2/action","desc":"Delete one key.","success_example":{"deleted":true,"key":"MYCHEATS-7D-AB12CD34"},"error_example":{"ok":false,"error":"not_found","message":"key not found"},"action":"delete-key","params":{"key":"license key string (user_key)","soft_id":"ID of a software you own"},"body_example":{"api_key":"YOUR_API_KEY","method":"delete-key","soft_id":123,"key":"KEY-EXAMPLE"}},{"method":"POST","path":"/api/v2/action","desc":"Reset a key's linked devices and increment hwid_resets_used by 1.","success_example":{"id":100,"key":"MYCHEATS-7D-AB12CD34","game":"standoff2","soft_id":10,"duration":7,"expired_date":null,"max_devices":2,"devices":[],"devices_used":0,"status":1,"active":1,"single":false,"is_admin":false,"hwid_reset_limit":2,"hwid_resets_used":1,"registrator":"JohnDoe","registrator_id":1,"key_type":"APK","created_at":"2025-06-01 12:00:00","updated_at":"2025-06-01 12:00:00"},"error_example":{"ok":false,"error":"not_found","message":"key not found"},"action":"reset-key-hwid","params":{"key":"license key string (user_key)","soft_id":"ID of a software you own"},"body_example":{"api_key":"YOUR_API_KEY","method":"reset-key-hwid","soft_id":123,"key":"KEY-EXAMPLE"}},{"method":"POST","path":"/api/v2/action","desc":"Export a list as a file, up to 10000 rows.","success_example":"(Returns a txt/csv/json file instead of the usual JSON envelope)","error_example":{"ok":false,"error":"validation","message":"format must be txt, csv or json"},"action":"export-keys","params":{"soft_id":"ID of a software you own","format?":"export format: txt, csv or json","game?":"filter by game","active?":"filter: 1 active, 0 paused"},"body_example":{"api_key":"YOUR_API_KEY","method":"export-keys","soft_id":123}},{"group":"Device bans"},{"action":"get-bans","desc":"List banned device serials with refused attempts.","params":{"soft_id":"ID of a software you own","limit?":"1-200, default 50","offset?":"default 0"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-bans","soft_id":123},"success_example":{"total":1,"limit":50,"offset":0,"items":[{"id":7,"serial":"device-serial","banned_by":"JohnDoe","attempts":3}]},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"method":"POST","path":"/api/v2/action"},{"action":"ban-device","desc":"Ban a device serial. Connect refuses it on every key of the software.","params":{"soft_id":"ID of a software you own","serial":"up to 255 characters, no commas"},"body_example":{"api_key":"YOUR_API_KEY","method":"ban-device","soft_id":123,"serial":"device-serial"},"success_example":{"id":7,"serial":"device-serial","banned_by":"JohnDoe","attempts":0},"success_code":201,"error_example":{"ok":false,"error":"duplicate","message":"this serial is already banned"},"method":"POST","path":"/api/v2/action"},{"action":"unban-device","desc":"Remove a ban.","params":{"soft_id":"ID of a software you own","ban_id":"ban ID from get-bans"},"body_example":{"api_key":"YOUR_API_KEY","method":"unban-device","soft_id":123,"ban_id":7},"success_example":{"id":7,"deleted":true},"error_example":{"ok":false,"error":"not_found","message":"ban not found"},"method":"POST","path":"/api/v2/action"},{"group":"Bulk key operations"},{"method":"POST","path":"/api/v2/action","desc":"Reset devices for all matching keys.","params":{"soft_id":"ID of a software you own","filter?":"object {game?, key_type?, active?, status?}"},"body_example":{"api_key":"YOUR_API_KEY","method":"reset-keys-hwid","soft_id":123,"filter":{"game":"standoff2"}},"success_example":{"affected":42},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"action":"reset-keys-hwid"},{"method":"POST","path":"/api/v2/action","desc":"Pause matching keys (active=0).","params":{"soft_id":"ID of a software you own","filter?":"same structure as above"},"body_example":{"api_key":"YOUR_API_KEY","method":"pause-keys","soft_id":123,"filter":{"game":"standoff2"}},"success_example":{"affected":42,"active":0},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"action":"pause-keys"},{"method":"POST","path":"/api/v2/action","desc":"Resume matching keys (active=1).","body_example":{"api_key":"YOUR_API_KEY","method":"resume-keys","soft_id":123,"filter":{"game":"standoff2"}},"success_example":{"affected":42,"active":1},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"action":"resume-keys","params":{"soft_id":"ID of a software you own"}},{"method":"POST","path":"/api/v2/action","desc":"Add or subtract days from activated, time-limited keys. Paused keys stay paused. Unactivated and lifetime keys are skipped.","params":{"soft_id":"ID of a software you own","days":"-3650 to 3650, excluding zero","filter?":"optional filter"},"body_example":{"api_key":"YOUR_API_KEY","method":"extend-keys","soft_id":123,"days":7,"filter":{"game":"standoff2"}},"success_example":{"days_applied":7,"affected":42},"error_example":{"ok":false,"error":"validation","message":"days must be a non-zero integer between -3650 and 3650"},"action":"extend-keys"},{"method":"POST","path":"/api/v2/action","desc":"Delete matching keys. kind=all requires confirm.","params":{"soft_id":"ID of a software you own","kind":"expired, blocked, inactive, unused or all","confirm?":"required only for kind=all, value \"I_KNOW_WHAT_I_AM_DOING\""},"body_example":{"api_key":"YOUR_API_KEY","method":"delete-keys","soft_id":123,"kind":"expired"},"success_example":{"deleted":15,"kind":"expired"},"error_example":{"ok":false,"error":"confirmation_required","message":"to delete ALL keys for this soft, pass confirm=I_KNOW_WHAT_I_AM_DOING"},"action":"delete-keys"},{"action":"block-keys","desc":"Block matching keys (status=0). Blocked keys are refused by Connect.","params":{"soft_id":"ID of a software you own","filter?":"same structure as above"},"body_example":{"api_key":"YOUR_API_KEY","method":"block-keys","soft_id":123,"filter":{"game":"standoff2"}},"success_example":{"affected":42,"status":0},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"method":"POST","path":"/api/v2/action"},{"action":"unblock-keys","desc":"Unblock matching keys (status=1).","params":{"soft_id":"ID of a software you own","filter?":"same structure as above"},"body_example":{"api_key":"YOUR_API_KEY","method":"unblock-keys","soft_id":123,"filter":{"game":"standoff2"}},"success_example":{"affected":42,"status":1},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"method":"POST","path":"/api/v2/action"},{"group":"Statistics"},{"method":"POST","path":"/api/v2/action","desc":"Software totals: keys, domains and client accounts.","success_example":{"scope":"own","softs_count":1,"keys_total":150,"keys_active":120,"custom_domains":2,"users_count":8},"error_example":{"ok":false,"error":"unauthorized","message":"Invalid or missing api_key"},"action":"get-overview-stats","params":{"soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-overview-stats"}},{"method":"POST","path":"/api/v2/action","desc":"Software key counts: total, active, paused, blocked and expired.","success_example":{"soft":{"id":10,"name":"MyCheats"},"keys":{"total":150,"active":120,"paused":10,"blocked":5,"expired":15},"custom_domains_count":2},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"action":"get-soft-stats","params":{"soft_id":"ID of a software you own"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-soft-stats","soft_id":123}},{"group":"Key generation templates"},{"method":"POST","path":"/api/v2/action","desc":"Your key generation templates.","success_example":{"total":5,"limit":50,"offset":0,"items":[{"id":1,"user_id":1,"soft_id":10,"name":"Weekly","game":"standoff2","duration":7,"key_type":"APK","max_devices":1,"loopcount":10,"use_count":50,"is_single":false,"access_type":"all","allowed_roles":null,"allowed_users":null,"created_at":"2025-01-01 00:00:00"}]},"error_example":{"ok":false,"error":"unauthorized","message":"Invalid or missing api_key"},"action":"get-key-templates","params":{"soft_id?":"ID of a software you own; your main software when omitted","limit?":"number of records to return, 1..200, default 50","offset?":"number of records to skip for pagination"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-key-templates"}},{"method":"POST","path":"/api/v2/action","desc":"Create a generation template.","params":{"soft_id":"int","name":"string","game":"game id","duration":"int","key_type?":"APK or INJECTOR","max_devices?":"int","loopcount?":"1 to 10, default 1","is_single?":"true or false, single-use key","access_type?":"all, roles or users","allowed_roles?":"1 to 5 role IDs (values 1..5), required when access_type=roles","allowed_users?":"1 to 100 user IDs from this software, required when access_type=users"},"body_example":{"api_key":"YOUR_API_KEY","method":"create-key-template","soft_id":123,"name":"Daily","game":"standoff2","duration":1,"max_devices":1},"success_example":{"id":1,"user_id":1,"soft_id":123,"name":"Daily","game":"standoff2","duration":1,"key_type":"APK","max_devices":1,"loopcount":1,"use_count":0,"is_single":false,"access_type":"all","allowed_roles":null,"allowed_users":null,"created_at":"2025-06-01 12:00:00"},"success_code":201,"error_example":{"ok":false,"error":"validation","message":"name, game, duration are required"},"action":"create-key-template"},{"method":"POST","path":"/api/v2/action","desc":"Delete your template.","success_example":{"deleted":true,"id":1},"error_example":{"ok":false,"error":"not_found","message":"template not found"},"action":"delete-key-template","params":{"template_id":"generation template ID","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"delete-key-template","template_id":1}},{"group":"Client accounts"},{"method":"POST","path":"/api/v2/action","desc":"Client accounts created by you. status: 1 not blocked, 0 blocked; check expiration_date for expiry.","success_example":{"total":8,"limit":50,"offset":0,"items":[{"id":50,"username":"myreseller1","fullname":"Reseller One","email":"res@mail.com","level":3,"level_label":"Reseller","status":1,"saldo":1000,"uplink":"JohnDoe","soft":10,"created_at":"2025-03-01 09:00:00","expiration_date":"2026-03-01 09:00:00","telegram":null,"telegram_id":null}]},"error_example":{"ok":false,"error":"unauthorized","message":"Invalid or missing api_key"},"action":"get-users","params":{"q?":"substring search","level?":"filter by role: 2 Admin, 3 Reseller","status?":"filter: 1 normal, 0 blocked","limit?":"number of records to return, 1..200, default 50","offset?":"number of records to skip for pagination","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-users"}},{"method":"POST","path":"/api/v2/action","desc":"Create a client account. Software and uplink are assigned automatically.","params":{"username":"4-25 alphanumeric chars","password":"8-128 chars","level?":"2 Admin or 3 Reseller, default 2","email?":"up to 40 characters; a placeholder address is generated when omitted","fullname?":"up to 155 characters: letters, digits, spaces, periods, apostrophes and hyphens","saldo?":"int","expiration_date?":"YYYY-MM-DD HH:MM:SS","expiration_days?":"0 to 18250. Admin and Reseller accounts default to 30 days","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"create-user","username":"newrep1","password":"abcd1234","level":3},"success_example":{"id":50,"username":"newrep1","fullname":"","email":"ub5559fdd95b1@m.dk","level":3,"level_label":"Reseller","status":1,"saldo":0,"uplink":"JohnDoe","soft":10,"created_at":"2025-06-01 12:00:00","expiration_date":"2025-07-01 12:00:00","telegram":null,"telegram_id":null},"success_code":201,"error_example":{"ok":false,"error":"duplicate","message":"username already taken"},"action":"create-user"},{"method":"POST","path":"/api/v2/action","desc":"Client account details.","success_example":{"id":50,"username":"myreseller1","fullname":"Reseller One","email":"res@mail.com","level":3,"level_label":"Reseller","status":1,"saldo":1000,"uplink":"JohnDoe","soft":10,"created_at":"2025-03-01 09:00:00","expiration_date":"2026-03-01 09:00:00","telegram":null,"telegram_id":null},"error_example":{"ok":false,"error":"not_found","message":"user not found or not in your downline"},"action":"get-user","params":{"user_id":"client account ID","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-user","user_id":50}},{"method":"POST","path":"/api/v2/action","desc":"Update one of your client accounts.","params":{"user_id":"client account ID","fullname?":"up to 155 characters: letters, digits, spaces, periods, apostrophes and hyphens","email?":"up to 40 characters","telegram?":"1 to 32 letters, digits or underscores. Leading @ is optional; an empty value clears the field","status?":"0/1","saldo?":"int","expiration_date?":"date and time","level?":"2 or 3","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"edit-user","user_id":50,"fullname":"Updated Name","saldo":1000},"success_example":{"id":50,"username":"myreseller1","fullname":"Updated Name","email":"res@mail.com","level":3,"level_label":"Reseller","status":1,"saldo":1000,"uplink":"JohnDoe","soft":10,"created_at":"2025-03-01 09:00:00","expiration_date":"2026-03-01 09:00:00","telegram":null,"telegram_id":null},"error_example":{"ok":false,"error":"forbidden_soft","message":"Soft Owner may only assign users to their own soft"},"action":"edit-user"},{"method":"POST","path":"/api/v2/action","desc":"Delete a client account.","success_example":{"deleted":true,"id":50},"error_example":{"ok":false,"error":"self_destroy","message":"cannot delete yourself"},"action":"delete-user","params":{"user_id":"client account ID","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"delete-user","user_id":50}},{"method":"POST","path":"/api/v2/action","desc":"Block: status=0, the user can no longer sign in.","success_example":{"id":50,"status":0},"error_example":{"ok":false,"error":"self_block","message":"cannot change your own status"},"action":"block-user","params":{"user_id":"client account ID","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"block-user","user_id":50}},{"method":"POST","path":"/api/v2/action","desc":"Unblock: status=1.","success_example":{"id":50,"status":1},"error_example":{"ok":false,"error":"not_found","message":"user not found or not in your downline"},"action":"unblock-user","params":{"user_id":"client account ID","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"unblock-user","user_id":50}},{"method":"POST","path":"/api/v2/action","desc":"Reset quick-login tokens and require the user to sign in again.","success_example":{"id":50,"sessions_kicked":3},"error_example":{"ok":false,"error":"not_found","message":"user not found or not in your downline"},"action":"kick-user-sessions","params":{"user_id":"client account ID","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"kick-user-sessions","user_id":50}},{"action":"reset-user-password","desc":"Create a one-hour password reset link for an Admin or Reseller you created.","params":{"user_id":"client account ID","soft_id?":"ID of a software you own; default is your main software"},"body_example":{"api_key":"YOUR_API_KEY","method":"reset-user-password","user_id":50},"success_example":{"id":50,"reset_url":"https://mod.wtf/auth/reset-password?uid=50#token=<TOKEN>","expires_in_seconds":3600},"error_example":{"ok":false,"error":"not_found","message":"user not found or not in your downline"},"method":"POST","path":"/api/v2/action"},{"group":"Referrals"},{"method":"POST","path":"/api/v2/action","desc":"Same as get-users.","success_example":{"total":8,"limit":50,"offset":0,"items":[{"id":50,"username":"myreseller1","fullname":"Reseller One","email":"res@mail.com","level":3,"level_label":"Reseller","status":1,"saldo":1000,"uplink":"JohnDoe","soft":10,"created_at":"2025-03-01 09:00:00","expiration_date":"2026-03-01 09:00:00","telegram":null,"telegram_id":null}]},"error_example":{"ok":false,"error":"unauthorized","message":"Invalid or missing api_key"},"action":"get-referrals","params":{"soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-referrals"}},{"method":"POST","path":"/api/v2/action","desc":"Same as create-user; level defaults to 2 (Admin). In software you created, level 4 adds a Software owner.","params":{"username":"4-25 alphanumeric chars","password":"8-128 chars","level?":"2 or 3; 4 only in software you created; default 2","email?":"up to 40 characters; a placeholder address is generated when omitted","fullname?":"string","expiration_days?":"0 to 18250. Admin and Reseller default to 30 days. Software owners never expire","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"create-referral","username":"newpartner","password":"abcd1234","expiration_days":30},"success_example":{"id":51,"username":"newpartner","fullname":"","email":"ue2a994e09598@m.dk","level":2,"level_label":"Admin","status":1,"saldo":0,"uplink":"JohnDoe","soft":10,"created_at":"2025-06-01 12:00:00","expiration_date":"2025-07-01 12:00:00","telegram":null,"telegram_id":null},"success_code":201,"error_example":{"ok":false,"error":"validation","message":"username must be 4-25 alphanumeric characters"},"action":"create-referral"},{"group":"Referral codes"},{"action":"get-referral-codes","desc":"List sign-up codes of a software. used=0 for free codes, used=1 for used ones.","params":{"soft_id?":"ID of a software you own; default is your main software","used?":"0 or 1","limit?":"1-200, default 50","offset?":"default 0"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-referral-codes","used":0},"success_example":{"total":1,"limit":50,"offset":0,"items":[{"id":9,"code":"Hq7tPzW3mKa9RbXe","level":3,"role":"Reseller","soft_id":123,"saldo":500,"account_expires":"2026-12-01 12:00:00","used_by":null,"created_by":"JohnDoe"}]},"error_example":{"ok":false,"error":"validation","message":"used must be 0 or 1"},"method":"POST","path":"/api/v2/action"},{"action":"create-referral-code","desc":"Create a one-time sign-up code. It sets the role, balance and account term of whoever signs up with it.","params":{"soft_id?":"ID of a software you own; default is your main software","level?":"2 Admin or 3 Reseller, 4 only in software you created; default 3","saldo?":"starting balance, default 0","days?":"1, 3, 7, 14, 30, 60, 90, 180, 365 or 0 for lifetime; default 30"},"body_example":{"api_key":"YOUR_API_KEY","method":"create-referral-code","level":3,"saldo":500,"days":30},"success_example":{"id":9,"code":"Hq7tPzW3mKa9RbXe","level":3,"role":"Reseller","soft_id":123,"saldo":500,"account_expires":"2026-12-01 12:00:00","used_by":null,"created_by":"JohnDoe"},"success_code":201,"error_example":{"ok":false,"error":"forbidden","message":"You cannot assign this role."},"method":"POST","path":"/api/v2/action"},{"action":"delete-referral-code","desc":"Delete an unused code. Used codes stay in history.","params":{"code_id":"code ID from get-referral-codes","soft_id?":"ID of a software you own; your main software when omitted"},"body_example":{"api_key":"YOUR_API_KEY","method":"delete-referral-code","code_id":9},"success_example":{"id":9,"deleted":true},"error_example":{"ok":false,"error":"scope_changed","message":"This code has been used and must remain in history."},"method":"POST","path":"/api/v2/action"},{"group":"Connect settings"},{"action":"get-connect","desc":"Read the Connect settings of an endpoint and game profile: request fields, response templates, signature, IP guard, CipherLink and messages.","params":{"soft_id":"ID of a software you own","endpoint?":"main or test, default main","profile?":"game profile ID, default \"default\""},"body_example":{"api_key":"YOUR_API_KEY","method":"get-connect","soft_id":123,"endpoint":"main"},"success_example":{"soft_id":123,"endpoint":"main","profile":"default","request_game":"game","request_key":"user_key","request_serial":"serial","signature_enabled":true,"one_hwid_per_ip":false},"error_example":{"ok":false,"error":"not_found","message":"game profile not found"},"method":"POST","path":"/api/v2/action"},{"action":"edit-connect","desc":"Change request fields, templates, signature, IP guard or CipherLink. Send only the fields to change.","params":{"soft_id":"ID of a software you own","endpoint?":"main or test","profile?":"game profile ID","request_game?":"field name","request_key?":"field name","request_serial?":"field name","request_game_enabled?":"boolean","request_custom_fields?":"list of field names","success_template?":"object or JSON string","error_template?":"object or JSON string","signature_enabled?":"boolean","signature_source?":"string","token_algorithm?":"string","connect_secret?":"16-128 characters","reset_connect_secret?":"boolean","one_hwid_per_ip?":"boolean","connect_cipher_enabled?":"boolean, needs CipherLink keys"},"body_example":{"api_key":"YOUR_API_KEY","method":"edit-connect","soft_id":123,"one_hwid_per_ip":true},"success_example":{"message":"Request and response saved.","soft_id":123,"endpoint":"main","one_hwid_per_ip":true},"error_example":{"ok":false,"error":"validation","message":"Request field names must be unique."},"method":"POST","path":"/api/v2/action"},{"action":"edit-connect-messages","desc":"Change the refusal messages of an endpoint and game profile.","params":{"soft_id":"ID of a software you own","endpoint?":"main or test","profile?":"game profile ID","err_key_not_found?":"string","err_key_on_pause?":"string","err_key_blocked?":"string","err_expire_key?":"string","err_device_max_slots?":"string","ip_device_limit?":"string"},"body_example":{"api_key":"YOUR_API_KEY","method":"edit-connect-messages","soft_id":123,"err_key_blocked":"Your key is blocked"},"success_example":{"soft_id":123,"endpoint":"main","messages":{"err_key_blocked":"Your key is blocked"}},"error_example":{"ok":false,"error":"validation","message":"Fill in every error message with 1-255 characters."},"method":"POST","path":"/api/v2/action"},{"action":"create-game-profile","desc":"Add a game profile with its own fields, templates and messages.","params":{"soft_id":"ID of a software you own","endpoint?":"main or test","name":"lowercase letters and numbers","value":"value the mod sends in the game field","copy_from?":"profile to copy, default \"default\""},"body_example":{"api_key":"YOUR_API_KEY","method":"create-game-profile","soft_id":123,"name":"pubg","value":"pubg"},"success_example":{"soft_id":123,"endpoint":"main","profile":"pubg"},"success_code":201,"error_example":{"ok":false,"error":"validation","message":"A game with this client value already exists."},"method":"POST","path":"/api/v2/action"},{"action":"delete-game-profile","desc":"Delete a game profile.","params":{"soft_id":"ID of a software you own","endpoint?":"main or test","profile":"game profile ID"},"body_example":{"api_key":"YOUR_API_KEY","method":"delete-game-profile","soft_id":123,"profile":"pubg"},"success_example":{"profile":"pubg","deleted":true},"error_example":{"ok":false,"error":"not_found","message":"game profile not found"},"method":"POST","path":"/api/v2/action"},{"action":"rotate-cipher-keys","desc":"Generate CipherLink keys and turn CipherLink on. Replacing existing keys needs confirm=true; old builds stop passing validation.","params":{"soft_id":"ID of a software you own","endpoint?":"main or test","confirm?":"boolean, required when keys exist"},"body_example":{"api_key":"YOUR_API_KEY","method":"rotate-cipher-keys","soft_id":123},"success_example":{"replaced":false,"client":{"aes_key":"<AES_KEY>","aes_iv":"<AES_IV>","public_key":"<PEM>"}},"error_example":{"ok":false,"error":"confirmation_required","message":"keys exist; send confirm=true to replace them, existing builds will stop passing validation"},"method":"POST","path":"/api/v2/action"},{"action":"edit-connect-page","desc":"Change the public page at the Connect URL. To upload background or music, send multipart/form-data with the method in the query string: POST /api/v2/action?method=edit-connect-page.","params":{"soft_id":"ID of a software you own","endpoint?":"main or test","enabled?":"boolean","title?":"up to 100 characters","description?":"up to 2000 characters","links?":"list of {text, url}, up to 10","music_loop?":"boolean","music_volume?":"0-100","background?":"image file","music?":"audio file","remove_background?":"boolean","remove_music?":"boolean"},"body_example":{"api_key":"YOUR_API_KEY","method":"edit-connect-page","soft_id":123,"enabled":true,"title":"My mod","links":[{"text":"Telegram","url":"https://t.me/example"}]},"success_example":{"soft_id":123,"endpoint":"main","enabled":true,"title":"My mod"},"error_example":{"ok":false,"error":"validation","message":"Each link needs a valid label and an HTTP or HTTPS URL."},"method":"POST","path":"/api/v2/action"},{"group":"Online System and files"},{"action":"get-online","desc":"Read the Online System: mod feature switches, mod name, status and floating text.","params":{"soft_id":"ID of a software you own"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-online","soft_id":123},"success_example":{"soft_id":123,"features":{"esp":true,"items":true,"aim":true},"mod_name":"SUCCESS","safe":true,"mod_status":"Safe","floating_text":"Powered by Modkey Platform"},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"method":"POST","path":"/api/v2/action"},{"action":"edit-online","desc":"Change Online System values. Send only what changes; running mods get them on the next check.","params":{"soft_id":"ID of a software you own","features?":"object of esp, items, aim, silent_aim, bullet_track, memory, floating, settings: booleans","mod_name?":"string","mod_status?":"Safe or High","floating_text?":"string"},"body_example":{"api_key":"YOUR_API_KEY","method":"edit-online","soft_id":123,"features":{"esp":false},"mod_status":"Safe"},"success_example":{"soft_id":123,"features":{"esp":false},"mod_status":"Safe"},"error_example":{"ok":false,"error":"validation","message":"features.esp must be true or false"},"method":"POST","path":"/api/v2/action"},{"action":"get-files","desc":"List Online Lib files of a software with their public links.","params":{"soft_id":"ID of a software you own"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-files","soft_id":123},"success_example":{"soft_id":123,"limit":10,"max_bytes":14680064,"items":[{"token":"<TOKEN>","name":"libmod.so","link":"libmod.so","url":"https://mod.wtf/lib/libmod.so","version":"1.0.0","size":1048576,"available":true}]},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"method":"POST","path":"/api/v2/action"},{"action":"upload-files","desc":"Upload library files. Send multipart/form-data with the method in the query string: POST /api/v2/action?method=upload-files. Up to 10 files and 14 MB per upload.","params":{"soft_id":"ID of a software you own","files[]":".so, .a, .dll, .dylib or .lib files","version?":"up to 32 characters"},"body_example":{"api_key":"YOUR_API_KEY","method":"upload-files","soft_id":123,"version":"1.0.0"},"success_example":{"soft_id":123,"items":[{"token":"<TOKEN>","name":"libmod.so"}]},"success_code":201,"error_example":{"ok":false,"error":"validation","message":"You can store up to 10 files. Delete files to free up space."},"method":"POST","path":"/api/v2/action"},{"action":"rename-file","desc":"Change the public link name of a file. Old links keep working.","params":{"soft_id":"ID of a software you own","token":"file token from get-files","link":"new file name"},"body_example":{"api_key":"YOUR_API_KEY","method":"rename-file","soft_id":123,"token":"<TOKEN>","link":"libmod-v2.so"},"success_example":{"soft_id":123,"items":[{"token":"<TOKEN>","link":"libmod-v2.so"}]},"error_example":{"ok":false,"error":"validation","message":"Enter a valid filename ending in .so, .a, .dll, .dylib or .lib."},"method":"POST","path":"/api/v2/action"},{"action":"replace-file","desc":"Replace a file. Send multipart/form-data with the method in the query string: POST /api/v2/action?method=replace-file. Its links keep working.","params":{"soft_id":"ID of a software you own","token":"file token from get-files","file":"the new file","version?":"up to 32 characters"},"body_example":{"api_key":"YOUR_API_KEY","method":"replace-file","soft_id":123,"token":"<TOKEN>","version":"1.0.1"},"success_example":{"soft_id":123,"items":[{"token":"<TOKEN>","version":"1.0.1"}]},"error_example":{"ok":false,"error":"validation","message":"send exactly one file in the multipart field file"},"method":"POST","path":"/api/v2/action"},{"action":"delete-file","desc":"Delete one file, or every file of the software with all=true. Their links stop working.","params":{"soft_id":"ID of a software you own","token?":"file token from get-files","all?":"boolean"},"body_example":{"api_key":"YOUR_API_KEY","method":"delete-file","soft_id":123,"token":"<TOKEN>"},"success_example":{"soft_id":123,"items":[]},"error_example":{"ok":false,"error":"not_found","message":"file not found"},"method":"POST","path":"/api/v2/action"},{"group":"Activity"},{"action":"get-logs","desc":"Read the log of a software: panel actions and key checks, 50 per page.","params":{"soft_id":"ID of a software you own","filter?":"all, success, failed or info","q?":"text search","page?":"default 1"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-logs","soft_id":123,"filter":"failed"},"success_example":{"logs":[{"id":1,"action":"serial \"abc\" failed to log in with key \"KEY\"","date":"2026-10-26 12:00:00","soft":123,"event":"connect.denied","reason":"key_expired","occurrences":2}],"total":1,"page":1,"per_page":50,"total_pages":1},"error_example":{"ok":false,"error":"validation","message":"filter must be one of all, success, failed, info"},"method":"POST","path":"/api/v2/action"},{"action":"get-connect-logins","desc":"List Connect sign-ins: serial, key and result.","params":{"soft_id":"ID of a software you own","q?":"serial or key","limit?":"1-100","offset?":"default 0"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-connect-logins","soft_id":123,"limit":20},"success_example":{"total":1,"limit":20,"offset":0,"items":[{"id":1,"serial":"abc","user_key":"KEY","success":true,"login_time":"2026-10-26 12:00:00","occurrences":1}]},"error_example":{"ok":false,"error":"not_found","message":"soft not found or not yours"},"method":"POST","path":"/api/v2/action"},{"action":"get-clients","desc":"Clients by country from successful key checks, and who is online now.","params":{"soft_id":"ID of a software you own","period?":"24h, 7d or 30d, default 7d"},"body_example":{"api_key":"YOUR_API_KEY","method":"get-clients","soft_id":123,"period":"7d"},"success_example":{"soft_id":123,"period":"7d","countries":[{"code":"US","count":12}],"total":12,"online":{"total":3}},"error_example":{"ok":false,"error":"validation","message":"period must be one of 24h, 7d, 30d"},"method":"POST","path":"/api/v2/action"}]}}