iawia002/lux · error

invalid URL format

Error message

invalid URL format

What it means

The Threads extractor parses the URL path and requires a poster segment and a shortCode segment (it reads paths[1] and paths[3]). If splitting the path on '/' yields fewer than 3 parts, the URL does not look like a post permalink and this error is returned. Beware an off-by-one: the guard checks len(paths) < 3 but the code then reads paths[3], so a 3-part path (e.g. /@user/x) passes the guard and panics with index out of range instead.

Source

Thrown at extractors/threads/threads.go:56

		},
	}
}

type media struct {
	URL  string
	Type extractors.DataType
}

// Extract is the main function to extract the data.
func (e *extractor) Extract(url string, option extractors.Options) ([]*extractors.Data, error) {
	URL, err := netURL.Parse(url)
	if err != nil {
		return nil, errors.WithStack(err)
	}

	paths := strings.Split(URL.Path, "/")
	if len(paths) < 3 {
		return nil, errors.New("invalid URL format")
	}

	poster := paths[1]
	shortCode := paths[3]

	medias := make([]media, 0)

	title := fmt.Sprintf("Threads %s - %s", poster, shortCode)

	collector := colly.NewCollector()
	collector.SetClient(e.client)

	// case single image or video
	collector.OnHTML("div.SingleInnerMediaContainer", func(e *colly.HTMLElement) {
		if src := e.ChildAttr("img", "src"); src != "" {
			medias = append(medias, media{
				URL:  src,
				Type: extractors.DataTypeImage,

View on GitHub (pinned to dd00f6d258)

Solutions

  1. Use the full post permalink form: https://www.threads.net/@user/post/SHORTCODE
  2. Fix the guard in extractors/threads/threads.go to len(paths) < 4 so a 3-part path fails with this error instead of panicking
  3. Validate the URL shape on the caller side before invoking Extract
  4. Check for stray trailing slashes or query fragments that alter the path split

Example fix

// before
paths := strings.Split(URL.Path, "/")
if len(paths) < 3 {
    return nil, errors.New("invalid URL format")
}
poster := paths[1]
shortCode := paths[3]

// after
paths := strings.Split(URL.Path, "/")
if len(paths) < 4 {
    return nil, errors.New("invalid URL format: expected /@user/post/shortCode")
}
poster := paths[1]
shortCode := paths[3]
Defensive patterns

Strategy: validation

Validate before calling

func isThreadsPostURL(raw string) bool {
    u, err := url.Parse(raw)
    if err != nil || u.Host != "www.threads.net" {
        return false
    }
    parts := strings.Split(u.Path, "/")
    return len(parts) >= 4 && strings.HasPrefix(parts[1], "@") // /@user/post/shortCode
}

Try / catch

if !isThreadsPostURL(url) {
    return fmt.Errorf("not a threads post permalink: %s", url)
}
_, err := threads.Extract(url, opts) // still keep error handling for runtime failures

Prevention

When it happens

Trigger: Calling Extract with a profile URL like https://www.threads.net/@user (path '/@user' → 2 parts → this error), or with a 3-part path like /@user/replies which slips past the guard and crashes on paths[3]. Only full permalinks /@user/post/SHORTCODE (4 parts) work.

Common situations: Users paste a profile or search URL instead of a post permalink; scripts iterate over mixed Threads URLs; truncated share links missing the final segment.

Related errors


AI-assisted analysis of iawia002/lux@dd00f6d258 (2026-08-15). Data as JSON: /api/errors/8f6ae732e46a4ad2. Report an issue: GitHub.