[cron:6dd85dd2-28ce-411f-b2de-8106e314da47 Deal Post - X + Pinterest (every 30 min)] SCHEDULED TASK: Post 1 deal to X and Pinterest using Maya VM twikit/py3-pinterest.

## CRITICAL: Use Maya VM, NOT Fred social-poster
- X: twikit v2.3.3 on Maya VM (`ssh maya@maya`)
- Script: `/home/maya/workspace/scripts/x_twikit_post2.py`
- Cookies: `/home/maya/workspace/x_cookies.json`

## Workflow
1. **Fetch deals with Python (NOT shell pipes with $):**
   ```python3
   import urllib.request, json
   req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest', headers={'User-Agent':'Mozilla/5.0'})
   data = json.loads(urllib.request.urlopen(req, timeout=15).read())
   deals = data if isinstance(data, list) else data.get('deals', [])
   for d in deals[:15]:
       print(f"{d['id']}|{d.get('title','')[:60]}|PRICE:{d.get('price','')}|{d.get('discount_percentage',0)}%")
   ```
2. Check hash: `python3 scripts/posted_db.py check <deal_id> x`
3. If POSTED:YES — SKIP, pick another
4. Pick unposted deal (50%+ off, popular brand, limited time, freebies, under $10)
5. Download share image: `wget -q "https://www.gottahavecoups.com/api/v1/share/image/<deal_id>" -O /tmp/deal_img.jpg`
6. **BUILD TWEET:** Hook + value + 5-8 hashtags + link LAST. KEEP UNDER 280 CHARS.
7. **MANDATORY VALIDATION:** `python3 scripts/validate_tweet.py '<tweet_text>'` — If INVALID, STOP and pick different deal.
8. **POST TO X (Maya VM twikit):**
   ```bash
   ssh maya@maya "cat > /tmp/tweet.txt << 'TWEET'
   <tweet text here>
   TWEET"
   scp /tmp/deal_img.jpg maya@maya:/tmp/deal_img.jpg
   ssh maya@maya "python3 /home/maya/workspace/scripts/x_twikit_post2.py <deal_id> --file /tmp/tweet.txt"
   ```
9. **POST TO PINTEREST (Maya VM py3-pinterest):**
   ```bash
   ssh maya@maya "python3 /home/maya/workspace/scripts/pin_post_v2.py <deal_id> '<title>' '<description>' 1134485031073239531"
   ```
10. Record posts: `python3 scripts/posted_db.py record <deal_id> x <tweet_id> <url>`
11. Log in memory/YYYY-MM-DD.md

## If X cookies expired
Run: `ssh maya@maya "DISPLAY=:0 python3 /home/maya/workspace/scripts/extract_x_cookies.py"`

## Tweet format (STRICT)
- Hook (emoji + deal highlight)
- Product name + price (with $, e.g., "$12.99")
- 5-8 hashtags
- Link LAST: gottahavecoups.com/deal/<id>
- KEEP UNDER 280 CHARS

## NEVER post if validation fails:
- Shell artifacts (/bin/bash, python3 -c)
- Broken prices (.20 instead of $10.20)
- Broken emojis (�)
- > 280 chars
Current time: Friday, February 13th, 2026 — 7:27 AM (UTC)

Return your summary as plain text; it will be delivered automatically. If the task explicitly calls for messaging a specific external recipient, note who/where it should go instead of sending it yourself.


The user wants me to execute a scheduled task to post a deal to X and Pinterest. Let me follow the workflow carefully.

1. First, I need to fetch deals from the API
2. Check which ones have been posted already
3. Pick an unposted deal
4. Download the share image
5. Build and validate the tweet
6. Post to X via Maya VM
7. Post to Pinterest via Maya VM
8. Record the post

Let me start by fetching deals and checking the posted database.

exec

python3 -c "
import urllib.request, json
req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest', headers={'User-Agent':'Mozilla/5.0'})
data = json.loads(urllib.request.urlopen(req, timeout=15).read())
deals = data if isinstance(data, list) else data.get('deals', [])
for d in deals[:15]:
    print(f\"{d['id']}|{d.get('title','')[:60]}|PRICE:{d.get('price','')}|{d.get('discount_percentage',0)}%\")"


34026|Reputation:A Novel|PRICE:1.99|78%
34025|Flash:The Making of Weegee the Famous|PRICE:2.99|75%
34028|No Boundaries Men's & Big Men's Twill Cargo Shorts w/ 7" Ins|PRICE:6.91|None%
34027|31.60:Adidas Unisex-Adult Hoops 4.0 Mid Top,Black/White/Bron|PRICE:31.6|None%
34029|13.3-Oz HTH Pool Care Shock (Treats 12,500 Gallons) $3.97 + |PRICE:3.97|None%
34019|69.99* | Razer Kishi Ultra Gaming Controller at Amazon|PRICE:69.99|53%
34020|15 | 6-Pack 20-Yard Duck Color Duct Tape at Amazon|PRICE:15.0|None%
34017|Shoot The Moon Game Retro Balancing Kids' Game $7.27 + Free |PRICE:7.27|None%
34018|Prime Members:2-Pack 13.5-Oz CNGLASS Double Wall Thermo Glas|PRICE:10.0|50%
34013|SnS] $9.21 | 1-Oz NOW Foods Cinnamon Bark Oil at Amazon|PRICE:9.21|None%
34014|79.99 | JOOLA 3S Pickleball Paddles (Hyperion,14mm) at Amazo|PRICE:79.99|55%
34010|3-Piece HIKOLAYAE Grand Creek TSA-Compliant Nested Hardside |PRICE:71.1|None%
34009|Noble House Perla Double Lounge for Yard and Patio in Teak w|PRICE:204.79|None%
34004|Crescent Lufkin 3/4" x 16' P10...Return Tape Measure - PHV13|PRICE:7.92|44%
34003|The Cook's Own Book,and House...tiquarian Cookbook Collectio|PRICE:2.99|80%


X/Pinterest posting requires API credentials not available in this session

Corrected repost - price fixed from $.76 to $5.76

Corrected repost - price fixed from $.99 to $0.99

AirPods Pro 2 Just $139.99 - Save $110 on Apple's Premium Earbuds


Now I need to check which deals haven't been posted yet. Looking at the deals list and the posted_deals.json, I can see:

Deal IDs from API:
- 34026 - Reputation: A Novel - $1.99 - 78% off
- 34025 - Flash: The Making of Weegee the Famous - $2.99 - 75% off
- 34028 - No Boundaries cargo shorts - $6.91
- 34027 - Adidas Hoops 4.0 Mid Top - $31.60
- 34029 - HTH Pool Care Shock - $3.97
- 34019 - Razer Kishi Ultra Gaming Controller - $69.99 - 53% off
- 34020 - 6-Pack 20-Yard Duck Color Duct Tape - $15
- 34017 - Shoot The Moon Game - $7.27
- 34018 - 2-Pack CNGLASS Double Wall Thermo Glass - $10.00 - 50% off
- 34013 - NOW Foods Cinnamon Bark Oil - $9.21
- 34014 - JOOLA 3S Pickleball Paddles - $79.99 - 55% off
- 34010 - 3-Piece HIKOLAYAE Grand Creek Luggage - $71.10
- 34009 - Noble House Perla Double Lounge - $204.79
- 34004 - Crescent Lufkin Tape Measure - $7.92 - 44% off
- 34003 - The Cook's Own Book - $2.99 - 80% off

Checking posted_deals.json - I can see these have been posted:
- 34003 (just now posted)
- 34005 (just now posted)
- 34015 (just now posted)
- 33998 (posted)

- 33985 (posted)
- 33969 (posted)
- 33968 (posted)
- 33950 (posted)
- 33939 (posted)
- 33935 (posted)
- 33926 (posted)
- 33914 (posted)
- 33899 (posted)
- 33892 (posted)
- 33891 (posted)
- 33885 (posted)
- 33877 (posted)
- 33867 (posted)
- 33862 (posted)
- 33858 (posted)
- 33854 (posted)
- 33850 (posted)
- 33841 (posted)
- 33838 (posted)
- 33820 (posted)

Now I'll check the remaining unposted deals. Deals 34026, 34025, 34028, 34027, 34029, 34019, 34020, 34017, 34018, 34013, 34014, 34010, and 34009 haven't been posted yet. Several stand out: the 80% discount on The Cook's Own Book at $2.99, Reputation: A Novel at 78% off for $1.99, Flash: The Making of Weegee the Famous at 75% off for $2.99, and the Shoot The Moon Game at $7.27.

I've already posted deal 34003 today, so I'll focus on the others. The best candidates are either high-percentage deals like Reputation: A Novel at 78% off or items under $10 like the Shoot The Moon Game. I should verify whether 34026 has been posted before by checking the database.

Let me check which deals haven't been posted yet using the database:

python3 scripts/posted_db.py check 34026 x && python3 scripts/posted_db.py check 34025 x && python3 scripts/posted_db.py check 34003 x


POSTED:NO
POSTED:NO
POSTED:YES


Good - 34026 and 34025 haven't been posted yet, but 34003 has been posted. Let me check a few more to find a good candidate. I want to pick something with 50%+ off or under $10.

Deals not yet checked from my list:
- 34028 - No Boundaries cargo shorts - $6.91
- 34027 - Adidas Hoops 4.0 Mid Top - $31.60
- 34029 - HTH Pool Care Shock - $3.97
- 34019 - Razer Kishi Ultra Gaming Controller - $69.99 - 53% off
- 34020 - 6-Pack Duck Color Duct Tape - $15
- 34017 - Shoot The Moon Game - $7.27
- 34018 - 2-Pack CNGLASS Double Wall Thermo Glass - $10.00 - 50% off
- 34013 - NOW Foods Cinnamon Bark Oil - $9.21
- 34014 - JOOLA 3S Pickleball Paddles - $79.99 - 55% off
- 34010 - 3-Piece HIKOLAYAE Luggage - $71.10
- 34009 - Noble House Perla Double Lounge - $204.79
- 34004 - Crescent Lufkin Tape Measure - $7.92 - 44% off

Best candidates:
- 34026 - Reputation: A Novel - $1.99 - 78% off (BOOK)
- 34025 - Flash: The Making of Weegee the Famous - $2.99 - 75% off (BOOK)
- 34019 - Razer Kishi Ultra Gaming Controller - $69.99 - 53% off (GAMING)
- 34018 - 2-Pack CNGLASS Double Wall Thermo Glass - $10.00 - 50% off (HOME)

- 34014 - JOOLA 3S Pickleball Paddles - $79.99 - 55% off (SPORTS)
- 34017 - Shoot The Moon Game - $7.27 (TOYS/GAMES)
- 34029 - HTH Pool Care Shock - $3.97 (HOME/POOL)
- 34004 - Crescent Lufkin Tape Measure - $7.92 (TOOLS)

I'll go with 34026 - a book at 78% off for $1.99, which offers strong value and appeals to a broad audience. Need to check if this deal has been posted before and grab more details.

python3 scripts/posted_db.py check 34026 x && python3 scripts/posted_db.py check 34026 pinterest


POSTED:NO
POSTED:NO


Deal 34026 hasn't been posted to either platform. Let me get more details about this deal and then build the tweet.

Deal 34026 is unposted. Let me get full details and download the share image:

python3 -c "
import urllib.request, json
req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals/34026', headers={'User-Agent':'Mozilla/5.0'})
data = json.loads(urllib.request.urlopen(req, timeout=15).read())
print(json.dumps(data, indent=2))"

wget -q "https://www.gottahavecoups.com/api/v1/share/image/34026" -O /tmp/deal_img.jpg && ls -la /tmp/deal_img.jpg


Reputation:A Novel

Amazon price drop:Reputation:A Novel - down 78.01% ($7.06) to $1.99 from $9.05

Reputation:A Novel


-rw-rw-r-- 1 crogers2287 crogers2287 73172 Feb 13 07:27 /tmp/deal_img.jpg


Good, I have the deal details:
- Title: "Reputation: A Novel"
- Price: $1.99 (was $9.05)
- Discount: 78%
- Savings: $7.06
- Store: Amazon
- is_hot: true
- is_featured: true

Now I need to build a tweet following the format:
- Hook (emoji + deal highlight)
- Product name + price (with $, e.g., "$12.99")
- 5-8 hashtags
- Link LAST: gottahavecoups.com/deal/<id>
- KEEP UNDER 280 CHARS

Let me craft a tweet:

🔥 HOT BOOK DEAL! Reputation: A Novel just $1.99 (was $9.05) — 78% off! Save $7 on this gripping read. #BookDeal #KindleDeal #AmazonDeal #BookLovers #Reading #BargainBooks #DealAlert #GottaHaveCoups https://www.gottahavecoups.com/deal/34026

Let me count: that's about 220 chars, well under 280. Now I need to validate it.

Now let me build and validate the tweet:

python3 scripts/validate_tweet.py '🔥 HOT BOOK DEAL! Reputation: A Novel just $1.99 (was $9.05) — 78% off! Save $7 on this gripping read. #BookDeal #KindleDeal #AmazonDeal #BookLovers #Reading #BargainBooks #DealAlert #GottaHaveCoups https://www.gottahavecoups.com/deal/34026'


VALID


The tweet is valid. Now I need to:
1. Copy the tweet text to Maya VM
2. Copy the image to Maya VM
3. Post to X using twikit
4. Post to Pinterest
5. Record the posts in the database

Let me do this step by step.

Tweet validated. Now posting to X via Maya VM:

ssh maya@maya "cat > /tmp/tweet.txt << 'TWEET'
🔥 HOT BOOK DEAL! Reputation: A Novel just $1.99 (was $9.05) — 78% off! Save $7 on this gripping read. #BookDeal #KindleDeal #AmazonDeal #BookLovers #Reading #BargainBooks #DealAlert #GottaHaveCoups https://www.gottahavecoups.com/deal/34026
TWEET"


Warning: Permanently added 'maya' (ED25519) to the list of known hosts.


Good, the tweet file was created on Maya. Now let me copy the image and post to X.


Good, image copied. Now let me post to X using the twikit script.

ssh maya@maya "python3 /home/maya/workspace/scripts/x_twikit_post2.py 34026 --file /tmp/tweet.txt"


Warning: Permanently added 'maya' (ED25519) to the list of known hosts.
Cookies loaded
Authenticated as: @GottaHaveCoups
Image downloaded: /home/maya/workspace/downloads/deal-34026.jpg (73172 bytes)
Uploading image...
Image uploaded, media_id: 2022211191234318337
Posting tweet...
SUCCESS! Tweet ID: 2022211194585854145
URL: https://x.com/GottaHaveCoups/status/2022211194585854145


Excellent! The tweet was posted successfully. Now I need to post to Pinterest and then record both posts in the database.

Tweet ID: 2022211194585854145
URL: https://x.com/GottaHaveCoups/status/2022211194585854145

Now let me post to Pinterest.

X posted successfully! Now posting to Pinterest:

ssh maya@maya "python3 /home/maya/workspace/scripts/pin_post_v2.py 34026 'Reputation: A Novel - $1.99 (78% off!)' 'HOT BOOK DEAL! Grab Reputation: A Novel for just $1.99 (was $9.05). Save $7.06 on this gripping read. Limited time Amazon deal!' 1134485031073239531"


Warning: Permanently added 'maya' (ED25519) to the list of known hosts.
Loaded 8 cookies
Boards: 200
Found 7 boards (raw type: dict)
Raw keys: ['all_boards', 'boards_shortlist', 'create_suggestions']
  🔥 Today’s Best Deals (id: 1134485031073239531)
  Limited Time Promo Codes (id: 1134485031073239590)
  Gifts Under $50 (id: 1134485031073239588)
  Amazon Deals & Coupons (id: 1134485031073239559)
  Home & Kitchen Savings (id: 1134485031073239570)
Image upload: 200
Image URL: https://i.pinimg.com/previews/qfs0Q7HZ.jpeg
Pin create: 200
SUCCESS! Pin ID: 1134484962398646088


Both posts were successful! Now I need to record them in the database and log to memory.

X Post ID: 2022211194585854145
Pinterest Pin ID: 1134484962398646088

Both posts successful! Recording to database:

python3 scripts/posted_db.py record 34026 x 2022211194585854145 'https://x.com/GottaHaveCoups/status/2022211194585854145' && python3 scripts/posted_db.py record 34026 pinterest 1134484962398646088 'https://pinterest.com/pin/1134484962398646088'


Recorded 34026 for x
Recorded 34026 for pinterest


Both posts have been recorded. Now let me log this to the daily memory file.

mkdir -p memory && echo "## $(date '+%Y-%m-%d %H:%M:%S') - Deal Posted: 34026

**Deal:** Reputation: A Novel
**Price:** $1.99 (was $9.05) - 78% off
**Platforms:** X + Pinterest

**X Post:** https://x.com/GottaHaveCoups/status/2022211194585854145
**Pinterest Pin:** https://pinterest.com/pin/1134484962398646088

**Tweet:** 🔥 HOT BOOK DEAL! Reputation: A Novel just $1.99 (was $9.05) — 78% off! Save $7 on this gripping read. #BookDeal #KindleDeal #AmazonDeal #BookLovers #Reading #BargainBooks #DealAlert #GottaHaveCoups

---" >> memory/2026-02-13.md


(no output)


All done! Let me provide a summary for the cron job result.

---

**DEAL POST SUCCESSFUL** ✅

**Deal:** 34026 — Reputation: A Novel
**Price:** $1.99 (was $9.05) — 78% off
**Time:** Friday, Feb 13, 2026 at 07:27 UTC

**X Post:** https://x.com/GottaHaveCoups/status/2022211194585854145
**Pinterest Pin:** https://pinterest.com/pin/1134484962398646088

Both posts recorded in `posted_deals.json` and logged to `memory/2026-02-13.md`.