From da492180b4a6186201839896521650e263e70931 Mon Sep 17 00:00:00 2001 From: zman Date: Thu, 27 Feb 2025 12:37:02 -0500 Subject: [PATCH] api pricing --- app/db/models.py | 32 +++++ app/dependencies.py | 5 +- app/main.py | 4 +- app/services/pricing.py | 70 +++++++---- app/services/task.py | 8 +- app/services/tcgplayer_api.py | 211 ++++++++++++++++++++++++++++++++- app/services/util/_requests.py | 17 +++ requests.md | 16 +-- 8 files changed, 326 insertions(+), 37 deletions(-) diff --git a/app/db/models.py b/app/db/models.py index 8530163..0af65f1 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -363,6 +363,38 @@ class OrderProducts(Base): quantity = Column(Integer) unit_price = Column(Float) +class APIPricing(Base): + __tablename__ = 'api_pricing' + + id = Column(String, primary_key=True) + product_id = Column(String, ForeignKey('products.id')) + pricing_data = Column(String) + date_created = Column(DateTime, default=datetime.now) + date_modified = Column(DateTime, default=datetime.now, onupdate=datetime.now) + +class TCGPlayerInventory(Base): + __tablename__ = 'tcgplayer_inventory' + + id = Column(String, primary_key=True) + tcgplayer_id = Column(Integer) + product_line = Column(String) + set_name = Column(String) + product_name = Column(String) + title = Column(String) + number = Column(String) + rarity = Column(String) + condition = Column(String) + tcg_market_price = Column(Float) + tcg_direct_low = Column(Float) + tcg_low_price_with_shipping = Column(Float) + tcg_low_price = Column(Float) + total_quantity = Column(Integer) + add_to_quantity = Column(Integer) + tcg_marketplace_price = Column(Float) + photo_url = Column(String) + date_created = Column(DateTime, default=datetime.now) + date_modified = Column(DateTime, default=datetime.now, onupdate=datetime.now) + # enums class RarityEnum(str, Enum): diff --git a/app/dependencies.py b/app/dependencies.py index 3fbce88..0ffc6e5 100644 --- a/app/dependencies.py +++ b/app/dependencies.py @@ -66,10 +66,11 @@ def get_box_service( def get_task_service( db: DB, product_service: Annotated[ProductService, Depends(get_product_service)], - pricing_service: Annotated[PricingService, Depends(get_pricing_service)] + pricing_service: Annotated[PricingService, Depends(get_pricing_service)], + tcgplayer_api_service: Annotated[TCGPlayerAPIService, Depends(get_tcgplayer_api_service)] ) -> TaskService: """TaskService depends on ProductService and TCGPlayerService""" - return TaskService(db, product_service, pricing_service) + return TaskService(db, product_service, pricing_service, tcgplayer_api_service) # Form data dependencies def get_create_file_metadata( diff --git a/app/main.py b/app/main.py index 8fe27bd..63dbae6 100644 --- a/app/main.py +++ b/app/main.py @@ -15,6 +15,7 @@ from app.dependencies import ( get_product_service, get_storage_service, get_inventory_service, + get_tcgplayer_api_service ) logging.basicConfig( @@ -69,7 +70,8 @@ async def startup_event(): tcgplayer_service = get_tcgplayer_service(db, file_service) pricing_service = get_pricing_service(db, file_service, tcgplayer_service) product_service = get_product_service(db, file_service, tcgplayer_service, storage_service) - task_service = get_task_service(db, product_service, pricing_service) + tcgplayer_api_service = get_tcgplayer_api_service(db) + task_service = get_task_service(db, product_service, pricing_service, tcgplayer_api_service) # Start task service await task_service.start() diff --git a/app/services/pricing.py b/app/services/pricing.py index 3dc51b3..ffdc894 100644 --- a/app/services/pricing.py +++ b/app/services/pricing.py @@ -1,11 +1,12 @@ from sqlalchemy.orm import Session -from app.db.models import File, CardTCGPlayer, Price +from app.db.models import File, CardTCGPlayer, Price, TCGPlayerInventory from app.services.util._dataframe import TCGPlayerPricingRow, DataframeUtil from app.services.file import FileService from app.services.tcgplayer import TCGPlayerService from uuid import uuid4 from app.db.utils import db_transaction from typing import List, Dict +from decimal import Decimal, ROUND_HALF_UP import pandas as pd import logging @@ -115,34 +116,44 @@ class PricingService: def default_pricing_algo(self, row: pd.Series) -> pd.Series: """Default pricing algorithm with complex pricing rules""" - tcg_low = row.get('tcg_low_price') - tcg_low_shipping = row.get('tcg_low_price_with_shipping') - tcg_market_price = row.get('tcg_market_price') - if pd.isna(tcg_low) or pd.isna(tcg_low_shipping): + # Convert input values to Decimal for precise arithmetic + tcg_low = Decimal(str(row.get('tcg_low_price'))) if not pd.isna(row.get('tcg_low_price')) else None + tcg_low_shipping = Decimal(str(row.get('tcg_low_price_with_shipping'))) if not pd.isna(row.get('tcg_low_price_with_shipping')) else None + tcg_market_price = Decimal(str(row.get('tcg_market_price'))) if not pd.isna(row.get('tcg_market_price')) else None + + if tcg_low is None or tcg_low_shipping is None: logger.warning(f"Missing pricing data for row: {row}") row['new_price'] = None return row - # Apply pricing rules - if tcg_market_price < 1 and tcg_market_price > 0.25: - new_price = tcg_market_price * 1.05 - elif tcg_market_price < 0.25: - new_price = 0.25 - elif tcg_low < 5 or tcg_low_shipping < 5: - new_price = round(tcg_low+((abs(tcg_market_price-tcg_low))*.75), 2) - elif tcg_low_shipping > 20: - new_price = round(tcg_low_shipping * 1.0125, 2) - else: - # new_price = round(tcg_low_shipping * 1.08, 2) - new_price = round(tcg_market_price * 1.03) - # if new price is less than half of market price, set to 90% market - if new_price < (tcg_market_price / 2): - new_price = round(tcg_market_price * 0.85, 2) - if new_price < 0.25: - new_price = 0.25 + # Define precision for rounding + TWO_PLACES = Decimal('0.01') - row['new_price'] = new_price + # Apply pricing rules + if tcg_market_price < Decimal('1') and tcg_market_price > Decimal('0.25'): + new_price = tcg_market_price * Decimal('1.05') + elif tcg_market_price < Decimal('0.25'): + new_price = Decimal('0.25') + elif tcg_low < Decimal('5') or tcg_low_shipping < Decimal('5'): + new_price = tcg_low + ((abs(tcg_market_price - tcg_low)) * Decimal('0.75')) + elif tcg_low_shipping > Decimal('20'): + new_price = tcg_low_shipping * Decimal('1.0125') + else: + new_price = tcg_market_price * Decimal('1.03') + + # if new price is less than half of market price, set to 90% market + if new_price < (tcg_market_price / Decimal('2')): + new_price = tcg_market_price * Decimal('0.85') + + if new_price < Decimal('0.25'): + new_price = Decimal('0.25') + + # Ensure exactly 2 decimal places + new_price = new_price.quantize(TWO_PLACES, rounding=ROUND_HALF_UP) + + # Convert back to float or string as needed for your dataframe + row['new_price'] = float(new_price) return row def apply_pricing_algo(self, row: pd.Series, pricing_algo: callable = None) -> pd.Series: @@ -218,6 +229,19 @@ class PricingService: # Now do your column selection df = df[desired_columns] + if update_type == 'update': + with db_transaction(self.db): + self.db.query(TCGPlayerInventory).delete() + self.db.flush() + # copy df to modify before inserting + df_copy = df.copy() + df_copy['id'] = df_copy.apply(lambda x: str(uuid4()), axis=1) + # rename columns lowercase no space + df_copy.columns = df_copy.columns.str.lower().str.replace(' ', '_') + for index, row in df_copy.iterrows(): + tcgplayer_inventory = TCGPlayerInventory(**row.to_dict()) + self.db.add(tcgplayer_inventory) + # remove any rows with no price #df = df[df['TCG Marketplace Price'] != 0] #df = df[df['TCG Marketplace Price'].notna()] diff --git a/app/services/task.py b/app/services/task.py index e2230e5..a517254 100644 --- a/app/services/task.py +++ b/app/services/task.py @@ -5,16 +5,18 @@ from sqlalchemy.orm import Session from app.services.product import ProductService from app.db.models import File from app.services.pricing import PricingService +from app.services.tcgplayer_api import TCGPlayerAPIService class TaskService: - def __init__(self, db: Session, product_service: ProductService, pricing_service: PricingService): + def __init__(self, db: Session, product_service: ProductService, pricing_service: PricingService, tcgplayer_api_service: TCGPlayerAPIService): self.scheduler = BackgroundScheduler() self.logger = logging.getLogger(__name__) self.tasks: Dict[str, Callable] = {} self.db = db self.product_service = product_service self.pricing_service = pricing_service + self.tcgplayer_api_service = tcgplayer_api_service async def start(self): self.scheduler.start() @@ -24,12 +26,16 @@ class TaskService: def register_scheduled_tasks(self): self.scheduler.add_job(self.hourly_pricing, 'cron', minute='45') + self.scheduler.add_job(self.inventory_pricing, 'cron', minute='40') self.logger.info("Scheduled tasks registered.") def hourly_pricing(self): self.logger.info("Running hourly pricing task") self.pricing_service.cron_load_prices() self.logger.info("Finished hourly pricing task") + + def inventory_pricing(self): + self.tcgplayer_api_service.cron_tcgplayer_api_pricing() async def process_manabox_file(self, file: File): self.logger.info("Processing ManaBox file") diff --git a/app/services/tcgplayer_api.py b/app/services/tcgplayer_api.py index 7c6f678..9e7b2fc 100644 --- a/app/services/tcgplayer_api.py +++ b/app/services/tcgplayer_api.py @@ -1,10 +1,11 @@ from dataclasses import dataclass import logging -from app.db.models import Orders, OrderProducts, CardTCGPlayer +from app.db.models import Orders, OrderProducts, CardTCGPlayer, CardManabox, APIPricing, TCGPlayerInventory from app.services.util._requests import RequestsUtil from app.services.util._docker import DockerUtil from app.db.utils import db_transaction from sqlalchemy.orm import Session +from datetime import datetime from uuid import uuid4 as uuid logger = logging.getLogger(__name__) @@ -23,6 +24,7 @@ class TCGPlayerAPIService: self.is_in_docker = self.docker_util.is_in_docker() self.config = TCGPlayerAPIConfig() self.cookies = self.get_cookies() + self.session = None def get_cookies(self) -> dict: if self.is_in_docker: @@ -105,4 +107,209 @@ class TCGPlayerAPIService: if order: self.save_order(order) processed_orders.append(order_id) - return processed_orders \ No newline at end of file + return processed_orders + + def get_scryfall_data(self, scryfall_id: str): + url = f"https://api.scryfall.com/cards/{scryfall_id}?format=json" + response = self.requests_util.bare_request(url, method='GET') + return response + + def get_tcgplayer_pricing_data(self, tcgplayer_id: str): + if not self.session: + self.session = self.requests_util.get_session() + response = self.session.get("https://tcgplayer.com") + headers = { + 'accept': 'application/json, text/plain, */*', + 'accept-language': 'en-US,en;q=0.8', + 'priority': 'u=1, i', + 'sec-ch-ua': '"Not(A:Brand";v="99", "Brave";v="133", "Chromium";v="133"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"macOS"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-site', + 'sec-gpc': '1', + 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0 Safari/537.36' + } + url = f"https://mp-search-api.tcgplayer.com/v2/product/{tcgplayer_id}/details?mpfev=3279" + self.requests_util.rate_limit() + response = self.session.get(url, headers=headers) + self.requests_util.previous_request_time = datetime.now() + return response + + # pricing + def get_tcgplayer_pricing_data_for_product(self, product_id: str): + # get tcgplayer pricing data for a single card by product id + # product_id to manabox card + manabox_card = self.db.query(CardManabox).filter(CardManabox.product_id == product_id).first() + tcgplayer_card = self.db.query(CardTCGPlayer).filter(CardTCGPlayer.product_id == product_id).first() + if not manabox_card or not tcgplayer_card: + logger.warning(f"Card with product id {product_id} missing in either Manabox or TCGPlayer") + return None + # get scryfall id, tcgplayer id, and tcgplayer sku + scryfall_id = manabox_card.scryfall_id + tcgplayer_sku = tcgplayer_card.tcgplayer_id + tcgplayer_id = self.get_scryfall_data(scryfall_id).json().get('tcgplayer_id') + tcgplayer_pricing = self.get_tcgplayer_pricing_data(tcgplayer_id) + if not tcgplayer_pricing: + logger.warning(f"TCGPlayer pricing data not found for product id {product_id}") + return None + else: + logger.info(f"TCGPlayer pricing data found for product id {product_id}") + return tcgplayer_pricing.json() + + def save_tcgplayer_pricing_data(self, product_id: str, pricing_data: dict): + with db_transaction(self.db): + pricing_record = APIPricing( + id=str(uuid()), + product_id=product_id, + pricing_data=str(pricing_data) + ) + self.db.add(pricing_record) + + def cron_tcgplayer_api_pricing(self): + # Join both tables but retrieve both objects + results = self.db.query(TCGPlayerInventory, CardTCGPlayer).join( + CardTCGPlayer, + TCGPlayerInventory.tcgplayer_id == CardTCGPlayer.tcgplayer_id + ).all() + + for inventory, card in results: + # Now use card.product_id (from CardTCGPlayer) + pricing_data = self.get_tcgplayer_pricing_data_for_product(card.product_id) + if pricing_data: + self.save_tcgplayer_pricing_data(card.product_id, pricing_data) + + + + # this one contains nearly everything, use it first + # what does score mean? - totally ignore score, it seems related to price and changes based on what is on the page. probably some psy op shit to get you to buy expensive stuff, not useful for us + # can i get volatility from here? + # no historical data here + """ + curl 'https://mp-search-api.tcgplayer.com/v2/product/615745/details?mpfev=3279' \ + -H 'accept: application/json, text/plain, */*' \ + -H 'accept-language: en-US,en;q=0.8' \ + -b 'tcgpartner=PK=TRADECARDS&M=1; valid=set=true; product-display-settings=sort=price+shipping&size=10; OAuthLoginSessionId=63b1a89d-1ac2-43f7-8e79-55a9ca5e761d; __RequestVerificationToken_L2FkbWlu0=Lw1sfWh823UeJ7zRux0b1ZTI4Vg4i_dFt97a55aQpf-qBURVuwWDCJyuCxSwgLNLe9nPlfDSc1AMV5nyqhY4Q4jurxs1; spDisabledUIFeatures=orders; SellerProximity=ZipCode=&MaxSellerDistance=1000&IsActive=false; tcg-uuid=613192dc-ecf6-481a-bec1-afdee8686db7; LastSeller=e576ed4c; __RequestVerificationToken=VFv72VLK6McJVzthg8O-41p7BNkdoW2jQAlDAu-ylO39qfzCddRi2-7bWiH4qloc8Vo_ZftOAAa5OhXL3OByFHIdlwY1; TCGAuthTicket_Production=270B0566400C905C51DEAD644E3CDBD634ECBCCC796B1F77717F461EE104FCE101CFAD2A8458319330A0931018A99214D4EA5601E7551E25E2069ACA550BB71775C0A04F30724E2C4E262CB167EAC2C2EB05D15F9EA08363FC6455B94654F1F110CF079E24201C3B8CEF26762423D8CAA71DDF7B; ASP.NET_SessionId=5ycv15jf0mon3l5adodmkog5; StoreSaveForLater_PRODUCTION=SFLK=a167bf88521f4d0fbeb7497a7ed74629&Ignore=false; TCG_VisitorKey=81fe992f-9a12-4926-a417-7815c4f94edd; setting=CD=US&M=1; SearchSortSettings=M=1&ProductSortOption=MinPrice&ProductSortDesc=True&PriceSortOption=Shipping&ProductResultDisplay=grid; tcg_analytics_previousPageData=%7B%22title%22%3A%22Seller%20Feedback%22%2C%22href%22%3A%22https%3A%2F%2Fshop.tcgplayer.com%2Fsellerfeedback%2Fbe27fef9%22%7D; fileDownloadToken=1740499419709; StoreCart_PRODUCTION=CK=b4f8aff616974a12a6b2811129b81ee2&Ignore=false; tracking-preferences={%22version%22:1%2C%22destinations%22:{%22Actions%20Amplitude%22:false%2C%22AdWords%22:false%2C%22Google%20AdWords%20New%22:false%2C%22Google%20Enhanced%20Conversions%22:false%2C%22Google%20Tag%20Manager%22:false%2C%22Impact%20Partnership%20Cloud%22:false%2C%22Optimizely%22:false}%2C%22custom%22:{%22advertising%22:false%2C%22functional%22:false%2C%22marketingAndAnalytics%22:false}}; tcg-segment-session=1740595460137%257C1740595481177' \ + -H 'origin: https://www.tcgplayer.com' \ + -H 'priority: u=1, i' \ + -H 'referer: https://www.tcgplayer.com/' \ + -H 'sec-ch-ua: "Not(A:Brand";v="99", "Brave";v="133", "Chromium";v="133"' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'sec-ch-ua-platform: "macOS"' \ + -H 'sec-fetch-dest: empty' \ + -H 'sec-fetch-mode: cors' \ + -H 'sec-fetch-site: same-site' \ + -H 'sec-gpc: 1' \ + -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36' + """ + + # get volatility also + """ + curl 'https://mpgateway.tcgplayer.com/v1/pricepoints/marketprice/skus/8395586/volatility?mpfev=3279' \ + -H 'accept: application/json, text/plain, */*' \ + -H 'accept-language: en-US,en;q=0.8' \ + -b 'tcgpartner=PK=TRADECARDS&M=1; valid=set=true; product-display-settings=sort=price+shipping&size=10; OAuthLoginSessionId=63b1a89d-1ac2-43f7-8e79-55a9ca5e761d; __RequestVerificationToken_L2FkbWlu0=Lw1sfWh823UeJ7zRux0b1ZTI4Vg4i_dFt97a55aQpf-qBURVuwWDCJyuCxSwgLNLe9nPlfDSc1AMV5nyqhY4Q4jurxs1; spDisabledUIFeatures=orders; SellerProximity=ZipCode=&MaxSellerDistance=1000&IsActive=false; tcg-uuid=613192dc-ecf6-481a-bec1-afdee8686db7; LastSeller=e576ed4c; __RequestVerificationToken=VFv72VLK6McJVzthg8O-41p7BNkdoW2jQAlDAu-ylO39qfzCddRi2-7bWiH4qloc8Vo_ZftOAAa5OhXL3OByFHIdlwY1; TCGAuthTicket_Production=270B0566400C905C51DEAD644E3CDBD634ECBCCC796B1F77717F461EE104FCE101CFAD2A8458319330A0931018A99214D4EA5601E7551E25E2069ACA550BB71775C0A04F30724E2C4E262CB167EAC2C2EB05D15F9EA08363FC6455B94654F1F110CF079E24201C3B8CEF26762423D8CAA71DDF7B; ASP.NET_SessionId=5ycv15jf0mon3l5adodmkog5; StoreSaveForLater_PRODUCTION=SFLK=a167bf88521f4d0fbeb7497a7ed74629&Ignore=false; TCG_VisitorKey=81fe992f-9a12-4926-a417-7815c4f94edd; setting=CD=US&M=1; tcg_analytics_previousPageData=%7B%22title%22%3A%22Seller%20Feedback%22%2C%22href%22%3A%22https%3A%2F%2Fshop.tcgplayer.com%2Fsellerfeedback%2Fbe27fef9%22%7D; fileDownloadToken=1740499419709; StoreCart_PRODUCTION=CK=b4f8aff616974a12a6b2811129b81ee2&Ignore=false; tracking-preferences={%22version%22:1%2C%22destinations%22:{%22Actions%20Amplitude%22:false%2C%22AdWords%22:false%2C%22Google%20AdWords%20New%22:false%2C%22Google%20Enhanced%20Conversions%22:false%2C%22Google%20Tag%20Manager%22:false%2C%22Impact%20Partnership%20Cloud%22:false%2C%22Optimizely%22:false}%2C%22custom%22:{%22advertising%22:false%2C%22functional%22:false%2C%22marketingAndAnalytics%22:false}}; SearchCriteria=M=1&WantVerifiedSellers=False&WantDirect=False&WantSellersInCart=False; SearchSortSettings=M=1&ProductSortOption=Sales&ProductSortDesc=False&PriceSortOption=Shipping&ProductResultDisplay=grid; tcg-segment-session=1740597680921%257C1740598418227' \ + -H 'origin: https://www.tcgplayer.com' \ + -H 'priority: u=1, i' \ + -H 'referer: https://www.tcgplayer.com/' \ + -H 'sec-ch-ua: "Not(A:Brand";v="99", "Brave";v="133", "Chromium";v="133"' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'sec-ch-ua-platform: "macOS"' \ + -H 'sec-fetch-dest: empty' \ + -H 'sec-fetch-mode: cors' \ + -H 'sec-fetch-site: same-site' \ + -H 'sec-gpc: 1' \ + -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36' + """ + + # handle historical data later + + + # detailed range quarter - detailed pricing info for the last quarter. seems simple + """ + + """ + # listings - lots of stuff here + """ +QUANTITY OVERVIEW + + curl 'https://mp-search-api.tcgplayer.com/v1/product/615745/listings?mpfev=3279' \ + -H 'accept: application/json, text/plain, */*' \ + -H 'accept-language: en-US,en;q=0.8' \ + -H 'content-type: application/json' \ + -b 'tcgpartner=PK=TRADECARDS&M=1; valid=set=true; product-display-settings=sort=price+shipping&size=10; OAuthLoginSessionId=63b1a89d-1ac2-43f7-8e79-55a9ca5e761d; __RequestVerificationToken_L2FkbWlu0=Lw1sfWh823UeJ7zRux0b1ZTI4Vg4i_dFt97a55aQpf-qBURVuwWDCJyuCxSwgLNLe9nPlfDSc1AMV5nyqhY4Q4jurxs1; spDisabledUIFeatures=orders; SellerProximity=ZipCode=&MaxSellerDistance=1000&IsActive=false; tcg-uuid=613192dc-ecf6-481a-bec1-afdee8686db7; LastSeller=e576ed4c; __RequestVerificationToken=VFv72VLK6McJVzthg8O-41p7BNkdoW2jQAlDAu-ylO39qfzCddRi2-7bWiH4qloc8Vo_ZftOAAa5OhXL3OByFHIdlwY1; TCGAuthTicket_Production=270B0566400C905C51DEAD644E3CDBD634ECBCCC796B1F77717F461EE104FCE101CFAD2A8458319330A0931018A99214D4EA5601E7551E25E2069ACA550BB71775C0A04F30724E2C4E262CB167EAC2C2EB05D15F9EA08363FC6455B94654F1F110CF079E24201C3B8CEF26762423D8CAA71DDF7B; ASP.NET_SessionId=5ycv15jf0mon3l5adodmkog5; StoreSaveForLater_PRODUCTION=SFLK=a167bf88521f4d0fbeb7497a7ed74629&Ignore=false; TCG_VisitorKey=81fe992f-9a12-4926-a417-7815c4f94edd; setting=CD=US&M=1; SearchSortSettings=M=1&ProductSortOption=MinPrice&ProductSortDesc=True&PriceSortOption=Shipping&ProductResultDisplay=grid; tcg_analytics_previousPageData=%7B%22title%22%3A%22Seller%20Feedback%22%2C%22href%22%3A%22https%3A%2F%2Fshop.tcgplayer.com%2Fsellerfeedback%2Fbe27fef9%22%7D; fileDownloadToken=1740499419709; StoreCart_PRODUCTION=CK=b4f8aff616974a12a6b2811129b81ee2&Ignore=false; tracking-preferences={%22version%22:1%2C%22destinations%22:{%22Actions%20Amplitude%22:false%2C%22AdWords%22:false%2C%22Google%20AdWords%20New%22:false%2C%22Google%20Enhanced%20Conversions%22:false%2C%22Google%20Tag%20Manager%22:false%2C%22Impact%20Partnership%20Cloud%22:false%2C%22Optimizely%22:false}%2C%22custom%22:{%22advertising%22:false%2C%22functional%22:false%2C%22marketingAndAnalytics%22:false}}; tcg-segment-session=1740595460137%257C1740595481430' \ + -H 'origin: https://www.tcgplayer.com' \ + -H 'priority: u=1, i' \ + -H 'referer: https://www.tcgplayer.com/' \ + -H 'sec-ch-ua: "Not(A:Brand";v="99", "Brave";v="133", "Chromium";v="133"' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'sec-ch-ua-platform: "macOS"' \ + -H 'sec-fetch-dest: empty' \ + -H 'sec-fetch-mode: cors' \ + -H 'sec-fetch-site: same-site' \ + -H 'sec-gpc: 1' \ + -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36' \ + --data-raw '{"filters":{"term":{"sellerStatus":"Live","channelId":0,"language":["English"],"direct-seller":true,"directProduct":true,"listingType":"standard"},"range":{"quantity":{"gte":1},"direct-inventory":{"gte":1}},"exclude":{"channelExclusion":0,"listingType":"custom"}},"from":0,"size":1,"context":{"shippingCountry":"US","cart":{}},"sort":{"field":"price+shipping","order":"asc"}}' + + +AGGREGATION AND SOME SPECIFIC DATA IDK THIS MIGHT BE A GOOD ONE + + curl 'https://mp-search-api.tcgplayer.com/v1/product/615745/listings?mpfev=3279' \ + -H 'accept: application/json, text/plain, */*' \ + -H 'accept-language: en-US,en;q=0.8' \ + -H 'content-type: application/json' \ + -b 'tcgpartner=PK=TRADECARDS&M=1; valid=set=true; product-display-settings=sort=price+shipping&size=10; OAuthLoginSessionId=63b1a89d-1ac2-43f7-8e79-55a9ca5e761d; __RequestVerificationToken_L2FkbWlu0=Lw1sfWh823UeJ7zRux0b1ZTI4Vg4i_dFt97a55aQpf-qBURVuwWDCJyuCxSwgLNLe9nPlfDSc1AMV5nyqhY4Q4jurxs1; spDisabledUIFeatures=orders; SellerProximity=ZipCode=&MaxSellerDistance=1000&IsActive=false; tcg-uuid=613192dc-ecf6-481a-bec1-afdee8686db7; LastSeller=e576ed4c; __RequestVerificationToken=VFv72VLK6McJVzthg8O-41p7BNkdoW2jQAlDAu-ylO39qfzCddRi2-7bWiH4qloc8Vo_ZftOAAa5OhXL3OByFHIdlwY1; TCGAuthTicket_Production=270B0566400C905C51DEAD644E3CDBD634ECBCCC796B1F77717F461EE104FCE101CFAD2A8458319330A0931018A99214D4EA5601E7551E25E2069ACA550BB71775C0A04F30724E2C4E262CB167EAC2C2EB05D15F9EA08363FC6455B94654F1F110CF079E24201C3B8CEF26762423D8CAA71DDF7B; ASP.NET_SessionId=5ycv15jf0mon3l5adodmkog5; StoreSaveForLater_PRODUCTION=SFLK=a167bf88521f4d0fbeb7497a7ed74629&Ignore=false; TCG_VisitorKey=81fe992f-9a12-4926-a417-7815c4f94edd; setting=CD=US&M=1; SearchSortSettings=M=1&ProductSortOption=MinPrice&ProductSortDesc=True&PriceSortOption=Shipping&ProductResultDisplay=grid; tcg_analytics_previousPageData=%7B%22title%22%3A%22Seller%20Feedback%22%2C%22href%22%3A%22https%3A%2F%2Fshop.tcgplayer.com%2Fsellerfeedback%2Fbe27fef9%22%7D; fileDownloadToken=1740499419709; StoreCart_PRODUCTION=CK=b4f8aff616974a12a6b2811129b81ee2&Ignore=false; tracking-preferences={%22version%22:1%2C%22destinations%22:{%22Actions%20Amplitude%22:false%2C%22AdWords%22:false%2C%22Google%20AdWords%20New%22:false%2C%22Google%20Enhanced%20Conversions%22:false%2C%22Google%20Tag%20Manager%22:false%2C%22Impact%20Partnership%20Cloud%22:false%2C%22Optimizely%22:false}%2C%22custom%22:{%22advertising%22:false%2C%22functional%22:false%2C%22marketingAndAnalytics%22:false}}; tcg-segment-session=1740595460137%257C1740595481430' \ + -H 'origin: https://www.tcgplayer.com' \ + -H 'priority: u=1, i' \ + -H 'referer: https://www.tcgplayer.com/' \ + -H 'sec-ch-ua: "Not(A:Brand";v="99", "Brave";v="133", "Chromium";v="133"' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'sec-ch-ua-platform: "macOS"' \ + -H 'sec-fetch-dest: empty' \ + -H 'sec-fetch-mode: cors' \ + -H 'sec-fetch-site: same-site' \ + -H 'sec-gpc: 1' \ + -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36' \ + --data-raw '{"filters":{"term":{"sellerStatus":"Live","channelId":0,"language":["English"]},"range":{"quantity":{"gte":1}},"exclude":{"channelExclusion":0}},"from":0,"size":10,"sort":{"field":"price+shipping","order":"asc"},"context":{"shippingCountry":"US","cart":{}},"aggregations":["listingType"]}' + + +AGGREGATION OF RANDOM SHIT IDK + + curl 'https://mp-search-api.tcgplayer.com/v1/product/615745/listings?mpfev=3279' \ + -H 'accept: application/json, text/plain, */*' \ + -H 'accept-language: en-US,en;q=0.8' \ + -H 'content-type: application/json' \ + -b 'tcgpartner=PK=TRADECARDS&M=1; valid=set=true; product-display-settings=sort=price+shipping&size=10; OAuthLoginSessionId=63b1a89d-1ac2-43f7-8e79-55a9ca5e761d; __RequestVerificationToken_L2FkbWlu0=Lw1sfWh823UeJ7zRux0b1ZTI4Vg4i_dFt97a55aQpf-qBURVuwWDCJyuCxSwgLNLe9nPlfDSc1AMV5nyqhY4Q4jurxs1; spDisabledUIFeatures=orders; SellerProximity=ZipCode=&MaxSellerDistance=1000&IsActive=false; tcg-uuid=613192dc-ecf6-481a-bec1-afdee8686db7; LastSeller=e576ed4c; __RequestVerificationToken=VFv72VLK6McJVzthg8O-41p7BNkdoW2jQAlDAu-ylO39qfzCddRi2-7bWiH4qloc8Vo_ZftOAAa5OhXL3OByFHIdlwY1; TCGAuthTicket_Production=270B0566400C905C51DEAD644E3CDBD634ECBCCC796B1F77717F461EE104FCE101CFAD2A8458319330A0931018A99214D4EA5601E7551E25E2069ACA550BB71775C0A04F30724E2C4E262CB167EAC2C2EB05D15F9EA08363FC6455B94654F1F110CF079E24201C3B8CEF26762423D8CAA71DDF7B; ASP.NET_SessionId=5ycv15jf0mon3l5adodmkog5; StoreSaveForLater_PRODUCTION=SFLK=a167bf88521f4d0fbeb7497a7ed74629&Ignore=false; TCG_VisitorKey=81fe992f-9a12-4926-a417-7815c4f94edd; setting=CD=US&M=1; SearchSortSettings=M=1&ProductSortOption=MinPrice&ProductSortDesc=True&PriceSortOption=Shipping&ProductResultDisplay=grid; tcg_analytics_previousPageData=%7B%22title%22%3A%22Seller%20Feedback%22%2C%22href%22%3A%22https%3A%2F%2Fshop.tcgplayer.com%2Fsellerfeedback%2Fbe27fef9%22%7D; fileDownloadToken=1740499419709; StoreCart_PRODUCTION=CK=b4f8aff616974a12a6b2811129b81ee2&Ignore=false; tracking-preferences={%22version%22:1%2C%22destinations%22:{%22Actions%20Amplitude%22:false%2C%22AdWords%22:false%2C%22Google%20AdWords%20New%22:false%2C%22Google%20Enhanced%20Conversions%22:false%2C%22Google%20Tag%20Manager%22:false%2C%22Impact%20Partnership%20Cloud%22:false%2C%22Optimizely%22:false}%2C%22custom%22:{%22advertising%22:false%2C%22functional%22:false%2C%22marketingAndAnalytics%22:false}}; tcg-segment-session=1740595460137%257C1740595481430' \ + -H 'origin: https://www.tcgplayer.com' \ + -H 'priority: u=1, i' \ + -H 'referer: https://www.tcgplayer.com/' \ + -H 'sec-ch-ua: "Not(A:Brand";v="99", "Brave";v="133", "Chromium";v="133"' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'sec-ch-ua-platform: "macOS"' \ + -H 'sec-fetch-dest: empty' \ + -H 'sec-fetch-mode: cors' \ + -H 'sec-fetch-site: same-site' \ + -H 'sec-gpc: 1' \ + -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36' \ + --data-raw '{"filters":{"term":{"condition":["Near Mint","Lightly Played","Moderately Played","Heavily Played","Damaged"],"printing":["Foil"],"language":["English"],"sellerStatus":"Live"},"range":{"quantity":{"gte":1}},"exclude":{"channelExclusion":0}},"context":{"shippingCountry":"US","cart":{}},"aggregations":["seller-key"],"size":0}' + + +VOLATILITY + + curl 'https://mpgateway.tcgplayer.com/v1/pricepoints/marketprice/skus/8547894/volatility?mpfev=3279' \ + -H 'accept: application/json, text/plain, */*' \ + -H 'accept-language: en-US,en;q=0.8' \ + -b 'tcgpartner=PK=TRADECARDS&M=1; valid=set=true; product-display-settings=sort=price+shipping&size=10; OAuthLoginSessionId=63b1a89d-1ac2-43f7-8e79-55a9ca5e761d; __RequestVerificationToken_L2FkbWlu0=Lw1sfWh823UeJ7zRux0b1ZTI4Vg4i_dFt97a55aQpf-qBURVuwWDCJyuCxSwgLNLe9nPlfDSc1AMV5nyqhY4Q4jurxs1; spDisabledUIFeatures=orders; SellerProximity=ZipCode=&MaxSellerDistance=1000&IsActive=false; tcg-uuid=613192dc-ecf6-481a-bec1-afdee8686db7; LastSeller=e576ed4c; __RequestVerificationToken=VFv72VLK6McJVzthg8O-41p7BNkdoW2jQAlDAu-ylO39qfzCddRi2-7bWiH4qloc8Vo_ZftOAAa5OhXL3OByFHIdlwY1; TCGAuthTicket_Production=270B0566400C905C51DEAD644E3CDBD634ECBCCC796B1F77717F461EE104FCE101CFAD2A8458319330A0931018A99214D4EA5601E7551E25E2069ACA550BB71775C0A04F30724E2C4E262CB167EAC2C2EB05D15F9EA08363FC6455B94654F1F110CF079E24201C3B8CEF26762423D8CAA71DDF7B; ASP.NET_SessionId=5ycv15jf0mon3l5adodmkog5; StoreSaveForLater_PRODUCTION=SFLK=a167bf88521f4d0fbeb7497a7ed74629&Ignore=false; TCG_VisitorKey=81fe992f-9a12-4926-a417-7815c4f94edd; setting=CD=US&M=1; SearchSortSettings=M=1&ProductSortOption=MinPrice&ProductSortDesc=True&PriceSortOption=Shipping&ProductResultDisplay=grid; tcg_analytics_previousPageData=%7B%22title%22%3A%22Seller%20Feedback%22%2C%22href%22%3A%22https%3A%2F%2Fshop.tcgplayer.com%2Fsellerfeedback%2Fbe27fef9%22%7D; fileDownloadToken=1740499419709; StoreCart_PRODUCTION=CK=b4f8aff616974a12a6b2811129b81ee2&Ignore=false; tracking-preferences={%22version%22:1%2C%22destinations%22:{%22Actions%20Amplitude%22:false%2C%22AdWords%22:false%2C%22Google%20AdWords%20New%22:false%2C%22Google%20Enhanced%20Conversions%22:false%2C%22Google%20Tag%20Manager%22:false%2C%22Impact%20Partnership%20Cloud%22:false%2C%22Optimizely%22:false}%2C%22custom%22:{%22advertising%22:false%2C%22functional%22:false%2C%22marketingAndAnalytics%22:false}}; tcg-segment-session=1740595460137%257C1740595481430' \ + -H 'origin: https://www.tcgplayer.com' \ + -H 'priority: u=1, i' \ + -H 'referer: https://www.tcgplayer.com/' \ + -H 'sec-ch-ua: "Not(A:Brand";v="99", "Brave";v="133", "Chromium";v="133"' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'sec-ch-ua-platform: "macOS"' \ + -H 'sec-fetch-dest: empty' \ + -H 'sec-fetch-mode: cors' \ + -H 'sec-fetch-site: same-site' \ + -H 'sec-gpc: 1' \ + -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36' + """ \ No newline at end of file diff --git a/app/services/util/_requests.py b/app/services/util/_requests.py index db6245d..5e12531 100644 --- a/app/services/util/_requests.py +++ b/app/services/util/_requests.py @@ -71,6 +71,23 @@ class RequestsUtil: self.browser_type = browser_type self.docker_util = DockerUtil() self.previous_request_time = datetime.now() + + def get_session(self, cookies: Dict = None) -> requests.Session: + """Create a session with the specified cookies""" + session = requests.Session() + if cookies: + session.cookies.update(cookies) + return session + + def bare_request(self, url: str, method: str, cookies: dict, data=None) -> requests.Response: + """Send a request without any additional processing""" + try: + response = requests.request(method, url, cookies=cookies, data=data) + response.raise_for_status() + return response + except requests.RequestException as e: + logger.error(f"Request failed: {str(e)}") + return None def get_tcgplayer_cookies_from_file(self) -> Dict: # check if cookies file exists diff --git a/requests.md b/requests.md index 6d5b377..593f590 100644 --- a/requests.md +++ b/requests.md @@ -7,15 +7,15 @@ curl -J -X POST http://192.168.1.41:8000/api/tcgplayer/inventory/add \ curl -X POST http://192.168.1.41:8000/api/boxes \ -F "type=play" \ --F "set_code=DFT" \ --F "sku=195166278636" \ --F "num_cards_expected=422" +-F "set_code=MKM" \ +-F "sku=195166245744" \ +-F "num_cards_expected=504" -curl -X POST "http://192.168.1.41:8000/api/boxes/0d605f46-25b5-4784-8d45-38dec144ec8e/open" \ - -F "product_id=0d605f46-25b5-4784-8d45-38dec144ec8e" \ - -F "file_ids=61124a9d-8db3-49aa-bf56-ec0d784ca817" \ - -F "date_opened=2025-02-17" +curl -X POST "http://192.168.1.41:8000/api/boxes/53d2848e-86df-48ab-b9fb-d9b3bbfec114/open" \ + -F "product_id=53d2848e-86df-48ab-b9fb-d9b3bbfec114" \ + -F "file_ids=8676a5f4-c508-4623-a42d-8b1c98acf5f6" \ + -F "date_opened=2025-02-24" curl -X POST "http://192.168.1.41:8000/api/processOrders" \ -H "Content-Type: application/json" \ - -d '{"order_ids": ["E576ED4C-38871F-B0277","E576ED4C-3E53CD-07B52","E576ED4C-69B7E0-F98E7","E576ED4C-CF90F4-25741","E576ED4C-FA126E-2AA91","E576ED4C-D35CA8-78335","E576ED4C-EC4B27-13B95","E576ED4C-C36208-D0287","E576ED4C-144D2F-E6207","E576ED4C-898076-E9B86","E576ED4C-80F3CF-E249C","E576ED4C-5389E1-32C56","E576ED4C-F62209-9FFE1","E576ED4C-557BE9-837C6","E576ED4C-9BDBC5-B253D","E576ED4C-6A4977-BD9AF","E576ED4C-C64B3F-FC552","E576ED4C-A1117E-6904E","E576ED4C-24A2E5-FF7BE","E576ED4C-F5FA66-47D0C","E576ED4C-94270F-764A1","E576ED4C-C0BAA6-E6E7B","E576ED4C-501A6F-6B059","E576ED4C-274A72-571D8","E576ED4C-3E5868-E13C0","E576ED4C-AE735B-F6228","E576ED4C-D1D52D-7ADC4","E576ED4C-04B129-56991","E576ED4C-609E28-84E47","E576ED4C-D999D3-14AB2","E576ED4C-253672-2D0E2","E576ED4C-3158BD-67FDC","E576ED4C-FA69E4-1399C","E576ED4C-A65582-DDEA3","E576ED4C-7B64FB-B80DF","E576ED4C-FFDA6C-79950","E576ED4C-E7D937-B68AC","E576ED4C-8E7A98-8B099","E576ED4C-67B310-7F1FA","E576ED4C-7433C7-2AB9F","E576ED4C-46F32F-9F590","E576ED4C-23302B-87979","E576ED4C-83AF9F-49838","E576ED4C-8288A3-6DB1D","E576ED4C-9C60EB-600A7","E576ED4C-261CD5-30B1C","E576ED4C-525BF2-02DD9","E576ED4C-9125A5-E830A","E576ED4C-5D0E23-5AA99","E576ED4C-D4E9DD-4B50A","E576ED4C-B2C796-F447B","E576ED4C-D7AAE2-EF8ED","E576ED4C-CD8DB7-A1A48","E576ED4C-22DE13-0B188","E576ED4C-5E59BB-923D7","E576ED4C-181F86-D5A60","E576ED4C-B9E9E4-029FD","E576ED4C-A1EEB1-84DC0","E576ED4C-056585-026DB","E576ED4C-00FA91-515DE","E576ED4C-F4EABF-A5D05","E576ED4C-96E18B-686B6","E576ED4C-7075CD-96C6D","E576ED4C-D3CAD9-F0642","E576ED4C-4A65A8-FE309","E576ED4C-8B3EAE-B3711","E576ED4C-A5C78C-973E2","E576ED4C-DAFC39-BB279","E576ED4C-B04F81-BF772","E576ED4C-FB9D72-5E65F","E576ED4C-CE55F5-F90C1","E576ED4C-C7A483-CC683","E576ED4C-B0B3EF-BF951","E576ED4C-103849-DD87A","E576ED4C-EB809C-608E8","E576ED4C-74C1CA-267FE","E576ED4C-D4C8FE-6FF5C","E576ED4C-58D715-716F7","E576ED4C-7D768B-CFE95","E576ED4C-718BE8-93ED3","E576ED4C-8EB15E-30450","E576ED4C-0A37F7-F842D","E576ED4C-BFDFFE-B4D6C","E576ED4C-92366F-7684C","E576ED4C-69DBC1-CC54E","E576ED4C-4E2F9C-5E858","E576ED4C-C6D045-F5937","E576ED4C-AC3871-BF43A","E576ED4C-A7D90B-5D515","E576ED4C-EBE137-C12E7","E576ED4C-DE13F4-588EF","E576ED4C-1901C3-757E0","E576ED4C-8D2802-303D6","E576ED4C-A8539A-5F0D7","E576ED4C-38CB63-14833","E576ED4C-8D5560-4CCAA","E576ED4C-6FD37E-D0BCA","E576ED4C-A281A4-1CC09","E576ED4C-767A91-45637","E576ED4C-922062-9197E","E576ED4C-2A80E1-4354C","E576ED4C-FC05E3-16104","E576ED4C-94B6F8-18345","E576ED4C-910F67-968A2","E576ED4C-5699EC-2054D","E576ED4C-E14414-B83EA","E576ED4C-BEB39C-35B63","E576ED4C-1D4EC6-33E66","E576ED4C-62E04C-2BAE6","E576ED4C-6C6D28-58F81","E576ED4C-68F07C-FF2A9","E576ED4C-13B35D-FBBB0","E576ED4C-5F7456-AB349","E576ED4C-8085B2-DE6E3","E576ED4C-D98A87-B98BA","E576ED4C-ED25CC-CC299","E576ED4C-CFDB17-49D31","E576ED4C-AA2BC6-29D2D","E576ED4C-3BBD17-43578","E576ED4C-F806C0-9C144","E576ED4C-C4BB2A-34FC1","E576ED4C-10FA2E-3BDF9","E576ED4C-F7750F-AEAB1","E576ED4C-395756-5203B","E576ED4C-CF776D-840BC","E576ED4C-739E23-13A28","E576ED4C-29DB2C-4FF69","E576ED4C-3B797F-CA8A3","E576ED4C-905B1A-F386A","E576ED4C-D95009-F9418","E576ED4C-798C01-08E16","E576ED4C-8EEE17-A14F3","E576ED4C-8A5D93-6E23C","E576ED4C-929037-257B3","E576ED4C-FB93F4-9044C","E576ED4C-B30403-18B0F","E576ED4C-F1F693-7E9AF","E576ED4C-9BBB3C-A6C81","E576ED4C-79BD08-96363","E576ED4C-185BF4-F8BBA","E576ED4C-A5F93D-6290A","E576ED4C-E5633F-D91F2","E576ED4C-353447-8F733","E576ED4C-1FBC9F-B998A","E576ED4C-41B44F-1D90A","E576ED4C-6BF89E-8CCBC","E576ED4C-067A77-16E23","E576ED4C-DDE231-A88F9","E576ED4C-8299E5-441BB","E576ED4C-A99937-BBCFD","E576ED4C-6A9349-D65B2","E576ED4C-41982F-35802","E576ED4C-D520EB-0E750","E576ED4C-573EE8-DC8D7","E576ED4C-04B4E4-94E6E","E576ED4C-5DC86A-4ED20","E576ED4C-E3B44F-04500","E576ED4C-7463A5-80564","E576ED4C-2957CC-2EE3E","E576ED4C-59B1CB-6C747","E576ED4C-D112BD-FD97F","E576ED4C-E90A6C-876EF","E576ED4C-C3AAD0-25ABD","E576ED4C-4CFD5D-6B38B","E576ED4C-95BF5E-A7087","E576ED4C-691135-8BD7F","E576ED4C-CEA041-2AE46","E576ED4C-8D91BE-84D64","E576ED4C-D36D72-82D73","E576ED4C-545795-930B6","E576ED4C-E0AAD8-E9E21","E576ED4C-D1952C-838AA","E576ED4C-4C29C0-76581","E576ED4C-56CDD1-F2D72","E576ED4C-DE0969-A1C71","E576ED4C-41BB0D-E773F","E576ED4C-51C9F5-CB969","E576ED4C-FE9104-7327F","E576ED4C-71AB0F-467A5","E576ED4C-E0D26F-7A2A7","E576ED4C-4D0F42-0EEC9","E576ED4C-A14C66-A975C","E576ED4C-02B977-5467A","E576ED4C-8D6A43-57197","E576ED4C-52CB92-234BD","E576ED4C-6BD780-54E0E","E576ED4C-D95DCB-66016","E576ED4C-4E7E85-5104B","E576ED4C-D83B53-5C87D","E576ED4C-2B908F-71952","E576ED4C-D2DF07-4D5BD","E576ED4C-A1E368-B4A58","E576ED4C-4F8751-81E9E","E576ED4C-2F5F89-93FD6","E576ED4C-4B66CC-ED5D2","E576ED4C-96018B-C39AD","E576ED4C-8F0679-98379","E576ED4C-8875F7-B1A27","E576ED4C-6CCFF2-0DDDA","E576ED4C-44C32A-A4EA3","E576ED4C-97623E-06D87","E576ED4C-1A70F0-A4F2A","E576ED4C-FA636F-B141C","E576ED4C-6E0F4E-4BFE9","E576ED4C-BFBA0B-D5005","E576ED4C-27CA98-83D2F","E576ED4C-795137-626B0","E576ED4C-F7E0A8-D4B0C","E576ED4C-C6E094-9025C","E576ED4C-BFF619-06591","E576ED4C-C716E9-F1674","E576ED4C-0D2555-84F0C","E576ED4C-1F1C07-A140E","E576ED4C-145799-E256C","E576ED4C-82A482-1A4D6","E576ED4C-1202F4-1582B","E576ED4C-C0265E-F85A2","E576ED4C-BAAF10-1C60D","E576ED4C-5061A4-7902B","E576ED4C-2B7F22-4477F","E576ED4C-1100C6-2A806","E576ED4C-614519-65765","E576ED4C-EDE71A-B0C51","E576ED4C-C5A91F-0C6A5","E576ED4C-2459EF-05126","E576ED4C-EEFE49-E6541","E576ED4C-BF7D2A-C7316","E576ED4C-90B171-991DC","E576ED4C-9B1186-C3E3D","E576ED4C-F4B1E0-9162B","E576ED4C-9AC0D3-DE6C3","E576ED4C-470DB7-EF113","E576ED4C-0138EA-0C38C","E576ED4C-99D1D8-0C4AB","E576ED4C-7F18CA-45CAB","E576ED4C-48520D-CE059","E576ED4C-D8F3C6-EBA6C","E576ED4C-E26707-83043","E576ED4C-CDFD28-C0635","E576ED4C-2915D5-344BA","E576ED4C-F2DF0F-6B757","E576ED4C-F8025C-E56C6","E576ED4C-48B8E0-36BF0","E576ED4C-9990E0-73EBA","E576ED4C-D863C8-C2DA5","E576ED4C-C2A2DD-22E10","E576ED4C-98442F-A6683","E576ED4C-3B34EB-4D476","E576ED4C-8FA172-2F790","E576ED4C-6DBE35-00A10","E576ED4C-27F2F7-2CCCD","E576ED4C-ADF325-95F06","E576ED4C-867473-38D18","E576ED4C-675D76-406C5","E576ED4C-F4EFD4-B7514","E576ED4C-5F90E6-FC5AD","E576ED4C-930161-91BF3","E576ED4C-C1E655-CC793","E576ED4C-8A0C22-8CB9C","E576ED4C-B8CCCD-0EDCA","E576ED4C-B153EA-21762","E576ED4C-ABCD01-05E03","E576ED4C-15EB01-FB543","E576ED4C-27CA8F-B35E4","E576ED4C-A62C91-55496","E576ED4C-E14F81-13729","E576ED4C-BD9E8D-62771","E576ED4C-E6DDD1-51668","E576ED4C-38F5EC-F0094","E576ED4C-5054C6-E5F8B","E576ED4C-4158AF-CE8BC","E576ED4C-C6066B-03D77","E576ED4C-666E0E-4EE80","E576ED4C-0E8103-24552","E576ED4C-7077EF-BD22D","E576ED4C-7874C8-087FC","E576ED4C-1163E5-6BF28","E576ED4C-25A8B3-0EEC6","E576ED4C-971177-34E20","E576ED4C-F4A1C4-E2878","E576ED4C-96CF82-55CA4","E576ED4C-B3AFD6-ABCE7","E576ED4C-1F9D93-A9D4E","E576ED4C-65D8A4-0DD20","E576ED4C-4CC39E-E3C3D","E576ED4C-F009AC-AFD75","E576ED4C-B610D6-96CAF","E576ED4C-AF1B21-1ED9A","E576ED4C-CE6B74-76DEC","E576ED4C-ECA97D-90F1C","E576ED4C-F64A29-165EA","E576ED4C-AD018A-6E29C","E576ED4C-BCC37D-4FCE5","E576ED4C-FE8C4D-3E169","E576ED4C-BD8258-C5ADC","E576ED4C-9DE5C1-08DF1","E576ED4C-DD6FDB-13ABA","E576ED4C-49B4EB-7A64B","E576ED4C-9AE3F3-32EFA","E576ED4C-D74B14-9CC49","E576ED4C-024C38-3C35B","E576ED4C-EA83A3-44EE6","E576ED4C-C64053-5F938","E576ED4C-375B69-C7027","E576ED4C-9F17FC-C58D8","E576ED4C-87C4FD-7CA32","E576ED4C-B1C683-F35C4","E576ED4C-A25829-BD29C","E576ED4C-F7B316-550D7","E576ED4C-0FCAD8-EDEEF","E576ED4C-EEBAA7-79684","E576ED4C-C57446-6E285","E576ED4C-B3A7E4-915E0","E576ED4C-ECAC2A-30C84","E576ED4C-5D1EFB-1193E","E576ED4C-FB865B-E5D03","E576ED4C-4DD921-80145","E576ED4C-CC2F1D-6EAAA","E576ED4C-5AC75A-595C5","E576ED4C-AAFF5F-28E1B","E576ED4C-4F50E8-A0B98","E576ED4C-9C4239-DF193","E576ED4C-D5DBBD-56457","E576ED4C-EDBE07-51043","E576ED4C-F590D0-831A8","E576ED4C-DF281A-DFBD8","E576ED4C-5F8A91-10729","E576ED4C-A851A6-1C4EB","E576ED4C-8E2E36-69EC4","E576ED4C-C3B389-89599","E576ED4C-8B5147-4EB85","E576ED4C-F4A2BB-321C4","E576ED4C-7AE4FC-030F2","E576ED4C-26AABA-91EC5","E576ED4C-059703-60AE7","E576ED4C-79F0F1-D66C2","E576ED4C-BC5BDD-CB1FB","E576ED4C-49C5B7-DFF69","E576ED4C-346F3F-5C7DA","E576ED4C-88F7D0-0DA20","E576ED4C-8C830D-BC5BD","E576ED4C-4C5873-0C751","E576ED4C-38B774-5A228","E576ED4C-C21ED6-CBA63","E576ED4C-0FDE1E-FB554","E576ED4C-26ACF9-E3CDF","E576ED4C-D15B14-AC310","E576ED4C-F723C6-D409D","E576ED4C-920045-C212C","E576ED4C-6F35C5-E29B5","E576ED4C-1AE953-6186D","E576ED4C-501083-74A55","E576ED4C-259D19-58942","E576ED4C-0BD7B6-8E219","E576ED4C-C3BDB1-3632B","E576ED4C-7E5338-1CD92","E576ED4C-4B3900-11A10","E576ED4C-C5879D-49397","E576ED4C-194438-324DB","E576ED4C-BE487B-07AD3","E576ED4C-004F2B-F0534","E576ED4C-4FB2E3-63C2E","E576ED4C-D11744-8247E","E576ED4C-7FE5B2-6D94A","E576ED4C-4EC001-C1A94","E576ED4C-153BF2-13429","E576ED4C-7D886C-EC383","E576ED4C-980B66-F328F","E576ED4C-EC2D28-DEED9","E576ED4C-91F97E-D06CC","E576ED4C-98E539-92220","E576ED4C-1F34CD-D4F3B","E576ED4C-AB4F13-512A5","E576ED4C-428B9F-728CB","E576ED4C-D9491E-F728B","E576ED4C-74885E-D2E1C","E576ED4C-B7E887-F0385","E576ED4C-6F287A-C6790","E576ED4C-DCD12C-955E3","E576ED4C-B8C4DD-311BC","E576ED4C-F6C438-474ED","E576ED4C-0CEC56-C3916","E576ED4C-BEB378-B2820","E576ED4C-D16F98-50BC3","E576ED4C-6B6316-5A844","E576ED4C-9D477E-14905","E576ED4C-4D6C88-B5CD0","E576ED4C-2FB933-AA882","E576ED4C-171038-95864","E576ED4C-B9F844-22CB1","E576ED4C-427BFA-98F74","E576ED4C-4CB968-A3E30","E576ED4C-3322F8-8E6B1","E576ED4C-1A6753-6A1EA","E576ED4C-73E1E1-AF5D0","E576ED4C-5DF831-48D9A","E576ED4C-1DD40F-D605E","E576ED4C-0DCAA0-81CDF","E576ED4C-01DE42-327DE","E576ED4C-8521AA-0A4FD","E576ED4C-F45FCD-CB8BD","E576ED4C-373BB5-B1322","E576ED4C-BD13A7-F4554","E576ED4C-0224E5-568D7","E576ED4C-571235-15BA6","E576ED4C-1FF9A4-4566F","E576ED4C-A5EDB3-3C463","E576ED4C-7FACE0-2CBFC","E576ED4C-192253-BA0FA","E576ED4C-6F6601-272AD","E576ED4C-15F191-A20F2","E576ED4C-085A32-E43E8","E576ED4C-B896CA-778D0","E576ED4C-B93819-A086C","E576ED4C-0FCA34-A4310","E576ED4C-C41196-98479","E576ED4C-DE5CB4-7395C","E576ED4C-B1BBC3-99810","E576ED4C-30039A-8E1A7","E576ED4C-493ED8-2E70C","E576ED4C-8AFB86-B0D01","E576ED4C-7FF2E2-B43EB","E576ED4C-EAB570-2E495","E576ED4C-63D7E5-9581E","E576ED4C-0CE50F-6F155","E576ED4C-2DC72B-DD590","E576ED4C-B55B43-ABAC3","E576ED4C-AB1CAF-44B3E","E576ED4C-8C47C4-087E5","E576ED4C-719A34-769A0","E576ED4C-285D7C-B6842","E576ED4C-F37910-A9D17","E576ED4C-98C36C-14A44","E576ED4C-EF48C3-5D350","E576ED4C-7B358F-6135A","E576ED4C-9BDA05-C7611","E576ED4C-E96001-00584","E576ED4C-3E91F5-B117A","E576ED4C-793FD9-9DFFD","E576ED4C-5BF226-4979C","E576ED4C-ABD770-FCB33","E576ED4C-A5D706-80822","E576ED4C-2BD6E9-D65E5","E576ED4C-88E1C8-C2B0E","E576ED4C-68188E-5E9AB","E576ED4C-25E994-299D0","E576ED4C-060727-38EA7","E576ED4C-C4AAA4-62A08","E576ED4C-198F1A-A38A3","E576ED4C-FA22DB-7F00A","E576ED4C-4A4805-36BF1","E576ED4C-3ECD68-38961","E576ED4C-639191-B8D12","E576ED4C-B5DDDC-B7639","E576ED4C-9FAF76-5FD97","E576ED4C-8A5813-5F3B5","E576ED4C-EB06A8-A488A","E576ED4C-FBCBF8-0216F","E576ED4C-A66B8E-35987","E576ED4C-BC42C9-0CEA1","E576ED4C-CC0324-5416C","E576ED4C-D88DD3-CB65F","E576ED4C-ADACDB-9A182","E576ED4C-3AA2BF-9F4AC","E576ED4C-51C992-894CA","E576ED4C-5D9D07-377D8","E576ED4C-1C5CF1-84CC4","E576ED4C-666956-29BB4","E576ED4C-884E5C-832D2","E576ED4C-AEC21A-6D012"]}' \ No newline at end of file + -d '{"order_ids": ["E576ED4C-92196E-33E46","E576ED4C-B472A8-D6A4D","E576ED4C-B7AFD9-CBCA7","E576ED4C-F7F088-52BDE","E576ED4C-D3CAD9-F0642","E576ED4C-DA2FE7-6E606","E576ED4C-697357-D18D7","E576ED4C-7358D0-6B581","E576ED4C-2CAFBD-8D85E","E576ED4C-B4767E-72F78","E576ED4C-F0FE0E-5824F","E576ED4C-22BF76-ED926","E576ED4C-7A8059-6274E","E576ED4C-521E7D-BC5FA","E576ED4C-803C08-CB830","E576ED4C-790E48-10D1D","E576ED4C-0695F7-8715A","E576ED4C-CE8807-F142E","E576ED4C-EE581D-49448","E576ED4C-A5CAFC-E0C3B","E576ED4C-3094C4-28057","E576ED4C-14EC0D-8E4E6","E576ED4C-EDA04E-C8B93","E576ED4C-9155CF-35A0D","E576ED4C-56F053-8EF8B","E576ED4C-FA5B60-4DC85","E576ED4C-D74A72-7E742","E576ED4C-83CCB2-BB172","E576ED4C-262560-16B1A","E576ED4C-3B43FE-11A4A","E576ED4C-D7C0C5-526E1","E576ED4C-F045FB-CA986","E576ED4C-F41FF5-63374","E576ED4C-C5D26D-BCEBE","E576ED4C-0E4D56-AEE7E","E576ED4C-DD4ED4-AD401","E576ED4C-D823D6-25A29","E576ED4C-273363-D0375","E576ED4C-248400-A972A","E576ED4C-B18E0F-C55AE","E576ED4C-080F7F-7342B","E576ED4C-EF072E-FBBFA","E576ED4C-9E881F-1365E","E576ED4C-F85BB9-D2F24","E576ED4C-69777C-2725F","E576ED4C-187E7A-2F37A","E576ED4C-D7E80E-1F222","E576ED4C-BA84EF-71EEA","E576ED4C-ACD33A-6C589","E576ED4C-14A8FD-9792E","E576ED4C-C5CFFC-047AB","E576ED4C-F5BCCD-B85BB","E576ED4C-8FE692-377C5","E576ED4C-C60956-9380E","E576ED4C-E4C83F-104E4","E576ED4C-58D0C2-05AC0","E576ED4C-F8C4E7-7ABE0","E576ED4C-27B812-8132B","E576ED4C-68C830-17929","E576ED4C-3620EF-F5D1E","E576ED4C-ED4A56-F18AF"]}' \ No newline at end of file