Skip to main content

Python SDK

The appliku package includes a Python SDK for programmatic access to the Appliku API. It uses the same token resolution as the CLI, so if you have already run appliku login you can use the SDK without any extra setup.

Quick start

Create a client using the saved token or the APPLIKU_TOKEN environment variable:

from appliku import Appliku

client = Appliku()

Or pass the token explicitly:

from appliku import Appliku

client = Appliku(token="YOUR_API_TOKEN")

List your teams and their apps:

from appliku import Appliku

client = Appliku()

for team in client.teams.list():
print(team.team_path, team.plan)
apps = client.apps.list(team.team_path)
for app in apps:
print(" ", app.id, app.name, app.last_deployment_status)

Resources

All resources are accessed as properties on the Appliku client instance:

PropertyWhat it manages
client.appsApplications and their logs, config vars
client.teamsTeams you belong to
client.deploymentsDeployment history and build logs
client.domainsCustom domains and DNS verification
client.datastoresAttached databases, caches, etc.
client.volumesPersistent volumes
client.cron_jobsScheduled cron jobs
client.clustersDocker Swarm clusters
client.serversServers attached to a team
client.invitesTeam member invitations
client.migrationsDatabase migration runs

SDK Reference

apps

# List all applications in a team
client.apps.list("my-team")

# Get a single application
client.apps.get("my-team", app_id=42)

# Create an application
client.apps.create("my-team", name="my-app", branch="main")

# Update an application
client.apps.update("my-team", app_id=42, branch="develop")

# Delete an application
client.apps.delete("my-team", app_id=42)

# Trigger a deployment
client.apps.deploy("my-team", app_id=42)

# Read and write environment variables
vars = client.apps.get_config_vars("my-team", app_id=42)
client.apps.set_config_vars("my-team", app_id=42, vars={"DEBUG": "false", "LOG_LEVEL": "info"})

# Application-level logs (async fetch, one or more processes)
logs = client.apps.get_logs("my-team", app_id=42, process="web", tail=100)
print(logs)

# Service logs (direct single-request fetch)
logs = client.apps.get_service_logs("my-team", app_id=42, service="web", tail=100)

# Nginx access logs for a domain
logs = client.apps.get_nginx_logs("my-team", app_id=42, domain="example.com", tail=100)

# Load balancer logs for a domain
logs = client.apps.get_load_balancer_logs("my-team", app_id=42, domain="example.com", tail=100)

teams

# List all teams
client.teams.list()

# Get details for one team
client.teams.get("my-team")

deployments

# List deployments for an app
client.deployments.list("my-team", app_id=42)

# Get a specific deployment
client.deployments.get("my-team", app_id=42, deployment_id=1234)

# Get the latest deployment
latest = client.deployments.latest("my-team", app_id=42)
print(latest.status)

# Fetch build logs for a deployment
logs = client.deployments.logs("my-team", deployment_id=1234)
for entry in logs:
print(entry.log)

domains

# List domains for an app
client.domains.list("my-team", app_id=42)

# Get a single domain
client.domains.get("my-team", app_id=42, domain_id=7)

# Add a domain
client.domains.create("my-team", app_id=42, domain="example.com")

# Remove a domain
client.domains.delete("my-team", app_id=42, domain_id=7)

# Check DNS configuration
result = client.domains.check_dns("my-team", app_id=42, domain="example.com")
print(result.is_valid, result.a_records)

datastores

client.datastores.list("my-team", app_id=42)
client.datastores.get("my-team", app_id=42, datastore_id=5)
client.datastores.create("my-team", app_id=42, name="mydb", kind="postgresql")
client.datastores.delete("my-team", app_id=42, datastore_id=5)
client.datastores.start("my-team", app_id=42, datastore_id=5)
client.datastores.stop("my-team", app_id=42, datastore_id=5)
client.datastores.restart("my-team", app_id=42, datastore_id=5)

volumes

client.volumes.list("my-team", app_id=42)
client.volumes.get("my-team", app_id=42, volume_id=3)
client.volumes.create("my-team", app_id=42, name="uploads", mount_path="/app/uploads")
client.volumes.update("my-team", app_id=42, volume_id=3, mount_path="/app/media")
client.volumes.delete("my-team", app_id=42, volume_id=3)

cron_jobs

client.cron_jobs.list("my-team", app_id=42)
client.cron_jobs.create("my-team", app_id=42, schedule="0 * * * *", command="python manage.py clearsessions")
client.cron_jobs.update("my-team", app_id=42, cron_id=8, schedule="30 2 * * *")
client.cron_jobs.delete("my-team", app_id=42, cron_id=8)

clusters

client.clusters.list("my-team")
client.clusters.get("my-team", cluster_id=2)
client.clusters.create("my-team", name="prod-cluster")
client.clusters.delete("my-team", cluster_id=2)

servers

client.servers.list("my-team")
client.servers.get("my-team", server_id=10)

invites

client.invites.list("my-team")
client.invites.create("my-team", email="colleague@example.com")
client.invites.delete("my-team", invite_id=4)

migrations

client.migrations.list("my-team")
client.migrations.run("my-team", app_id=42, command="python manage.py migrate")
client.migrations.logs("my-team", migration_id=99)

Error handling

The SDK raises typed exceptions so you can handle specific failure cases:

from appliku import Appliku, AuthenticationError, NotFoundError, RateLimitError

client = Appliku()

try:
team = client.teams.get("missing-team")
except AuthenticationError:
print("Invalid or missing token — run `appliku login` or set APPLIKU_TOKEN")
except NotFoundError:
print("Team not found")
except RateLimitError:
print("Too many requests, back off and retry")

All exceptions inherit from AplikuError and include the HTTP status code and raw response. Available exception types:

ExceptionHTTP statusWhen raised
AplikuErroranyBase class for all SDK exceptions
AuthenticationError401Missing or invalid token
AuthorizationError403Token lacks permission for the action
NotFoundError404Resource does not exist
ValidationError400Invalid request data
RateLimitError429Too many requests
ServerError5xxAppliku API server error

Import exceptions from the top-level package:

from appliku import AplikuError, AuthenticationError, AuthorizationError, NotFoundError, ValidationError, RateLimitError, ServerError