Skip to main content

FoxAPI Documentation

Join our discord : https://discord.gg/XJJkuDYZXw

Installation

pip install foxapi

FoxAPI is a wrapper for the Official Foxhole API. It provides methods to interact with various endpoints related to maps, war data, dynamic/static map states, and more. The client supports data caching and etags natively to avoid overloading the Foxhole servers.

If you are new to the developer world or just like coding, it's the perfect tool!

Also, if you work with discord.py or any asynchronous API, this tool might be useful as well since it support async methods natively as well as synchronous

Table of Contents

Dependencies

pip install pillow requests aiohttp

Wrapper

class FoxAPI(shard: str = "", image_dir: str = None, safe_mode: bool = True)

Methods

API Interaction (async)

Note : all of theses methods are async, to run the synchronous version, add _sync at the end (see API example)

get_data(endpoint: str, session: aiohttp.ClientSession | None = None, etag: str = None, use_cache: bool = False) -> APIResponse

Fetches data from the specified endpoint, you can choose to use cache instead of sending a request and you can pass ETag.

  • Parameters:

    • endpoint (str): The API endpoint to call.
    • session (aiohttp.ClientSession, optional) the async session
    • etag (str, optional): The ETag header for cache validation (not required since managed natively).
    • use_cache (bool, optional): Whether to use cached data (default: False).
  • Returns: The response data from the API as a APIResponse object.

Map and War Data

get_maps(use_cache: bool = True, session: aiohttp.ClientSession | None = None) -> list[str]
  • Retrieves a list of available hexagons (maps) in the game world.
get_war(use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> WarObject
  • Retrieves the current war state (war data).
get_static(hexagon: str, use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> SDObject
  • Retrieves the static data for the specified hexagon.
get_dynamic(hexagon: str, use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> SDObject
  • Retrieves the dynamic data for the specified hexagon.
get_war_report(hexagon: str, use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> WarReportObject
  • Retrieves the war report for the specified hexagon.
get_hexagon_data(hexagon: str, use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> HexagonObject
  • Retrieves all the data awailable for the specified hexagon.

Hexagon Operations

calc_distance(x1: float, y1: float, x2: float, y2: float) -> float
  • Calculates the Euclidean distance between two points on the map.
get_captured_towns(hexagon: str = None, dynamic: SDObject = None, static: SDObject = None, session: aiohttp.ClientSession | None = None) -> dict
  • Retrieves the captured towns for a given hexagon based on dynamic and static data.
load_hexagon_map(hexagon: str) -> pillow.Image
  • Loads the PNG map for the specified hexagon.
make_map_png(hexagon: str, icons: str | list = "all", colored: bool = False, dynamic: SDObject = None, static: SDObject = None, force: bool = False, session: aiohttp.ClientSession | None = None) -> pillow.Image
  • Generates a PNG image of the hexagon map with all the icons associated to each faction in their respective colors (included fields and town base). Only public data will be present.
  • colored -> display each region in the team's color
  • icons -> display selected building in their team's color
  • force -> bypass the cache and generate a new map
calculate_death_rate(hexagon: str = None, war_report: WarReportObject = None, session: aiohttp.ClientSession | None = None): -> dict
  • calculate the death rate between the first launch and the current one

Listener Functions

on_api_update(callback: callable = None, endpoints: list = None)
  • Registers a callback function to be called when the data for specified API endpoints is updated.
on_hexagon_update(callback: callable = None, hexagons: list = "all")
  • Registers a callback function to be called when the data for specified hexagons is updated.

Queue Tasks

This library also give the possibility to queue up some sync and async methods to run them simultaneously

from foxapi import FoxAPI

api = FoxAPI()

for i in range(10):
    api.add_task(function=api.get_war) # or any other method

data = api.run_task_sync()

for elem in data:
    print(elem.result)
from foxapi import FoxAPI
import asyncio

api = FoxAPI()

async def main():
    for i in range(10):
        api.add_task(function=api.get_war) # or any other method

    data = await api.run_task()

    for elem in data:
        print(elem.result)

asyncio.run(main())

Error Handling

EndpointError: Raised if an invalid API endpoint is used.

HexagonError: Raised if an invalid hexagon is provided.

FoxAPIError: A general error for issues within the FoxAPI class (e.g., missing data).

Objects

class APIResponse:
    headers: dict
    json: dict
    status_code: int
    hexagon: str
    is_cache: bool


class HexagonObject:
    hexagon: str
    war_report: WarReportObject
    static: SDObject
    dynamic: SDObject
    captured_towns: dict
    casualty_rate: dict


class WarObject:
    warId: str
    warNumber: int
    winner: str
    conquestStartTime: str
    conquestEndTime: str
    resistanceStartTime: str
    scheduledConquestEndTime: str
    requiredVictoryTowns: str
    shortRequiredVictoryTowns: str
    response: APIResponse


class WarReportObject:
    totalEnlistments: int
    colonialCasualties: int
    wardenCasualties: int
    dayOfWar: int
    version: int
    response: APIResponse


class MapItemsObject:
    teamId: str
    iconType: int
    x: float
    y: float
    flags: int
    viewDirection: int


class MapTextItemsObject:
    text: str
    x: float
    y: float
    mapMarkerType: str


class SDObject:
    regionId: int
    scorchedVictoryTowns: int

    mapItems: list[MapItemsObject]
    mapItemsC: list[MapItemsObject]
    mapItemsW: list[MapItemsObject]
    mapTextItems: list[MapTextItemsObject]
    
    lastUpdated: int
    version: int
    response: APIResponse

Example Usage

from foxapi import FoxAPI

# Initialize the API client in safe mode

# if you are a developer and plane to use the exact hexagons name
# you can turn the safe_mode off, otherwise it will convert
# api calls and hexagons name into valid ones
# Ex: deadlands -> DeadLandsHex (Yes, I am *that* lazy)

fox = FoxAPI(shard="1")


def function(hexagon: str = "DeadLandsHex"):
    # Get the list of available hexagons (maps) and state of the current war
    maps: list = fox.get_maps_sync()
    war: WarObject = fox.get_war_sync()

    # Retrieve data for a specific hexagon
    dynamic_data: SDObject = fox.get_dynamic_sync(hexagon)
    static_data: SDObject = fox.get_static_sync(hexagon)
    war_report: WarReportObject = fox.get_war_report_sync(hexagon)

    # Create a map PNG for a hexagon with building informations on it
    map_image = fox.make_map_png_sync(hexagon)
    map_image.show()

    # to get all the data at once

    data: HexagonObject = fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)

# Async equivalent

async def function(hexagon: str = "DeadLandsHex"):
    # Get the list of available hexagons (maps) and state of the current war
    maps: list = await fox.get_maps()
    war: WarObject = await fox.get_war()

    # Retrieve data for a specific hexagon
    dynamic_data: SDObject = await fox.get_dynamic(hexagon)
    static_data: SDObject = await fox.get_static(hexagon)
    war_report: WarReportObject = await fox.get_war_report(hexagon)

    # Create a map PNG for a hexagon with building informations on it
    map_image = await fox.make_map_png(hexagon)
    map_image.show()

    # to get all the data at once

    data: HexagonObject = await fox.get_hexagon_data(hexagon=hexagon, use_cache=True)


# Register a callback to listen for updates on all the hexagons
# it will run forever don't worry

@fox.on_hexagon_update("all")
def on_update(hexa: HexagonObject):
    print(f"Hexagon {hexa.hexagon} has been updated")


# The following async code works as well

@fox.on_hexagon_update("all")
async def on_update(hexa: HexagonObject):
    print(f"Hexagon {hexa.hexagon} has been updated")

I am not responsible for what you are doing with it

Metadata

Release files for foxapi 2.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for foxapi 2.1.1
File Size Uploaded Provenance
foxapi-2.1.1.tar.gz 24.4 MB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for foxapi 2.1.1
File Interpreter ABI Platform
foxapi-2.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 48.8 MB

Release files / foxapi-2.1.1.tar.gz

Download URL foxapi-2.1.1.tar.gz
Size 24.4 MB
Tags Source
SHA-256 checksum
How to use checksums
ad30c5f75d90756875bf0936221bcd83d1c875e0d6c57f7763c30858a5140ef3
BLAKE2b-256 checksum
How to use checksums
254e27d45665069df5ac7a20b1efe5b53b95fbb2f3ef794df9271b6a62b41aee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.11

Release files / foxapi-2.1.1-py3-none-any.whl

Download URL foxapi-2.1.1-py3-none-any.whl
Size 24.4 MB
Tags Python 3
SHA-256 checksum
How to use checksums
9049b411235a9c71eceffb4e61454abb456b6e9be81840f2fb2461deb66fc634
BLAKE2b-256 checksum
How to use checksums
6891cd511ac5e4fbf91e222586f8c285a20a59de25a6d7d9a8fdb46a2e73caa2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.11

Security for foxapi 2.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

2.1.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page