Apply for Thailand Visa (TDAC) on Atlys

Site atlys.comTask apply-thailand-visa-dwl0xiVersion v1Updated Jul 13, 2026Category travel

Start a Thailand TDAC/visa application on Atlys and extract product terms, full price breakdown, processing time, required documents, and the application form structure. Read-only — stops before payment. This skill was captured from a live agent session on atlys.com and publishes here verbatim, exactly as an agent receives it.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

Purpose

Start a Thailand entry application on Atlys (atlys.com) and extract everything a traveler needs before committing: the product Atlys sells for Thailand (the TDAC — Thailand Digital Arrival Card for visa-exempt nationalities), its stay/validity/entry terms, the full price breakdown, processing time, the required documents, and the structure of the application form. The skill drives the flow up to the application form entry and stops there. It is read-only: it never fills personal data, uploads a passport, or reaches checkout/payment. For most nationalities Atlys treats "Thailand visa" as the mandatory TDAC (Thailand is visa-exempt for short tourist stays); a true sticker/eVisa only appears for nationalities that require one.

When to Use

  • "How do I apply for a Thailand visa / TDAC on Atlys, and what does it cost?"
  • "What documents and details does Atlys need for the Thailand TDAC?"
  • "How long does Atlys take to process a Thailand TDAC, and what's the total fee?"
  • A travel-planning agent gathering Thailand entry requirements and Atlys pricing before a human decides whether to pay.
  • Pre-filling a checklist of the fields the traveler will need (passport, flight numbers, hotel) before they sit down to apply.

Workflow

The recommended method is browser automation via browserless_agent. Atlys has no public API for this, and bare HTTP fetches of any atlys.com path return a Cloudflare 308 challenge page instead of content (the site is a client-rendered React SPA). A full browser session passes Cloudflare cleanly — in testing a plain session reached the page without a residential proxy or extra stealth. Keep the read + click-through-to-form steps in one call's commands array (this saves round-trips and avoids accidentally dropping the session config — the session persists across calls, keyed by proxy/profile); re-fetch the accessibility tree with snapshot after each navigation since refs invalidate.

1. Open the Thailand visa page

{ "method": "goto", "params": { "url": "https://www.atlys.com/apply-thailand-visa", "waitUntil": "load", "timeout": 45000 } },
{ "method": "waitForTimeout", "params": { "time": 3000 } }

/apply-thailand-visa 308-redirects, then client-redirects by IP geolocation to a locale page such as https://www.atlys.com/en-US/visa/thailand-visa. Confirm the resolved URL with an evaluate ((()=>location.href)()). To force a specific nationality/locale, navigate directly to the locale-prefixed URL instead (e.g. https://www.atlys.com/en-IN/visa/thailand-visa, /en-GB/, /en-PH/).

2. Read the visa terms and pricing

{ "method": "text", "params": { "selector": "body" } }

The body text reliably contains all content (and an embedded i18n JSON bundle). Pull from it:

  • TDAC Information block → Type: TDAC, Length of Stay: 30 days, Validity: 90 days, Entry: Single.
  • Pricing card (next to the "Start Application" button) → Pay Now (Government Fees), Pay on approval (Processing Fee), and Total Amount. For a US passport this reads $1 + $60 = $61 USD. Prices and the product vary by nationality.
  • Processing time → "Guaranteed in 20 minutes" / "TDAC in 1 hour" on the hero, guaranteed before the travel date.

3. Advance to the application form (read-only)

{ "method": "snapshot" },                                                              // find refs (large tree — see gotchas)
{ "method": "click", "params": { "selector": "<ref/selector of 'After <date>'>" } },   // the "When do you plan to travel?" option
{ "method": "snapshot" },
{ "method": "click", "params": { "selector": "<ref/selector of 'Check Required Documents' or 'Start Application'>" } },
{ "method": "waitForTimeout", "params": { "time": 6000 } },                             // the apply page shows a loading animation first
{ "method": "evaluate", "params": { "content": "(()=>location.href)()" } },            // read the resulting /apply-visa URL
{ "method": "snapshot" }

The URL becomes https://www.atlys.com/{locale}/apply-visa?destination=TH&action_source=visa_breakdown&departure=<date>&arrival=<date>&purpose=atlys_black&step=passport&auth=guest and the TDAC application form renders (heading "THAILAND TDAC — guaranteed in 20 minutes"). Record its sections/fields:

  • Personal Information — First/Last Name (as per passport), Date of Birth, Gender, Marital Status, Passport Number, Passport Valid Till, Passport place of issue, Nationality, Occupation.
  • Arrival Flight Details — Direct/Multi-Stop, Flight Number, Arrival Date.
  • Return Flight Details — Direct/Multi-Stop, Flight Number, Departure Date.
  • Hotel Details — Hotel Name, Location in Thailand (province).
  • Contact Details — Email.

4. Stop and emit

STOP here. Do not type into any field, do not click "Submit application", do not "Add Travelers", do not proceed to checkout. Read the field labels and emit the JSON in Expected Output.

https://www.atlys.com/{locale}/apply-visa?destination=TH&step=passport&auth=guest cold-navigates straight to the application form. It works, but without the full departure/arrival/purpose/action_source query params it often shows a perpetual loading animation ("Knocking on embassy doors…", "Smoothing the journey ahead"). If it spins, fall back to the landing-page CTA flow in step 3.

Site-Specific Gotchas

  • READ-ONLY. The form's terminal action is "Submit application" / "Proceed to checkout". Never submit, never pay, never upload a passport image.
  • Bare HTTP fetch is Cloudflare-blocked. Any curl/fetch of an atlys.com URL returns a 308 Permanent Redirect Cloudflare challenge page, not content. A full browserless_agent browser session passes — in testing no residential proxy and no extra stealth were required. If a session ever does get challenged, add a { "method": "solve", "params": { "type": "cloudflare" } } and/or a residential proxy (the homepage anti-bot probe flagged Cloudflare and likelyNeedsProxies).
  • The accessibility tree is huge (10k+ nodes). A full snapshot can be very large. Prefer the text method on body for content and only snapshot when you need a clickable ref. Re-snapshot after every navigation — refs invalidate.
  • Geo-driven locale + pricing. /apply-thailand-visa redirects to a locale page based on the session's IP, and nationality determines the product and price. Force a nationality via the locale URL prefix (/en-US/, /en-IN/, /en-GB/, /en-PH/ …) or the in-page nationality selector (a flag button that opens a "Search for a country" textbox + full country list).
  • It's a TDAC, not a sticker visa, for visa-exempt nationalities. Thailand allows visa-free short tourist stays (~60 days for US/many others), but the TDAC arrival card is mandatory (since May 1, 2025). Atlys's "Thailand visa" product for these nationalities is the TDAC. Nationalities that genuinely need a visa will see a different product/price.
  • Price is split into two charges. "Pay Now" is a small government fee (≈$1) and "Pay on approval" is the Atlys processing fee (≈$60), totaling ≈$61 for a US passport. Report both legs, not just the total.
  • The apply page loads behind an animation. After clicking the CTA, the /apply-visa route renders a multi-second loading sequence before the form appears — wait ~6s (waitForTimeout 6000) before snapshot.
  • snapshot output is verbose but functional here; clicking the travel-date option button before the CTA is what actually navigates to the form (the CTA alone, with no date chosen, stays on the landing page).
  • No login wall blocks reaching the form — the entry uses auth=guest. Account creation/email is only requested deeper in the flow (and is past the read-only stop point).

Expected Output

{
  "success": true,
  "provider": "atlys.com",
  "destination": "Thailand",
  "product": "TDAC (Thailand Digital Arrival Card)",
  "nationality_detected": "United States",
  "visa_details": {
    "type": "TDAC",
    "length_of_stay_days": 30,
    "validity_days": 90,
    "entry": "Single"
  },
  "pricing": {
    "pay_now": "$1 (Government Fees)",
    "pay_on_approval": "$60 (Processing Fee)",
    "total": "$61",
    "currency": "USD"
  },
  "processing_time": "Guaranteed ~20 minutes; delivered before travel date",
  "required_documents": [
    "Passport (front page upload — OCR auto-fill)",
    "Arrival flight number",
    "Hotel name and city in Thailand",
    "Email (contact)"
  ],
  "application_form_sections": [
    "Personal Information",
    "Arrival Flight Details",
    "Return Flight Details",
    "Hotel Details",
    "Contact Details"
  ],
  "application_entry_url": "https://www.atlys.com/en-US/apply-visa?destination=TH&step=passport&auth=guest",
  "stopped_at": "application form entry (pre-payment, read-only)",
  "error_reasoning": null
}

Failure / blocked shape:

{
  "success": false,
  "provider": "atlys.com",
  "destination": "Thailand",
  "stopped_at": "blocked before application form",
  "error_reasoning": "Cloudflare challenge / page did not render the apply widget after retries"
}

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=atlys.com&task=apply-thailand-visa-dwl0xi