firecrawl/firecrawl · warning · FirecrawlError

Failed to start LLMs.txt generation. No job ID returned.

Error message

Failed to start LLMs.txt generation. No job ID returned.

What it means

Thrown by generateLLMsText() (v1, deprecated) when the POST /v1/llmstxt start call returned success but the body has no `id`. Without a job id the SDK cannot poll, so it throws FirecrawlError 500. Indicates a malformed or stub response from a server that does not implement llmstxt.

Source

Thrown at apps/js-sdk/firecrawl/src/v1/index.ts:1954

  }

  /**
   * Generates LLMs.txt for a given URL and polls until completion.
   * @param url - The URL to generate LLMs.txt from.
   * @param params - Parameters for the LLMs.txt generation operation.
   * @returns The final generation results.
   * @deprecated /v1/llmstxt is deprecated and will not be replaced.
   */
  async generateLLMsText(url: string, params?: GenerateLLMsTextParams): Promise<GenerateLLMsTextStatusResponse | ErrorResponse> {
    try {
      const response = await this.asyncGenerateLLMsText(url, params);
      
      if (!response.success || 'error' in response) {
        return { success: false, error: 'error' in response ? response.error : 'Unknown error' };
      }

      if (!response.id) {
        throw new FirecrawlError(`Failed to start LLMs.txt generation. No job ID returned.`, 500);
      }

      const jobId = response.id;
      let generationStatus;

      while (true) {
        generationStatus = await this.checkGenerateLLMsTextStatus(jobId);
        
        if ('error' in generationStatus && !generationStatus.success) {
          return generationStatus;
        }

        if (generationStatus.status === "completed") {
          return generationStatus;
        }

        if (generationStatus.status === "failed") {
          throw new FirecrawlError(

View on GitHub (pinned to 656bffcc28)

Solutions

  1. Confirm the server implements /v1/llmstxt (curl it directly).
  2. Use asyncGenerateLLMsText() and inspect the raw response.
  3. Consider migrating off llmstxt entirely since the API is deprecated.
  4. Match SDK and server versions.

Example fix

// before
const r = await app.generateLLMsText('https://example.com');

// after: inspect the raw start response
const start = await app.asyncGenerateLLMsText('https://example.com');
if (!start.success || !('id' in start) || !start.id) {
  throw new Error(`no job id; raw=${JSON.stringify(start)}`);
}
Defensive patterns

Strategy: type-guard

Validate before calling

const start = await app.asyncGenerateLLMsText(url, params);
if (!start?.success || typeof (start as any).id !== 'string' || !(start as any).id) throw new Error('no id');

Type guard

function isLLMsTextStart(r: any): r is { success: true; id: string } {
  return r && r.success === true && typeof r.id === 'string' && r.id.length > 0;
}

Try / catch

try { await app.generateLLMsText(url); }
catch (e) { if (/No job ID returned/.test(e.message)) console.error('server did not return id — check llmstxt support'); }

Prevention

When it happens

Trigger: Self-hosted server without the /v1/llmstxt route; server older than the feature; gateway stripping fields; endpoint stub that returns { success: true } and nothing else.

Common situations: Self-hosted Firecrawl predating llmstxt; wrong apiUrl; SDK/server version skew; note the API itself is deprecated and will not be replaced.

Related errors


AI-assisted analysis of firecrawl/firecrawl@656bffcc28 (2026-08-12). Data as JSON: /api/errors/de386af3052b04ce. Report an issue: GitHub.