eve-swagger

JS Client for the Eve Swagger Interface (ESI)

JavaScript client for ESI compatible with NodeJS. The client returns a developer friendly set of functions that return Promises resolving to the response from the ESI endpoint.

The versioning of this library is independent of the ESI version. Because this is a client adapter, it is possible that certain routes are perfectly usable even when an ESI update changes other routes. The library uses specific route versions for each end point instead of the legacy, latest, or dev aliases.

Installation

For Node.js

The library is published to npm as eve-swagger. It can be depended on as usual by running npm install --save eve-swagger, or by including in your package.json:

"dependencies": {
   "eve-swagger": "^0.3.3",
}

Getting Started

Please follow the Installation instruction and execute the following JS code. All ESI end points and their code mappings are provided in the subsequent ESI Mappings section.

// The main module returns a default Api instance with an attached
// Api constructor if configuration changes are necessary.
let esi = require('eve-swagger');

// Creating a new Api instance with a different configuration.
// All options, with their default values, are shown below.
let esi2 = esi({
    service: 'https://esi.tech.ccp.is',
    source: 'tranquility',
    agent: 'eve-swagger | https://github.com/lhkbob/eve-swagger-js',
    language: 'en-us',
    timeout: 6000,
    minTime: 0,
    maxConcurrent: 0
  });

// Fetch all active alliance ids (could also call 'esi.alliances.all()')
esi.alliances().then(result => {
  console.log(result);
}).catch(error => {
  console.error(error);
});

ESI Mappings

The following table lists the mapping from ESI route end point to the function in the library that contacts that route. It also contains the version of the route that this library is coded to use (on a per-route basis as recommended by CCP) and an example snippet showing how to call the linked function.

ESI URL Version JS Function Example
GET /alliances/ v1 Alliances.all() esi.alliances()
GET /alliances/names/ v1 Alliances.names() esi.alliance.names(ids)
GET /alliances/{alliance_id}/ v2 Alliance.info() esi.alliances(1).info()
GET /alliances/{alliance_id}/corporations/ v1 Alliance.corporations() esi.alliances(1).corporations()
GET /alliances/{alliance_id}/icons/ v1 Alliance.icon() esi.alliances(1).icon()
POST /characters/affiliation/ v1 Characters.affiliations() esi.characters.affiliations(ids)
GET /characters/names/ v1 Characters.names() esi.characters.names(ids)
GET /characters/{character_id}/ v4 CharacterInfo.info() esi.characters(1).info()
GET /characters/{character_id}/agents_research/ v1 Character.agentResearch() esi.characters(1, 'token').agentResearch()
GET /characters/{character_id}/assets/ v1 Character.assets() esi.characters(1, 'token').assets()
GET /characters/{character_id}/blueprints/ v1 Character.blueprints() esi.characters(1, 'token').blueprints()
GET /characters/{character_id}/bookmarks/ v1 Bookmarks.all() esi.characters(1, 'token').bookmarks()
GET /characters/{character_id}/bookmarks/folders/ v1 Bookmarks.folders() esi.characters(1, 'token').bookmarks.folders()
GET /characters/{character_id}/calendar/ v1 Calendar.recent() esi.characters(1, 'token').calendar()
GET /characters/{character_id}/calendar/{event_id}/ v3 Event.info() esi.characters(1, 'token').calendar(2).info()
PUT /characters/{character_id}/calendar/{event_id}/ v3 Event.decline() esi.characters(1, 'token').calendar(2).decline()
PUT /characters/{character_id}/calendar/{event_id}/ v3 Event.accept() esi.characters(1, 'token').calendar(2).accept()
PUT /characters/{character_id}/calendar/{event_id}/ v3 Event.tentative() esi.characters(1, 'token').calendar(2).tentative()
GET /characters/{character_id}/chat_channels/ v1 Character.chatChannels() esi.characters(1, 'token').chatChannels()
GET /characters/{character_id}/clones/ v2 Character.clones() esi.characters(1, 'token').clones()
DELETE /characters/{character_id}/contacts/ v1 Contact.del() esi.characters(1, 'token').contacts(2).del()
GET /characters/{character_id}/contacts/ v1 Contacts.all() esi.characters(1, 'token').contacts()
POST /characters/{character_id}/contacts/ v1 Contacts.add() esi.characters(1, 'token').contacts.add({...})
POST /characters/{character_id}/contacts/ v1 Contacts.addWatched() esi.characters(1, 'token').contacts.addWatched({...})
PUT /characters/{character_id}/contacts/ v1 Contact.update() esi.characters(1, 'token').contacts(2).update({...})
PUT /characters/{character_id}/contacts/ v1 Contact.updateWatched() esi.characters(1, 'token').contacts(2).updateWatched({...})
GET /characters/{character_id}/contacts/labels/ v1 Contacts.labels() esi.characters(1, 'token').contacts.labels()
GET /characters/{character_id}/corporationhistory/ v1 CharacterInfo.history() esi.characters(1).history()
POST /characters/{character_id}/cspa/ v3 Mail.cspaCost() esi.characters(1, 'token').mail.cspaCost()
GET /characters/{character_id}/fittings/ v1 Fittings.all() esi.characters(1, 'token').fittings()
POST /characters/{character_id}/fittings/ v1 Fittings.add() esi.characters(1, 'token').fittings.add({...})
DELETE /characters/{character_id}/fittings/{fitting_id}/ v1 Fitting.del() esi.characters(1, 'token').fittings(2).del()
GET /characters/{character_id}/industry/jobs/ v1 Character.industryJobs() esi.characters(1, 'token').industryJobs()
GET /characters/{character_id}/killmails/recent/ v1 Character.recentKillmails() esi.characters(1, 'token').recentKillmails()
GET /characters/{character_id}/killmails/recent/ v1 Character.recentKills() esi.characters(1, 'token').recentKills()
GET /characters/{character_id}/location/ v1 Character.location() esi.characters(1, 'token').location()
GET /characters/{character_id}/loyalty/points/ v1 Character.loyaltyPoints() esi.characters(1, 'token').loyaltyPoints()
GET /characters/{character_id}/mail/ v1 Mail.inbox() esi.characters(1, 'token').mail()
POST /characters/{character_id}/mail/ v1 Mail.send() esi.characters(1, 'token').mail.send({...})
GET /characters/{character_id}/mail/labels/ v3 Mail.unreadCount() esi.characters(1, 'token').mail.unreadCount()
GET /characters/{character_id}/mail/labels/ v3 Labels.all() esi.characters(1, 'token').mail.labels()
POST /characters/{character_id}/mail/labels/ v2 Labels.add() esi.characters(1, 'token').mail.labels.add({...})
DELETE /characters/{character_id}/mail/labels/{label_id}/ v1 Label.del() esi.characters(1, 'token').mail.labels(2).del()
GET /characters/{character_id}/mail/lists/ v1 Mail.lists() esi.characters(1, 'token').mail.lists()
DELETE /characters/{character_id}/mail/{mail_id}/ v1 Message.del() esi.characters(1, 'token').mail(2).del()
GET /characters/{character_id}/mail/{mail_id}/ v1 Message.info() esi.characters(1, 'token').mail(2).info()
PUT /characters/{character_id}/mail/{mail_id}/ v1 Message.update() esi.characters(1, 'token').mail(2).update({...})
GET /characters/{character_id}/medals/ v1 Character.medals() esi.characters(1, 'token').medals()
GET /characters/{character_id}/online/ v1 Character.online() esi.characters(1, 'token').online()
GET /characters/{character_id}/opportunities/ v1 Character.opportunities() esi.characters(1, 'token').opportunities()
GET /characters/{character_id}/orders/ v1 Character.orders() esi.characters(1, 'token').orders()
GET /characters/{character_id}/planets/ v1 Colonies.all() esi.characters(1, 'token').colonies()
GET /characters/{character_id}/planets/{planet_id}/ v2 Colonies.layout() esi.characters(1, 'token').colonies.layout(2)
GET /characters/{character_id}/portrait/ v2 CharacterInfo.portrait() esi.characters(1).portrait()
GET /characters/{character_id}/roles/ v1 Character.roles() esi.characters(1, 'token').roles()
GET /characters/{character_id}/search/?category=[structure] v2 Structures.search() esi.characters(1, 'token').structures.search('text')
GET /characters/{character_id}/ship/ v1 Character.ship() esi.characters(1, 'token').ship()
GET /characters/{character_id}/skillqueue/ v2 Character.skillqueue() esi.characters(1, 'token').skillqueue()
GET /characters/{character_id}/skills/ v3 Character.skills() esi.characters(1, 'token').skills()
GET /characters/{character_id}/standings/ v1 Character.standings() esi.characters(1, 'token').standings()
GET /characters/{character_id}/wallets/ v1 Character.wallets() esi.characters(1, 'token').wallets()
GET /corporations/names/ v1 Corporations.names() esi.corporations.names()
GET /corporations/npccorps/ v1 Corporations.npc() esi.corporations.npc()
GET /corporations/{corporation_id}/ v3 Corporation.info() esi.corporations(1).info()
GET /corporations/{corporation_id}/ v3 CharacterCorporation.info() esi.characters(1, 'token').corporation.info()
GET /corporations/{corporation_id}/alliancehistory/ v1 CharacterCorporation.history() esi.characters(1, 'token').corporation.history()
GET /corporations/{corporation_id}/alliancehistory/ v1 Corporation.history() esi.corporations(1).history()
GET /corporations/{corporation_id}/icons/ v1 CharacterCorporation.icon() esi.characters(1, 'token').corporation.icon()
GET /corporations/{corporation_id}/icons/ v1 Corporation.icon() esi.corporations(1).icon()
GET /corporations/{corporation_id}/members/ v2 CharacterCorporation.members() esi.characters(1, 'token').corporation.members()
GET /corporations/{corporation_id}/roles/ v1 CharacterCorporation.roles() esi.characters(1, 'token').corporation.roles()
GET /corporations/{corporation_id}/structures/ v1 CharacterCorporation.structures() esi.characters(1, 'token').corporation.structures()
PUT /corporations/{corporation_id}/structures/{structure_id}/ v1 Structure.vulnerability() esi.characters(1, 'token').structures(2).vulnerability({...})
GET /dogma/attributes/ v1 Attributes.all() esi.dogma.attributes()
GET /dogma/attributes/{attribute_id}/ v1 Attribute.info() esi.dogma.attributes(1).info()
GET /dogma/effects/ v1 Effects.all() esi.dogma.effects()
GET /dogma/effects/{effect_id}/ v1 Effect.info() esi.dogma.effects(1).info()
GET /fleets/{fleet_id}/ v1 Fleet.info() esi.characters(1, 'token').fleet(2).info()
PUT /fleets/{fleet_id}/ v1 Fleet.update() esi.characters(1, 'token').fleet(2).update({...})
GET /fleets/{fleet_id}/members/ v1 Fleet.members() esi.characters(1, 'token').fleet(2).members()
POST /fleets/{fleet_id}/members/ v1 Fleet.invite() esi.characters(1, 'token').fleet(2).invite({...})
DELETE /fleets/{fleet_id}/members/{member_id}/ v1 Fleet.kick() esi.characters(1, 'token').fleet(2).kick(3)
PUT /fleets/{fleet_id}/members/{member_id}/ v1 Fleet.move() esi.characters(1, 'token').fleet(2).move(3, {...})
DELETE /fleets/{fleet_id}/squads/{squad_id}/ v1 Squad.del() esi.characters(1, 'token').fleet(2).wings(3).squads(4).del()
PUT /fleets/{fleet_id}/squads/{squad_id}/ v1 Squad.rename() esi.characters(1, 'token').fleet(2).wings(3).squads(4).rename('name')
GET /fleets/{fleet_id}/wings/ v1 Wings.all() esi.characters(1, 'token').fleet(2).wings()
POST /fleets/{fleet_id}/wings/ v1 Wings.add() esi.characters(1, 'token').fleet(2).wings.add()
DELETE /fleets/{fleet_id}/wings/{wing_id}/ v1 Wing.del() esi.characters(1, 'token').fleet(2).wings(3).del()
PUT /fleets/{fleet_id}/wings/{wing_id}/ v1 Wing.rename() esi.characters(1, 'token').fleet(2).wings(3).rename('name')
POST /fleets/{fleet_id}/wings/{wing_id}/squads/ v1 Squads.add() esi.characters(1, 'token').fleet(2).wings(3).squads.add()
GET /incursions/ v1 Incursions.all() esi.incursions()
GET /industry/facilities/ v1 Industry.facilities() esi.industry.facilities()
GET /industry/systems/ v1 Industry.systemCosts() esi.industry.systemCosts()
GET /insurance/prices/ v1 Insurance.prices() esi.insurance.prices()
GET /killmails/{killmail_id}/{killmail_hash}/ v1 Killmail.get() esi.killmail(id, hash)
GET /loyalty/stores/{corporation_id}/offers/ v1 CharacterCorporation.loyaltyOffers() esi.characters(1, 'token').corporation.loyaltyOffers()
GET /loyalty/stores/{corporation_id}/offers/ v1 Corporation.loyaltyOffers() esi.corporations(1).loyaltyOffers()
GET /markets/groups/ v1 MarketGroups.all() esi.types.marketGroups()
GET /markets/groups/{market_group_id}/ v1 MarketGroup.info() esi.types.marketGroups(1).info()
GET /markets/prices/ v1 Types.prices() esi.types.prices()
GET /markets/structures/{structure_id}/?orders=all v1 Structure.orders() esi.characters(1, 'token').structures(2).orders()
GET /markets/structures/{structure_id}/?orders=buy&typeId v1 Structure.buyOrdersFor() esi.characters(1, 'token').structures(2).orders()
GET /markets/structures/{structure_id}/?orders=sell&typeId v1 Structure.sellOrdersFor() esi.characters(1, 'token').structures(2).orders()
GET /markets/structures/{structure_id}/?orders=all&typeId v1 Structure.ordersFor() esi.characters(1, 'token').structures(2).orders()
GET /markets/{region_id}/history/ v1 Region.history() esi.regions(1).history();
GET /markets/{region_id}/orders/?orders=buy&typeId v1 Region.buyOrdersFor() esi.regions(1).buyOrdersFor(2)
GET /markets/{region_id}/orders/?orders=all v1 Region.orders() esi.regions(1).orders()
GET /markets/{region_id}/orders/?orders=all&typeId v1 Region.ordersFor() esi.regions(1).ordersFor(2)
GET /markets/{region_id}/orders/?orders=sell&typeId v1 Region.sellOrdersFor() esi.regions(1).sellOrdersFor(2)
GET /opportunities/groups/ v1 OpportunityGroups.all() esi.opportunities.groups()
GET /opportunities/groups/{group_id}/ v1 OpportunityGroup.info() esi.opportunities.groups(1).info()
GET /opportunities/tasks/ v1 OpportunityTasks.all() esi.opportunities.tasks()
GET /opportunities/tasks/{task_id}/ v1 OpportunityTask.info() esi.opportunities.tasks(1).info()
GET /route/{origin}/{destination}/ v1 SolarSystem.insecureRoute() esi.solarSystems(1).insecureRoute(2, {...})
GET /route/{origin}/{destination}/ v1 SolarSystem.secureRoute() esi.solarSystems(1).secureRoute(2, {...})
GET /route/{origin}/{destination}/ v1 SolarSystem.shortestRoute() esi.solarSystems(1).shortestRoute(2, {...})
GET /search/?categories=[character] v1 Characters.search() esi.characters.search
GET /search/?strict=false v1 Search.get() esi.search('query')
GET /search/?strict=true v1 Search.strict() esi.search.strict('query')
GET /search/?category=[alliance] v1 Alliances.search() esi.alliances.search('text')
GET /search/?category=[faction] v1 Factions.search() esi.factions.search('text')
GET /search/?category=[station] v1 Stations.search() esi.stations.search('text')
GET /search/?category=[region] v1 Regions.search() esi.regions.search('text')
GET /search/?categories=[agent] v1 Agents.search() esi.agents.search('text')
GET /search/?categories=[corporation] v1 Corporations.search() esi.corporations.search('text')
GET /search/?category=[solarsystem] v1 SolarSystems.search() esi.solarSystems.search('text')
GET /search/?category=[constellation] v1 Constellations.search() esi.constellations.search('text')
GET /search/?category=[wormhole] v1 Wormholes.search() esi.wormholes.search('text')
GET /search/?category=[inventorytype] v1 Types.search() esi.types.search('text')
GET /sovereignty/campaigns/ v1 Sovereignty.campaigns() esi.sovereignty.campaigns()
GET /sovereignty/map/ v1 Sovereignty.map() esi.sovereignty.map()
GET /sovereignty/structures/ v1 Sovereignty.structures() esi.sovereignty.structures()
GET /status/ v1 API.status() esi.status()
POST /ui/autopilot/waypoint/ v2 Autopilot.append() esi.characters(1, 'token').autopilot.append(2)
POST /ui/autopilot/waypoint/ v2 Autopilot.prepend() esi.characters(1, 'token').autopilot.prepend(2)
POST /ui/autopilot/waypoint/ v2 Autopilot.destination() esi.characters(1, 'token').autopilot.destination(2)
POST /ui/openwindow/contract/ v1 Window.contract() esi.characters(1, 'token').window.contract(2)
POST /ui/openwindow/information/ v1 Window.info() esi.characters(1, 'token').window.info(2)
POST /ui/openwindow/marketdetails/ v1 Window.market() esi.characters(1, 'token').window.market(2)
POST /ui/openwindow/newmail/ v1 Window.newMail() esi.characters(1, 'token').window.newMail({...})
GET /universe/bloodlines/ v1 Bloodlines.all() esi.bloodlines()
GET /universe/categories/ v1 Categories.all() esi.types.categories()
GET /universe/categories/{category_id}/ v1 Category.info() esi.types.categories(1).info()
GET /universe/constellations/ v1 Constellations.all() esi.constellations()
GET /universe/constellations/{constellation_id}/ v1 Constellation.info() esi.constellations(1).info()
GET /universe/factions/ v1 Factions.all() esi.factions()
GET /universe/graphics/ v1 Graphics.all() esi.graphics()
GET /universe/graphics/{graphic_id}/ v1 Graphic.info() esi.graphics(1).info()
GET /universe/groups/ v1 Groups.all() esi.types.groups()
GET /universe/groups/{group_id}/ v1 Group.info() esi.types.groups(1).info()
GET /universe/moons/{moon_id}/ v1 Moon.info() esi.moons(1).info()
POST /universe/names/?category=[inventory_type] v2 Types.names() esi.types.names()
POST /universe/names/ v2 API.names() esi.names(ids)
POST /universe/names/?category=[station] v2 Stations.names() esi.stations.names(ids)
POST /universe/names/?category=[region] v2 Regions.names() esi.regions.names()
POST /universe/names/?category=[solar_system] v2 SolarSystems.names() esi.solarSystems.names()
POST /universe/names/?category=[constellation] v2 Constellations.names() esi.constellations.names()
GET /universe/planets/{planet_id}/ v1 Planet.info() esi.planets(1).info()
GET /universe/races/ v1 Races.all() esi.races()
GET /universe/regions/ v1 Regions.all() esi.regions()
GET /universe/regions/{region_id}/ v1 Region.info() esi.regions(1).info()
GET /universe/schematics/{schematic_id}/ v1 PlanetaryInteraction.schematic() esi.pi.schematic(1)
GET /universe/stargates/{stargate_id}/ v1 Stargate.info() esi.stargates(1).info()
GET /universe/stations/{station_id}/ v2 Station.info() esi.stations(1).info()
GET /universe/structures/ v1 Freeports.all() esi.freeports()
GET /universe/structures/{structure_id}/ v1 Structure.info() esi.characters(1, 'token').structures(2).info()
GET /universe/system_jumps/ v1 SolarSystems.jumpStats() esi.solarSystems.jumpStats()
GET /universe/system_kills/ v1 SolarSystems.killStats() esi.solarSystems.killStats()
GET /universe/systems/ v1 SolarSystems.all() esi.solarSystems()
GET /universe/systems/{system_id}/ v2 SolarSystem.info() esi.solarSystems(1).info()
GET /universe/types/ v1 Types.all() esi.types()
GET /universe/types/{type_id}/ v2 Type.info() esi.types(1).info()
GET /wars/ v1 Wars.recent() esi.wars.recent()
GET /wars/{war_id}/ v1 War.info() esi.wars(1).info()
GET /wars/{war_id}/killmails/ v1 War.kills() esi.wars(1).kills()
GET /wars/{war_id}/killmails/ v1 War.killmails() esi.wars(1).killmails()

SSO Token Authorization

Numerous functions require user authorization. EVE and ESI manage this via access tokens that have been verified between the user, app, and EVE using the OAuth protocol. When an app requests a token for a user it specifies a number of scopes that it requires to successfully operate. These scopes allow for compartmentalization between a user's various in-game data, enabling apps to only have access to what they need.

All end points that require authentication via a token are exposed by calling esi.characters(id, token). The returned Character instance and child adapters will then use that token for all requests. This instance can be saved by the app if the app's purpose focuses on a limited set of characters. Otherwise the created Character instances are lightweight enough that it can be called each time a new character must be accessed. This module does not provide any tools for acquiring evesso tokens.

The OAuth verification is made against https://login.eveonline.com/oauth/authorize, although this is the responsibility of the app that wishes to use this library. eve-swagger-js does not provide any OAuth support.

Available Scopes

SSO Scope Description
esi-assets.read_assets.v1 EVE SSO scope esi-assets.read_assets.v1
esi-bookmarks.read_character_bookmarks.v1 EVE SSO scope esi-bookmarks.read_character_bookmarks.v1
esi-calendar.read_calendar_events.v1 EVE SSO scope esi-calendar.read_calendar_events.v1
esi-calendar.respond_calendar_events.v1 EVE SSO scope esi-calendar.respond_calendar_events.v1
esi-characters.read_agents_research.v1 EVE SSO scope esi-characters.read_agents_research.v1
esi-characters.read_blueprints.v1 EVE SSO scope esi-characters.read_blueprints.v1
esi-characters.read_chat_channels.v1 EVE SSO scope esi-characters.read_chat_channels.v1
esi-characters.read_contacts.v1 EVE SSO scope esi-characters.read_contacts.v1
esi-characters.read_corporation_roles.v1 EVE SSO scope esi-characters.read_corporation_roles.v1
esi-characters.read_loyalty.v1 EVE SSO scope esi-characters.read_loyalty.v1
esi-characters.read_medals.v1 EVE SSO scope esi-characters.read_medals.v1
esi-characters.read_opportunities.v1 EVE SSO scope esi-characters.read_opportunities.v1
esi-characters.read_standings.v1 EVE SSO scope esi-characters.read_standings.v1
esi-characters.write_contacts.v1 EVE SSO scope esi-characters.write_contacts.v1
esi-clones.read_clones.v1 EVE SSO scope esi-clones.read_clones.v1
esi-corporations.read_corporation_membership.v1 EVE SSO scope esi-corporations.read_corporation_membership.v1
esi-corporations.read_structures.v1 EVE SSO scope esi-corporations.read_structures.v1
esi-corporations.write_structures.v1 EVE SSO scope esi-corporations.write_structures.v1
esi-fittings.read_fittings.v1 EVE SSO scope esi-fittings.read_fittings.v1
esi-fittings.write_fittings.v1 EVE SSO scope esi-fittings.write_fittings.v1
esi-fleets.read_fleet.v1 EVE SSO scope esi-fleets.read_fleet.v1
esi-fleets.write_fleet.v1 EVE SSO scope esi-fleets.write_fleet.v1
esi-industry.read_character_jobs.v1 EVE SSO scope esi-industry.read_character_jobs.v1
esi-killmails.read_killmails.v1 EVE SSO scope esi-killmails.read_killmails.v1
esi-location.read_location.v1 EVE SSO scope esi-location.read_location.v1
esi-location.read_online.v1 EVE SSO scope esi-location.read_online.v1
esi-location.read_ship_type.v1 EVE SSO scope esi-location.read_ship_type.v1
esi-mail.organize_mail.v1 EVE SSO scope esi-mail.organize_mail.v1
esi-mail.read_mail.v1 EVE SSO scope esi-mail.read_mail.v1
esi-mail.send_mail.v1 EVE SSO scope esi-mail.send_mail.v1
esi-markets.read_character_orders.v1 EVE SSO scope esi-markets.read_character_orders.v1
esi-markets.structure_markets.v1 EVE SSO scope esi-markets.structure_markets.v1
esi-planets.manage_planets.v1 EVE SSO scope esi-planets.manage_planets.v1
esi-search.search_structures.v1 EVE SSO scope esi-search.search_structures.v1
esi-skills.read_skillqueue.v1 EVE SSO scope esi-skills.read_skillqueue.v1
esi-skills.read_skills.v1 EVE SSO scope esi-skills.read_skills.v1
esi-ui.open_window.v1 EVE SSO scope esi-ui.open_window.v1
esi-ui.write_waypoint.v1 EVE SSO scope esi-ui.write_waypoint.v1
esi-universe.read_structures.v1 EVE SSO scope esi-universe.read_structures.v1
esi-wallet.read_character_wallet.v1 EVE SSO scope esi-wallet.read_character_wallet.v1