Steal the Deal

20% off Steal the Deal With Unreal Engine Plugins For Grab

AthenaQuery

Query your game analytics data in Amazon S3 with SQL right inside the Unreal Editor: an Amazon Athena query tab, 80 Editor Utility nodes, and results straight to CSV, JS…

Malware-scannedSigned licence keyInstant downloadUpdates included
AthenaQuery β€” screenshot 1
AthenaQuery β€” screenshot 2
AthenaQuery β€” screenshot 3
AthenaQuery β€” screenshot 4
AthenaQuery β€” screenshot 5
AthenaQuery β€” screenshot 6
AthenaQuery β€” screenshot 7
AthenaQuery β€” screenshot 8
AthenaQuery β€” screenshot 9
AthenaQuery β€” screenshot 10
AthenaQuery β€” screenshot 11
AthenaQuery β€” screenshot 12
AthenaQuery β€” screenshot 13
AthenaQuery β€” screenshot 14
AthenaQuery β€” screenshot 15
AthenaQuery β€” screenshot 16
AthenaQuery β€” screenshot 17
AthenaQuery β€” screenshot 18
1 / 18
Athena Query tab: SQL editor, Run / Stop, workgroup and database pickers, results…
Run Query And Wait (latent): start, poll with back-off, download all pages, cancel…
Run Query To Data Table: one node from SQL to a saved DataTable asset
Create DataTable From Results: columns mapped to row-struct fields by name, create or…
Start / Get / Stop Query Execution, Get Query Results (paged, typed columns), Wait For…
Catalog browsing: data catalogs, databases, table metadata (columns, partition keys),…
$64.99$51.99

AthenaQuery brings Amazon Athena into the Unreal Editor. Your telemetry, economy logs and match results already land in S3 - now designers and analysts can ask questions of that data without leaving the editor, and turn the answers into game data.

Open Window > Tools > Alpha XP > Athena Query, pick a workgroup and database, type SQL and press Run. The query runs in the background while the editor stays responsive; the status line shows its state, the data scanned and the estimated cost. Results appear in a grid with one column per field. Export them to CSV, or save them as a DataTable asset: pick a row struct, and AthenaQuery maps the result columns to its fields by name (player_id fills PlayerId) and creates or updates the asset.

Everything the tab does is also available to Editor Utility Blueprints and Widgets. Run Query And Wait starts a query, polls it with back-off and downloads every result page; cancelling it stops the query on Athena. Run Query To Data Table does the query and the DataTable in one node - ideal for a "refresh balance data" button. Browse data catalogs, databases, tables (columns, partition keys, types) and workgroups, manage saved queries and prepared statements, and read the query history.

Result helpers convert cells to numbers, integers, bools and dates, filter and sort rows, select columns, aggregate locally, and export CSV or JSON. SQL helpers escape strings, quote identifiers, build SELECT and GROUP BY queries and write partition filters for year/month/day partitioned data, so date-range queries scan only the days you need. Estimate Query Cost shows what a query cost before you run it again.

Sign in the way your team already does: a named AWS profile (static keys, AWS IAM Identity Center / SSO, assume-role or credential_process), the default AWS credential chain, static keys or a Cognito identity pool. Get Caller Identity shows which AWS account the editor is using. Settings are stored per user, never in the project's shared config.

AthenaQuery is part of the Alpha XP AWS collection for Unreal Engine 4.27 and 5.8. It is an editor-only tool (nothing ships in your game), includes the AWS SDK for C++ prebuilt for Win64, and comes with styled HTML documentation.

51Blueprint nodes
5Events
26Project settings
2Engine builds

Key features

  • Athena Query tab: SQL editor, Run / Stop, workgroup and database pickers, results
  • Run Query And Wait (latent): start, poll with back-off, download all pages, cancel
  • Run Query To Data Table: one node from SQL to a saved DataTable asset
  • Create DataTable From Results: columns mapped to row-struct fields by name, create or
  • Start / Get / Stop Query Execution, Get Query Results (paged, typed columns), Wait For
  • Catalog browsing: data catalogs, databases, table metadata (columns, partition keys),
  • Named queries and prepared statements (create, get, list, update, delete, execute with
  • Results to CSV (RFC 4180) and JSON, Load Results From CSV, typed cell getters, filter,
  • SQL helpers: escaping, identifiers, SELECT / GROUP BY builders, year/month/day
  • Cost estimate (price per TB setting), result reuse, query timeout
  • Named AWS profiles (SSO included), default chain, static keys or Cognito; Get Caller
  • C++ API with a native callback

Blueprint & C++ API

The API is organised into these entry points:

ClassTypeNodesUse it for
AthenaQueryResultsLibraryFunction library24Working with query results: CSV / JSON export, DataTables, typed cell access, local filtering and cost helpers.
AthenaQueryLibraryFunction library15Configuration, identity and query-tab nodes of AthenaQuery (Editor Utility Blueprints and Widgets).
AthenaQuerySqlLibraryFunction library10SQL text helpers for building Athena (Trino / Presto) queries safely.
Async action nodesLatent Blueprint nodes2Latent node with success / failure output pins.

Callable runs when executed Β· Pure no exec pin, returns a value Β· LatentAsync finishes later and fires its outputs

AthenaQuery 2
NodeTypeAvailable onDescription
CancelAsyncAsyncStops waiting for this request: none of its output pins fire any more. Running queries started by a wait node are stopped on Athena too.
Is FinishedAsyncAsyncTrue after Cancel was called or the node finished.
Config 4
NodeTypeAvailable onDescription
Set Region(Region: String)CallableStaticSwitches the AWS region used by every following request.
Set Credential Mode(Mode: Athena Query Credential Mode)CallableStaticOverrides the credential mode from the project settings for this editor session.
Is Configured() β†’ Boolean, ProblemPureStaticChecks the settings and returns false with a reason when requests cannot work yet.
Get Default Query Options() β†’ Athena Query OptionsPureStaticThe query options the plugin uses when a node leaves fields empty (workgroup, catalog, database, output location, reuse, max rows).
Identity 7
NodeTypeAvailable onDescription
Set Profile(Profile Name: String)CallableStaticUses a named profile from ~/.aws/credentials or ~/.aws/config (static keys, SSO, assume-role or credential_process) for every following request.
List Profiles() β†’ Array of StringCallableStaticNames of the profiles found in ~/.aws/credentials and ~/.aws/config (or the files named by AWS_SHARED_CREDENTIALS_FILE / AWS_CONFIG_FILE).
Set Login Token(Provider: String, Token: String)CallableStaticSigns in to the Cognito identity pool with a token from an identity provider (Cognito Identity Pool mode).
Clear Login TokensCallableStaticForgets all login tokens and the cached identity.
Set Static Credentials(Access Key Id: String, Secret Access Key: String, Session Token: String)CallableStaticUses these credentials from now on (Static Keys mode), for example temporary keys from your SSO tooling. Not saved.
Get Identity Id() β†’ StringPureStaticThe Cognito identity id, empty until credentials were resolved once (Cognito mode only).
Make User Pool Provider Name(Region: String, User Pool Id: String) β†’ StringPureStaticBuilds the identity-pool login key of a Cognito user pool: cognito-idp.<region>.amazonaws.com/<user pool id>.
Editor 4
NodeTypeAvailable onDescription
Open Query EditorCallableStaticOpens (or focuses) the Athena Query tab (Window > Tools > Alpha XP > Athena Query).
Set Query Editor Sql(Sql: String, Run Now: Boolean)CallableStaticPuts SQL into the Athena Query tab's editor (opening the tab), optionally running it at once.
Get Query Editor Sql() β†’ StringPureStaticThe SQL currently in the Athena Query tab's editor.
Get Last Editor Results() β†’ Boolean, Results, ExecutionCallableStaticThe results last shown in the Athena Query tab (empty before the first run). Returns false when there are none.
Results 24
NodeTypeAvailable onDescription
Results To CSV(Results: Athena Query Results, Include Header: Boolean) β†’ StringPureStaticThe results as CSV text (RFC 4180: fields with commas, quotes or line breaks are quoted, quotes doubled). NULL cells are empty.
Save Results As CSV(Results: Athena Query Results, File Path: String, Include Header: Boolean) β†’ Boolean, Saved PathCallableStaticWrites the results to a UTF-8 CSV file. FilePath empty = a Save File dialog. Returns false when nothing was written.
Load Results From CSV(File Path: String) β†’ Boolean, ResultsCallableStaticReads a CSV file (first line = column names) back into a result table, for example an exported or downloaded Athena result. FilePath empty = an Open File dialog.
Results To JSON(Results: Athena Query Results, Typed: Boolean, Pretty: Boolean) β†’ StringPureStaticThe results as a JSON array with one object per row.
Create DataTable From Results(Results: Athena Query Results, Row Struct: Script Struct, Package Path: String, Asset Name: String, Row Name Column: String, …) β†’ Data Table, ReportCallableStaticCreates or updates a DataTable asset from the results.
Get Column Names(Results: Athena Query Results) β†’ Array of StringPureStaticColumn names in order.
Get Column Index(Results: Athena Query Results, Column Name: String) β†’ IntegerPureStaticIndex of a column by name (case-insensitive), -1 when missing.
Get Column Values(Results: Athena Query Results, Column Name: String) β†’ Array of StringPureStaticEvery value of one column, in row order (NULL = empty string).
Get Cell(Results: Athena Query Results, Row Index: Integer, Column Name: String) β†’ Boolean, ValuePureStaticThe text of one cell. Returns false when the row or column does not exist.
Get Cell As Float(Results: Athena Query Results, Row Index: Integer, Column Name: String) β†’ Boolean, ValuePureStaticOne cell as a float (double, real, decimal, integer columns). Returns false when missing, NULL or not a number.
Get Cell As Integer 64(Results: Athena Query Results, Row Index: Integer, Column Name: String) β†’ Boolean, ValuePureStaticOne cell as a 64-bit integer (bigint, integer, smallint, tinyint columns). Returns false when missing, NULL or not an integer.
Get Cell As Bool(Results: Athena Query Results, Row Index: Integer, Column Name: String) β†’ Boolean, ValuePureStaticOne cell as a bool (true/false, 1/0, yes/no). Returns false when missing, NULL or not a bool.
Get Cell As Date Time(Results: Athena Query Results, Row Index: Integer, Column Name: String) β†’ Boolean, ValuePureStaticOne date / timestamp cell ("2026-10-28", "2026-10-28 14:05:00.123", ISO 8601) as a UTC date time.
Is Cell Null(Results: Athena Query Results, Row Index: Integer, Column Name: String) β†’ BooleanPureStaticTrue when the cell is SQL NULL (or the row / column does not exist).
Get Row As Map(Results: Athena Query Results, Row Index: Integer) β†’ Map String β†’ StringPureStaticOne row as a column name -> value map (NULL cells are left out).
Find Rows Where(Results: Athena Query Results, Column Name: String, Compare: Athena Query Compare, Value: String) β†’ Athena Query ResultsPureStaticThe rows whose column matches (numeric comparison when both sides are numbers, else case-insensitive text).
Sort Results By Column(Results: Athena Query Results, Column Name: String, Descending: Boolean) β†’ Athena Query ResultsPureStaticThe rows sorted by one column (numbers numerically, text case-insensitively, NULL last).
Select Columns(Results: Athena Query Results, Column Names: Array of String) β†’ Athena Query ResultsPureStaticA copy with only the named columns, in the given order (unknown names are skipped).
Append Results(A: Athena Query Results, B: Athena Query Results) β†’ Athena Query ResultsPureStaticRows of B appended to A (columns are matched by name; B's extra columns are dropped).
Aggregate Column(Results: Athena Query Results, Column Name: String, Aggregate: Athena Query Aggregate) β†’ FloatPureStaticSum / average / min / max / count / count distinct of one column, computed locally. Non-numeric cells are skipped for numeric aggregates.
Estimate Query Cost(Data Scanned Bytes: Integer64, Price Per Terabyte Usd: Float) β†’ FloatPureStaticAthena cost of scanning this many bytes in USD: bytes rounded up to 10 MB (the per-query minimum) x price per TB.
Format Bytes(Bytes: Integer64) β†’ StringPureStaticBytes as text: "512 B", "3.4 MB", "1.27 TB".
Format Duration(Milliseconds: Integer64) β†’ StringPureStaticMilliseconds as text: "850 ms", "12.4 s", "3 min 05 s".
Is Terminal State(State: Athena Query State) β†’ BooleanPureStaticTrue for Succeeded, Failed and Cancelled.
SQL 10
NodeTypeAvailable onDescription
Escape SQL String(Value: String) β†’ StringPureStaticA quoted SQL string literal: O'Brien -> 'O''Brien'. Use it for every user-provided value.
Quote Identifier(Name: String) β†’ StringPureStaticA quoted identifier for column / table names with odd characters: player id -> "player id" (dots split db.table).
Make Select Query(Table: String, Columns: Array of String, Where: String, Order By: String, Limit: Integer) β†’ StringPureStaticSELECT <columns> FROM <table> [WHERE ...] [ORDER BY ...] [LIMIT n].
Make Partition Filter(From: Date Time, To: Date Time, Date Column: String, Year Column: String, Month Column: String, …) β†’ StringPureStaticA partition predicate for a date range on year / month / day partition columns (Hive-style partitions such as year=2026/month=10/day=28), one (year, month, day)…
Make In List(Column: String, Values: Array of String, Numeric: Boolean) β†’ StringPureStaticcolumn IN ('a', 'b', 'c') with every value escaped (numbers unquoted when bNumeric). Empty values = FALSE.
Make Timestamp Literal(Time: Date Time) β†’ StringPureStaticA TIMESTAMP literal: TIMESTAMP '2026-10-28 14:05:00.000' (UTC).
Make Aggregate Query(Table: String, Group By Columns: Array of String, Aggregates: Array of String, Where: String, Order By: String, …) β†’ StringPureStaticSELECT <group columns>, <aggregates> FROM <table> [WHERE] GROUP BY <group columns> [ORDER BY] [LIMIT].
Is Read Only Query(Sql: String) β†’ BooleanPureStaticTrue for statements that only read data (SELECT, WITH, SHOW, DESCRIBE, EXPLAIN, VALUES). Comments are skipped.
Split Sql Statements(Sql: String) β†’ Array of StringPureStaticSplits a script into statements at semicolons that are outside quotes and comments (empty statements are dropped).
Make S3 Location(Bucket: String, Prefix: String) β†’ StringPureStatics3://bucket/prefix/ from a bucket and a prefix (slashes normalized), for Output Location and LOCATION clauses.

Events & delegates

Bind these in Blueprint (drag off the object β†’ Bind Event) or with AddDynamic in C++.

EventParametersFires on
On SuccessId (String), Error (Athena Query Error)AthenaQueryIdAction
On FailureId (String), Error (Athena Query Error)AthenaQueryIdAction
On ProgressExecution (Athena Query Execution)AthenaQueryRunAction
On SucceededExecution (Athena Query Execution), Results (Athena Query Results), Error (Athena Query Error)AthenaQueryRunAction
On FailedExecution (Athena Query Execution), Results (Athena Query Results), Error (Athena Query Error)AthenaQueryRunAction

Project settings

Configure once under Project Settings β€Ί Plugins β€Ί AthenaQuery β€” values are saved to the project's config .ini, so they travel with the project and your build.

SettingSectionTypeWhat it does
RegionConnectionStringAWS region of your Athena workgroup and data, for example "us-east-1" or "eu-west-1".
Credential ModeCredentialsCredential ModeWhere request credentials come from. Default Credential Chain or Named Profile is the common choice for the editor.
Profile NameCredentialsStringProfile from ~/.aws/credentials or ~/.aws/config, for example "analytics" (Named Profile mode, or call Set Profile).
Identity Pool IdCredentialsStringCognito identity pool, for example "us-east-1:01234567-89ab-cdef-0123-456789abcdef".
Allow Guest AccessCredentialsBooleanAllow unauthenticated (guest) identities before Set Login Token is called. The pool must allow guest access too.
Access Key IdCredentialsStringAccess key for Static Keys mode (stored in your per-user editor settings). Prefer a named profile.
Secret Access KeyCredentialsStringSecret key for Static Keys mode.
Endpoint OverrideConnectionStringCustom endpoint, for example a VPC endpoint or a local emulator. Empty = the regional Athena endpoint.
Request Timeout MsConnectionIntegerTotal time one API call may take, in milliseconds (queries themselves are polled and may run longer).
Connect Timeout MsConnectionIntegerTime allowed to open the connection, in milliseconds.
Max RetriesConnectionIntegerAutomatic retries with exponential back-off for throttled and transient failures.
Worker ThreadsConnectionIntegerWorker threads that run requests in the background (requests never block the editor).
Verify SSLConnectionBooleanVerify TLS certificates. Only disable for a local emulator.
Log Sdk WarningsConnectionBooleanForward SDK warnings and errors to the Output Log (LogAthenaQuery).
Default Work GroupAthenaStringWorkgroup used when a node or the tab leaves it empty.
Default CatalogAthenaStringData catalog used when a node leaves it empty. "AwsDataCatalog" is the AWS Glue Data Catalog.
Default DatabaseAthenaStringDatabase used for unqualified table names when a node leaves it empty, for example "game_analytics".
Default Output LocationAthenaStringS3 folder for query results, for example "s3://my-athena-results/editor/". Empty = the workgroup's location.
Result Reuse Max Age MinutesAthenaIntegerReuse results of identical queries up to this many minutes old (saves cost while iterating). 0 = off.
Poll Interval SecondsAthenaFloatFirst wait between status checks of a running query; it grows up to Max Poll Interval.
Max Poll Interval SecondsAthenaFloatLongest wait between status checks of a long query.
Max Result RowsAthenaIntegerRows Run Query And Wait and the query tab download at most (more rows mark the results Truncated).
Query Timeout SecondsAthenaFloatStop waiting (and cancel the query) after this many seconds. 0 = no limit.
Price Per Terabyte UsdAthenaFloatAthena price per terabyte scanned in USD, used by Estimate Query Cost and the tab's status line.
Confirm Non Read Only QueriesQuery TabBooleanThe query tab asks before it runs statements that are not read-only (CREATE, DROP, INSERT, ...).
Default Data Table FolderQuery TabStringContent folder the tab's Save As DataTable suggests, for example "/Game/Data/Athena".

Options & enums

EnumValues
Credential ModeCognito Identity Pool Static Keys Default Credential Chain Named Profile
StateUnknown Queued Running Succeeded Failed Cancelled
CompareEquals Not Equals Contains Starts With Greater Than Less Than Greater Or Equal Less Or Equal Is Null Is Not Null
AggregateSum Average Min Count Distinct

Compatibility

UE 4.27AthenaQuery 4.27.zipUE 5.8AthenaQuery 5.8.zip

One ready-made build per engine version is included in the download β€” copy the one that matches your project.

PlatformSupported in
WindowsEditor & packaged
ModuleTypeLoading phase
AthenaQueryEditorDefault

Technical details

Code modulesAthenaQuery (Editor), AthenaQuerySdk (External, Source/ThirdParty - prebuilt AWS SDK for C++)
Blueprints0 Β· C++ classes: 25
Network replicatedNo
Development platformsWindows: Yes, Mac: No, Linux: No
Target build platformsWin64 (editor only - nothing is added to packaged games)
Third-party softwareYes - AWS SDK for C++ 1.11.916 (Apache-2.0), in Source/ThirdParty/AthenaQuerySdk
Engine versionsUnreal Engine 4.27 Β· 5.8 β€” a build for each is included
C++ classes25 + 14 structs
Blueprint nodes51
Events5
DocumentationDocumentation.html (in the download)
DownloadAthenaQuery.zip Β· 7.7 MB
Versionv1.0.0

What's in the download

FileWhat it is
AthenaQuery 4.27.zipPlugin build for Unreal Engine 4.27
AthenaQuery 5.8.zipPlugin build for Unreal Engine 5.8
Documentation.htmlDocumentation (open in a browser)

Quick start

  1. Unzip the download and pick the build that matches your engine (4.27 Β· 5.8).
  2. Copy the AthenaQuery folder into your project's Plugins/ folder (create it if needed).
  3. Open the project, enable AthenaQuery under Edit β€Ί Plugins and restart the editor.
  4. Fill in Project Settings β€Ί Plugins β€Ί AthenaQuery.
  5. Right-click in any Blueprint graph and search AthenaQuery β€” or include the public headers from C++.
  6. Package for your target platform (Windows).

Good to know

Editor-only tool, built for Unreal Engine 4.27 and 5.8 on Windows. Requires an AWS account; Amazon Athena bills per terabyte of data scanned and S3 stores the query results. The SDK is one DLL with a plugin-specific name, so AthenaQuery can be installed next to other AWS-based plugins. Credentials are read from your AWS profile or the default credential chain; nothing is stored in the project's shared config files. Developed and maintained by Alpha XP.

Everything included

  • Athena Query tab: SQL editor, Run / Stop, workgroup and database pickers, results…
  • Run Query And Wait (latent): start, poll with back-off, download all pages, cancel…
  • Run Query To Data Table: one node from SQL to a saved DataTable asset
  • Create DataTable From Results: columns mapped to row-struct fields by name, create or…
  • Start / Get / Stop Query Execution, Get Query Results (paged, typed columns), Wait For…
  • Catalog browsing: data catalogs, databases, table metadata (columns, partition keys),…
  • Named queries and prepared statements (create, get, list, update, delete, execute with…
  • Results to CSV (RFC 4180) and JSON, Load Results From CSV, typed cell getters, filter,…
  • SQL helpers: escaping, identifiers, SELECT / GROUP BY builders, year/month/day…
  • Cost estimate (price per TB setting), result reuse, query timeout
  • Named AWS profiles (SSO included), default chain, static keys or Cognito; Get Caller…
  • C++ API with a native callback

Platforms

Windows

Requirements

  • Unreal Engine 4.27 and 5.8
  • Develop on Windows (Win64)
  • Blueprints and C++

In the download

FileAthenaQuery.zip
FormatZIP
Size7.7 MB
Versionv1.0.0
Licence fileIncluded in the archive
SHA-25678b9030f46f9c48f…

Personal

$64.99$51.99
βˆ’20%You save $13.00

One non-commercial project

  • 1 activation seat
  • 1 year of updates
  • One end product
  • Non-commercial use
  • Community support
  • 14-day refund window
Read the Personal terms
β˜… Most popular

Commercial

$194.99$155.99
βˆ’20%You save $39.00

Ship paid products

  • 5 activation seats
  • 1 year of updates
  • One paid end product
  • Unlimited end users
  • Priority support
  • Source files
  • 14-day refund window
Read the Commercial terms

Extended

$615.00$492.00
βˆ’20%You save $123.00

Resell & white-label

  • Unlimited activation seats
  • Lifetime updates
  • Unlimited end products
  • White-label & resell
  • 1-hour SLA
  • Seat-free team use
  • 14-day refund window
Read the Extended terms

One purchase per product, no subscription. Each licence comes with a signed key β€” 1 seat on Personal, 5 seats on Commercial, unlimited seats on Extended. Paid licences can be refunded within 14 days from your order page.

  1. v1.0.0Latest
    • Unreal Engine 4.27 and 5.8
    • Blueprint and C++ API, HTML documentation
β€”
β˜…β˜…β˜…β˜…β˜…
No reviews yet
5β˜…0%
4β˜…0%
3β˜…0%
2β˜…0%
1β˜…0%

Be the first to review AthenaQuery β€” reviews come from customers who bought it, so every one is a verified purchase.

Reviews are for customers who bought AthenaQuery.
Email supportsupport@alphaxp.net β€” include your order reference.
What support coversInstallation help, download or activation problems, and questions about documented behaviour, for your licence term.
Keys & downloadsLost a key or a download link? Everything you bought is in My library.
Refunds & terms14-day refunds from your order page. Refund policy Β· Personal terms Β· Commercial terms Β· Extended terms

Frequently asked

How do I get the files after paying?

Straight after checkout you land on your order page with the download button and your licence key. A receipt is emailed to you, and every order stays in My library.

Which licence do I need?

Personal β€” One non-commercial project. Commercial β€” Ship paid products. Extended β€” Resell & white-label. The Licences tab compares them side by side.

On how many devices can I activate it?

1 seat on Personal, 5 seats on Commercial, unlimited seats on Extended.

How long do I get updates?

Personal: 1 year of updates, Commercial: 1 year of updates, Extended: lifetime updates, counted from your purchase.

Can I get a refund?

Yes β€” paid licences can be refunded within 14 days, straight from your order page.

Is the download safe?

The file was scanned with ClamAV when it was published. Its SHA-256 checksum is listed under Features β†’ In the download, so you can verify the file you receive.

Do I need an account?

No. Checkout only needs your email. Signing in keeps all your purchases, keys and downloads together in My library.

More like this

From the same studio
$64.99$51.99Personal licence Β· AthenaQuery
✦ Why TechHarbour

Software you own, from the people who built it.

117 products, one studio. Each ships with a signed licence key, an instant download and 14-day refunds β€” and every file is malware-scanned before it goes on sale.