Mod upload API: Difference between revisions
		
		
		
		Jump to navigation
		Jump to search
		
 Add upload API documentation from forums  | 
				 Removed {{Languages}}  | 
				||
| Line 7: | Line 7: | ||
== Endpoints ==  | == Endpoints ==  | ||
=== init_upload ===  | === init_upload ===  | ||
{| class="wikitable"  | {| class="wikitable"  | ||
| URL || https://mods.factorio.com/api/v2/mods/releases/init_upload    | | URL || https://mods.factorio.com/api/v2/mods/releases/init_upload    | ||
|-  | |-  | ||
| HTTP Method || <code>POST</code>    | | HTTP Method || <code>POST</code>  | ||
|}  | |}  | ||
| Line 39: | Line 35: | ||
=== finish_upload ===  | === finish_upload ===  | ||
{| class="wikitable"  | {| class="wikitable"  | ||
| URL || <code>$upload_url</code> URL returned by the init_upload endpoint  | | URL || <code>$upload_url</code> URL returned by the init_upload endpoint  | ||
|-  | |-  | ||
| Line 78: | Line 73: | ||
|-  | |-  | ||
| UnknownMod || Mod does not exist in mod portal  | | UnknownMod || Mod does not exist in mod portal  | ||
|}  | |}  | ||
| Line 120: | Line 113: | ||
</syntaxhighlight>  | </syntaxhighlight>  | ||
[[Category:Technical]]  | |||
Latest revision as of 09:08, 12 November 2023
Category: Public API
The mod upload API is used to add new releases to mods on the Factorio mod portal. It requires an API key with the ModPortal: Upload Mods usage, which can be created on https://factorio.com/profile. 
It accepts multipart/form-data HTTP requests and responds with JSON encoded objects.
It was first announced on the Factorio forums. [1]
Endpoints
init_upload
| URL | https://mods.factorio.com/api/v2/mods/releases/init_upload | 
| HTTP Method | POST
 | 
HTTP Request Header
| Authorization | Bearer $APIKey | 
Authorization header with the APIKey and a "Bearer " prefix -> "Bearer $APIKey" | 
HTTP Request Body
| mod | string | Name of the mod, for which a new release will be uploaded | 
JSON object response
| upload_url | string | URL the mod zip file should be uploaded to | 
| error | string | This attribute only appears on failed requests. | 
| message | string | This attribute only appears on failed requests. Has details about the problem. | 
finish_upload
| URL | $upload_url URL returned by the init_upload endpoint
 | 
| HTTP Method | POST
 | 
HTTP Request Body
| file | Mod zip file | 
JSON object response
| success | bool | This attribute only appears on successful uploads. It's set to true. | 
| error | string | This attribute only appears on failed uploads. | 
| message | string | This attribute only appears on failed uploads. Has details about the problem. | 
Possible API Error Responses
Possible values for the error property of API responses
| InvalidApiKey | Missing or invalid API key for the current endpoint | 
| InvalidRequest | Invalid request. | 
| InternalError | Internal error, please try again later. | 
| Forbidden | Insufficent permission for current endpoint | 
| Unknown | Unknown error, please try again later. | 
| InvalidModRelease | Invalid release data in info.json | 
| InvalidModUpload | Invalid mod data in zipfile | 
| UnknownMod | Mod does not exist in mod portal | 
Python Example
import sys
import requests
from os import getenv
MOD_PORTAL_URL = "https://mods.factorio.com"
INIT_UPLOAD_URL = f"{MOD_PORTAL_URL}/api/v2/mods/releases/init_upload"
apikey = getenv("MOD_UPLOAD_API_KEY")
modname = getenv("MOD_UPLOAD_NAME")
zipfilepath = getenv("MOD_UPLOAD_FILE")
request_body = data={"mod":modname}
request_headers = {"Authorization": f"Bearer {apikey}"}
response = requests.post(
	INIT_UPLOAD_URL,
	data=request_body,
	headers=request_headers)
if not response.ok:	
	print(f"init_upload failed: {response.text}")
	sys.exit(1)
upload_url = response.json()["upload_url"]
with open(zipfilepath, "rb") as f:	
	request_body = {"file": f}	
	response = requests.post(upload_url, files=request_body)
if not response.ok:	
	print(f"upload failed: {response.text}")	
	sys.exit(1)
print(f"upload successful: {response.text}")