Skip to main content

Setup Wizard REST API

Endpoints used by the setup wizard and migration-related screens. Covers wizard step progression, episode import, migration redirect settings, and Patreon shadow subscriber visibility. All endpoints require manage_options and a valid X-WP-Nonce header unless noted otherwise.


Wizard Progression

POST /benecaster/v1/wizard/steps/{id}/complete

Marks a wizard step as complete and records any step-specific data. {id} is the step identifier string (e.g. bridge, tier-mapping, episode-import).

Body: Step-specific data as a JSON object. The accepted fields depend on the step; the wizard UI sends only the relevant fields for each step. Pass an empty object {} for steps with no data to record.

Response:

{
  "step_id": "bridge",
  "completed": true,
  "next_step": "tier-mapping"
}
Field Description
step_id The step just completed
completed Always true on success
next_step ID of the next incomplete step; null when all steps complete

Errors:

Code HTTP Condition
invalid_step 400 {id} is not a recognized wizard step identifier

Step definitions are filterable via benecaster_setup_wizard_steps — add-ons can inject additional steps.


POST /benecaster/v1/wizard/complete

Marks the entire wizard as complete and fires the benecaster_setup_wizard_completed action.

Body: Empty — no body required.

Response:

{
  "completed": true,
  "show_id": 45
}

show_id is the primary show created or configured during the wizard. Used by the post-wizard redirect to the dashboard.

Errors:

Code HTTP Condition
wizard_incomplete 409 Not all required steps are marked complete

Episode Import

POST /benecaster/v1/shows/{id}/import

One-time bulk import of all episodes from a source RSS feed. Distinct from the recurring feed sync — this imports everything, not just new items. Typically used during setup to bring existing episodes from a previous podcast host.

Body:

{
  "source_feed_url": "https://feeds.buzzsprout.com/12345.rss",
  "skip_existing": true
}

skip_existing: true (default) skips episodes whose GUID already exists in WordPress. Set false to force re-import of all episodes — this creates duplicates and should only be used on empty shows.

Response:

{
  "total_in_feed": 84,
  "skipped_existing": 68,
  "drafts_created": 16,
  "draft_ids": [201, 202, 203],
  "log_id": 48
}

For large feeds (50+ episodes), this endpoint may take 10–30 seconds. It is synchronous — it completes before returning.

Errors:

Code HTTP Condition
show_not_found 404 Show ID does not exist
invalid_param 400 source_feed_url missing or not a valid URL
feed_unreachable 503 Source feed URL could not be fetched

GET /benecaster/v1/shows/{id}/import

Returns the last import log for a show.

Response:

{
  "log_id": 48,
  "source_feed_url": "https://feeds.buzzsprout.com/12345.rss",
  "total_in_feed": 84,
  "skipped_existing": 68,
  "drafts_created": 16,
  "status": "complete",
  "started_at": "2026-05-17T09:00:00",
  "completed_at": "2026-05-17T09:00:28"
}

Returns 404 when no import log exists for the show.


Migration / Redirect Settings

PUT /benecaster/v1/shows/{id}/migration

Update migration and redirect settings for a show. Used by the setup wizard’s Migration step and the Show Settings → Migration tab.

Body:

{
  "redirect_from_url": "https://feeds.buzzsprout.com/12345.rss",
  "new_feed_url": null,
  "redirect_expires": "2026-08-17"
}
Field Description
redirect_from_url The old feed URL this show is replacing. Stored for reference and shown in setup UI. Not used to generate redirects — feed redirect is handled by a 301 rewrite rule.
new_feed_url If set, Benecaster emits <itunes:new-feed-url> in its own feed pointing here. Use when migrating away from Benecaster.
redirect_expires Date to stop emitting the <itunes:new-feed-url> tag. After this date, the tag is omitted from the feed. Fires benecaster_redirect_expiry_run when the cron removes it.

All fields are optional — only provided fields are updated.

Response: Updated show object with migration fields.

Errors:

Code HTTP Condition
show_not_found 404 Show ID does not exist
invalid_param 400 redirect_expires is not a valid date; new_feed_url or redirect_from_url not a valid URL

Shadow Subscriber Visibility (Patreon Import)

These endpoints manage the “visibility” scorecard — a platform’s patron or subscriber list uploaded for comparison with Benecaster subscribers before a migration decision.

GET /benecaster/v1/shows/{id}/visibility

Returns the current shadow subscriber state for a show — one entry per uploaded platform.

Response:

{
  "items": [
    {
      "platform": "patreon",
      "patron_count": 89,
      "uploaded_at": "2026-04-17T09:00:00",
      "expires_at": "2026-07-16T09:00:00",
      "expired": false
    }
  ]
}
Field Description
platform Platform identifier: patreon, supercast, or a custom slug
patron_count Number of patron records in the uploaded dataset
uploaded_at ISO 8601 datetime of the most recent upload
expires_at ISO 8601 datetime when this data will be automatically removed (90 days from upload)
expired true when past expires_at — data has been purged; re-upload required

Errors:

Code HTTP Condition
show_not_found 404 Show ID does not exist

POST /benecaster/v1/shows/{id}/visibility/csv

Upload a patron export CSV to populate the shadow subscriber scorecard.

Body: multipart/form-data with a file field containing the CSV.

Response:

{
  "platform": "patreon",
  "patrons_imported": 89,
  "patrons_already_subscribed": 12,
  "expires_at": "2026-07-16T09:00:00"
}
Field Description
patrons_imported Total patron records in the uploaded CSV
patrons_already_subscribed Patrons already found as active Benecaster subscribers (deduped on email)
expires_at 90 days from upload — when the data will be automatically removed

The platform (e.g. patreon) is auto-detected from the CSV structure. Re-uploading for the same platform resets the uploaded_at and expires_at clocks and replaces all previous records.

Errors:

Code HTTP Condition
show_not_found 404 Show ID does not exist
invalid_param 400 No file provided
invalid_csv 422 CSV format not recognized

POST /benecaster/v1/shows/{id}/visibility/count

Register a manual patron count without uploading a CSV. For platforms that don’t support CSV export or when only an aggregate number is available.

Body:

{
  "platform": "patreon",
  "count": 47
}

Response:

{
  "platform": "patreon",
  "patron_count": 47,
  "uploaded_at": "2026-05-17T09:00:00",
  "expires_at": "2026-08-15T09:00:00"
}

Manual count entries are not deduplicable (no individual records) and expire at the same 90-day schedule as CSV uploads.


DELETE /benecaster/v1/shows/{id}/visibility/{platform}

Removes all shadow subscriber data for a specific platform from a show. Equivalent to the “Clear” button in the Settings → Visibility UI.

Response: 204 No Content

Errors:

Code HTTP Condition
show_not_found 404 Show ID does not exist
rest_not_found 404 No visibility data for this platform on this show

See Also