Skip to content

How to Create an Apideck-to-Truto Migration Guide (Without Re-Authenticating Users)

Learn how to migrate from Apideck to Truto without forcing users to re-authenticate. Covers OAuth app ownership checks, Apideck Vault token export, credential import, schema mapping, smoke tests, and rollback procedures.

Nachi Raman Nachi Raman · · 22 min read
How to Create an Apideck-to-Truto Migration Guide (Without Re-Authenticating Users)

If you are evaluating Apideck alternatives, you are likely staring down the barrel of a massive migration cliff. You want to switch infrastructure, but the thought of asking hundreds of enterprise customers to re-authenticate their Salesforce, HubSpot, BambooHR, or QuickBooks accounts is terrifying. Forcing users to click "Reconnect" generates support tickets, introduces immediate churn risk, and burns social capital with your best accounts.

The good news is you do not have to do this. As we've demonstrated in our Merge.dev migration guide, you can migrate away from Apideck without asking a single end user to reconnect. The process involves exporting OAuth tokens from Apideck Vault, importing them into your new platform's credential context, mapping the old unified schema to the new one, and updating your API routing so your frontend code stays completely untouched.

This guide breaks down the exact technical strategy to extract your credentials, handle rate limits post-migration, and use declarative mappings to mimic your old API responses. If you need to create an Apideck-to-Truto migration guide for your internal engineering team, use this playbook as your architectural foundation. For a deeper dive specifically on credential extraction, see our companion guide on how to migrate from Apideck without re-authenticating end users.

The Vendor Lock-In Trap: Why SaaS Teams Outgrow Apideck

Apideck is a well-built product for early-stage teams. The documentation is clean, the Vault connection UI is polished, and the real-time pass-through architecture that avoids caching customer data is a sound design decision that we share at Truto.

Integrations are a revenue and retention lever, not a backlog item. BetterCloud's 2025 State of SaaS report found that organizations use an average of 106 different SaaS tools, creating a massive expectation for product integrations. Furthermore, Crossbeam's State of the Partner Ecosystem Report found that customers who use integrations are 58% less likely to churn on average, with 98% of companies reporting that customers with integrations are generally stickier.

While Apideck helps teams get off the ground quickly to capture this value, engineering leaders typically hit three specific scaling limits that force a migration conversation:

1. Custom Field Mapping is gated behind a $1,299/mo paywall. Enterprise customers heavily customize their CRMs, HRIS platforms, and accounting software. Apideck restricts Custom Field Mapping to its Scale plan and above. Their Launch plan at $599/month does not include it. You need the Scale tier at $1,299/month to access custom field mapping. That is a sharp price jump the moment your first enterprise customer asks you to map a custom BambooHR employment type or a custom Salesforce picklist object, effectively tripling your infrastructure costs overnight.

2. Virtual webhooks default to 24-hour polling. Apideck's own documentation states that by default, they monitor integrations at an interval of every 24 hours for their virtual webhooks. This frequency can be adjusted based on the pricing plan chosen, but for providers that lack native webhook support—like many accounting platforms and a surprising number of HRIS tools—a 24-hour delay on detecting an employee termination can be an actual compliance incident. If you are building a product that requires near-real-time synchronization, a 24-hour delay is a dealbreaker for enterprise buyers.

3. No auto-generated MCP server support. If your product team is building AI-powered features or agentic workflows, you need your integrations exposed as tools that LLMs can call securely. Apideck currently lacks native Model Context Protocol (MCP) server generation. That means your AI engineering team is stuck hand-writing and maintaining custom tool definitions and tool-calling layers for every single integration you support.

The Migration Fear: The "Re-Authentication Cliff"

When product managers and engineering leaders discuss migrating off a unified API provider, the conversation usually stops at the "Re-Authentication Cliff." This is the moment you realize that migrating your integration platform might mean asking every connected customer to re-authorize their third-party accounts.

OAuth 2.0 requires an end user to explicitly grant an application access to their data. When you use a unified API platform, the platform's credential vault typically stores the access_token and refresh_token. If you switch providers without migrating those tokens, you have to email every connected customer and ask them to log in, navigate to your settings page, and click a new "Connect" button.

This is a catastrophic user experience for several reasons:

  • Support ticket explosion: Every customer who sees a "Please reconnect your Salesforce" banner files a ticket. If you have 200 connected accounts, that is 200 potential friction points in a single week.
  • Immediate churn risk: Forcing re-authentication temporarily breaks your product's stickiness. Integrations will silently break, data syncs will fail, and enterprise customers view broken integrations as a breach of trust.
  • Burned enterprise political capital: Your champion at a Fortune 500 account spent months getting their IT and Security teams to approve the OAuth scopes. Asking them to repeat that process, while security teams flag the new authorization requests, burns social capital you cannot easily rebuild.

The good news: if you own your OAuth app credentials (your Client ID and Client Secret), you already control the relationship with the upstream provider. The tokens belong to your OAuth app, not to Apideck. Because you own your Apideck Vault data, you have the legal and technical right to export these credentials. This is the architectural foundation that makes a zero-friction migration possible.

When Is Zero Re-Authentication Possible?

Before you plan a single line of migration code, you need to answer one question: who owns the OAuth application that your customers authorized?

OAuth tokens are bound to a specific Client ID. When your customer clicked "Authorize" in Apideck Vault, their consent was granted to whichever OAuth application was configured for that integration. This determines everything about whether a zero-friction migration is feasible.

Scenario 1: You brought your own OAuth credentials (BYOC). Apideck's setup flow requires you to provide the client_id and client_secret for each OAuth integration you activate. If you registered your own OAuth application with Salesforce, HubSpot, QuickBooks, etc. and then entered those credentials into Apideck's dashboard, you own the OAuth app. The tokens were issued to your Client ID, and Apideck's callback URL (https://unify.apideck.com/vault/callback) was simply registered as one of several redirect URIs in your OAuth app's configuration. In this scenario, zero re-authentication is fully possible. You can export the refresh tokens, import them into Truto (or any other platform), and the upstream provider will honor them as long as your Client ID and Client Secret remain valid.

Scenario 2: You used Apideck-managed OAuth credentials. If Apideck provided sandbox or shared OAuth credentials for a particular integration, those tokens are bound to Apideck's Client ID. You cannot use those refresh tokens with a different OAuth app - the upstream provider will reject the token exchange because the Client ID won't match. In this case, re-authentication is required for those specific integrations. You'll need to have affected users reconnect through your new platform.

How to check which scenario applies:

  1. Log into the Apideck dashboard and navigate to Unify > Unified APIs.
  2. Select each integration you have enabled and check the connector settings.
  3. If you see your own client_id and client_secret values, you own the OAuth app.
  4. Cross-reference with the OAuth developer portals of each provider (Salesforce Connected Apps, HubSpot Developer Account, Intuit Developer Portal, etc.) to confirm your redirect URIs include both Apideck's callback URL and any new callback URLs you'll need.
  5. For API key-based integrations (non-OAuth), ownership is not an issue - the keys belong to the end user and can be migrated freely.
flowchart TD
    A["Check each integration"] --> B{"Who owns the<br>OAuth Client ID?"}
    B -->|"Your own credentials"| C["Zero re-auth possible"]
    B -->|"Apideck-managed credentials"| D["Re-auth required for<br>this integration"]
    B -->|"API key / Basic auth"| E["Keys are portable -<br>no re-auth needed"]
    C --> F["Export refresh tokens<br>and migrate"]
    D --> G["Plan targeted re-auth<br>for affected accounts"]
    E --> H["Export API keys<br>from Vault"]

For most production Apideck deployments, Scenario 1 is the norm. Apideck's own documentation instructs you to provide your OAuth app credentials during setup, so unless you explicitly opted into a managed credential arrangement, you likely own your tokens.

Does Apideck Expose Your OAuth Tokens for Export?

This is where things get complicated. Apideck's Vault is designed to abstract away credential management - that's its whole value proposition. The Vault API provides endpoints to list connections (GET /vault/connections) and retrieve individual connection metadata (GET /vault/connections/{unified_api}/{service_id}), but these endpoints return connection state, configuration, and metadata. Apideck does not provide a public API endpoint that returns raw access_token or refresh_token values.

Apideck's architecture intentionally handles token injection transparently in the background when you make API calls through their Unify platform. You never see the raw tokens during normal operation.

This means you have three paths to extract your credentials:

Path 1: GDPR / Data Portability Request (Recommended) Under GDPR Article 20 and similar data protection regulations, you have the right to receive your personal data in a structured, machine-readable format. Contact Apideck support and request a full data export of your Vault credentials, including raw OAuth tokens, for all consumers. Frame this as a data portability request. Apideck is GDPR-compliant and SOC 2 certified, so they have processes for this. Be specific about what you need: access_token, refresh_token, expires_at, issued_at, scope, and the consumer_id mapping for each connection.

Path 2: Direct Apideck Support Engagement If you're on an Enterprise plan or have an account manager, reach out to Apideck's team directly and explain you're migrating. In our experience, most unified API vendors will cooperate with a structured data export request, especially under contractual data ownership terms. Many DPAs (Data Processing Agreements) explicitly guarantee your right to retrieve stored credentials.

Path 3: Parallel Token Acquisition (Fallback) If neither of the above paths yields results quickly, and you own your OAuth app, you can add Truto's callback URL as an additional redirect URI in your OAuth app configuration before disabling Apideck. This lets you run both platforms simultaneously while gradually migrating connections. New connections authenticate through Truto directly, while existing Apideck connections continue working until you can arrange the token export.

Info

Apideck's Vault API has an import endpoint (POST /vault/connections/:unified_api/:service_id/import) for bringing tokens into Apideck, but no corresponding export endpoint. This asymmetry is common across unified API vendors - most make it easy to onboard but provide no self-service off-ramp for credentials. This is exactly why establishing your data portability rights early in any vendor relationship matters.

How to Create an Apideck-to-Truto Migration Guide (Zero End-User Friction)

Executing a zero-friction migration requires a precise sequence of operations. You are moving live, encrypted credentials between two isolated systems while ensuring background jobs continue to run. The entire process follows four phases and can be completed in a single sprint for most engineering teams.

flowchart LR
    A["Phase 1:<br>Export Tokens"] --> B["Phase 2:<br>Import into Truto"]
    B --> C["Phase 3:<br>Map Schemas"]
    C --> D["Phase 4:<br>Flip DNS"]
    D --> E["Phase 5:<br>Validate & Rollback"]

Phase 1: Export Credentials from Apideck Vault

Your first step is to initiate an export of your active credentials from Apideck. Apideck Vault stores the OAuth access tokens and refresh tokens for each connected account.

Exporting OAuth Tokens

  1. Enumerate all consumers and connections. Use the Apideck Vault API to list all consumers (GET /vault/consumers) and then list connections for each consumer (GET /vault/connections with the x-apideck-consumer-id header). Record the service_id, unified_api, auth_type, state, and consumer_id for every connection in callable state.
# List all consumers
curl -X GET https://unify.apideck.com/vault/consumers \
  -H "Authorization: Bearer $APIDECK_API_KEY" \
  -H "x-apideck-app-id: $APIDECK_APP_ID"
 
# List connections for a specific consumer
curl -X GET https://unify.apideck.com/vault/connections \
  -H "Authorization: Bearer $APIDECK_API_KEY" \
  -H "x-apideck-app-id: $APIDECK_APP_ID" \
  -H "x-apideck-consumer-id: $CONSUMER_ID"
  1. Request the raw token export. As covered in the previous section, Apideck's GET /vault/connections endpoint does not return raw tokens. Submit a GDPR data portability request or work with your Apideck account manager to get a structured export containing access_token, refresh_token, expires_at, and scope for each OAuth connection.

  2. Export the refresh tokens - not just the access tokens. Access tokens expire (typically in 1 hour for most providers), so the refresh token is what actually matters for continuity.

  3. Record the specific metadata, including the token expiry timestamp, the associated provider ID (e.g., salesforce, quickbooks), the OAuth scopes, and the consumer ID mapping back to your internal user records.

Extracting API Keys (Non-OAuth Connections)

For integrations that use API key or basic authentication (not OAuth), the extraction path is different. API keys, subdomain values, and other static credentials are stored as connection settings in Apideck Vault.

If your end users originally entered these credentials through Apideck's Vault UI, those values live in Apideck's system. You'll need them in the export as well. The GET /vault/connections/{unified_api}/{service_id} endpoint returns connection settings, which may include non-sensitive configuration like subdomains. However, sensitive fields like API keys are typically masked.

For API key integrations, you have two options:

  1. Include API keys in your data portability request to Apideck. These are your customers' credentials stored on your behalf.
  2. Ask the affected end users directly. Since API keys don't expire the way OAuth tokens do, and the customer usually has access to regenerate them in their own admin panels, this is often the simplest path. You can batch this request into a single email: "We're upgrading our integration infrastructure - please re-enter your API key in the new settings page." This is far less disruptive than a full OAuth re-authorization flow.
Warning

Treat this export file as highly sensitive production data. It contains active authorization grants for your customers' third-party systems. Ensure it is transferred via secure, encrypted channels and never stored in plain text on local developer machines. Note that some Apideck plans may restrict programmatic access to raw tokens. If so, contact Apideck support for a secure data export. Under GDPR and most DPAs, you have the right to your data.

Phase 2: Import Tokens into Truto's Credential Context

Once you have the credential payload, you will map these records into Truto. Truto uses the concept of an Integrated Account to represent a connection between your environment and a specific third-party provider.

You will use Truto's API to programmatically create Integrated Accounts for each exported record. The credential payload structure varies depending on the authentication type.

OAuth 2.0 Connections

For OAuth integrations, inject the existing tokens directly into the Truto credential context:

curl -X POST https://api.truto.one/integrated-account \
  -H "Authorization: Bearer $TRUTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "integration_id": "salesforce",
    "environment_id": "your-env-id",
    "credentials": {
      "access_token": "existing-access-token",
      "refresh_token": "existing-refresh-token",
      "expires_at": "2026-04-18T12:00:00Z"
    },
    "metadata": {
      "apideck_consumer_id": "original-consumer-id"
    }
  }'

API Key Connections

For integrations using API key authentication, pass the key and any required configuration fields:

curl -X POST https://api.truto.one/integrated-account \
  -H "Authorization: Bearer $TRUTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "integration_id": "bamboohr",
    "environment_id": "your-env-id",
    "credentials": {
      "api_key": "exported-api-key",
      "subdomain": "customer-subdomain"
    },
    "metadata": {
      "apideck_consumer_id": "original-consumer-id"
    }
  }'

Client Credentials (Service-to-Service)

For integrations using OAuth 2.0 Client Credentials flow (no end-user authorization), you import the client credentials themselves:

curl -X POST https://api.truto.one/integrated-account \
  -H "Authorization: Bearer $TRUTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "integration_id": "servicenow",
    "environment_id": "your-env-id",
    "credentials": {
      "client_id": "exported-client-id",
      "client_secret": "exported-client-secret"
    },
    "metadata": {
      "apideck_consumer_id": "original-consumer-id"
    }
  }'
sequenceDiagram
    participant Old as Apideck Vault
    participant Script as Migration Script
    participant Truto as Truto API
    participant Provider as 3rd-Party API
    
    Old->>Script: Secure Export (Tokens & Expiry)
    Script->>Truto: POST /integrated-accounts<br>(Inject Tokens)
    Truto-->>Script: Returns Truto Account ID
    
    Note over Truto,Provider: Truto assumes token lifecycle management
    Truto->>Provider: Refresh Token (Proactively before expiry)
    Provider-->>Truto: New Access Token

Once imported, Truto's architecture is designed to handle this seamlessly. The platform schedules proactive token refreshes based on the expiry timestamps you provide. Shortly before a token expires, Truto will use the imported refresh_token to negotiate a new access_token with the upstream provider, ensuring the connection remains active without any user intervention. If a refresh token was already expired at the time of import, Truto marks that account as needing re-authentication—but in practice, most active accounts will have valid refresh tokens.

Tip

Store the apideck_consumer_id in Truto's metadata field for every imported account. This creates a lookup table between the old and new systems, which is invaluable during parallel running, debugging, and rollback scenarios.

Phase 3: Map the Unified Schema via JSONata

Your application code currently expects Apideck's specific JSON response shapes. Rewriting your entire backend to expect Truto's default unified schema would require massive engineering effort. This is where most teams expect pain, and where Truto's architecture actually makes things straightforward.

Instead of rewriting your application, you use Truto's declarative configuration engine. Truto uses JSONata—a lightweight query and transformation language for JSON data—to normalize upstream responses. You write custom JSONata expressions in Truto to transform the raw provider data into the exact schema shape your application already expects from Apideck.

For example, if your frontend expects Apideck's field name first_name and Truto returns firstName, you define a mapping at the environment level:

// Example JSONata transformation in Truto
// Mapping a raw Salesforce response to mimic an Apideck CRM Contact
{
  "id": Id,
  "first_name": FirstName,
  "last_name": LastName,
  "emails": [
    {
      "email": Email,
      "type": "primary"
    }
  ],
  "custom_mappings": {
    "industry_segment": Custom_Segment__c
  }
}
Tip

Truto supports a 3-level override system: base mappings at the integration level, environment-level overrides, and per-customer (Integrated Account) overrides. This means you can match Apideck's response format globally for all users, then customize individual enterprise customer mappings without touching the global configuration.

By pushing the transformation logic to Truto's API layer, you achieve a zero-code migration for your application layer. Your backend receives the exact same payload structure it always has.

Phase 4: Route Traffic and Flip the DNS

With the credentials imported and the JSONata mappings configured and validated, you execute the final cutover. Update your environment variables to point your API client base URLs from api.apideck.com to api.truto.one.

  1. Run both systems in parallel for 48-72 hours. Route a percentage of traffic to Truto using weighted DNS or a feature flag.
  2. Compare response payloads between the two systems to validate your schema mappings catch every required field.
  3. Monitor error rates and latency. Because Truto is a true pass-through architecture, there is no caching delay or sync job to wait for. Latency should be comparable to Apideck since both architectures fetch directly from upstream providers.
  4. Cut over fully once you are confident in parity.

The next API call your system makes will route through Truto, authenticate using the imported tokens, fetch the live data from the upstream provider, transform it via JSONata, and return it to your application.

Phase 5: Smoke Tests, Validation, and Rollback

Do not skip this phase. A migration without a test plan is a migration that breaks at 2 AM.

Smoke Tests

Build an automated smoke test suite that runs against every imported Integrated Account. At minimum, test these operations for each connection:

  1. Read test: Make a GET request to list a small page of records (e.g., list 5 contacts, list 5 employees). Verify the response status is 200, the payload matches your expected schema shape, and key fields are populated.
  2. Token refresh test: For OAuth connections, force a token refresh via Truto's API (POST /integrated-account/refresh-credentials) and verify it succeeds. This confirms the imported refresh token is valid and your OAuth app credentials are correctly configured in Truto.
  3. Write test (if applicable): If your application creates or updates records, test a write operation against a sandbox or test account. Do not test writes against production customer accounts without their knowledge.
  4. Webhook delivery test: If you've configured webhook subscriptions, trigger a test event and verify it arrives at your endpoint with the expected payload format.
# Force a token refresh to validate imported credentials
curl -X POST https://api.truto.one/integrated-account/refresh-credentials \
  -H "Authorization: Bearer $TRUTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id": "imported-integrated-account-id"}'

Validation During Parallel Running

During the 48-72 hour parallel running window, log the responses from both Apideck and Truto for the same requests. Diff them programmatically. Common discrepancies to watch for:

  • Field naming differences you missed in your JSONata mappings
  • Date format variations (ISO 8601 vs. Unix timestamps)
  • Pagination cursor formats that differ between platforms
  • Null vs. missing fields - Apideck may return null for empty fields while Truto may omit them entirely, or vice versa

Rollback Plan

If the migration fails or you discover a blocking issue, you need a clean rollback path:

  1. Keep Apideck active for at least 2 weeks after cutover. Do not cancel your Apideck subscription or delete connections until the migration is fully validated in production.
  2. DNS rollback: If you used weighted DNS or a feature flag for the cutover, reverting is a single configuration change that routes traffic back to Apideck.
  3. Token validity window: Refresh tokens don't expire when you stop using them (they expire when the upstream provider invalidates them, which typically only happens on explicit revocation or after extended non-use). Your Apideck connections will remain functional as long as you haven't revoked the OAuth grants.
  4. Do not refresh the same token from both platforms simultaneously. Once Truto refreshes a token, the old access token that Apideck holds becomes invalid. During parallel running, ensure only one platform is actively refreshing tokens for a given connection at any time.
Danger

Critical: Some OAuth providers (notably Salesforce and Google) rotate refresh tokens on use - meaning when Truto uses a refresh token, it receives a new refresh token and the old one is invalidated. Once this happens, Apideck's copy of the refresh token is dead. Plan your parallel running carefully: use Truto for active traffic and keep Apideck as a read-only fallback, not as a live secondary.

Handling Rate Limits and Webhooks Post-Migration

When evaluating Truto vs Apideck, you must understand the architectural differences in how the platforms handle infrastructure realities like rate limits and webhooks.

Strict Pass-Through for Rate Limits

Many unified APIs attempt to hide rate limits from developers by automatically queuing and retrying requests when an upstream provider returns an HTTP 429 Too Many Requests error. This is an architectural anti-pattern. Automatic retries obscure the actual state of the system, break idempotency guarantees, and cause unpredictable latency spikes in customer-facing applications. A generic retry-after-429 policy inside the middleware can actually make things worse during bursty traffic by queuing retries that compound the problem.

Truto takes a deliberately opinionated, radically honest approach: Truto does not automatically retry, throttle, or apply backoff on rate limit errors. When an upstream API returns HTTP 429, Truto passes that error directly to the caller.

However, every upstream provider uses different header names for rate limit info (e.g., Salesforce uses Sforce-Limit-Info, HubSpot uses X-HubSpot-RateLimit-Daily). Truto normalizes this chaotic upstream rate limit information into standardized headers per the IETF specification:

HTTP/1.1 429 Too Many Requests
RateLimit-Limit: 10000
RateLimit-Remaining: 0
RateLimit-Reset: 1678901234

This gives your engineering team full control. You know your traffic patterns better than any middleware does. You know exactly how many requests you have left and exactly when the window resets across every integration, allowing you to implement your own exponential backoff and circuit breaker logic tailored to your specific application needs.

Warning

Migration-specific rate limit risk: During parallel running, both Apideck and Truto are making requests to the same upstream provider on behalf of the same OAuth app. This effectively doubles your API call volume against provider rate limits. Budget for this by reducing traffic to non-essential endpoints during the parallel window, or stagger the cutover integration by integration rather than all at once.

Unified Webhook Ingestion

Apideck relies heavily on virtual webhooks, defaulting to polling endpoints every 24 hours to check for state changes for providers without native webhook support. Truto takes a different architectural approach focused on real-time ingestion.

For providers that support native webhooks (Salesforce, HubSpot, QuickBooks, Jira, etc.), Truto receives incoming HTTP webhooks directly from the third-party provider, verifies the cryptographic signature against provider-specific algorithms, maps the provider-specific event into a normalized event type, and delivers it to your application via a standardized outbound payload secured by an X-Truto-Signature.

For providers without native webhook support, Truto's declarative data sync engine lets you configure polling at the interval you need—minutes, not hours—and delivers changes as webhook-style events to your application. This eliminates the need to manage polling infrastructure entirely, ensuring your application reacts to data changes in seconds, not days, with total transparency into your sync logs.

Security and Compliance Checklist for Token Transfer

Migrating OAuth tokens between platforms is a high-stakes operation. A single leaked token could give an attacker access to your customer's CRM, HRIS, or accounting data. Follow this checklist:

Requirement Implementation Why It Matters
Encryption in transit Transfer token export files exclusively over TLS 1.2+ (HTTPS, SFTP, or encrypted email). Never transmit via Slack, email attachments, or shared drives. Tokens in transit are vulnerable to interception
Encryption at rest If tokens must be stored on disk temporarily (e.g., a migration script's working directory), use AES-256 encryption. Delete the plaintext export immediately after import. A leaked export file compromises every customer
Access control Restrict access to the export file and migration scripts to the smallest possible group. Use named credentials, not shared logins, for audit trails. Limits blast radius if credentials leak
Audit logging Log every token import operation with timestamps, the Integrated Account ID created, and the operator's identity. Do not log the token values themselves. Enables incident response and compliance audits
Token rotation post-migration After confirming all connections are live in Truto, force a bulk token refresh. This rotates the access tokens and, for providers that support it, the refresh tokens. Invalidates any copies of tokens that may still exist in Apideck or intermediate systems
Revoke old platform access Once migration is validated, revoke Apideck's callback URL from your OAuth app configurations at each provider. Prevents the old platform from refreshing tokens you've already migrated
SOC 2 / HIPAA documentation Update your sub-processor list: remove Apideck, add Truto. Update data flow diagrams to reflect the new credential storage path. Compliance auditors will ask about this during your next review

Truto encrypts all sensitive credential fields (access tokens, refresh tokens, API keys, client secrets) at rest using AES-GCM encryption. These fields are masked when listing Integrated Accounts via the API and are only decrypted internally when making authenticated requests to upstream providers.

Future-Proofing with Truto: Custom Resources and MCP Servers

Migrating off Apideck solves the immediate pain of pricing walls and polling delays, but Truto's architecture provides long-term strategic advantages for enterprise SaaS.

Zero Integration-Specific Code Truto's runtime is a generic execution engine. It reads a declarative configuration describing how to talk to a third-party API, plus a declarative mapping describing how to translate between unified and native formats, and executes both without any awareness of which integration it is running. This means Truto can support any custom field, custom object, or obscure endpoint without requiring a code deployment. You are never blocked waiting for a vendor's product roadmap update.

The Proxy API If a provider has a niche endpoint that is not covered by a standard unified model, you do not have to fall back to building the integration yourself. Truto's Proxy API allows you to make authenticated requests directly to the underlying provider using the same Integrated Account credentials, bypassing the unified schema entirely when necessary.

Auto-Generated MCP Servers As your product evolves to include agentic AI capabilities, Truto automatically exposes every integration as an MCP server. Truto handles the tool generation, filtering, token management, and JSON-RPC protocol handling required to give LLMs (like Claude, ChatGPT, or custom LangChain agents) secure, auditable access to your customers' third-party data. No hand-writing tool schemas or maintaining a separate tool layer.

Pass-Through Architecture with Zero Data Retention Like Apideck, Truto does not cache your customers' third-party data at rest. When a request comes in, Truto routes it, translates it, handles OAuth token refresh, and passes the response directly back. This means one less sub-processor to worry about on your SOC 2 or HIPAA compliance documentation.

Troubleshooting Common Failure Modes

Even well-planned migrations hit edge cases. Here are the failure modes we see most often and how to resolve them.

invalid_grant errors immediately after import This means the refresh token was already expired or revoked when you imported it. Common causes: the token export sat on disk too long before import, or the upstream provider rotated the refresh token between export and import. Fix: These accounts require re-authentication. Flag them in your migration tracking spreadsheet and send targeted reconnection requests to only the affected customers.

401 Unauthorized on first API call but refresh succeeds The imported access_token has expired (they usually last 1 hour), but the refresh token is still valid. Truto's proactive refresh may not have fired yet if the expires_at timestamp was missing or incorrect. Fix: Force a token refresh via the API before making the first call, or ensure your import includes an accurate expires_at timestamp so Truto's proactive refresh schedules correctly.

redirect_uri_mismatch during token refresh Some OAuth providers validate the redirect URI during token refresh (most don't, but some do). If Truto's callback URL isn't registered in your OAuth app configuration, the refresh will fail. Fix: Add Truto's OAuth callback URL to the list of authorized redirect URIs in your OAuth app settings at the provider before importing tokens.

Scope mismatch after migration The scopes granted during the original OAuth flow through Apideck may not match the scopes Truto requests by default. If Truto requests additional scopes during a token refresh, some providers will reject the request. Fix: Configure the Truto integration to use exactly the same scopes that were granted through Apideck. You recorded these during the export phase.

Duplicate API calls during parallel running If both platforms are processing the same webhook events or running sync jobs simultaneously, you may see duplicate writes to your database. Fix: Ensure only one platform is the active processor at any given time. Use feature flags at the application layer, not at the DNS layer, to control which platform handles which traffic.

Rate limits hit faster than expected During parallel running, your effective API call volume to upstream providers doubles. If you're already close to a provider's rate limit, this will push you over. Fix: Stagger the migration integration by integration. Migrate your lowest-volume integrations first to build confidence, then migrate high-volume integrations last with careful rate limit monitoring.

Your Migration Checklist

Before you start, validate these prerequisites with your team:

Step What to Verify Risk if Skipped
OAuth app ownership You own the client ID/secret, not Apideck Tokens cannot be migrated; full re-auth required
Refresh token validity Export and validate refresh tokens are not expired Expired tokens require per-account re-auth
Schema mapping audit Document every field your frontend consumes from Apideck's API Post-migration 500 errors from missing field mappings
Webhook endpoint inventory List all webhook subscriptions and their event types Missed events during cutover window
Rate limit budgets Know your per-provider API call quotas Parallel running during migration doubles API usage
Redirect URI registration Add Truto's callback URL to your OAuth apps at each provider Token refreshes fail with redirect_uri_mismatch
Rollback plan documented DNS or feature flag config to revert to Apideck within minutes Extended outage if migration fails with no fallback
Security review Encrypted transfer channel, access controls, audit logging for token export Token leak compromises customer data across all integrations

Migrating unified APIs is a serious engineering undertaking, but the re-authentication cliff is entirely avoidable. By systematically exporting your credentials, mapping your responses, and leveraging a true pass-through architecture, you can upgrade your integration infrastructure in a single sprint without your customers ever noticing the transition.

FAQ

Can I migrate from Apideck to another unified API without re-authenticating users?
Yes, if you own the OAuth app credentials (Client ID and Client Secret) that were configured in Apideck Vault. The tokens were issued to your OAuth application, not to Apideck. You can export refresh tokens, import them into the new platform, and the upstream providers will continue to honor them.
Does Apideck let you export raw OAuth tokens from Vault?
Apideck does not provide a public API endpoint that returns raw access_token or refresh_token values. The Vault API returns connection metadata but not raw credentials. You'll need to submit a GDPR data portability request or work with Apideck support to get a structured credential export.
What happens if my refresh token expires during the migration?
If a refresh token is already expired when you import it into Truto, the platform marks that account as needing re-authentication. To avoid this, minimize the time between exporting tokens from Apideck and importing them into Truto. Force a token refresh immediately after import to validate all connections.
How does Truto handle OAuth token refresh for migrated accounts?
Truto schedules proactive token refreshes 60-180 seconds before expiry, based on the expires_at timestamp you provide during import. It also checks token validity before every API call with a 30-second buffer. If a proactive refresh fails, Truto marks the account as needing re-auth and sends a webhook notification.
Can I roll back to Apideck if the migration fails?
Yes, as long as you keep your Apideck subscription active and don't revoke connections. Use feature flags or weighted DNS to control traffic routing, so reverting is a single configuration change. Be aware that some OAuth providers rotate refresh tokens on use, so once Truto refreshes a token, Apideck's copy may be invalidated.
What about API key integrations - do those need re-authentication?
API key and basic auth integrations don't involve OAuth at all, so there's no re-authentication flow. You can export the API keys from Apideck (via data export request or by asking end users directly) and import them into Truto. The keys remain valid regardless of which platform uses them.

More from our Blog