Files
codex-oauth-plus-onboarding…/skill/codex-oauth-plus-onboarding/references/openai-add-phone-free-country-runner-policy-2026-05-10.md
T

3.5 KiB

Free-country OpenAI phone-verification runner notes (2026-05-10)

Trigger

BOSS asked to stop constraining the country list and let the runner choose countries freely:

No fixed region restriction.
Each country at most 2 attempts.
Total 20 attempts.
Try to find whether any country succeeds.

Policy learned

For broad country exploration, count only real 5sim activations toward the global budget:

real activation = 5sim buy returns an activation id and phone number

Do not count these as phone attempts:

  • OpenAI country-gate/CDP failures before buying.
  • 5sim no free phones / non-JSON buy responses.
  • Unsupported country mappings.
  • OAuth recovery failures before add-phone.

This prevents the global budget from being consumed by inventory misses or UI/CDP glitches.

Country scheduling

Use a broad candidate list of OpenAI-supported countries, with a per-country cap:

for country in candidate_order:
  try up to 2 real activations for this country
  skip/no-count if no inventory
  move to next country
repeat/cycle if needed until global real-activation budget is met

Keep the same hard gates as the stricter regional runners:

  1. Recover/verify page is usable https://auth.openai.com/add-phone.
  2. Before buying, set and read back OpenAI country selector:
    • select.value == target ISO
    • visible text equals expected country and dial prefix, e.g. 越南 (+84).
  3. After buying, re-check country before entering the phone number.
  4. If gate fails after buying, cancel the activation immediately.
  5. Probe resend channel before clicking; if WhatsApp, cancel the SMS activation rather than clicking WhatsApp resend.

5sim API quirks

The authenticated/guest prices endpoints may return 403 in this environment:

GET https://5sim.net/v1/guest/prices?product=openai -> 403
GET https://5sim.net/v1/user/prices?product=openai  -> 403

When prices are unavailable, use controlled buy activation probes and classify inventory misses.

5sim buy endpoints can return HTTP 200 text/plain instead of JSON:

status=200
content-type=text/plain; charset=utf-8
body='no free phones'

Treat this as:

{"phase":"buy_failed_not_counted","reason":"no_free_phones"}

No activation was created, so no cancellation is needed and it must not count toward the global real-attempt total.

Candidate-country runner shape

The session generated a broad runner:

/tmp/phone_verify_free_country_2each_total20.py

Initial candidate list included Southeast Asia, Latin America, Africa, Europe, and South Asia. The first inventory checks showed:

Philippines: no free phones
Malaysia: no free phones
Thailand: no free phones
Vietnam: bought activation successfully and proceeded to OpenAI polling

Persisted script copies should avoid secrets and should keep the candidate map as data near the top of the script so new countries can be added safely.

Pitfalls

  • Do not rely on FIVE_SIM_COUNTRY_ORDER when BOSS explicitly asks for free-country exploration; the runner should ignore stale env country order or log its effective order clearly.
  • Do not let no free phones consume the per-country or global real-activation budget.
  • Keep the visible country/ISO gate even in exploration mode; the country list is larger, so selector mismatches are more likely.
  • If a broad run is still active in the background, record only the stable runner policy and early observations; write final outcome only after process completion and order cleanup verification.