Migrate from API V1 to V2
Activations API V1 is deprecated and will be retired on January 15, 2027. API V2 introduces source-based management of Activations resources, and unified access controls.
This guide shows what to change and gives before-and-after examples. For timelines, Terraform, and the Airflow and Prefect integrations, see the Census Migration FAQ.
What changes at a glance
| V1 | V2 | |
|---|---|---|
| Base path | /api/v1 | /api/v2 |
| Authentication | Workspace API key (Workspace APIs), or a PAT (Organization APIs) | Activations personal access token (PAT) only |
| Scope | A workspace | A Fivetran group (group_id) |
| Destinations | /destinations, with an integer id | /activations, with a string id like glimmering_donkey |
| Destination connect links | /destination_connect_links | /activation_connect_links |
| Source connect links | /source_connect_links | Deprecated, with no V2 equivalent |
| Users and permissions | Organization API | Fivetran's user and access management APIs |
| Webhooks | /webhooks | /webhooks, with group_id added to responses |
Migration checklist
- Create an Activations PAT and use it in the
Authorizationheader. - Change your base path from
/api/v1to/api/v2. - Rename
/destinationscalls to/activations,/connectorsto/activation_types, and/destination_connect_linksto/activation_connect_links. - Store the activation
id(a string) in place of any destination ID, and readgroup_idwhere you need it. - Add
group_idto the requests that now require it: creating activations, datasets, and connect links. - Pass
activation_idwhen you create syncs instead of the source and destination connection IDs. - Remove calls to workspace, user, and invitation endpoints. Use Fivetran's user and access management APIs instead.
- Remove calls to source connect links, source models, and topics.
- Review the renamed endpoints below and update any calls that use them.
- Test your integration and switch to the V2 API before January 15, 2027.
Authentication
V1 Workspace API calls use a workspace API key. V2 does not use workspace API keys. Every V2 call uses an Activations PAT.
- Go to your user settings page.
- Under Personal Access Tokens, click New Token.
- Name the token and copy it.
Activations PATs are separate from Fivetran PATs. A Fivetran PAT will not work with the Activations API.
V1
curl "https://app.getcensus.com/api/v1/syncs" \
-H "Authorization: Bearer YOUR_WORKSPACE_API_KEY"
V2
curl "https://app.getcensus.com/api/v2/syncs" \
-H "Authorization: Bearer YOUR_ACTIVATIONS_PAT"
A PAT has the same permissions as the user who created it. For more detail, see Authentication.
Endpoint mapping
Use these tables to find the V2 endpoint for each V1 endpoint. All V2 paths start with /api/v2 and all V1 paths start with /api/v1. The methods are the same in V1 and V2 unless noted.
Renamed endpoints
Destinations are now activations
| Method | V1 | V2 |
|---|---|---|
| GET, POST | /destinations | /activations |
| GET, PATCH, DELETE | /destinations/{destination_id} | /activations/{activation_id} |
| POST | /destinations/{destination_id}/refresh_objects | /activations/{activation_id}/refresh_objects |
| GET | /destinations/{destination_id}/refresh_objects_status | /activations/{activation_id}/refresh_objects_status |
| GET | /destinations/{destination_id}/objects | /activations/{activation_id}/objects |
| POST | /destinations/{destination_id}/object_creation_requests | /activations/{activation_id}/object_creation_requests |
| GET | /destinations/{destination_id}/object_types | /activations/{activation_id}/object_types |
| GET | /destinations/{destination_id}/objects/{object_full_name} | /activations/{activation_id}/objects/{object_full_name} |
| POST | /destinations/{destination_id}/objects/{object_full_name}/refresh_fields | /activations/{activation_id}/objects/{object_full_name}/refresh_fields |
| GET | /destinations/{destination_id}/objects/{object_full_name}/refresh_fields_status | /activations/{activation_id}/objects/{object_full_name}/refresh_fields_status |
Connectors are now activation types
| Method | V1 | V2 |
|---|---|---|
| GET, POST | /connectors | /activation_types |
| GET, PATCH, DELETE | /connectors/{service_name} | /activation_types/{service_name} |
| GET | /connectors/{service_name}/object_types | /activation_types/{service_name}/object_types |
Destination connect links are now activation connect links
| Method | V1 | V2 |
|---|---|---|
| GET, POST | /destination_connect_links | /activation_connect_links |
| GET | /destination_connect_links/{connect_link_id} | /activation_connect_links/{connect_link_id} |
| POST | /destination_connect_links/{connect_link_id}/revoke | /activation_connect_links/{connect_link_id}/revoke |
| POST | /destinations/{destination_id}/connect_links | /activations/{activation_id}/activation_connect_links |
Table endpoints previously using a table ID now identify a table by its catalog, schema, and name
| Method | V1 | V2 |
|---|---|---|
| GET | /sources/{source_id}/tables/{table_id} | /sources/{source_id}/tables/columns |
| POST | /sources/{source_id}/tables/{table_id}/refresh_columns | /sources/{source_id}/tables/refresh_columns |
| GET | /sources/{source_id}/tables/{table_id}/refresh_columns_status | /sources/{source_id}/tables/refresh_columns_status |
The V1 endpoints that use /tables/{table_id} are consolidated to the existing bulk /tables/... endpoints, with query params to identify the table. In V2, pass the table_catalog, table_schema, and table_name query parameters instead of a table ID. For example, replace GET /api/v1/sources/{source_id}/tables/{table_id} with GET /api/v2/sources/{source_id}/tables/columns?table_catalog=<catalog>&table_schema=<schema>&table_name=<table>.
The V1 endpoint returned all of a table's columns in one response. In V2, tables/columns is paginated, so use the page and per_page query parameters to retrieve every column.
Sync run records are now fetched as an export
| Method | V1 | V2 |
|---|---|---|
| GET | /sync_runs/{sync_run_id}/records | /sync_runs/{sync_run_id}/records_export |
The V1 /records endpoint is consolidated into the existing /records_export endpoint. Use Fetch records export to retrieve the records synced during a sync run.
The V1 endpoint returned the records in the response and could filter them by primary_identifier, status, and operation. The V2 endpoint returns a list of URLs to Parquet files that contain all records synced during the sync run, including the operation performed and its status.
The export is available only after the sync run has completed. Before then, the endpoint returns an error.
Endpoints with the same path
These V1 endpoints keep their path in V2. Their request and response bodies can still differ, as described in the sections above.
| Resource | Paths |
|---|---|
| Sources | /sources, /sources/{source_id}, /sources/{source_id}/objects |
| Source tables | /sources/{source_id}/tables, /sources/{source_id}/refresh_tables, /sources/{source_id}/refresh_tables_status, /sources/{source_id}/tables/columns, /sources/{source_id}/tables/refresh_columns, /sources/{source_id}/tables/refresh_columns_status |
| Segments | /sources/{source_id}/filter_segments, /sources/{source_id}/filter_segments/{segment_id} |
| Projects | /sources/{source_id}/projects, /projects/{project_id}/refresh, /projects/{project_id}/refresh_status |
| Source types | /source_types, /source_types/{service_name} |
| Syncs | /syncs, /syncs/{sync_id}, /syncs/{sync_id}/trigger, /syncs/{sync_id}/sync_runs, /syncs/test, /syncs/test_status |
| Sync runs | /sync_runs/{sync_run_id}, /sync_runs/{sync_run_id}/cancel, /sync_runs/{sync_run_id}/records_count, /sync_runs/{sync_run_id}/records_export |
| Datasets | /datasets, /datasets/{dataset_id}, /datasets/{dataset_id}/refresh_columns, /datasets/{dataset_id}/refresh_columns_status |
| Webhooks | /webhooks, /webhooks/{webhook_id} |
Endpoints with no V2 equivalent
Source connect links will be retired with V1. Topics were previously deprecated, and models have been replaced by datasets. For the workspace, user, and invitation endpoints, see Workspaces and access control.
| Method | V1 |
|---|---|
| GET, POST | /source_connect_links |
| GET | /source_connect_links/{connect_link_id} |
| POST | /source_connect_links/{connect_link_id}/revoke |
| POST | /sources/{source_id}/connect_links |
| GET, POST | /sources/{source_id}/models |
| GET, PATCH, DELETE | /sources/{source_id}/models/{model_id} |
| POST | /sources/{source_id}/models/{model_id}/refresh_columns |
| GET | /sources/{source_id}/models/{model_id}/refresh_columns_status |
| GET, POST | /sources/{source_id}/topics |
| GET, PATCH, DELETE | /sources/{source_id}/topics/{topic_id} |
| POST | /sources/{source_id}/topics/{topic_id}/events |
| PUT | /connectors/{service_name}/publish_to_organization |
| GET, POST, PUT, PATCH, DELETE | /workspace, /workspaces, and everything under /workspaces |
| GET, PATCH, DELETE | /users and /users/{user_id} |
| GET, POST, PATCH | /invitations and everything under it |
Workspaces and access control
Resources are tied to groups, not workspaces
In V1, everything lived inside a workspace, and you picked the workspace by choosing its API key. V2 has no workspaces; instead, resources are tied to a group, identified by a group_id such as abundant_giraffe.
Activation sources are uniquely paired with a group. Resources built off of Activation sources (ex. datasets, activations) now have a group_id returned with the resource to identify which group it is associated with.
Workspace, user, and invitation endpoints are removed
The Organization API's workspace, user, and invitation endpoints have no V2 equivalent:
/workspacesand everything under it, including/workspaces/{id}/api_key,clone, andapplication_variables/users/invitations
User and permission management has now been consolidated into Fivetran. Census's standalone organization and workspaces APIs will be retired with V1. To manage users and permissions programmatically, use Fivetran's existing user and access management APIs. They require a separate Fivetran API key.
If you used workspace cloning, templates, or variables to manage many tenants, see the Census Migration FAQ for the recommended path.
Destinations are now activations
In V1, a destination was a standalone connection inside a workspace. In V2, destinations are restructured into activations, and every destination-related resource is renamed to match: /destinations becomes /activations, destination connect links become activation connect links, and connectors become activation_types.
An activation is built from two things:
- A group, where each Activation source is uniquely associated with a group
- A target (previously known as a destination connection), such as Salesforce or HubSpot, that is paired with that source.
This means you can no longer create a destination on its own. You create an activation by choosing an existing source's group_id and giving it a new target. See Response body and Creating an activation for the request and response changes.
Response body
The destination object is now an activation. An activation has its own id, name, and group_id. It also has a source object for the source connection and a destination object for the target. The destination object holds the fields that were at the top level of a V1 destination, such as created_at, last_test_succeeded, type, is_file_system_destination, connection_details, and last_test_results.
What changes:
idis now the activation ID, a string (likeglimmering_donkey) instead of an integer.nameis now the name of the activation, and it is no longer part of the destination object.group_idis new.sourceis new.- All of the V1 destination fields move into the
destinationobject. Thedestination.idis the ID of the destination connection, as in V1.
V1 response: GET /api/v1/destinations/12
{
"status": "success",
"data": {
"id": 12,
"name": "Google Sheets",
"created_at": "2023-07-22T23:42:47.239Z",
"last_test_succeeded": true,
"last_tested_at": "2023-07-22T23:45:00.000Z",
"type": "google_sheets",
"is_file_system_destination": false,
"connection_details": {},
"last_test_results": {
"steps": []
}
}
}
V2 response: GET /api/v2/activations/glimmering_donkey
{
"status": "success",
"data": {
"id": "glimmering_donkey",
"name": "Google Sheets",
"group_id": "abundant_giraffe",
"source": {
"id": 42,
"name": "My Snowflake Warehouse",
"type": "snowflake"
},
"destination": {
"id": 12,
"created_at": "2023-07-22T23:42:47.239Z",
"last_test_succeeded": true,
"last_tested_at": "2023-07-22T23:45:00.000Z",
"type": "google_sheets",
"is_file_system_destination": false,
"connection_details": {},
"last_test_results": {
"steps": []
}
}
}
}
Anywhere you stored a destination ID, store the activation id instead. Because the ID is now a string, check that your code and database columns do not assume a number. Read destination fields, such as last_test_succeeded, from the destination object.
Creating an activation
To create an activation, you must say which group it belongs to. The group_id must belong to an existing source connection. Each activation pairs that source with a new destination connection.
V1 request: POST /api/v1/destinations
{
"service_connection": {
"name": "My Salesforce Connection",
"type": "salesforce",
"credentials": {
"...": "..."
}
}
}
V2 request: POST /api/v2/activations
{
"activation": {
"group_id": "abundant_giraffe",
"name": "My Salesforce Connection",
"type": "salesforce",
"credentials": {
"...": "..."
}
}
}
The request body key changes from service_connection to activation. The type is the service_name of an entry returned by GET /api/v2/activation_types that is marked creatable_via_api.
Syncs
When you create a sync, set activation_id instead of destination_attributes.connection_id and source_attributes.connection_id. The activation identifies both the source and destination connections already, so setting them in the request will not change the connection.
Example Request:
{
"activation_id": "glimmering_donkey",
"label": "New Signups to Leads",
"operation": "upsert",
"destination_attributes": {
"object": "lead"
},
"source_attributes": {
"type": "table",
"table_catalog": "analytics",
"table_schema": "publish",
"table_name": "contacts"
},
"...": "..."
}
Connect links
Connect links let your customers authorize a destination without sharing credentials with you. In V2, destination connect links are called activation connect links, and source connect links are deprecated.
What changes for you:
- Use
/activation_connect_linksinstead of/destination_connect_links. - When you create a link, pass the
group_idof an existing source connection. It is required. - Responses no longer include
destination_id. They includegroup_id. uriandredirect_uriwork the same way as before.uriisnullafter the link expires or is revoked.- To let a customer reauthorize an existing activation, use
POST /activations/{activation_id}/activation_connect_links. In V1, this wasPOST /destinations/{destination_id}/connect_links.
V1 request: POST /api/v1/destination_connect_links
{
"type": "hubspot",
"redirect_uri": "https://example.com/done"
}
V2 request: POST /api/v2/activation_connect_links
{
"type": "hubspot",
"group_id": "abundant_giraffe",
"redirect_uri": "https://example.com/done"
}
If you used source connect links, there is no direct replacement. Create the source connection first, then use its group_id to create an activation connect link.
Webhooks
The webhook endpoints (/webhooks and /webhooks/{webhook_id}), request bodies, and event types are the same as in V1. What changes:
- Responses include a
group_id. It identifies the group of the source connection the webhook is associated with. - Authentication. Use your Activations PAT, as with every other V2 call.
V1 request: POST /api/v1/webhooks
{
"name": "My Webhook",
"endpoint": "https://example.com/activations-alerts",
"events": [
"sync.alert.raised",
"sync.alert.resolved"
]
}
V2 response: POST /api/v2/webhooks
The request is the same as V1. The response now includes group_id.
{
"status": "created",
"data": {
"id": 123,
"name": "My Webhook",
"endpoint": "https://example.com/activations-alerts",
"events": [
"sync.alert.raised",
"sync.alert.resolved"
],
"group_id": "abundant_giraffe",
"secret": "..."
}
}
The supported events are unchanged: sync.alert.raised, sync.alert.resolved, sync.triggered, sync.started, sync.completed, sync.success, and sync.failed. The signing secret is returned once, when you create the webhook, so store it securely.
Need help?
- Browse the Activations REST API V2 reference.
- Read the Census Migration FAQ.