Introduction
Public API for MutaMarket, the marketplace for abyssal modules in EVE Online. Browse modules with their rolled attributes, roll-quality metrics, price estimates and sale listings, import new modules from the game, and access per-type roll statistics.
This documentation aims to provide all the information you need to work with our API.
<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>
Authenticating requests
This API is not authenticated.
Abyssal Types
Roll statistics of abyssal types and their attributes.
List attribute roll ranges per abyssal type
Returns the best and worst possible rolled value of every mutated attribute for every abyssal type, including the attribute definition and the abyssal type itself.
Use this to normalize a module's rolls against the theoretical range of its type — it is
the same data MutaMarket uses for the fraction_type roll-quality metric and the
attribute bars.
Example request:
curl --request GET \
--get "https://mutamarket.test/api/abyssal-type-statistics" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://mutamarket.test/api/abyssal-type-statistics"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
[
{
"id": 1,
"type_id": 47408,
"attribute_id": 6,
"high_is_good": false,
"is_virtual": false,
"best": 71.5,
"worst": 261.00001,
"is_derived": false,
"attribute": {
"id": 6,
"name": "capacitorNeed",
"display_name": "Activation Cost",
"high_is_good": false,
"is_derived": false,
"unit": {
"id": 114,
"name": "capacitor units",
"display_name": "GJ"
}
},
"type": {
"id": 47408,
"name": "50MN Abyssal Microwarpdrive",
"meta_group": "Abyssal",
"meta_group_id": 15,
"published": true
}
},
{
"id": 2,
"type_id": 47408,
"attribute_id": 20,
"high_is_good": true,
"is_virtual": false,
"best": 597.99999,
"worst": 425.00001,
"is_derived": false,
"attribute": {
"id": 20,
"name": "speedFactor",
"display_name": "Maximum Velocity Bonus",
"high_is_good": true,
"is_derived": false,
"unit": {
"id": 124,
"name": "Modifier Relative Percent",
"display_name": "%"
}
},
"type": {
"id": 47408,
"name": "50MN Abyssal Microwarpdrive",
"meta_group": "Abyssal",
"meta_group_id": 15,
"published": true
}
}
]
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Estimators
Quality metrics of the machine-learning price estimators behind the estimated_value of modules.
List price estimator quality metrics
Returns quality metrics for every per-type machine-learning price estimator: how much
historic sales data each model was trained on (data_count), how well it fits the
training data (r2, where 1 is a perfect fit), and its average prediction error in ISK
(mae) and normalized by the mean sale price (nmae).
Useful for judging how much trust to put into the estimated_value of modules of a
given type.
Example request:
curl --request GET \
--get "https://mutamarket.test/api/estimator-statistics" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://mutamarket.test/api/estimator-statistics"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
[
{
"id": 1,
"type_id": 47408,
"name": "50MN Abyssal Microwarpdrive",
"data_count": 4679,
"r2": 0.41,
"mae": 183450744.87,
"nmae": 39.3,
"last_trained_at": "2026-02-23T11:00:29.000000Z",
"data_statistics": {
"Tech I": 1804,
"Faction": 333,
"Officer": 1,
"Tech II": 243,
"Deadspace": 2182,
"Storyline": 116
},
"created_at": "2024-11-25T15:02:07.000000Z",
"updated_at": "2026-02-23T11:00:29.000000Z"
},
{
"id": 2,
"type_id": 47702,
"name": "Abyssal Stasis Webifier",
"data_count": 11492,
"r2": 0.71,
"mae": 117016139.61,
"nmae": 29.67,
"last_trained_at": "2026-02-23T11:01:13.000000Z",
"data_statistics": {
"Tech I": 410,
"Faction": 9891,
"Officer": 17,
"Tech II": 1174
},
"created_at": "2024-11-25T15:02:07.000000Z",
"updated_at": "2026-02-23T11:01:13.000000Z"
}
]
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Modules
Browse abyssal modules that are for sale, retrieve single modules with all rolled attributes and price data, and import modules from EVE.
Get a single module
Returns a single module with all rolled attributes, roll-quality metrics, the estimated value, and its current sale listing (contract or MutaMarket sell listing), if any. The module must have been imported into MutaMarket before; unknown item ids return 404.
Example request:
curl --request GET \
--get "https://mutamarket.test/api/modules/large-abyssal-armor-repairer-1027784685291" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://mutamarket.test/api/modules/large-abyssal-armor-repairer-1027784685291"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"id": 1052842251186,
"type": {
"id": 49738,
"name": "Abyssal Ballistic Control System"
},
"creator": {
"id": 2112606829,
"slug": "max1m-bolshakov-2112606829",
"name": "Max1m Bolshakov",
"description": null,
"has_premium": false,
"corporation_id": 1000045
},
"mutated_attributes": [
{
"id": 50,
"name": "cpu",
"display_name": "CPU usage",
"value": 21.069600465775,
"base_value": 24,
"fraction": 0.814,
"fraction_type": 0.4884,
"fraction_absolute": 0.90597529518355,
"bar": 0,
"is_derived": false,
"unit": {
"id": 106,
"name": "Teraflops",
"display_name": "tf"
},
"is_virtual": false
},
{
"id": 1255,
"name": "droneDamageBonus",
"display_name": "Drone Damage Bonus",
"value": 0,
"base_value": 0,
"fraction": 0,
"fraction_type": 0,
"fraction_absolute": -2,
"bar": 0,
"is_derived": false,
"unit": {
"id": 105,
"name": "Percentage",
"display_name": "%"
},
"is_virtual": true
},
{
"id": 213,
"name": "missileDamageMultiplierBonus",
"display_name": "Missile Damage Bonus",
"value": 1.1202800431252,
"base_value": 1.12,
"fraction": 0.01786,
"fraction_type": 0.01,
"fraction_absolute": 0.59083450673975,
"bar": 0,
"is_derived": false,
"unit": {
"id": 109,
"name": "Modifier Percent",
"display_name": "%"
},
"is_virtual": false
},
{
"id": 204,
"name": "speedMultiplier",
"display_name": "Rate Of Fire Bonus",
"value": 0.87609376326203,
"base_value": 0.89,
"fraction": 0.78125,
"fraction_type": 0.52083,
"fraction_absolute": 0.86475956827719,
"bar": 0,
"is_derived": false,
"unit": {
"id": 111,
"name": "Inversed Modifier Percent",
"display_name": "%"
},
"is_virtual": false
},
{
"id": 5000004,
"name": "dpsIncreaseMissiles",
"display_name": "DPS Increase",
"value": 1.27872162787,
"base_value": 1.2584269662921,
"fraction": 0.4648,
"fraction_type": 0.28443,
"fraction_absolute": 0.70135645073128,
"bar": 0,
"is_derived": true,
"unit": {
"id": 109,
"name": "Modifier Percent",
"display_name": "%"
},
"is_virtual": false
}
],
"source_type": {
"id": 13937,
"name": "Dread Guristas Ballistic Control System",
"meta_group": "Faction",
"meta_group_id": 4,
"published": true
},
"mutaplasmid": {
"id": 49740,
"name": "Gravid Ballistic Control System Mutaplasmid"
},
"contract": {
"id": 228749822,
"type": "item_exchange",
"price": 290000000,
"asking_for_items": false,
"plex_count": 0,
"non_abyssal_modules_count": 0,
"abyssal_modules_count": 1,
"issuer": {
"id": 2112606829,
"slug": "max1m-bolshakov-2112606829",
"name": "Max1m Bolshakov",
"description": null,
"has_premium": false,
"corporation_id": 1000045
},
"date_issued": "2026-02-23T10:42:18.000000Z",
"date_expired": "2026-03-23T10:42:18.000000Z"
},
"estimated_value": 289601018.52,
"estimated_value_updated_at": "2026-02-23T10:41:59.000000Z",
"public_asset": null,
"slug": "abyssal-ballistic-control-system-1052842251186",
"average_fraction": 0.53770333333333
}
Example response (404):
{
"message": "No module with this item id is known to MutaMarket."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List modules of a type
Lists all modules of an abyssal type that are currently for sale, either through a public in-game contract or a MutaMarket sell listing. Newest modules come first unless a sort option is given.
The query path segment must contain a type option (type/{id-or-slug}, e.g. type/49738
or type/abyssal-ballistic-control-system) and accepts the same filter options as the
module browser, chained as URL segments in any order:
| Option | Format | Effect |
|---|---|---|
| sort | sort/{field}/{direction} |
Sort by price (contract price), value (estimated value), fraction (average roll quality), or a dogma attribute given by id or name (e.g. sort/50/desc or sort/cpu/asc). Direction is asc or desc. Sorting by an attribute only returns modules that have that attribute. |
| attributes | attributes/{attribute}/{value} (pairs, repeatable) |
Filter by rolled attribute values, e.g. attributes/cpu/20-30/damageMultiplier/2.1. A min-max range bounds the value; a single number is a minimum for attributes where high is good, otherwise a maximum. |
| meta-group | meta-group/{group} |
One of t1, t2, storyline, faction, officer, deadspace: only modules mutated from a source module of that meta group. |
| meta-level | meta-level/{n} |
Only modules mutated from a source module of that meta level. |
| contract-price | contract-price/{max} or contract-price/{min}-{max} |
Bound the contract price in ISK. |
| estimated-value | estimated-value/{min} or estimated-value/{min}-{max} |
Bound the estimated value in ISK. |
| goldbar | flag | Only modules with at least one attribute rolled better than the best regular meta variant. |
| brownbar | flag | Only modules with at least one attribute rolled worse than the worst regular meta variant. |
| diamondbar | flag | Only modules with the best recorded roll for the type in at least one attribute. |
| item-exchange / auction | flag | Only contracts of that type. |
| no-multi-item-contracts | flag | Only contracts that contain exactly one abyssal module and nothing else. |
| contracts-only | flag | Exclude modules that are only listed as MutaMarket sell listings without a contract. |
| without-other-items | flag | Only contracts that do not include unrelated items. |
Full example: /api/modules/type/abyssal-ballistic-control-system/sort/price/asc/goldbar/contract-price/0-500000000
Responses are cursor-paginated with 100 modules per page: request the next page by passing
meta.next_cursor as the cursor query parameter, or follow links.next directly.
Example request:
curl --request GET \
--get "https://mutamarket.test/api/modules/type/abyssal-ballistic-control-system/sort/price/asc/goldbar" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://mutamarket.test/api/modules/type/abyssal-ballistic-control-system/sort/price/asc/goldbar"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"data": [
{
"id": 1052842251186,
"type": {
"id": 49738,
"name": "Abyssal Ballistic Control System"
},
"creator": {
"id": 2112606829,
"slug": "max1m-bolshakov-2112606829",
"name": "Max1m Bolshakov",
"description": null,
"has_premium": false,
"corporation_id": 1000045
},
"mutated_attributes": [
{
"id": 50,
"name": "cpu",
"display_name": "CPU usage",
"value": 21.069600465775,
"base_value": 24,
"fraction": 0.814,
"fraction_type": 0.4884,
"fraction_absolute": 0.90597529518355,
"bar": 0,
"is_derived": false,
"unit": {
"id": 106,
"name": "Teraflops",
"display_name": "tf"
},
"is_virtual": false
},
{
"id": 1255,
"name": "droneDamageBonus",
"display_name": "Drone Damage Bonus",
"value": 0,
"base_value": 0,
"fraction": 0,
"fraction_type": 0,
"fraction_absolute": -2,
"bar": 0,
"is_derived": false,
"unit": {
"id": 105,
"name": "Percentage",
"display_name": "%"
},
"is_virtual": true
},
{
"id": 213,
"name": "missileDamageMultiplierBonus",
"display_name": "Missile Damage Bonus",
"value": 1.1202800431252,
"base_value": 1.12,
"fraction": 0.01786,
"fraction_type": 0.01,
"fraction_absolute": 0.59083450673975,
"bar": 0,
"is_derived": false,
"unit": {
"id": 109,
"name": "Modifier Percent",
"display_name": "%"
},
"is_virtual": false
},
{
"id": 204,
"name": "speedMultiplier",
"display_name": "Rate Of Fire Bonus",
"value": 0.87609376326203,
"base_value": 0.89,
"fraction": 0.78125,
"fraction_type": 0.52083,
"fraction_absolute": 0.86475956827719,
"bar": 0,
"is_derived": false,
"unit": {
"id": 111,
"name": "Inversed Modifier Percent",
"display_name": "%"
},
"is_virtual": false
},
{
"id": 5000004,
"name": "dpsIncreaseMissiles",
"display_name": "DPS Increase",
"value": 1.27872162787,
"base_value": 1.2584269662921,
"fraction": 0.4648,
"fraction_type": 0.28443,
"fraction_absolute": 0.70135645073128,
"bar": 0,
"is_derived": true,
"unit": {
"id": 109,
"name": "Modifier Percent",
"display_name": "%"
},
"is_virtual": false
}
],
"source_type": {
"id": 13937,
"name": "Dread Guristas Ballistic Control System",
"meta_group": "Faction",
"meta_group_id": 4,
"published": true
},
"mutaplasmid": {
"id": 49740,
"name": "Gravid Ballistic Control System Mutaplasmid"
},
"contract": {
"id": 228749822,
"type": "item_exchange",
"price": 290000000,
"asking_for_items": false,
"plex_count": 0,
"non_abyssal_modules_count": 0,
"abyssal_modules_count": 1,
"issuer": {
"id": 2112606829,
"slug": "max1m-bolshakov-2112606829",
"name": "Max1m Bolshakov",
"description": null,
"has_premium": false,
"corporation_id": 1000045
},
"date_issued": "2026-02-23T10:42:18.000000Z",
"date_expired": "2026-03-23T10:42:18.000000Z"
},
"estimated_value": 289601018.52,
"estimated_value_updated_at": "2026-02-23T10:41:59.000000Z",
"public_asset": null,
"slug": "abyssal-ballistic-control-system-1052842251186",
"average_fraction": 0.53770333333333
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": "https://mutamarket.test/api/modules/type/49738?cursor=eyJtb2R1bGVzLmlkIjoxMDUyNzM1NjA0NDY5LCJfcG9pbnRzVG9OZXh0SXRlbXMiOnRydWV9"
},
"meta": {
"path": "https://mutamarket.test/api/modules/type/49738",
"per_page": 100,
"next_cursor": "eyJtb2R1bGVzLmlkIjoxMDUyNzM1NjA0NDY5LCJfcG9pbnRzVG9OZXh0SXRlbXMiOnRydWV9",
"prev_cursor": null
}
}
Example response (404):
{
"message": "Please provide a valid type."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Import a module from EVE
Imports a module from EVE into MutaMarket by its in-game item id and returns it with all rolled attributes, roll-quality metrics, and the estimated value.
Identify the module either explicitly via type_id + item_id, or by pasting an in-game
item link as message — any string containing showinfo:{type_id}//{item_id} works,
which is what you get when you drag an item into the EVE chat window and copy the message.
The module data is fetched live from the EVE ESI API and the value estimation runs synchronously, so expect this request to take a few seconds. Re-submitting an existing module refreshes its data instead of duplicating it.
Example request:
curl --request POST \
"https://mutamarket.test/api/modules" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"item_id\": 1041420958612,
\"type_id\": 47820
}"
const url = new URL(
"https://mutamarket.test/api/modules"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"item_id": 1041420958612,
"type_id": 47820
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"id": 1052842251186,
"type": {
"id": 49738,
"name": "Abyssal Ballistic Control System"
},
"creator": {
"id": 2112606829,
"slug": "max1m-bolshakov-2112606829",
"name": "Max1m Bolshakov",
"description": null,
"has_premium": false,
"corporation_id": 1000045
},
"mutated_attributes": [
{
"id": 50,
"name": "cpu",
"display_name": "CPU usage",
"value": 21.069600465775,
"base_value": 24,
"fraction": 0.814,
"fraction_type": 0.4884,
"fraction_absolute": 0.90597529518355,
"bar": 0,
"is_derived": false,
"unit": {
"id": 106,
"name": "Teraflops",
"display_name": "tf"
},
"is_virtual": false
},
{
"id": 1255,
"name": "droneDamageBonus",
"display_name": "Drone Damage Bonus",
"value": 0,
"base_value": 0,
"fraction": 0,
"fraction_type": 0,
"fraction_absolute": -2,
"bar": 0,
"is_derived": false,
"unit": {
"id": 105,
"name": "Percentage",
"display_name": "%"
},
"is_virtual": true
},
{
"id": 213,
"name": "missileDamageMultiplierBonus",
"display_name": "Missile Damage Bonus",
"value": 1.1202800431252,
"base_value": 1.12,
"fraction": 0.01786,
"fraction_type": 0.01,
"fraction_absolute": 0.59083450673975,
"bar": 0,
"is_derived": false,
"unit": {
"id": 109,
"name": "Modifier Percent",
"display_name": "%"
},
"is_virtual": false
},
{
"id": 204,
"name": "speedMultiplier",
"display_name": "Rate Of Fire Bonus",
"value": 0.87609376326203,
"base_value": 0.89,
"fraction": 0.78125,
"fraction_type": 0.52083,
"fraction_absolute": 0.86475956827719,
"bar": 0,
"is_derived": false,
"unit": {
"id": 111,
"name": "Inversed Modifier Percent",
"display_name": "%"
},
"is_virtual": false
},
{
"id": 5000004,
"name": "dpsIncreaseMissiles",
"display_name": "DPS Increase",
"value": 1.27872162787,
"base_value": 1.2584269662921,
"fraction": 0.4648,
"fraction_type": 0.28443,
"fraction_absolute": 0.70135645073128,
"bar": 0,
"is_derived": true,
"unit": {
"id": 109,
"name": "Modifier Percent",
"display_name": "%"
},
"is_virtual": false
}
],
"source_type": {
"id": 13937,
"name": "Dread Guristas Ballistic Control System",
"meta_group": "Faction",
"meta_group_id": 4,
"published": true
},
"mutaplasmid": {
"id": 49740,
"name": "Gravid Ballistic Control System Mutaplasmid"
},
"contract": {
"id": 228749822,
"type": "item_exchange",
"price": 290000000,
"asking_for_items": false,
"plex_count": 0,
"non_abyssal_modules_count": 0,
"abyssal_modules_count": 1,
"issuer": {
"id": 2112606829,
"slug": "max1m-bolshakov-2112606829",
"name": "Max1m Bolshakov",
"description": null,
"has_premium": false,
"corporation_id": 1000045
},
"date_issued": "2026-02-23T10:42:18.000000Z",
"date_expired": "2026-03-23T10:42:18.000000Z"
},
"estimated_value": 289601018.52,
"estimated_value_updated_at": "2026-02-23T10:41:59.000000Z",
"public_asset": null,
"slug": "abyssal-ballistic-control-system-1052842251186",
"average_fraction": 0.53770333333333
}
Example response (400):
{
"message": "Failed to add module!"
}
Example response (422):
{
"message": "The message field is required when item id is not present.",
"errors": {
"message": [
"The message field is required when item id is not present."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.