Skip to main content

What is the Vimeo Connector?

The Vimeo Connector is a production-grade integration that automatically imports video content from Vimeo into CustomGPT.ai's knowledge base, making video transcripts searchable through AI-powered conversations.

The Problem It Solves​

Challenge: Video content is difficult to search and reference. Users can't easily find specific information buried in hours of video without manually watching everything.

Traditional Solutions:

  • Manual transcription (time-consuming, expensive)
  • Watching videos to take notes (slow, incomplete)
  • Video hosting platforms' search (limited to titles/descriptions, not content)

The Vimeo Connector Solution:

  1. Automatically extract native transcripts from Vimeo videos
  2. Import metadata (titles, descriptions, tags, thumbnails)
  3. Index everything in CustomGPT.ai's RAG (Retrieval-Augmented Generation) pipeline
  4. Enable AI search across video content via natural language queries

Real-World Example​

Before: A company has 500 training videos on Vimeo. An employee wants to find information about "password reset procedures" but doesn't know which video contains it. They must:

  • Manually scan through video titles/descriptions
  • Watch videos one by one to find the right section
  • Take 30+ minutes to find a 2-minute explanation

After: The company uses the Vimeo Connector to import all training videos into CustomGPT.ai. The employee asks:

"How do I reset a user's password?"

CustomGPT.ai responds:

"To reset a user's password, go to Admin Panel β†’ Users β†’ Select User β†’ Reset Password button. This is covered in the 'User Management Tutorial' video at timestamp 12:35."

Source: User Management Tutorial

Result: Instant answer with source citation in 5 seconds instead of 30+ minutes of searching.

Key Features​

1. Five Vimeo URL Types Supported​

Import content from any Vimeo organization structure:

User Profiles β€” All videos from a Vimeo account

https://vimeo.com/user230805735

Showcases β€” Curated collections of videos

https://vimeo.com/showcase/11708791

Albums β€” Organized video albums

https://vimeo.com/user230805735/albums

Collections β€” User-created collections (may include third-party videos)

https://vimeo.com/user230805735/collections

Individual Videos β€” Single video imports

https://vimeo.com/987654321

2. Native Transcript Extraction​

What It Does: Fetches transcripts that video owners uploaded to Vimeo (VTT or SRT format).

How It Works:

  • Calls Vimeo's /videos/{id}/texttracks API
  • Downloads transcript files
  • Parses VTT/SRT, stripping timing codes
  • Outputs clean plain text

What It Doesn't Do: Generate transcripts from audio. If a video doesn't have a native Vimeo transcript, metadata is imported but transcript field is empty.

Why This Matters: Native transcripts are high-quality (human-reviewed or professionally generated), unlike auto-generated captions which may have errors.

3. Smart Sync Modes​

Auto Mode (Recommended):

  • First import: Full Sync (fetch all content)
  • Repeat import: Incremental Sync (fetch only changes)
  • User doesn't need to remember which mode to use

Full Sync:

  • Always fetches all videos
  • Compares against previous data to mark Added/Updated/Unchanged/Deleted
  • Use when you want a complete refresh

Incremental Sync:

  • Only fetches new or modified videos (detected via checksum comparison)
  • 10x faster for repeat imports
  • Requires previous import to exist

4. Token Pool Load Balancing (6x Capacity)​

Problem: Vimeo limits API usage to 600 calls per 10 minutes per token.

Solution: Distribute calls across 6 tokens β†’ 3600 calls per 10 minutes.

Features:

  • Round-robin token selection
  • Automatic failover on rate limits (429 errors)
  • Health tracking (HEALTHY β†’ COOLDOWN β†’ auto-recovery)
  • Zero downtime (if 5 tokens fail, 1 still works)

Impact: Sync 500 videos in 10 minutes instead of 60 minutes.

See How to Set Up Token Pool for details.

5. Full Observability​

Metrics (Prometheus):

  • Requests per second
  • Error rates (4xx, 5xx)
  • Latency percentiles (p50, p95, p99)
  • Token health states
  • Sync job progress

Tracing (OpenTelemetry/Jaeger):

  • Distributed traces across API calls
  • Span annotations showing which video is being processed
  • Helps diagnose slow requests

Logging (Structlog):

  • Structured JSON logs
  • Correlation IDs for tracing requests
  • PII redaction (emails, phone numbers)
  • Secret masking (API tokens logged as xxxx...yyyy)

Dashboards (Grafana):

  • Real-time sync progress
  • Token pool health
  • API performance metrics

Architecture Overview​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ User Dashboard β”‚
β”‚ (React/Next.js Frontend) β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ URL Input │───▢│ Sync Mode │───▢│ Progress β”‚ β”‚
β”‚ β”‚ (5 types) β”‚ β”‚ (Auto/Full/ β”‚ β”‚ (Real-time) β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ Incremental)β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ HTTPS REST API
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Backend API Server β”‚
β”‚ (FastAPI + Python 3.11) β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Sync Engine β”‚ β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ β”‚ URL Parser │─▢│ API Client │─▢│ Transcript β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Extractor β”‚ β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ β”‚ Token Pool (6 tokens, round-robin failover) β”‚ β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ HTTP Client Layer β”‚ β”‚
β”‚ β”‚ - Rate Limiting (600 calls/10min per token) β”‚ β”‚
β”‚ β”‚ - Exponential Backoff (retries on network errors) β”‚ β”‚
β”‚ β”‚ - Circuit Breaker (stops requests on sustained failures)β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ HTTPS
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Vimeo API β”‚
β”‚ (api.vimeo.com) β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Endpoints Used: β”‚ β”‚
β”‚ β”‚ - GET /users/{id} β”‚ β”‚
β”‚ β”‚ - GET /users/{id}/videos β”‚ β”‚
β”‚ β”‚ - GET /albums/{id}/videos β”‚ β”‚
β”‚ β”‚ - GET /showcases/{id}/videos β”‚ β”‚
β”‚ β”‚ - GET /videos/{id}/texttracks β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Stored Data β”‚
β”‚ β”‚
β”‚ /data/videos/ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”œβ”€ {video_id}.json β”‚ Video metadata (JSON) β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ /data/transcripts/ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”œβ”€ {video_id}.txt β”‚ Transcript plain text β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ /data/checksums/ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”œβ”€ {video_id}.hash β”‚ SHA256 checksums β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

How It Fits Into CustomGPT.ai​

The Vimeo Connector is a data ingestion pipeline for CustomGPT.ai's RAG (Retrieval-Augmented Generation) system.

RAG Pipeline Steps:

  1. Data Source β€” Vimeo videos with transcripts
  2. Ingestion β€” Vimeo Connector imports and structures the data
  3. Indexing β€” CustomGPT.ai embeds transcripts using OpenAI embeddings
  4. Storage β€” Vector database (Pinecone/Weaviate) stores embeddings
  5. Retrieval β€” User asks a question, system finds relevant transcript chunks
  6. Generation β€” LLM (GPT-4) generates an answer using retrieved context
  7. Citation β€” Answer includes source video URL and timestamp

Example Flow:

User Query β†’ CustomGPT.ai RAG System β†’ Vector Search β†’ Relevant Transcript Chunks β†’ GPT-4 β†’ Answer with Source Citation

Who Should Use This?​

Primary Use Cases​

Training & Education:

  • Import training video libraries
  • Make course content searchable
  • Enable students to find specific topics instantly

Customer Support:

  • Import product tutorial videos
  • Support agents can query video knowledge base
  • Reduce time to find relevant information

Internal Documentation:

  • Import company all-hands meetings, product demos
  • Searchable video archive for employees
  • "What did the CEO say about Q3 goals?"

Content Management:

  • Large Vimeo libraries (100+ videos)
  • Need to organize and search content
  • Want AI-powered discovery instead of manual tagging

Who Should Not Use This (Yet)​

Auto-Transcript Generation Needed:

  • If your videos don't have native Vimeo transcripts
  • Workaround: Generate transcripts externally (Whisper, Rev.com) and upload to Vimeo first

Real-Time Syncing Required:

  • The connector is designed for periodic batch imports (e.g., nightly syncs)
  • Not designed for real-time syncing (sub-second latency)

Other Video Platforms:

  • Currently supports Vimeo only
  • YouTube, Wistia, etc. not supported
  • Future: Connector architecture is modular and can be extended

Deployment Options​

URL: https://vimeo.trustedgpt.io

Advantages:

  • No setup required
  • Automatic updates
  • Managed by CustomGPT.ai team

Disadvantages:

  • Token Pool not available (single-tenant rate limits)
  • Cannot customize backend configuration

Deployment Methods:

  • Docker Compose (simplest)
  • Kubernetes (scalable)
  • Heroku/AWS/GCP (managed PaaS)

Advantages:

  • Full control over configuration
  • Token Pool available (6x capacity)
  • Can customize observability stack

Disadvantages:

  • Requires infrastructure management
  • Responsible for updates and monitoring

See the GitHub repository for deployment instructions.

Performance Characteristics​

Throughput​

ConfigurationVideos/Minute500-Video Sync Time
Single Token~10 videos/min50 minutes
Token Pool (6 tokens)~60 videos/min8 minutes

Variables:

  • Transcript length (longer transcripts take more time to download)
  • Network latency to Vimeo
  • Backend server resources (CPU, RAM)

Scalability​

Horizontal Scaling:

  • Deploy multiple backend instances
  • Use load balancer to distribute sync jobs
  • Each instance has its own token pool

Vertical Scaling:

  • More CPU β†’ Faster transcript parsing
  • More RAM β†’ Handle larger transcripts (60+ min videos)
  • More tokens β†’ Higher API capacity

Tested Limits:

  • Single Instance: 500 videos in 8 minutes (with Token Pool)
  • Concurrency: 3 simultaneous sync jobs per instance

Security & Privacy​

API Token Security:

  • Tokens stored in environment variables (not in code)
  • Tokens masked in logs (xxxx...yyyy format)
  • .env files gitignored

PII Redaction:

  • Emails automatically redacted in logs: [REDACTED_EMAIL]
  • Phone numbers redacted: [REDACTED_PHONE]

Secrets Management:

  • Production deployments should use AWS Secrets Manager, HashiCorp Vault, etc.
  • Never commit .env or .env.tokens.json to version control

Data Privacy:

  • Transcripts are stored locally (not sent to third parties except CustomGPT.ai)
  • Video metadata follows Vimeo's privacy settings (public/private respected)

Limitations​

Vimeo-Only:

  • Does not support YouTube, Wistia, or other platforms
  • Workaround: Download videos and re-upload to Vimeo (if licensing allows)

Native Transcripts Only:

  • Does not generate transcripts from audio
  • Videos without native Vimeo transcripts are imported as metadata-only
  • Workaround: Generate transcripts externally and upload to Vimeo

Rate Limits:

  • Single token: 600 calls/10min (Vimeo's API limit)
  • Token Pool: 3600 calls/10min (6 tokens)
  • Cannot exceed Vimeo's API limits without official partnership

No Real-Time Sync:

  • Designed for periodic batch imports (hourly, daily)
  • Not suitable for sub-second real-time syncing

Manual Token Management:

  • FAILED tokens require manual regeneration and config update
  • No automatic token refresh (OAuth not yet implemented)

Future Roadmap​

Planned Features:

  1. OAuth Flow β€” Proper OAuth for customer tokens (eliminates manual token management)
  2. YouTube Support β€” Extend to support YouTube video imports
  3. Auto-Transcript Generation β€” Integrate Whisper for videos without native transcripts
  4. Real-Time Webhooks β€” Subscribe to Vimeo events for instant syncing
  5. Advanced Chunking β€” Timestamp-aware chunking for better search precision
  6. Multilingual Support β€” Support transcripts in 50+ languages

Long-Term Vision:

  • Universal video connector (Vimeo, YouTube, Wistia, Loom, etc.)
  • One-click integration with all major video platforms
  • AI-powered video content discovery across entire organization

Next Steps​

For End Users:

For Administrators:

For Developers:

You're now ready to make your Vimeo video library searchable with AI!