Skip to main content
Company campaigns are workspace-wide automation flows stored as flows with accessLevel: COMPANY. Use them for outbound calling workflows: scheduling, interviews, interest checks, assessment reminders, and similar global campaigns—with IVR or AI call scripts, defined call times, and optional SMS. Use these endpoints to create and update campaigns, inspect their public configuration, and add or remove leads (candidates on the campaign) using the same Bearer API key model as the rest of the Partner API. Base path: /v1/partner/campaigns
Company sites (needed to create a campaign): /v1/partner/company-sites
Authentication: Authorization: Bearer YOUR_API_KEY (same as API keys)
Set purposeType and related fields to match the kind of campaign you are building (same concepts as creating a global / company campaign in the TapTalent app). Optional GET /campaigns query parameters let you filter by status or purposeType.

Concepts

Typical integration flow
  1. GET /v1/partner/company-sites → pick a companySiteId assigned to the API key user.
  2. POST /v1/partner/campaigns → create a campaign with the appropriate purposeType and payload for that campaign.
  3. POST /v1/partner/campaigns/:campaignId/leads → add one or many candidates.
  4. GET /v1/partner/campaigns/:campaignId/leads → poll status labels until your automation is done.

List campaigns

GET /campaigns

Returns company-scoped campaigns (accessLevel: COMPANY) for the company tied to the API key. Results are ordered with newest campaign id first, then paginated. Query parameters Example: filter by purpose and paginate
Example response
Depending on purposeType, optional blocks such as assessment may appear in list items; callSettings and core fields are included when present in the mapped summary.

Get one campaign

GET /campaigns/:campaignId

Returns a campaign detail object with high-level schedule, IVR/AI call settings, opening/closing messages, and purpose-specific blocks when applicable (for example an assessment object for assessment-related campaigns).
  • 404 if the id is invalid, deleted, not in the API key’s company, or not a company (COMPANY) campaign — this avoids leaking whether an id exists in another workspace.
Example request
Example response (truncated)

Create campaign

POST /campaigns

Creates a new company campaign. The request body is validated with strict keys (stripUnknown: true); extra properties are rejected. Rules
  • purposeType identifies which campaign you are creating (for example scheduling, virtual interviews, interest checks, or assessment reminders). Payload requirements depend on the purpose—mirror the same fields you would use when creating that campaign type in the app (global / company campaign).
  • Partner API allowlist: by default, only ASSESSMENT_REMINDER is accepted for POST /campaigns (and related updates). Your workspace may support additional purposeType values when configured server-side. The tables below describe payload expectations for each campaign kind (same as the in-app global campaign creator), even if a given type is not yet enabled for your API key.
  • companySiteId must be a site linked to the API key user (use GET /company-sites first). The server applies the same checks as the in-app global campaign creator.
  • phoneNumber must be a verified outbound number on the company (present in your company caller ID settings with status VERIFIED). If the number is missing or not verified, the API returns a 400 with a clear message.
  • Schedule: for campaign types that use bulk calling, supply enough data for a valid first-call schedule. Common patterns:
    • UTC-based: callStartTimeUtc (and optionally retryScheduleUtc) or
    • Local display + retries: callTime and/or followUpRetries (timezone-aware scheduling, same behavior as in the app).
  • Follow-up retries (auto-fill): If you omit followUpRetries (local schedule) or retryScheduleUtc (UTC schedule), the server fills four retry slots using the same rules as the TapTalent app: offsets +60, +90, +90, and +90 minutes after the previous slot, with calls constrained to 9:00 AM–9:00 PM (if a slot would fall after 9:00 PM, it moves to 9:00 AM on a later day, matching the product UI).
  • Assessment reminder job title: For ASSESSMENT_REMINDER, if jobDetails.jobTitle is omitted or empty, the server uses jobDetails.assessmentName, then the campaign title, in that order. At least one of these must yield a non-empty label.
Common body fields (always review validation responses for your chosen purposeType; required flags vary by type.) For campaign types that use bulk calling, include enough schedule data that a first execution time can be computed (typically callTime / followUpRetries and/or callStartTimeUtc / retryScheduleUtc, depending on how you configure the campaign—same rules as in the app). jobDetails is required when the chosen purposeType expects it.

Required fields by purposeType (reference)

These mirror the global / company campaign creator in the app. Fields marked “bulk schedule” apply to the first call and retries (callTime / followUpRetries or callStartTimeUtc / retryScheduleUtc). Example jobDetails fields (assessment-oriented campaigns) When purposeType is ASSESSMENT_REMINDER, jobDetails typically includes: You may also set assessmentTestId, SMS templates, autoAddInvitedCandidates, and assessmentFirstReminderDelayHours at the top level of the body (duplicates for convenience); jobDetails remains the canonical nested block for that shape. Example: UTC-scheduled creation (ASSESSMENT_REMINDER)
Example: 201 response

Update campaign

PATCH /campaigns/:campaignId

Updates editable fields for the campaign: title/name, job title, SMS templates, delay, verified phone number, call schedule (until first call starts), opening/closing messages, and call type / AI script—which fields apply depends on the campaign’s purpose and current state.
  • The campaign must belong to the company and be a company campaign (404 otherwise).
Common body fields (all optional; only send what changes) Example
Example response
The campaign object follows the same partner response shape as Get one campaign, including createdAt / updatedAt when present.

Company sites

GET /company-sites

Returns sites the API key user may use when creating campaigns. Each entry includes companySiteId and optional site metadata (name, address, region). Example response

Leads

GET /campaigns/:campaignId/leads

Lists campaign participants with partner-facing lead fields. Query parameters Example
Example row
For campaigns that track assessment submission, assessmentSubmitted is Submitted or Not submitted; flowStatus may show Completed when the lead row completes even if the last dial outcome was pending/no-answer.

POST /campaigns/:campaignId/leads

Adds one or many leads in a single request. Only the simple candidate path is supported (no AI search or marketplace bulk import). Body Each lead Idempotency: the API does not guarantee idempotent adds. Re-posting the same email may return skipped counts if the candidate is already on the flow or blocked by duplicate/contact rules. Treat added / skipped as best-effort telemetry and reconcile with GET .../leads if needed. Example
Example response
skipped increments when a row is not added because of duplicates, prior contact, or internal eligibility checks.

DELETE /campaigns/:campaignId/leads/:leadId

Removes a lead from the campaign. leadId is the leadId returned by the list endpoint (internal talentId).
Example response

Webhooks (campaign completion)

When a lead reaches a terminal campaign outcome, TapTalent sends a webhook event:
  • Event: candidate.flow_completed
  • When sent: after a lead reaches a terminal status such as completed or terminated
  • Scope: company-level webhook URL configured in your Partner API settings
Example payload
See Webhooks overview and Webhook event types for delivery headers, verification, retries, and handler best practices.

Errors

Partner routes normalize failures to JSON:

Debugging failed requests

If you see a generic error or 500 in your API client:
  1. For INVALID_REQUEST, read error.message (and details when present). For INTERNAL_ERROR, review your request payload and retry; if the issue persists, contact your workspace owner/support with the request context.
  2. Check the terminal where the Partner API (Node) is running. Failed creates are logged as [POST /v1/partner/campaigns] with the underlying exception (operators only).
  3. Confirm companySiteId appears in GET /v1/partner/company-sites for the same API key user, and that phoneNumber is a verified company number (same rules as the in-app global campaign creator).
  4. Confirm your API key’s user has access to the assessment assessmentTestId you pass in jobDetails.

Operational notes

  • Rate limiting: follows the same limits as other Partner API routes for your workspace.
  • Voice (IVR): creating or updating IVR messages may trigger text-to-speech generation in the background, as in the product. Administrative or system-only operations are not exposed on the Partner API.