Skip to main content
This guide covers the file formats we support and requirements for resume URLs.

Supported Resume Formats

We use Gotenberg for document conversion, supporting a wide range of formats:

Document Formats

FormatExtensionNotes
PDF.pdfPreferred - no conversion needed
Microsoft Word.doc, .docx, .docmFully supported
OpenDocument.odtFull support
Rich Text.rtfFull support
Plain Text.txtFull support
Apple Pages.pagesFull support
HTML.html, .htmFull support

Image Formats

FormatExtensionNotes
PNG.pngOCR applied
JPEG.jpg, .jpegOCR applied
TIFF.tiffOCR applied
BMP.bmpOCR applied
PDF is preferred as it requires no conversion and preserves formatting best. However, .docx and .doc are fully supported and commonly used.

File Size Limits

LimitValue
Maximum file size10 MB
Maximum pages50 pages
Files exceeding these limits will fail with RESUME_TOO_LARGE error.

Pre-signed URL Requirements

The resumeUrl must be a pre-signed URL that allows unauthenticated access.

Requirements

HTTPS - HTTP URLs are rejected
Valid for 2+ hours - We recommend 24 hours for safety
Publicly accessible - No authentication required
Direct download - Should return the file, not a redirect to a login page

URL Expiry

SettingRecommendation
Minimum expiry2 hours
Recommended expiry24 hours
Typical processing timeUnder 5 minutes
We recommend 24-hour expiry because retry scenarios may delay processing. Longer expiry has no downside.

Generating Pre-signed URLs

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: 86400 // 24 hours in seconds
  });
}

Common Issues

Cause: The pre-signed URL expired before we could fetch it.Solution: Generate URLs with longer expiry (24 hours recommended).
Cause: The URL requires authentication or the signature is invalid.Solutions:
  • Verify the pre-signing credentials are correct
  • Check bucket/blob permissions allow public read with signed URLs
  • Test the URL in an incognito browser window
Cause: Network issues between Nova and your storage provider.Solutions:
  • Ensure your storage is in a supported region
  • Check for firewall rules blocking our IP ranges
  • Retry the request - may be transient
Cause: The PDF file is encrypted or password-protected.Details: We detect encryption by looking for /Encrypt markers, security handler flags, and other encryption indicators in the PDF structure.Solutions:
  • Request an unprotected version of the resume from the candidate
  • Remove password protection before uploading (if you have the password)
  • This is not retryable - the file must be replaced
Cause: The PDF file is corrupted or malformed. This can happen when:
  • The file is missing the %PDF- header (not a valid PDF)
  • The file is missing the %%EOF end marker (truncated/incomplete)
  • The URL returned an error page instead of the actual file (e.g., HTML error page, XML access denied response)
Solutions:
  • Verify the file opens correctly in a PDF reader locally
  • Re-upload the file if it was corrupted during transfer
  • Check that your pre-signed URL returns the actual file, not an error page
  • If the storage returns HTML/XML errors, check bucket permissions
Cause: File extension doesn’t match actual content, or format is not supported.Solutions:
  • Verify the file opens correctly locally
  • Check the file extension matches the content
  • Convert to PDF if using an unusual format
Cause: The file appears empty or contains only images without text.Solutions:
  • Verify the file isn’t corrupted
  • For image-only PDFs, we apply OCR but results may be poor
  • Consider asking candidates to upload text-based formats

Best Practices

Accept PDF primarily

Encourage candidates to upload PDF for best results

Validate before upload

Check file size and format on your end before storing

Use long URL expiry

24 hours prevents retry failures from expired URLs

Test your URL generation

Verify URLs work in incognito mode before integration