7.6 KiB
ai& / aiand provider validation notes
Use these notes for legitimate single-account setup, API-key validation, and Hermes provider configuration for aiand.com. Do not use them to automate mass signup, promo abuse, or coupon circumvention.
Domains and routes
- Marketing site:
https://www.aiand.com/ - Console:
https://console.aiand.com/ - API host:
https://api.aiand.com - Magic-link verification page:
https://console.aiand.com/verify-magic?token=<uuid> - OpenAI-compatible chat endpoint:
https://api.aiand.com/v1/chat/completions- Pitfall:
https://api.aiand.com/api/v1/chat/completionsis the wrong base path for OpenAI-compatible chat probes.
- Pitfall:
Email magic-link flow
A login email may contain both a tracked redirect URL and a plain console URL. Prefer the plain URL matching:
https://console.aiand.com/verify-magic?token=<uuid>
After navigation, click Continue sign-in to establish the browser session.
Dashboard credit-check flow
For one-account validation:
- Open
https://console.aiand.com/home. - Read the top-right
Credits: $...button/state. Add Creditsopens aPurchase Creditsdialog.- Choose
$50(or requested amount) and clickPurchaseto reach Stripe checkout. - In Stripe, enter the promo in the
Ввести промокод/ promo-code field and verify page text:- Success: discount line appears and total becomes zero or expected discounted value.
- Failure: explicit alert such as
Код недействителен.means the coupon did not apply for that checkout/account/product/region.
Do not infer success from merely typing the code; verify total and explicit error text.
Billing-page route nuance
- The docs point to billing at
https://console.aiand.com/settings/billing, but in practice the same flow is reachable from the Home dashboard viaAdd Credits. - The purchase dialog commonly shows preset buttons like
$50,$150,$500and aPurchasebutton before redirecting to Stripe. - Browser snapshots around the Stripe transition can briefly come back as
(empty page)even whilewindow.location.hrefalready points athttps://checkout.stripe.com/.... When that happens, confirm location first, then refresh the snapshot or take a screenshot before concluding the click failed.
Stripe promo diagnostics notes
- Observed Stripe checkout for aiand
Platform Creditsmay localize to Russian; the promo field label can beВвести промокод, the apply buttonПрименить, and rejection textКод недействителен. - On a valid browser session, the
$50credit purchase flow reaches Stripe correctly even when the coupon fails. A Stripe rejection means the issue is coupon eligibility/configuration, not browser automation or field selection. - Treat
Код недействителен./ invalid-code alerts as a hard diagnostic result for that checkout: likely expired/disabled coupon, wrong product/price, region/currency restriction, or customer-specific coupon. Do not retry across many accounts as a workaround. - Clicking
Purchaseto reach Stripe can create an unpaid checkout/invoice state; do not enter payment details or complete the payment during diagnostics unless the user explicitly intends to pay. Use the merchant back link to exit.
API-key validation classification
Use a minimal chat/completions request against /v1/chat/completions with a known model id. Interpret results carefully:
200 OK: key, org routing, endpoint, and selected model are usable.insufficient_credits: key authentication succeeded, but org/account balance is zero.No access token/ 401-like: missing, truncated, or wrong bearer token, or wrong auth header.- Model-not-found errors: auth may still be valid; retry with a known aiand model.
- Cloudflare
Error 1010: Access denied/browser's signature: not necessarily an auth failure. Python HTTP clients such asurllibandaiohttpare blocked by Cloudflare while the same key succeeds through systemcurl. Re-test with curl before concluding the token is bad. For any Python tool that needs to talk to aiand API, usesubprocess.run(["curl", ...])instead ofrequests/aiohttp/urllib.
Actual model availability (2026-07-09)
GET /v1/models returns 7 models, but only 1 actually works on a $0-balance account:
| Model | Status | Notes |
|---|---|---|
qwen/qwen3.6-27b |
✅ Works | Reasoning model — output in reasoning field, content is null. Free tier. |
deepseek-ai/deepseek-v4-pro |
❌ Needs credits | Returns insufficient_credits |
deepseek-ai/deepseek-v4-flash |
❌ Needs credits | Returns insufficient_credits |
zai-org/glm-5.2 |
❌ Not on host | Returns does not exist |
moonshotai/kimi-k2.7-code |
❌ Not on host | Returns does not exist |
google/gemma-4-31b-it |
❌ Not on host | Returns does not exist |
openai/gpt-oss-120b |
❌ Not on host | Returns does not exist |
Note: moonshotai/kimi-k2.6 is NOT in the /v1/models response (7 models, not 8).
qwen/qwen3.6-27b reasoning model quirk
This model is a reasoning model running on vLLM. The output is in choices[0].message.reasoning — NOT choices[0].message.content which is null. The model uses finish_reason: "length" when max_tokens is hit. Always check BOTH fields when parsing responses:
msg = data["choices"][0]["message"]
txt = msg.get("content") or msg.get("reasoning", "")
Stress test results (2026-07-09): 108/108 requests OK, 6.8 req/s throughput, avg latency 5.73s, p50 4.94s, 204 tok/s total TPS. Multi-key concurrent requests work without rate limiting.
For bulk key files, prefer the bundled curl-based checker:
python scripts/aiand_check_keys_curl.py --keys C:/path/to/aiand_keys.txt --out aiand_key_report.csv
Parsing pitfalls:
- Current observed key rows may be
email|sk-...|org_id; do not split once and treatsk-...|org_idas the bearer token. - Select the first field beginning with
sk-as the API key and the UUID-like non-email field asX-Org-ID. - Never log raw keys; print email/line, key length, status, and HTTP status only.
Known model ids observed in the console/pricing table include:
zai-org/glm-5.2moonshotai/kimi-k2.7-codemoonshotai/kimi-k2.6qwen/qwen3.6-27bdeepseek-ai/deepseek-v4-prodeepseek-ai/deepseek-v4-flashgoogle/gemma-4-31b-itopenai/gpt-oss-120b
Session timeout pitfall
The aiand console session (established via magic link) expires aggressively — often within 5-10 minutes of inactivity. After expiry, any navigation (console.aiand.com/*) redirects to /login with an empty page. The browser snapshot shows only region "Notifications alt+T" with no interactive elements.
Workflow impact: When doing browser-based promo code validation or credit checks, the entire flow (login → magic link → navigate → add credits → Stripe → promo code) must complete within one session window. If the session dies mid-flow, request a fresh magic link via IMAP (execute_code with imaplib is fastest) and restart.
Detection: A snapshot showing only region "Notifications alt+T" and no navigation/content elements means the session is dead. Do not try to interact — go straight to requesting a new magic link.
Fastest re-login: Use execute_code to pull the latest magic link from IMAP, then browser_navigate directly to the verify-magic?token= URL. This is faster than re-entering email on the login form.
Security hygiene
If an email app password or provider key is found hardcoded in a script, move it to .env/environment variables and recommend rotating it. Do not preserve raw secrets in skill references.