Observed since 20 Oct, 16:49 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
aa-buybackprogram
Buyback program plugin app for Alliance Auth.
An Alliance Auth app for creating buyback programs and to allow users calculate prices for buyback contracts. Designed to be very transparent for the user and fast to use for the managers.

source /home/allianceserver/venv/auth/bin/activatepip install aa-buybackprogram'buybackprogram', into your settings/local.py installed apps sectionpython manage.py migratepython manage.py collectstaticUpdate the Eve Online API app used for authentication in your AA installation to include the following scopes:
esi-contracts.read_character_contracts.v1esi-contracts.read_corporation_contracts.v1esi-universe.read_structures.v1esi-wallet.read_corporation_wallets.v1esi-corporations.read_divisions.v1esi-assets.read_corporation_assets.v1Buybackprogram requires a lot of data to function as it is designed to allow your clients to sell you any items that exists in EVE. For this reason pre-loading all the date will take a while. Data pre-loading is used to decrease the amount of API calls made to type and price fetches.
To load type data run the command python manage.py buybackprogram_load_data. This will start the preload of all EveType, SolarSystem, EveMarketGroup and EveTypeMaterial objects.
You can follow the progress of the load from your auth dashboard. This task can spike up easily over 100.000 tasks at a time so it is very normal that the queue grows very large while running this task.
:warning: You will need to wait for the type data to load up before you can start to use the plugin. Trying to adjust program settings while the required data has not been yet loaded may result in failure of adjusting the settings.
After you have preloaded the type data you can preload price data into the database. Price data preloading is not mandatory but will speed up the first buyback calculations.
:information_source: If price information is not found for items when the prices are calculated the first time the prices for that item will be fetched during the calculation process. This will increase the calculation time for the contract.
To preload price data run python manage.py buybackprogram_load_prices
Buyback program requires a few periodic tasks to operate and update its data.
Buybackprogram is designed to use locally stored prices to speed up the price calculations. It is important that you have the price update task in your periodic tasks so that your prices will update.
By adding the following lines in your local.py setting file the program will update the stored item prices at midnight. This same task is also responsible for maintenance tasks such as removing unlinked tracking objects, including reverse buyback requests that were never followed through with an actual contract (which releases the stock they had reserved). It will also check for any new contracts and update the statistics page with them every 30 minutes:
# Buybackprogram price updates, updates prices at midnight
CELERYBEAT_SCHEDULE['buybackprogram_update_all_prices'] = {
'task': 'buybackprogram.tasks.update_all_prices',
'schedule': crontab(minute=0, hour='0'),
}
# Buybackprogram contract updates, updates contracts every 30 minutes
CELERYBEAT_SCHEDULE['buybackprogram_update_all_contracts'] = {
'task': 'buybackprogram.tasks.update_all_contracts',
'schedule': crontab(minute='*/30'),
}
# Buybackprogram program performance updates, updates performance at midnight
CELERYBEAT_SCHEDULE['buybackprogram_update_program_performance'] = {
'task': 'buybackprogram.tasks.update_program_performance',
'schedule': crontab(minute=0, hour='0'),
}
# Buybackprogram wallet sync, updates wallet balances and names every hour
CELERYBEAT_SCHEDULE['buybackprogram_update_all_wallets'] = {
'task': 'buybackprogram.update_all_wallets',
'schedule': crontab(minute=0),
}
# Buybackprogram hangar stock sync, updates reverse buyback stock every 30 minutes
CELERYBEAT_SCHEDULE['buybackprogram_update_all_hangars'] = {
'task': 'buybackprogram.tasks.update_all_hangars',
'schedule': crontab(minute='*/30'),
}
You may change the following settings by adding the lines in your local.py setting files
| Name | Description | Default | Options |
|---|---|---|---|
| BUYBACKPROGRAM_ENABLE_REVERSE_BUYBACK | Enable or disable the reverse buyback feature entirely. When disabled the menu item will not appear. | True | True, False |
| BUYBACKPROGRAM_DISALLOW_CONTRACTS_WITH_ANY_DISALLOWED_ITEMS | Prevents price calculations if there are any disallowed items in the parsed list | False | True, False |
| BUYBACKPROGRAM_SHOW_LOCATION_COUNT | How many locations we will show on buyback index page before we change it to a pop-up show all locations button | 4 | Integer |
| BUYBACKPROGRAM_TRACKING_PREFILL | Default prefill tag used at the start of tracking numbers for your contracts. Individual buyback and reverse buyback programs can override this from their program settings (Tracking prefill tag), e.g. to separate ore and manufacturing buybacks in reports. | aa-bbp. | Free text input |
| BUYBACKPROGRAM_PRICE_SOURCE_ID | Station ID for fetching base prices. Supports IDs listed on Fuzzwork API. Does not work with Janice API! | 60003760 | See ID list |
| BUYBACKPROGRAM_PRICE_SOURCE_NAME | Display name of your price source. Has no effect on the actual price fetch which uses the ID. | Jita | Free text input |
| BUYBACKPROGRAM_PRICE_AGE_WARNING_LIMIT | Limit in hours when an item price is considered as outdated | 48 | |
| BUYBACKPROGRAM_PRICE_METHOD | By default Fuzzwork API will be used for pricing, if this is set to "Janice" then the Janice API will be used. | Fuzzwork | Fuzzwork, Janice |
| BUYBACKPROGRAM_PRICE_INSTANT_PRICES | On default we use top 5% average prices. Set to true to change to instant prices | False | False, True |
| BUYBACKPROGRAM_PRICE_JANICE_API_KEY | The API key to access Janice API. | null | G9KwKq3465588VPd6747t95Zh94q3W2E |
| BUYBACKPROGRAM_UNUSED_TRACKING_PURGE_LIMIT | Time limit to remove unlinked tracking objects (both normal and reverse buyback requests) from the database. Purging an unlinked reverse buyback request also releases the hangar stock it had reserved. Set to 0 to never purge any tracking objects. | 48 | Any number in hours |
| BUYBACKPROGRAM_TRACK_PREFILL_CONTRACTS | Determines if we will track and store contracts that starts with the prefill phrase but do not have any actual tracking hits in database | True | True, False |
| BUYBACKPROGRAM_RESTRICT_TRACKING_DETAILS | When True, only the contract issuer and managers can view tracking detail pages via direct URL. Set to False to allow any authenticated basic_access user to view any tracking detail. | False | True, False |
Note: If you change your price source for an old install you need to wait for the price update task to run or manually run it to update your current database prices.
Note: Using Janice API, Jita 4-4 prices will be used with the top 5% average price of the 5 day median price for buy and sell orders. No other price sources can be used with Janice
Overview of all permissions in this program. Note that all permissions are in the "general" section.
| Name | Purpose | Example Target Audience |
|---|---|---|
| basic_access | Can access this app and see own statics. Can use buyback programs that are allowed by the buyback restriction rules. | Member State |
| manage_programs | Can create new locations and buyback programs and manage their own buyback programs. Can see own buyback programs statics. | Buyback managers |
| see_leaderboard | Can see the leaderboard stats for the programs that are visible for the user | Member State |
| see_performance | Can see the performance stats for the programs that are visible to the user | Member / Managers |
| see_all_statics | Can see all statistics in all buyback programs | Leadership |
| manage_all_programs | Can manage any program | Leadership |
After you have preloaded all the needed data you can start to setup programs.
Each user with manage_programs permission is able to setup their own buyback programs.
Each buyback program is operated by a manager. To add a new manager click on the setup manager button.
Each buyback program operates at a location that is constructed of SolarSystem and a Custom name and an optional Structure ID. To add a new location click on the add location button on the buyback page.
Find a solar system by typing in the solar system box. Then determine a name for the structure. Most often you want to use the actual in-game name of the structure so that people are able to identify the location.
The solar system name will indicate your sellers where the program contract structure is located. The name will describe the structure name in where the contracts should be created and most often should be identical to the actual structure name in-game.
Structure ID is optional and will enable contract location tracking in the program statistics page. If a program location has been given a structure ID the statistics page will display a warning if the user has made the actual contract from some other structure than the one that was determined in the buyback program.
The easiest way to find the actual structure id is to link the structure name into any chat box and post the structure name into the chat. This can be done in any channel or the structure name can be also copied from any MOTDs.
After you have posted the structure name in the chat right click it and press copy. You can now paste the structure into notepad or any other text editor and your output should look like this:
[17:37:54] Ikarus Cesaille > <url=showinfo:35826//1037962518481>Oisio - LinkNet Central Station</url> `
The unique structure ID for your structure is then 1037962518481. Adding the ID to the location ID field will check if the contract creation location matches this ID.
Once you have created a location and added at least one manager you can setup the actual program. Click on the create program button to create a new program.
Each program can be customized based on your needs. When setting up select the settings you wish to use.
A display name for your program
This is the character or the characters corporation which will be used as the assign to target for buyback contracts at this location. To add more owners use the add manager button. You can only see your own characters.
If you wish that the contracts are assigned to the owners corporation instead of the character tick this box.
The location where contracts should be created at. Only these locations are accepted
Expiration time the contracts should bet set to.
You can select what price type is used as the base price for your calculations. You can select from either buy, sell or split prices.
This is a general tax which is applied on all items in this program. If you wish to not allow all items in this program you can leave this to 0.
General tax is applied on all items sold via the buyback. You can add additional taxes on individual items or ban them from being accepted to the program once you have created the program.
You can add a fuel cost expense that is applied on each item sold via this program based on the volume of the item.
:information_source: This setting is aimed more to null sec buyback programs to make it easier to calculate your taxes and display your members the expenses you have when selling.
You can use a price density modifier which will add a additional tax on items with low price per volume ratio such as T1 ships.
:information_source: This setting is aimer more at high sec buyback programs.
Using this setting will calculate all items that can be compressed (mainly ore and ice) based on the compressed variant volume and use this volume instead of the raw volume to calculate the hauling and price dencity costs. This setting is mainly aimed at null sec where you might get raw ore sold to you but want to compress it before shipping as raw ore volume is very high and will cause high hauling costs.
This is the lowest isk/m^3 ratio for items that are accepted to the program without the price density tax. Finding your own limits depends on your logistical department.
For example: Tritanium is 500 ISK/m³ @ 5 ISK per unit price. PLEX is 14,5Trillion ISK/m³ @2.9M per unit price.
This is the tax which will be applied to items with a price density below the price density threshold
:warning: You should avoid using both the hauling fuel cost and the price density modifier at the same time as their function is fairly similar.
If you wish to allow any types of items to be sold via this program keep this box ticker.
You can determine individual increased taxes or ban items from being accepted to this program after creating the program.
If you do not want to accept all items you can set this box to False. By doing this you will need to set up a tax for each item you wish to accept into the program individually.
Ore type items such as asteroid, moon goo and ice have additional pricing methods you can use. You can use a mix of any of the three pricing models.
:information_source: When using more than one pricing model the best price will be used as the buy value.
If you wish to calculate ore buyback value based on the mineral values tick this box.
If you want to use compressed value as a pricing method tick this box.
If you want to use raw ore value as a pricing method you can tick this box. Note that some ores such as Kernite and Moon Goo do not represent the real mineral value of the ores.
You can also individually ban raw ore types from the program. If you have an other option than the raw ore value selected the price will be calculated based on the other pricing models.
Most often you want to buy only items that are packed. This will ensure that people do not sell items such as broken ammo crystals for you.
The refining rate is used in combination with the use refined value option.
If you cant to use NPC buy order prices for blue loot (Sleeper loot) instead of Jita prices check this box. NPC price for these items will always be used even when Jita price would be higher.
If you cant to use NPC buy order prices for red loot (Triglavian loot) instead of Jita prices check this box. NPC price for these items will always be used even when Jita price would be higher.
You can restrict the visibility of the buyback programs to groups and states with the restriction options.
If no options are selected the program will be visible for everyone with the basic_access role.
:no_entry: Do not mix group and state restrictions as this may lead into logic error. If you need to mix then create a separate programs for them.
If you want to receive messages over discord for every new contract you can tick this box.
:information_source: Requires the aa-discordbot plugin or discordproxy app to work
This option will determine if a list of all contract items is added into the discord message description field. If you are accepting all items the list may become very long. If set to false will show a link to the tracking page instead.
You can send notifications about new contracts directly into the discord channel which is linked to AUTH,
:information_source: Requires the aa-discordbot plugin or discordproxy app to work
This wallet information will be displayed on the tracking page allowing you to see your selected wallet balance when checking on outstanding contracts.
You can value T1 (meta 1-4 items) with refined output instead of the actual item price.
Similar to ore reprocessing yield you determine the T1 (meta 1-4) item refining yield. This only applies if the Use reprocessed value for T1/Named (Meta 1-4) option is selected.
If you want to allow unauthenticated users (people without an Alliance Auth account) to view and use this buyback program, tick the Public program box.
Public programs will be visible on the buyback index page without login and can be used to calculate prices without authentication. A tracking number is still generated for public submissions so that contracts can be linked to the calculation — the issuer will simply show as an anonymous user in the statistics page.
:warning: Public programs bypass all group and state restrictions. Any person with access to your Alliance Auth URL will be able to see and use the program. Do not use this together with group or state restrictions.
:information_source: Enabling public programs requires a one-time server configuration by your Alliance Auth administrator. Add the following to your
local.py:APPS_WITH_PUBLIC_VIEWS = ["buybackprogram"]Without this setting, the public view will not be accessible even if the program is marked as public.
You can modify individual item settings or allow items for a program that has set allow all items = False via the special taxes menu for each program.
Set a item specific tax for each item. The tax wil be applied on top of the default tax for the program. You can also disallow an item from being accepted in the contract completely.
You can also set static prices. Items with static prices are absolute prices and have no taxes or price dencity costs added on them.
:information_source: The item specific tax can also be a negative value allowing you to decrease taxes on certain items.
To adjust individual item taxes inside a program click on the Special taxes button next to your program.
You can either add items one by one with the add item button or add all items that belongs to a market group and every sub-child market group of that group with add market group
You can edit an item on the taxation table simply by adding it again. To delete the item press the delete button next to it or to delete all items in the program click on the delete all items button.
When you add an market group each item inside that market group, the child of the market group and the child of the child group will be added to the item taxes (3 steps down)
The easiest way to check which items are under which market group is to open the market window in-game or third party programs such as https://evemarketer.com/
Example:
Market group Minerals is the bottom market group that includes the standard minerals. Adding this market group to the taxation will add 8 items to the taxes (Tritanium, Pyerite etc.)
Market group Standard ores is a parent category and there are no direct items under this category. However this category has child categories such as Veldspar, Jaspet, Scordite which each includes multiple variations of the ores. Adding the Standard ores category will add each ore type to the special tax section.
To protect your buyback program from market manipulation or extremely low-velocity items (such as Officer Modules or rare Abyssal items), you can utilize the Manual Review Watchlist.
The Watchlist allows you to flag specific items or entire EVE Market Groups. When a user pastes an inventory containing a watchlisted item into the buyback calculator, the system will automatically:
fa-search warning icon next to the item on the user's appraisal result.To manage your watchlist, click the Special Taxes button next to your program, and scroll down to the Manual Review Watchlist section. Click Add to Watchlist to create a new rule.
You have two options when adding a rule:
:information_source: Note: You can only specify either an Item Type or an EVE Group for a single rule. You cannot fill out both fields at the same time.
To remove an item or group from the watchlist, simply click the Delete button next to the rule on the Special Taxes dashboard. The change takes effect immediately for all future calculations.
Name | Includes | Items -- | -- Standard Ores | Normal ores from belts and anomalies | Veldspar, Hedbergite, Compressed Arkonor ... Moon Ores | Ores from moon mining | Cobaltite, Loparite, Pollucite Ice Ores | Ores from ice mining | Blue Ice, Dark Glitter, Compressed Blue Ice .... Minerals | Contains materials for refining Standard Ore | Tritanium, Pyerite .... Salvage Materials | Salvage from loot | Armor Plates, Trigger Unit, Ancient Radar Decorrelator ...
Reverse buyback programs allow you to sell items from your corporation hangar directly to players. Players submit a buy request, receive a tracking number, and you create a contract to them with the requested items.
Click Reverse Buyback in the navigation menu, then click 1. Create Reverse Program.
A display name for the reverse program.
The character or corporation used as the contract issuer.
If ticked, contracts will be issued from the manager's corporation.
The structure where stock is held and contracts will be created. The structure ID must be set on the location for hangar sync to work.
Choose where the program's stock comes from:
Containers are discovered during the hangar sync, so on a new manager the container list is empty until the first sync has run. Click Refresh Stock and reload the page if the list is empty. If a selected container is repackaged or moved away from the program locations it disappears from the program's stock and a warning is written to the log.
The corporation hangar division to sell from. Only used when the stock source is a whole hangar division.
The containers to sell from. Only used when the stock source is selected containers.
The base price type used to value items. Default: Sell.
A markup percentage added on top of the base price.
Expiration time for contracts created by the owner.
If enabled, the program is visible and usable without login. Requires APPS_WITH_PUBLIC_VIEWS = ["buybackprogram"] in local.py.
Once your program is created, click Refresh Stock in the management menu to pull current hangar contents from ESI. Stock will also update automatically every 30 minutes if the celery beat task is configured.
:information_source: Only items located at a structure with a configured Structure ID will be synced. Make sure your location has a structure ID set.
Players navigate to Reverse Buyback, click Buy on a program, paste a list of items they want, and submit. The calculator checks availability against current stock and generates a price and tracking number. The player then waits for the owner to create a contract to them using the tracking number as the contract title.
Symptom: the log shows Starting all contract updates and Updating contracts for <owner> for each owner, but no Fetching all contracts for ... line follows and no contracts are linked.
Cause: each owner's contract update runs as a run-once task. If a worker is restarted while the task is running (for example right after applying migrations), the lock is never released and every following run is silently skipped until the lock expires. The lock is stored in the Django cache and expires after BUYBACKPROGRAM_TASKS_TIME_LIMIT seconds (2 hours by default).
To clear the locks immediately:
redis-cli -n 1 --scan --pattern "*qo_buybackprogram*" | xargs -r redis-cli -n 1 del
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
allianceauth-app-utilsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | allianceauth-app-utils>=1.18.0 | runtime |
allianceauthEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | allianceauth<6.0.0,>=4.6.0 | runtime |
django-eveuniverseEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | django-eveuniverse>=2.0.0 | runtime |
bdist_wheel · 366.61 KB · Python py3
sdist · 309.18 KB · Python source
Shared repository data · GitLab
| Contributor | Contributions |
|---|---|
| Pauli Parkkinen | 242 |
| root | 118 |
| Ikarus Cesaille | 57 |
| ErikKalkoken | 23 |
| Arc Tiru | 22 |
| arctiru | 9 |
| Curt Petricca | 2 |
| Dusty Meg | 1 |
| Marn Vermuldir | 1 |
| Peter Pfeufer | 1 |
Default-branch author identities; GitLab commit counts exclude merge commits.
Public sponsor counts have not been collected. These signals belong to the repository owner.
gitlab · 5 observations shown. Missing days are unknown.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-24 | 10 | 2026-10-24T16:57:17.7617684Z |
| 2026-10-23 | 10 | 2026-10-23T16:56:14.3223539Z |
| 2026-10-22 | 10 | 2026-10-22T16:55:45.3544282Z |
| 2026-10-21 | 10 | 2026-10-21T16:55:24.6405086Z |
| 2026-10-20 | 10 | 2026-10-20T16:55:04.8585851Z |
Observed since 20 Oct, 16:49 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:3dc184b86e95ab08c4b151e9d61517c8a50d33b3ad2a83a940c8bdbe0880e38f