> ## Documentation Index
> Fetch the complete documentation index at: https://nova.dweet.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Supported Formats

> Resume input formats, size limits, and URL requirements

## File URL (`type: "url"`)

Pass a public HTTPS URL to a resume file.

| Format         | Extension | Content-Type                                                              |
| -------------- | --------- | ------------------------------------------------------------------------- |
| PDF            | `.pdf`    | `application/pdf`                                                         |
| Microsoft Word | `.doc`    | `application/msword`                                                      |
| Microsoft Word | `.docx`   | `application/vnd.openxmlformats-officedocument.wordprocessingml.document` |

```json theme={null}
{
  "resume": {
    "type": "url",
    "url": "https://storage.example.com/resumes/abc123.pdf"
  }
}
```

## Inline text (`type: "text"`)

Pass resume content directly as plain text or markdown. Min 50 characters, max 100 KB.

```json theme={null}
{
  "resume": {
    "type": "text",
    "content": "# Jane Smith\n\n## Experience\nSenior Backend Engineer at Acme Corp (2020-present)\n- Led migration to Node.js microservices\n- Reduced API latency by 40%\n\n## Skills\nTypeScript, Node.js, PostgreSQL, AWS"
  }
}
```

<Tip>
  Markdown preserves resume structure (headings, lists, sections) which boosts scoring accuracy.
</Tip>

## Size limits

| Input type   | Max size |
| ------------ | -------- |
| File URL     | 50 MB    |
| Inline text  | 100 KB   |
| Request body | 4.5 MB   |

## URL requirements

<Check>HTTPS</Check>
<Check>Publicly accessible without authentication</Check>
<Check>Direct file download</Check>

For scoring submissions, Nova downloads the resume URL during the submission request, validates the file, and stores it before creating a scoring job. Set URL expiry long enough for the request to complete; 1 hour is recommended.

## Generating pre-signed URLs

<Tabs>
  <Tab title="AWS S3">
    ```javascript theme={null}
    import { GetObjectCommand, S3Client } from '@aws-sdk/client-s3';
    import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

    const s3 = new S3Client({ region: 'us-east-1' });

    async function getResumeUrl(key) {
      const command = new GetObjectCommand({
        Bucket: 'your-resume-bucket',
        Key: key,
      });

      return getSignedUrl(s3, command, {
        expiresIn: 3600 // 1 hour in seconds
      });
    }
    ```
  </Tab>

  <Tab title="Google Cloud Storage">
    ```javascript theme={null}
    const { Storage } = require('@google-cloud/storage');
    const storage = new Storage();

    async function getResumeUrl(filename) {
      const bucket = storage.bucket('your-resume-bucket');
      const file = bucket.file(filename);

      const [url] = await file.getSignedUrl({
        action: 'read',
        expires: Date.now() + 60 * 60 * 1000, // 1 hour
      });

      return url;
    }
    ```
  </Tab>

  <Tab title="Azure Blob Storage">
    ```javascript theme={null}
    const {
      BlobServiceClient,
      generateBlobSASQueryParameters,
      BlobSASPermissions,
    } = require('@azure/storage-blob');

    async function getResumeUrl(containerName, blobName) {
      const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString);
      const containerClient = blobServiceClient.getContainerClient(containerName);
      const blobClient = containerClient.getBlobClient(blobName);

      const startsOn = new Date();
      const expiresOn = new Date(startsOn);
      expiresOn.setHours(expiresOn.getHours() + 1);

      const sasToken = generateBlobSASQueryParameters({
        containerName,
        blobName,
        permissions: BlobSASPermissions.parse('r'),
        startsOn,
        expiresOn,
      }, sharedKeyCredential).toString();

      return `${blobClient.url}?${sasToken}`;
    }
    ```
  </Tab>
</Tabs>

## Common issues

<AccordionGroup>
  <Accordion title="RESUME_FETCH_FAILED">
    URL expired, not publicly accessible, or storage returned a non-2xx response. Test the URL in an incognito browser window.
  </Accordion>

  <Accordion title="Unsupported file type">
    The response Content-Type isn't PDF, DOC, or DOCX. If your storage returns `application/octet-stream`, configure correct Content-Type metadata.
  </Accordion>

  <Accordion title="RESUME_TOO_LARGE">
    File exceeds 50 MB or inline text exceeds 100 KB.
  </Accordion>

  <Accordion title="RESUME_ENCRYPTED">
    PDF is password-protected. Provide an unprotected version.
  </Accordion>

  <Accordion title="RESUME_CORRUPTED">
    PDF bytes are malformed or incomplete, such as a truncated file missing the final EOF marker. Nova may also reject PDFs whose structural line endings are escaped, with `rejectedApplications[].error.reason` set to `escaped_pdf_line_endings` in batch intake responses. Submit a corrected PDF.
  </Accordion>

  <Accordion title="RESUME_PARSE_FAILED">
    Nova could not process a structurally valid resume document. Check the URL returns the actual file and contact support if the file opens normally.
  </Accordion>
</AccordionGroup>
