Skip to content

Migrate from Keila

How-to guide
For:
Publishers and marketers, Workspace admins
Needs permission:
subscribers:import
In the app:
Import contacts

To migrate from Keila, you connect ReputeCast to a Keila project with an API key and import all of its contacts into one ReputeCast list, with their custom data and statuses. It works with Keila Cloud and with a Keila server you run yourself. ReputeCast only reads from the Keila API v1; nothing changes in Keila.

  • You need the subscribers:import permission (Owner, Admin and Editor have it).
  • Create a Keila API key in the project you’re moving: select API Keys in the menu on the left, click Create new API key, name it and save. Keila shows the key once. Source: Keila, API authentication (checked October 2026).
  • For a self-hosted Keila, ReputeCast must reach the server over HTTP or HTTPS. A server on a private or internal network is refused unless the instance turns on providers.allow_private_networks (see the configuration reference).
  • Read how a migration carries consent if this is your first import.
  1. Open Import contacts and choose Keila.

  2. Check the Server address. It starts as https://app.keila.io for Keila Cloud; replace it with your own server’s address if you run Keila yourself. Leave out credentials, a query string and a fragment; ReputeCast adds /api/v1 itself.

  3. Paste the key into API key and select Connect. Keila has no lists, so the wizard shows one source list, All contacts, with the project’s contact count.

  4. Pick the ReputeCast list the contacts go into, keep pulling suppressions from your sending providers on, and continue to field mapping.

  5. Map the fields. email is required; first_name and last_name match the ReputeCast fields, and each key of the contacts’ custom data becomes a field named after it.

  6. Check the consent step (see the next section), run the preview and start the import.

  • Every contact of the project goes into the one ReputeCast list you chose.
  • First and last name go into the matching fields.
  • Custom data (data) becomes contact fields. The wizard offers the keys it finds on the first 100 contacts; a key that only appears on later contacts isn’t offered.
  • Dates: the contact’s creation date in Keila becomes its creation date in ReputeCast. Keila’s API gives no opt-in date or IP, so the contacts arrive as single opt-in.
Keila status Becomes in ReputeCast
active Subscribed · confirmed (or pending, or Skip)
unsubscribed Suppressed · unsubscribed: no Broadcasts or Automations, System mail allowed (locked)
unreachable Suppressed · hard bounce, all streams (locked)

Keila segments are not imported, although the source step lists their names: rebuild them as ReputeCast segments, using the custom data you imported. Campaigns, templates, forms and senders stay in Keila too.

ReputeCast reads 500 contacts per request, one request at a time, and backs off when Keila answers 429 or a 5xx error:

SettingDefaultHow to change
Largest CSV or XLSX file100 MB and 500,000 rows (XLSX reads the first sheet)Fixed
Source API rate limit (429)Up to 5 retries, each after the source's Retry-After (2 s when absent, at most 60 s); then the import pauses and resumes by itself after 1 minuteResume now, or Slow down to 3 req/s on the paused import
Source server or network errorsUp to 5 retries, after 1, 2, 4, 8 and 16 sFixed
  • The summary shows how many contacts were imported, merged, suppressed, left pending and skipped. Download full report · CSV lists every row with what happened to it.
  • Open Audience, then Suppression list and check that unsubscribed and unreachable contacts are there.
  • “Keila rejected the API key”: the key was deleted, or it belongs to another project or another Keila server. Create a key in the right project.
  • “Use the full address, like https://lists.example.com.” or “Use only the server’s address …”: enter the address you open Keila at, starting with https://, without anything after the host name.
  • “That address is on a private or internal network.”: use the server’s public address, or have the operator turn on providers.allow_private_networks.
  • “Keila redirects to another address (301). Enter the address it answers at.”: ReputeCast doesn’t follow redirects. Enter the final address.
  • A custom data key is missing on the field mapping: none of the first 100 contacts has it. After the import, set the field with a CSV import that matches contacts by email.