Skip to content

JobDiva to Ceipal Migration: The CTO's Technical Guide

Technical guide to migrating from JobDiva to Ceipal. Covers API constraints, data mapping, why CSV imports break resume search, and the only approach that preserves full relational data.

Raaj Raaj · · 19 min read
JobDiva to Ceipal Migration: The CTO's Technical Guide
TALK TO AN ENGINEER

Planning a migration?

Get a free 30-min call with our engineers. We'll review your setup and map out a custom migration plan — no obligation.

Schedule a free call
  • 1,200+ migrations completed
  • Zero downtime guaranteed
  • Transparent, fixed pricing
  • Project success responsibility
  • Post-migration support included

Migrating from JobDiva to Ceipal is a data-model translation problem wrapped in two sets of API constraints. JobDiva is a deeply integrated staffing platform — ATS, CRM, onboarding, VMS synchronization, financials, and reporting — connected through proprietary IDs and date-stamped activity records. Ceipal is an AI-driven ATS/VMS/HRIS with a flatter schema organized around Applicants, Job Postings, Submissions, Clients, Leads, and Placements. A CSV export from JobDiva will move rows but will silently break the Candidate → Submittal → Placement chain and leave every imported resume unsearchable in Ceipal's database.

If you need a fast decision: API-to-API migration is the only path that preserves full-fidelity relational data and ensures resume searchability in Ceipal. CSV imports bypass Ceipal's parsing engine. Unified APIs normalize away proprietary objects like Hotlists. The only approach that handles the complete data graph is direct extraction via JobDiva's REST API, transformation in a staging layer, and loading through Ceipal's API with resume files pushed through the parsing pipeline.

This guide covers the real API constraints on both sides, object-by-object mapping, every viable migration method with trade-offs, and the edge cases that cause silent data corruption. For a broader ATS migration framework, see 5 "Gotchas" in ATS Migration. To understand why data migration and implementation should be scoped separately, read Why Data Migration Isn't Implementation.

Why Staffing Firms Move from JobDiva to Ceipal

The migration drivers are consistent across the agencies we've worked with:

  • Cost structure. JobDiva's pricing is client-specific and historically premium. Ceipal's per-user model — starting lower per seat — appeals to mid-market staffing firms scaling recruiter headcount.
  • AI-powered sourcing. Ceipal's AI candidate matching and integrated resume parsing attract teams that want automated screening without third-party add-ons.
  • Unified ATS + HRIS + VMS. Ceipal bundles workforce management, timesheets, VMS, and onboarding into the same platform, reducing the tool sprawl that accumulates around JobDiva deployments. (jobdiva.com)
  • Modern API surface. While JobDiva offers a comprehensive API suite, Ceipal's developer portal and REST API feel more accessible for teams building custom integrations. (developer.ceipal.com)

None of this matters if the migration corrupts your candidate database. The rest of this guide focuses on preventing that.

JobDiva vs. Ceipal: Data Model and Object Mapping

The structural gap between these two systems is where migration projects fail. Here is the object-level translation:

JobDiva Object Ceipal Equivalent Key Differences
Candidates Applicants Both store contact info, skills, resumes. JobDiva uses candidateId; Ceipal uses internal applicant IDs. Ceipal's Create Applicant endpoint accepts resume files for parsing.
Jobs / Job Orders Job Postings JobDiva jobs carry extensive custom fields via userFieldsName. Ceipal job postings have a more fixed schema with master-data-driven picklists (Job Types, Job Categories, Employment Types).
Submittals Submissions The Candidate → Job linkage. JobDiva submittals include interview schedules, hire activity, and pay rates. Ceipal submissions are lighter — check which status fields map and which get dropped.
Hotlists Talent Bench JobDiva Hotlists are curated candidate lists for sales/recruiter workflows. Ceipal's Talent Bench is the closest equivalent but has different grouping semantics. There is no first-class Hotlist object in Ceipal's public API. (developer.ceipal.com)
Contacts Client Contacts JobDiva contacts are standalone objects linked to accounts. Ceipal nests contacts under Clients.
Companies / Accounts Clients Direct mapping, but Ceipal Clients carry fixed categories and statuses from master data.
Leads Leads Both systems track sales leads, but field structures differ significantly.
Placements Placements Both track the post-hire relationship. Pay rate structures and billing fields rarely map 1:1.
Notes / Activities Notes (via Applicant Details) JobDiva candidate notes include recruiter ID, action type, and linked job references. Ceipal's note structure is flatter.
User-Defined Fields Limited custom fields JobDiva's user-defined fields are highly flexible. Ceipal's customization is more constrained — expect data loss or field consolidation here.
Warning

Ceipal does not support true custom objects. Any proprietary data structures you've built in JobDiva — custom screening templates, reference check forms, attribute lists — will need to be flattened into existing Ceipal fields or stored as structured notes. Ceipal does support layered conditional custom fields and attachment-type custom fields (referenced in release notes), and a Custom API surface for additional fields, but this is not the same thing as an open-ended custom-object model. Plan for this before writing any migration code. (developer.ceipal.com)

Field-level mapping rules matter as much as object mapping:

  • IDs: Never overwrite source IDs with target-generated IDs. Store every legacy JobDiva primary key in Ceipal as an immutable custom field or external reference. Without that crosswalk, retries, validation, and rollback become much harder.
  • Picklists: Build explicit mapping tables for status, source, job type, employment type, work authorization, and industry. Values that don't match Ceipal's picklists will be silently rejected or defaulted.
  • Dates: Normalize timezone assumptions before load.
  • Multi-value text: Split skills, certifications, and tag-like fields deterministically. Ceipal may use structured skill tags versus free-text.
  • Nulls: Decide whether blank means unknown, intentionally empty, or not applicable.
  • Attachments: Separate binary handling from row handling — resumes need to go through the parsing path.

The CSV Trap: Why Resumes Become Unsearchable

The most common first instinct — export CSVs from JobDiva, import into Ceipal — fails in a way that's invisible until recruiters try to search.

Resumes imported via standard CSV bypass Ceipal's parsing engine. The candidate record gets created, but the resume content isn't indexed. Recruiters searching by keyword, skill, or experience get zero hits on migrated candidates. Ceipal's own resume parsing content says parsed resumes become easy to search by keywords and phrases, and Ceipal has invested in bulk parsing features across the product. (ceipal.com)

This happens because Ceipal's resume parsing pipeline — which extracts skills, experience duration, education, and other structured data from uploaded documents — only triggers when resumes are submitted through specific ingestion paths: the UI, job board integrations, or the API's applicant creation endpoint with an attached file. A CSV row with a filename reference doesn't trigger parsing.

For an agency with 500,000 historical candidates, manually opening and re-parsing every single resume is impossible.

Danger

The CSV Trap: Data imported from CSV files into Ceipal cannot be searched by keyword. You must upload resumes programmatically through Ceipal's applicant creation or resume upload API to trigger the parsing engine and enable full-text search. This is slower per record but is the only way to guarantee searchability.

CSV is not useless for everything. It works for low-risk foundation data such as companies, contacts, and lookup tables. But for candidate records where recruiters depend on resume search on day one, CSV-only loads are unsafe. For a deeper analysis, see Using CSVs for SaaS Data Migrations: Pros and Cons.

Extracting Data from JobDiva: API Constraints and Date Chunking

JobDiva's REST API lives at api.jobdiva.com and authenticates via Client ID plus API username and password credentials. The extraction constraints that shape every migration script:

Mandatory date-range parameters. The key extraction endpoints — Get Candidate Application Records, Get New and Updated Job Records, Get New Updated Submittal Interview Hire Activity Records — all require fromDate and toDate as mandatory query parameters in MM/dd/yyyy HH:mm:ss format. You cannot pull "all candidates" in a single call. Your migration script must chunk historical data into date windows. (developers.getknit.dev)

If your agency has 10 years of history, your extraction architecture must programmatically iterate through hundreds of date chunks, handling pagination within each chunk. If a single chunk times out or fails, your script must know exactly where to resume to prevent duplicate extraction or data loss.

# Pseudocode: date-chunked extraction from JobDiva
import datetime
 
def extract_candidates(session, start_date, end_date, chunk_days=30):
    current = start_date
    all_records = []
    while current < end_date:
        chunk_end = min(current + datetime.timedelta(days=chunk_days), end_date)
        page = 1
        while True:
            resp = session.get(
                "https://api.jobdiva.com/apiv2/jobdiva/getCandidateApplicationRecords",
                params={
                    "fromDate": current.strftime("%m/%d/%Y %H:%M:%S"),
                    "toDate": chunk_end.strftime("%m/%d/%Y %H:%M:%S"),
                    "pageNumber": page,
                    "pageSize": 100
                }
            )
            records = resp.json()
            if not records:
                break
            all_records.extend(records)
            page += 1
        current = chunk_end
    return all_records

Pagination. All list endpoints support pageNumber and pageSize. There's no cursor-based pagination — you're working with offset-based pages, which means you need to handle the possibility of records shifting between pages during long-running extractions. Consider using overlapping extraction windows plus ID-based dedupe at the staging layer to protect against boundary loss around timestamp edges.

Rate limiting. JobDiva imposes request-rate restrictions, though exact limits aren't publicly documented. Build in exponential backoff and respect 429 or 503 responses.

User-defined fields. To extract custom field data, you must pass field names via the userFieldsName parameter. If you don't know the exact field names, you'll get default fields only — silently losing custom data.

Loading Data into Ceipal: Rate Limits and Token Expiration

Ceipal's API uses Bearer token authentication with a critical lifecycle constraint: the access token expires after approximately 1 hour, and the refresh token is valid for 7 days. If your migration script doesn't implement proactive token refresh logic, it will fail mid-run with 401 Unauthorized errors — and depending on your error handling, you may not notice until the import is half-complete. (developer.ceipal.com)

# Pseudocode: Ceipal token management and applicant creation
import time, requests
 
class CeipalClient:
    def __init__(self, base_url, credentials):
        self.base_url = base_url
        self.credentials = credentials
        self.token = None
        self.refresh_token = None
        self.token_expiry = 0
 
    def authenticate(self):
        resp = requests.post(f"{self.base_url}/auth/token", data=self.credentials)
        data = resp.json()
        self.token = data["access_token"]
        self.refresh_token = data["refresh_token"]
        self.token_expiry = time.time() + 3500  # ~58 min buffer
 
    def ensure_token(self):
        if time.time() > self.token_expiry:
            resp = requests.post(
                f"{self.base_url}/auth/refresh",
                data={"refresh_token": self.refresh_token}
            )
            data = resp.json()
            self.token = data["access_token"]
            self.refresh_token = data.get("refresh_token", self.refresh_token)
            self.token_expiry = time.time() + 3500
 
    def create_applicant(self, payload, resume_file=None):
        self.ensure_token()
        headers = {"Authorization": f"Bearer {self.token}"}
        resp = requests.post(
            f"{self.base_url}/applicants",
            headers=headers,
            json=payload,
            files={"resume": resume_file} if resume_file else None
        )
        if resp.status_code == 429:
            time.sleep(60)  # Back off on rate limit
            return self.create_applicant(payload, resume_file)
        return resp.json()

Rate limiting. Ceipal enforces rate limits on all authenticated endpoints and returns 429 Too Many Requests when exceeded. List endpoints such as Applicants, Clients, and Submissions cap page size between 5 and 50 per request. The exact rate threshold depends on your account tier. Build in retry logic with increasing backoff intervals. (developer.ceipal.com)

Ceipal v2 specifics. If you're building against the v2 API surface, note that v2 requires /v2/ URLs with a trailing slash and camelCase parameters. Error handling also changed: v1 could return HTTP 200 on some errors, while v2 uses standard HTTP status codes. Resume and document downloads in v2 use a two-step resumeToken flow, and the token expires after 30 minutes — relevant for QA tools and any coexistence logic that fetches target-side documents. (developer.ceipal.com)

Master data dependencies. Before importing applicants or job postings, you need to pull Ceipal's master data — Applicant Statuses, Job Types, Employment Types, Industries, Work Authorizations, Countries, States — and build lookup maps. Field values that don't match Ceipal's picklists will be silently rejected or defaulted.

Info

v2 read vs. write coverage. Ceipal's public v2 docs are read-heavy. Some write flows may require v1 endpoints or Custom API access. Confirm your write paths during planning, not during production migration. (developer.ceipal.com)

Migration Methods Compared

There are five real options. None is universally best.

1. Native CSV export/import

How it works: Export JobDiva records through reports or bulk exports, normalize columns in a staging sheet, import the result into Ceipal's native import surfaces, then manually reconcile relationships and documents.

  • Pros: Fastest to start, lowest engineering cost.
  • Cons: Flattens relationships, breaks resume searchability, weak auditability, poor support for hotlists, submittals, and placements.
  • Best for: Small business, one-time cutover with limited history, few custom fields, and no dependency on submittal lineage or recruiter keyword search.
  • Complexity: Low.
  • Risk: Duplicate candidates, broken company and contact links, inconsistent picklists, and resume-search regression.

2. Direct API-to-API migration

How it works: Pull JobDiva candidates, jobs, and submittal/interview/hire activity in date windows; stage the data; transform fields and build crosswalk tables; push records into Ceipal while refreshing auth tokens and backing off on 429s.

  • Pros: Best balance of control and fidelity. Supports rehearsal runs. Preserves candidate-to-job-to-submission chains. Resumes uploaded via API trigger the parsing engine.
  • Cons: You must handle vendor-specific auth, pagination, windowing, and write-path differences.
  • Best for: Production migrations that need full relational fidelity, repeatable dry runs, or incremental delta sync before cutover.
  • Complexity: Medium to high.
  • Risk: Token expiry, throttling, partial writes, and gaps between documented public objects and your actual target configuration.

3. Unified APIs (Merge.dev, Unified.to)

How it works: These platforms aggregate multiple ATS endpoints into a single, normalized schema.

  • Pros: Lower engineering effort for ongoing sync use cases.
  • Cons: Normalization loses provider-specific objects. Because they normalize data to work across all ATS platforms, JobDiva-specific objects — Hotlists, detailed submittal workflows, custom attribute lists — are dropped or flattened unless the provider supports raw passthrough. Merge's docs describe Remote Data and Authenticated Passthrough for data that isn't part of the common model, and Unified markets raw passthrough alongside normalized objects. That's a feature, but it tells you the normalized model is not enough by itself for proprietary ATS workflows. (docs.merge.dev)
  • Best for: Ongoing bidirectional sync, not one-time historical migrations.
  • Complexity: Medium.
  • Risk: High risk of silent data loss from schema normalization.

4. Custom ETL pipeline

How it works: Extract from JobDiva into a staging database or object store, transform in code or SQL, maintain immutable raw snapshots and ID crosswalks, then load into Ceipal with controlled retries and validation.

  • Pros: Strongest audit trail, easiest replayability, best fit for complex transformations and phased migration.
  • Cons: Highest engineering effort, more infrastructure to operate, easy to overbuild.
  • Best for: Enterprise volumes, multi-wave cutovers, compliance-heavy QA, or when you also need an ongoing coexistence layer.
  • Complexity: High.
  • Risk: Scope creep, orchestration drift, and long-tail maintenance after go-live.

5. Middleware / iPaaS (Zapier, Make, Workato)

How it works: Use HTTP connectors or native connectors to call JobDiva and Ceipal, apply lightweight transforms, and push deltas between systems.

  • Pros: Fast to prototype, accessible to teams with light engineering support.
  • Cons: Poor fit for historical backfills, weak transactionality across multi-object records, and still subject to upstream vendor limits. Typically CSV-based triggers that don't handle resume parsing.
  • Best for: Post-migration syncs, low-volume automations, and small operational handoffs.
  • Complexity: Medium.
  • Risk: Silent partial writes, hard-to-debug failures, and task-volume cost blowups.

Comparison table

Method Historical Fidelity Resume Search Ongoing Sync Scale Complexity
CSV export/import ❌ Flat files lose linkages ❌ Bypasses parser No Small Low
Direct API-to-API ✅ Full control ✅ When resumes uploaded via API Yes Mid to enterprise Medium-High
Unified API ⚠️ Normalized schema loses proprietary objects Depends on implementation Yes Varies Medium
Custom ETL ✅ Very high ✅ When resumes re-parsed Yes Enterprise High
Middleware / iPaaS ❌ Poor for backfill ❌ Typically CSV-based Yes Small ongoing sync Medium

Recommendations by scenario

  • < 5,000 candidates, no custom fields: CSV export may work for basic records. You'll still need to re-upload resumes through Ceipal's UI or API to enable search.
  • Small business, but recruiter search must work immediately: Skip CSV-only candidate migration. Use API or a managed migration service for resumes.
  • Enterprise (50K+ candidates), complex submittals: API-to-API or custom ETL with transformation logic. Budget 2–4 weeks of engineering time.
  • Ongoing bidirectional sync: Unified API or custom middleware — but accept that proprietary objects won't sync.
  • Need it done in days, not weeks: Managed migration service.

Pre-Migration Planning Checklist

Before extracting a single record:

  1. Audit your JobDiva data. Count Candidates, Jobs, Submittals, Placements, Contacts, Companies, Hotlists, and Notes. Identify the date range of your oldest records.
  2. Identify dead data. Candidates with no activity in 3+ years, closed jobs from expired contracts, duplicate records from resume harvesting. Migrating garbage into Ceipal wastes API calls and pollutes search results.
  3. Map user-defined fields. Export the full list of userFieldsName values from JobDiva. For each, decide: does it map to a Ceipal standard field, a Ceipal custom field, a note, or does it get dropped?
  4. Pull Ceipal master data. Fetch all picklist values (Applicant Statuses, Job Types, Employment Types, Industries, Work Authorizations, Countries, States) via the Master Data API endpoints and build transformation maps before writing migration logic.
  5. Choose your cutover strategy:
    • Big bang: Migrate everything over a weekend. Recruiters work in JobDiva on Friday, start in Ceipal on Monday. Simplest operationally but highest risk.
    • Phased: Migrate by data type or business unit. Allows validation between phases but increases coexistence complexity.
    • Incremental: Migrate historical data first, then run a delta sync for records modified between the initial extraction and go-live. Best for low downtime.
  6. Define your rollback plan. If Ceipal data is corrupt after import, what's your path back? Ensure JobDiva access is retained for at least 90 days post-migration.
Tip

Store every legacy JobDiva primary key in Ceipal as an immutable custom field or external reference. Without that crosswalk, retries, validation, and rollback become much harder.

Step-by-Step Migration Process

A reliable architecture follows this flow:

JobDiva API + reports

raw staging store

normalization + lookup mapping + ID crosswalks

Ceipal load layer

validation + UAT + delta sync

Phase 1: Extract from JobDiva

  1. Authenticate with Client ID + API credentials
  2. Extract master/reference data: Companies, Contacts
  3. Extract Candidates in date-range chunks with user-defined fields (pass userFieldsName parameter)
  4. Extract Job Orders in date-range chunks
  5. Extract Submittals with interview/hire activity records
  6. Extract Placements
  7. Download resume files for every active candidate
  8. Export Hotlist memberships

Phase 2: Transform

  1. Deduplicate candidates (email + name matching, phone normalization)
  2. Map JobDiva status values → Ceipal Applicant Status picklist
  3. Map job fields → Ceipal Job Posting schema, substituting master data IDs
  4. Build Candidate → Submittal → Placement relationship graph
  5. Convert user-defined fields to Ceipal-compatible structures
  6. Flag unmappable fields for manual review

Phase 3: Load into Ceipal

Load order matters because of dependency chains:

  1. Create Clients (Companies) first — these are dependency roots
  2. Create Client Contacts and Leads
  3. Create Job Postings, capturing Ceipal-assigned IDs
  4. Create Applicants with resume files attached (this triggers the parsing engine)
  5. Create Submissions linking Applicants ↔ Job Postings
  6. Create Interviews
  7. Create Placements
  8. Populate Talent Bench (Hotlist equivalents)
  9. Create Notes and upload remaining attachments

Every write operation should check whether the target record already exists. This lets you re-run failed batches without creating duplicates. Persist every source-to-target ID mapping immediately after a successful create. Log request body, response code, legacy ID, target ID, and retry count for every write. Keep a dead-letter queue for records that need manual remediation.

Phase 4: Validate

  1. Compare record counts: source vs. target for every object type
  2. Spot-check 5% of records for field-level accuracy
  3. Verify resume searchability: run keyword searches on migrated candidates
  4. Confirm submittal chains: pick 20 Submittals and trace Candidate → Job → Placement in Ceipal
  5. Run UAT with 2–3 recruiters on real workflow scenarios

Edge Cases and Failure Modes

Duplicate candidates. JobDiva's resume harvesting creates duplicates. If you import them all, Ceipal's deduplication may or may not catch them depending on configuration. Normalize phones and emails, then deduplicate during the transform phase.

Multi-value user-defined fields. JobDiva allows arrays in some UDFs. Ceipal custom fields are typically single-value. You'll need to concatenate or choose a primary value.

Attachment migration. Resume files are the priority, but JobDiva also stores cover letters, certificates, and reference documents. Ceipal's API may not have a dedicated attachment endpoint for all document types — test this early.

Submittal status mapping. JobDiva's submittal lifecycle (Submitted → Interview Scheduled → Interviewed → Offered → Hired → Placed) may not align 1:1 with Ceipal's Applicant Status list. Map statuses explicitly; don't rely on name matching.

Multi-level relationship dependencies. A single placement depends on client, client contact, job, applicant, submission, and interview lineage. If you load out of order, you will orphan history.

Hotlists and workflow-only entities. These are rarely first-class matches in the target. Ceipal exposes Talent Bench, tagging, and custom-field tools, so treat hotlists as a design decision, not a direct copy. (developer.ceipal.com)

API failures mid-migration. A 429 from Ceipal or a network timeout from JobDiva mid-batch means you need idempotent writes. Track which records have been successfully created (source ID → target ID map) so you can resume without duplicating.

Token expiration during long runs. A migration of 100K+ candidates will run for hours. If your token refresh logic has a bug, you'll discover it at record 40,000. Test the refresh cycle explicitly before starting production runs.

Missing or inconsistent source data. JobDiva's reporting surface is wide, but exported data is only as good as source hygiene. Null job owners, stale statuses, and free-text skills all need deterministic transforms.

For more ATS-specific edge cases, see 5 "Gotchas" in ATS Migration: Custom Fields, Integrations, and Compliance.

Validation and Testing

Do not stop at record counts.

Check Method Pass Criteria
Record counts Query both APIs, compare totals per object type ±0 variance
Field accuracy Sample 5% of records, compare field-by-field < 1% field-level error rate
Resume search Run 10 recruiter-realistic keyword searches in Ceipal All migrated candidates with matching skills appear
Relationship integrity Trace 20 Submittal → Candidate → Job chains 100% chain intact
Picklist mapping Review all status/type fields No "Unknown" or default values on records that had valid source data
UAT Recruiters run real workflows for 2 days No blockers reported
Info

A migration can pass QA and still fail operationally. The fastest way to catch that is recruiter-led UAT with real searches, real submission lookups, and real pipeline views — not static record review.

Post-Migration Tasks

Moving data does not rebuild operating logic.

  1. Rebuild automations. JobDiva workflow triggers don't transfer. Recreate email templates, submittal notifications, and interview scheduling rules in Ceipal.
  2. Reconfigure integrations. Job board connections, VMS integrations, email syncs — all need to be re-established in Ceipal.
  3. Recreate business rules. Any logic that was implicit in JobDiva statuses, hotlists, or recruiter habits needs to be explicitly rebuilt in Ceipal's workflow tooling.
  4. Train recruiters. Ceipal's UI and search work differently from JobDiva. Plan 1–2 days of hands-on training focused on candidate search, submission workflows, and reporting.
  5. Monitor for 30 days. Watch for missing records, search gaps, duplicate rates, and integration failures. Keep JobDiva read-only access as a fallback.
  6. Run a controlled delta-sync window until you're sure no late source edits need replay.

Sample JobDiva to Ceipal Field Mapping

JobDiva Field Ceipal Field Transform Notes
candidateId legacy_candidate_id (custom field) Store as immutable crosswalk key
firstName / lastName first_name / last_name Trim, title-case if needed; preserve raw in audit log
email email Lowercase, dedupe; primary email only — Ceipal may not support multiple
phone / mobilePhone phone / mobile_number E.164 normalize for consistent formatting
city / state / zip city / state / zip_code State must match Ceipal's States List master data
skills skills Split, trim, rejoin deterministically; Ceipal may use structured skill tags vs. free-text
workAuthorization work_authorization Map to Ceipal's Work Authorizations picklist
candidateStatus applicant_status Map via lookup table; do not free-type
resumeFile Attached via Create Applicant Must upload binary file, not reference path — triggers parsing
salary / payRate pay_rate Normalize to Ceipal's Pay Frequency Types
jobId legacy_job_id (custom) + job posting link Use ID mapping table
submittalId legacy_submission_id (custom) Required for replay and QA
submittalStatus submission_status / pipeline_status Map JobDiva lifecycle stages → Ceipal statuses; validate semantics with end users
companyName / companyId client_name / legacy_client_id (custom) Create Client first, reference by Ceipal ID
hotlistName talent_bench / tags / custom fields Reinterpret semantics; no direct API equivalent
userField_* Custom field or Note Case-by-case; expect data flattening
interviewRound interview_round Normalize numeric and text labels; keep original raw value
placementStartDate Placement start date Normalize timezone and date format

Best Practices

  • Backup everything before starting. Request a full data export from JobDiva. This is your insurance policy.
  • Run a test migration first. Migrate 500 candidates end-to-end into a Ceipal sandbox. Validate searchability, relationships, and field accuracy before touching production.
  • Automate idempotently. Every write operation should check whether the target record already exists. This lets you re-run failed batches without creating duplicates.
  • Log everything. Every API call, every transformation decision, every error. When a recruiter reports a missing candidate six weeks later, your logs are the only way to diagnose it.
  • Validate incrementally. Don't wait until the full migration is complete to start checking. Validate after each object type is loaded.
  • Freeze taxonomy changes shortly before final cutover to avoid mapping drift.
  • Separate archive data from operational data. Not every old note needs to be live. Decide early what's operationally necessary versus archival.
  • Refresh tokens before they expire, not after the first 401. Proactive refresh prevents silent mid-pipeline failures.

For a deeper look at why AI-generated migration scripts fail at this kind of complexity, see Why DIY AI Scripts Fail and How to Engineer Accountability.

When to Build In-House vs. Use a Managed Migration Service

Build in-house when you have dedicated engineers with 2–4 weeks of availability, the migration is straightforward (< 10K candidates, minimal custom fields), and you don't need zero downtime.

Do not build in-house when:

  • Your candidate database exceeds 50K records and includes years of submittal history with complex Candidate → Job → Placement chains
  • Resume searchability is non-negotiable — the CSV shortcut will cost more to fix than doing it right
  • Your engineering team is already at capacity — migration code is throwaway code that competes with product work
  • You need it done over a weekend — building, testing, and running a production migration pipeline in under two weeks is aggressive even for experienced teams
  • You don't have a safe way to run multiple dry runs
  • Your internal app team doesn't know the JobDiva or Ceipal data model well enough to spot silent field loss

The hidden cost of DIY migration isn't the initial script — it's the three weeks of cleanup when recruiters discover 15% of candidates don't appear in search results, submittal histories are orphaned, and custom fields are blank. The combination of date-windowed JobDiva extraction, Ceipal token rotation, public-object limitations, and parsed-resume dependency is exactly the kind of integration surface that punishes half-built scripts.

At ClonePartner, we handle the date-range chunking, token lifecycle management, resume injection into Ceipal's parsing pipeline, and end-to-end validation. We treat migration as an engineering delivery problem, not spreadsheet admin. We build around relationship integrity first — candidate to submittal to placement, company to contact to requisition — and support custom fields and non-standard transforms instead of forcing everything into a lowest-common-denominator mapping.

Your recruiters work in JobDiva on Friday and log into a fully populated, fully searchable Ceipal on Monday. No downtime, no orphaned records, no unsearchable resumes.

Frequently Asked Questions

Can I use CSV export to migrate data from JobDiva to Ceipal?
You can, but resumes imported via CSV bypass Ceipal's parsing engine, making candidate profiles unsearchable by keyword. CSV works for basic tabular data like companies and contacts, but breaks resume searchability and loses relational linkages between Candidates, Submittals, and Placements. Use the Ceipal API's Create Applicant endpoint with attached resume files instead.
What are the JobDiva API constraints for historical data extraction?
JobDiva's key extraction endpoints require mandatory fromDate and toDate parameters in MM/dd/yyyy HH:mm:ss format. You cannot pull all records in a single call. Your migration script must chunk historical data into date windows and paginate within each window using pageNumber and pageSize parameters. Exact rate limits aren't publicly documented, so build in exponential backoff.
How long does a JobDiva to Ceipal migration take?
It depends on data volume and complexity. A small agency with under 10K candidates and minimal custom fields can complete in 3–5 days. Enterprise migrations with 50K+ candidates, complex submittal histories, and resume file uploads typically take 1–3 weeks including validation. A managed migration service can compress timelines significantly.
Does Ceipal support custom objects like JobDiva's user-defined fields?
Ceipal has limited custom field support — including layered conditional custom fields and a Custom API surface — but does not support true custom objects. JobDiva's flexible user-defined fields and custom screening templates will need to be flattened into existing Ceipal fields or stored as structured notes. Plan for some data consolidation or loss during mapping.
How do I handle Ceipal API token expiration during a long migration?
Ceipal's access token expires after approximately 1 hour, and the refresh token is valid for 7 days. Your migration script must implement proactive token refresh logic — check token age before each API call and refresh before expiry, not after the first 401. A failed refresh mid-migration can corrupt partially imported data if not handled with idempotent writes.

More from our Blog

5
ATS

5 "Gotchas" in ATS Migration: Tackling Custom Fields, Integrations, and Compliance

Don't get derailed by hidden surprises. This guide uncovers the 5 critical "gotchas" that derail most projects, from mapping tricky custom fields and preventing broken integrations to navigating complex data compliance rules. Learn how to tackle these common challenges before they start and ensure your migration is a seamless success, not a costly failure.

Raaj Raaj · · 14 min read