Authentication & IP Whitelisting
All dev_* commands require your request to originate from an IP-whitelisted machine. The whitelist is the primary auth gate — no additional password is needed for API calls.
How to get whitelisted
- Find your public IP at whatismyip.com
- Email support@annoying-is-caring.com with your IP and reason for access
- Once approved, your IP will be added and the status bar above will show WHITELISTED
Note: If your IP changes (VPN, travel, ISP rotation), you will need to request whitelisting again.
API endpoint (POST JSON body or GET query string):
CLI Tool
Download and install the command-line interface:
curl -o aic-cli.zip https://d2f64d7f2dnmit.cloudfront.net/mobile/aic-cli.zip
# 2. Unzip
mkdir -p aic-cli && cd aic-cli && unzip ../aic-cli.zip
# 3. Install dependencies
pip install -r requirements.txt
# 4. Login (stores credentials at ~/.aic/config.json)
python3 aic.py login
# 5. Test
python3 aic.py sub listall
Or import as a Python library in your own scripts:
client = AicClient()
subs = client.sub_list()
credits = client.sub_credits("submission-id")
API Endpoints
Subscriptions
carer_emailList all subscriptions for a carer. Returns subscription_id, cared_for_email, name, status, tier.
python aic.py --json sub listall
subscription_idFull subscription detail: tier, status, emails, carer password, timestamps, Stripe ID.
python aic.py --json sub status <subscription_id>
subscription_idCredits remaining: image, video, cartoon — with tier limits, extras, and usage this month.
python aic.py --json sub credits <subscription_id>
subscription_idNext auto-generated joke date, last joke date, cooldown, overdue flag.
python aic.py --json sub schedule <subscription_id>
subscription_idPause a subscription. Jokes stop being auto-generated.
python aic.py --json sub pause <subscription_id>
subscription_idCancel a subscription permanently.
python aic.py --json sub cancel <subscription_id>
carer_email, cared_for_email, cared_for_nametier=premium (basic|standard|premium|group_premium), review=true, above_18=yes, mental_disability=falseCreate a new gifted subscription with optional flags. All flags have defaults shown above.
python aic.py sub new --tier standard --review false --above-18 no
python aic.py sub new --tier group_premium --mental-disability true
Jokes & Cartoons
subscription_id, limit (default 10)Recent jokes with text, presigned image/video URLs (1h expiry), status, source. Use non_expired=true to only return jokes with media.
python aic.py --json jokes last <subscription_id> --limit 3
joke_idAll feedback on a joke: liked/disliked sentiment, text comments, humor category, feedback role (carer/cared-for), and source.
python aic.py --json jokes feedback <joke_id>
joke_id (or subscription_id for last joke)All ChatGPT and media generation prompts for a joke, including all retry attempts in the thread. Shows prompt text, media generator used, and any rejection/error messages.
python aic.py jokes prompts --sub <subscription_id>
python aic.py --json jokes prompts <joke_id>
subscription_id (or cared_for_email), description, humor_category, tone, media_typecount_credit=true|false (default: true, false from dev IP), use_face_images=true|false, media_type=image|videoTrigger async joke generation via crack_a_joke. Use dev_sub_last_jokes to check results (generation takes 30-120s). Local image uploads coming soon.
python aic.py --json jokes generate <subscription_id> --desc "spring weather" --media image --no-credit
Advisor
subscription_idsession_id=N (default: last session)All text entered during a Virtual Joke Advisor session. Shows turns, timestamps, and sources. Defaults to last session if no session_id specified.
python aic.py advisor <subscription_id> --session 2
python aic.py --json advisor <subscription_id>
Battles
carer_email (optional — filter by carer)List active battles with group members, consented/opted-out/pending participants, entries submitted, and time remaining.
battle_id (optional — uses most recent if omitted)Rankings by votes, feedback stats (who gave likes/dislikes), participants, and time remaining.
python aic.py battles scores
python aic.py --json battles scores