{"openapi":"3.1.0","info":{"title":"MutaMarket API","description":"Public API for abyssal modules in EVE Online: browse what is for sale, look up a single module with every rolled attribute and its estimated value, import a module from EVE, and read the reference data behind the roll-quality metrics.\n\nNo key or account is needed. Send a User-Agent that identifies you, with a contact address. Do not call POST /modules in a loop: it calls EVE's ESI and runs a price model on every request.\n\nOnly the endpoints described here are public. Everything else under /api serves mutamarket.com itself and changes without notice.","contact":{"name":"MutaMarket","url":"https://mutamarket.com/documentation/support"},"license":{"name":"See the site's legal page","url":"https://mutamarket.com/documentation/legal"},"version":"1.0.0"},"servers":[{"url":"https://mutamarket.com/api"}],"paths":{"/abyssal-type-statistics":{"get":{"tags":["Reference"],"summary":"Attribute roll ranges per type","description":"The best and worst possible rolled value of every mutated attribute of every abyssal type. This is the data behind the fraction_type roll-quality metric and the attribute bars.","operationId":"abyssal_type_statistics","responses":{"200":{"description":"One entry per type and attribute.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AbyssalTypeStatistic"}}}}}}}},"/estimator-statistics":{"get":{"tags":["Reference"],"summary":"Price estimator quality per type","description":"How much data each per-type price model was trained on, how well it fits, and its average error. A null r2 means the model is untrained and modules of that type carry no estimate.","operationId":"estimator_statistics","responses":{"200":{"description":"One entry per abyssal type.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EstimatorStatistic"}}}}}}}},"/modules":{"get":{"tags":["Modules"],"summary":"Always rejects: the list needs a type","description":"The list requires a type option, so this always answers 404.","operationId":"modules_index_root","responses":{"404":{"description":"The list requires a type option.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"message":"Please provide a valid type."}}}}}},"post":{"tags":["Modules"],"summary":"Import a module from EVE","description":"Fetches the module live from ESI and runs the value estimation synchronously, so expect a few seconds. Re-submitting an existing module refreshes it. Do not call this in a loop.","operationId":"store_module","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportModuleRequest"}}},"required":true},"responses":{"200":{"description":"The imported module.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleEnvelope"}}}},"400":{"description":"The import failed, or the request carried no usable item link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"message":"Failed to add module!"}}}},"422":{"description":"Neither a message nor both ids were given. `message` repeats the first failing field, in the order message, item_id, type_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}}}},"/modules/{query}":{"get":{"tags":["Modules"],"summary":"List modules of a type, or get one module","description":"A path segment ending in digits is read as a single-module lookup by EVE item id or MutaMarket slug. Anything else is the type-scoped list, whose segments carry the filter and sort options documented at https://mutamarket.com/documentation/api-modules.\n\nThe list requires a type option, e.g. `type/49738` or `type/abyssal-ballistic-control-system`.","operationId":"modules_show_or_index","parameters":[{"name":"query","in":"path","description":"Either a module item id or slug, or a type segment plus filter and sort segments.","required":true,"schema":{"type":"string"},"example":"type/abyssal-ballistic-control-system/sort/price/asc/goldbar"},{"name":"cursor","in":"query","description":"Opaque pagination cursor from meta.next_cursor of a previous response. List responses only.","required":false,"schema":{"type":"string"}},{"name":"region_id","in":"query","description":"Only modules whose contract is in this EVE region. List responses only.","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"One module, or a page of them.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleOrPage"}}}},"404":{"description":"No such module, or the query named no valid abyssal type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"message":"No module with this item id is known to MutaMarket."}}}}}}}},"components":{"schemas":{"AbyssalTypeStatistic":{"type":"object","description":"The roll extremes of one attribute of one abyssal type.","required":["id","type_id","attribute_id","high_is_good","is_virtual","best","worst","is_derived","attribute","type"],"properties":{"attribute":{"$ref":"#/components/schemas/StatisticAttribute"},"attribute_id":{"type":"integer","format":"int64"},"best":{"type":"number","format":"double","description":"The best possible rolled value."},"high_is_good":{"type":"boolean","description":"Whether a larger value is better. When false, `best` is smaller."},"id":{"type":"integer","format":"int64"},"is_derived":{"type":"boolean","description":"Computed by MutaMarket rather than rolled by EVE."},"is_virtual":{"type":"boolean"},"type":{"$ref":"#/components/schemas/StatisticType"},"type_id":{"type":"integer","format":"int64"},"worst":{"type":"number","format":"double","description":"The worst possible rolled value."}}},"ApiError":{"type":"object","description":"Every error response of the public API.","required":["message"],"properties":{"message":{"type":"string"}}},"AssetLocationView":{"type":"object","description":"Where a user's module physically sits, the legacy `AssetResource`\nshape: the direct parent (ship/container, or the station itself when the\nmodule lies loose in a hangar) plus the resolved station/structure at\nthe top of the ancestor chain.","required":["parent_name","parent_slug","location_id","location_type","location_flag","location_index","owner"],"properties":{"corporation_id":{"type":["integer","null"],"format":"int64"},"location_flag":{"type":"string"},"location_id":{"type":"integer","format":"int64"},"location_index":{"type":"integer","format":"int64"},"location_type":{"type":"string"},"owner":{"$ref":"#/components/schemas/CharacterRef","description":"The character holding the asset (legacy `asset.character`, loaded\nby `withUserAsset`); the find-asset card names them."},"parent_name":{"type":"string"},"parent_slug":{"type":"string"},"parent_type_id":{"type":["integer","null"],"format":"int64"},"station":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/StationRef","description":"The station or structure hosting the chain (legacy `station` key)."}]}}},"CharacterRef":{"type":"object","description":"Legacy `CharacterResource` without the user-conditional fields.","required":["id","slug","name","has_premium"],"properties":{"corporation_id":{"type":["integer","null"],"format":"int64"},"description":{"type":["string","null"]},"has_premium":{"type":"boolean"},"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"slug":{"type":"string"}}},"CollectionNoteRef":{"type":"object","description":"Legacy `CollectionNoteResource`.","required":["collection","id","content"],"properties":{"collection":{"$ref":"#/components/schemas/NoteCollectionRef"},"content":{"type":"string"},"id":{"type":"integer","format":"int64"}}},"ContractRef":{"type":"object","description":"Legacy `ContractResource` as loaded for a module's latest public\ncontract (issuer loaded; modules/types/acceptor/status absent for\npublic contracts).","required":["id","type","asking_for_items","plex_count","non_abyssal_modules_count","abyssal_modules_count"],"properties":{"abyssal_modules_count":{"type":"integer","format":"int64"},"asking_for_items":{"type":"boolean"},"date_expired":{"type":["string","null"]},"date_issued":{"type":["string","null"]},"id":{"type":"integer","format":"int64"},"issuer":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CharacterRef"}]},"non_abyssal_modules_count":{"type":"integer","format":"int64"},"plex_count":{"type":"integer","format":"int64"},"price":{"type":["number","null"],"format":"double","description":"The unified price (auction bids and asked-for PLEX included)."},"type":{"type":"string","description":"`auction` or `item_exchange`."}}},"EstimatorStatistic":{"type":"object","description":"Quality metrics of one per-type price model.","required":["id","type_id","name","data_count"],"properties":{"created_at":{"type":["string","null"]},"data_count":{"type":"integer","format":"int64","description":"Recorded sales the model was trained on."},"data_statistics":{"description":"Training sales by the source module's meta group."},"id":{"type":"integer","format":"int64"},"last_trained_at":{"type":["string","null"]},"mae":{"type":["number","null"],"format":"double","description":"Mean absolute error, in ISK."},"name":{"type":"string"},"nmae":{"type":["number","null"],"format":"double","description":"Mean absolute error normalized by the mean sale price."},"r2":{"type":["number","null"],"format":"double","description":"Fit against the training data, 1 being perfect. Null means the\nmodel is untrained, and modules of the type carry no estimate."},"type_id":{"type":"integer","format":"int64"},"updated_at":{"type":["string","null"]}}},"ImportModuleRequest":{"type":"object","description":"Give either `message`, or both `type_id` and `item_id`.","properties":{"item_id":{"type":["integer","null"],"format":"int64","description":"EVE item id of the module."},"message":{"type":["string","null"],"description":"Any string containing `showinfo:{type_id}//{item_id}`, such as an\nin-game item link copied out of chat."},"type_id":{"type":["integer","null"],"format":"int64","description":"EVE type id of the mutated module."}}},"ModuleAttributeView":{"type":"object","description":"Legacy `MutatedAttributeResource`, plus the server-computed `type_band`\nthe legacy frontend derives from its bundled static data.","required":["id","name","display_name","value","base_value","fraction","fraction_type","fraction_absolute","bar","is_derived","is_virtual"],"properties":{"bar":{"type":"integer","format":"int32"},"base_value":{"type":"number","format":"double"},"display_name":{"type":"string"},"fraction":{"type":"number","format":"double"},"fraction_absolute":{"type":"number","format":"double"},"fraction_type":{"type":"number","format":"double"},"id":{"type":"integer","format":"int64"},"is_derived":{"type":"boolean"},"is_virtual":{"type":"boolean"},"name":{"type":"string"},"type_band":{"type":["array","null"],"items":false,"prefixItems":[{"type":"number","format":"double"},{"type":"number","format":"double"}],"description":"The mutaplasmid's own share of the type-wide roll range, as (min,\nmax) half-width fractions — the highlight band of the\ntype-normalized bar. Absent when the mutaplasmid covers the whole\nrange."},"unit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UnitRef"}]},"value":{"type":"number","format":"double"}}},"ModuleDetail":{"type":"object","description":"A module as the legacy `ModuleResource` emits it for guests with the\ndefault relations loaded: same field names, same nesting. Keys owned by\nunported features (`contract`, `public_asset`, estimator values) are\npresent and null, like the legacy loaded-but-empty relations.","required":["id","type","mutated_attributes","slug"],"properties":{"asset":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AssetLocationView","description":"Where the module sits in the signed-in user's assets (the legacy\n`withUserAsset` half of `withDefaultRelations`, loaded on every\nmodule list): present-and-null when they do not own it, absent\nfor guests."}]},"average_fraction":{"type":["number","null"],"format":"double"},"collection_note":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CollectionNoteRef","description":"The per-collection note (legacy `withCollectionNote`): present for\nevery viewer of a collection page, absent elsewhere."}]},"contract":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ContractRef","description":"The module's latest public sale contract, if any."}]},"creator":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CharacterRef"}]},"estimated_value":{"type":["number","null"],"format":"double"},"estimated_value_updated_at":{"type":["string","null"]},"id":{"type":"integer","format":"int64"},"mutaplasmid":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/MutaplasmidRef"}]},"mutated_attributes":{"type":"array","items":{"$ref":"#/components/schemas/ModuleAttributeView"}},"note":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NoteRef","description":"The signed-in user's note (legacy `withUserNote` in the default\nrelations): the key exists only with a session, and is null when\nthe user has no note on the module. Absent for guests."}]},"public_asset":{"description":"The MutaMarket sell listing; arrives with the assets milestone."},"slug":{"type":"string"},"source_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SourceTypeRef"}]},"training_module":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TrainingRef","description":"The recorded historic sale (legacy `whenLoaded('trainingModule')`):\npresent only on the historic-sales cards, absent elsewhere."}]},"type":{"$ref":"#/components/schemas/TypeRef"}}},"ModuleEnvelope":{"type":"object","description":"One module.","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/ModuleDetail"}}},"ModuleOrPage":{"oneOf":[{"$ref":"#/components/schemas/ModuleEnvelope"},{"$ref":"#/components/schemas/ModulePage"}],"description":"One module when the path segment is an id or slug, a page of them when\nit is a type-scoped query."},"ModulePage":{"type":"object","description":"A page of modules.","required":["data","links","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ModuleDetail"}},"links":{"$ref":"#/components/schemas/PageLinks"},"meta":{"$ref":"#/components/schemas/PageMeta"}}},"MutaplasmidRef":{"type":"object","description":"Legacy `MutaplasmidResource`.","required":["id","name"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}}},"NoteCollectionRef":{"type":"object","description":"Legacy `CollectionResource` as embedded in a collection note: only the\ncollection's own columns (no counted or loaded relations).","required":["id","identifier","slug","name","visibility","created_at","updated_at","auto_sync"],"properties":{"auto_sync":{"type":"boolean"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"id":{"type":"integer","format":"int64"},"identifier":{"type":"string"},"last_synced_at":{"type":["string","null"]},"name":{"type":"string"},"slug":{"type":"string"},"updated_at":{"type":"string"},"visibility":{"type":"string"}}},"NoteRef":{"type":"object","description":"Legacy `NoteResource`.","required":["id","content"],"properties":{"content":{"type":"string"},"id":{"type":"integer","format":"int64"}}},"PageLinks":{"type":"object","description":"`first` and `last` are always null on a cursor paginator.","properties":{"first":{"type":["string","null"]},"last":{"type":["string","null"]},"next":{"type":["string","null"]},"prev":{"type":["string","null"]}}},"PageMeta":{"type":"object","required":["path","per_page"],"properties":{"next_cursor":{"type":["string","null"],"description":"Opaque. Pass it back as the `cursor` query parameter."},"path":{"type":"string"},"per_page":{"type":"integer","format":"int64"},"prev_cursor":{"type":["string","null"]}}},"SourceTypeRef":{"type":"object","description":"Legacy `TypeResource` as loaded for the source type (meta group loaded,\ntype attributes and meta level not).","required":["id","name","published"],"properties":{"id":{"type":"integer","format":"int64"},"meta_group":{"type":["string","null"]},"meta_group_id":{"type":["integer","null"],"format":"int64"},"name":{"type":"string"},"published":{"type":"boolean"}}},"StationRef":{"type":"object","required":["id","name","slug"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"slug":{"type":"string"},"type_id":{"type":["integer","null"],"format":"int64"}}},"StatisticAttribute":{"type":"object","description":"The dogma attribute of a roll range. `high_is_good` and `is_derived`\nrepeat the parent's values.","required":["id","name","high_is_good","is_derived"],"properties":{"display_name":{"type":["string","null"]},"high_is_good":{"type":"boolean"},"id":{"type":"integer","format":"int64"},"is_derived":{"type":"boolean"},"name":{"type":"string"},"unit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/StatisticUnit"}]}}},"StatisticType":{"type":"object","required":["id","name","published"],"properties":{"id":{"type":"integer","format":"int64"},"meta_group":{"type":["string","null"]},"meta_group_id":{"type":["integer","null"],"format":"int64"},"name":{"type":"string"},"published":{"type":"boolean"}}},"StatisticUnit":{"type":"object","required":["id","name","display_name"],"properties":{"display_name":{"type":"string"},"id":{"type":"integer","format":"int64"},"name":{"type":"string"}}},"TrainingRef":{"type":"object","description":"Legacy `TrainingModuleResource`.","required":["contract_id"],"properties":{"contract_id":{"type":"integer","format":"int64"},"sold_at":{"type":["string","null"]},"sold_for":{"type":["number","null"],"format":"double"}}},"TypeRef":{"type":"object","description":"Legacy `ModuleTypeResource`.","required":["id","name"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}}},"UnitRef":{"type":"object","description":"Legacy `UnitResource`.","required":["id","name","display_name"],"properties":{"display_name":{"type":"string"},"id":{"type":"integer","format":"int64"},"name":{"type":"string"}}},"ValidationError":{"type":"object","description":"`message` repeats the first failing field.","required":["message","errors"],"properties":{"errors":{"type":"object","description":"Field name to the messages for that field.","additionalProperties":true},"message":{"type":"string"}}}}},"tags":[{"name":"Modules","description":"Browse, retrieve and import abyssal modules."},{"name":"Reference","description":"Model quality and attribute roll ranges."}]}