# Check access Source: https://crevio.co/docs/api-reference/access/check-access /developer/api-reference/openapi.json get /users/{id}/access/{resource_id} Returns whether a buyer (user_… or cus_… id) has access to a resource (the account acct_…, a prod_…, or an exp_…) and at what level (no_access, customer, admin). Powers entitlement gating on deployed sites. # Get current account Source: https://crevio.co/docs/api-reference/account/get-current-account /developer/api-reference/openapi.json get /account Returns information about the authenticated account # Update current account Source: https://crevio.co/docs/api-reference/account/update-current-account /developer/api-reference/openapi.json patch /account Updates the authenticated account's information # Ad comments Source: https://crevio.co/docs/api-reference/ads/ad-comments /developer/api-reference/openapi.json get /ads/{id}/comments Comments on the ad's underlying post (Meta dark posts). # Ad performance Source: https://crevio.co/docs/api-reference/ads/ad-performance /developer/api-reference/openapi.json get /ads/{id}/analytics Per-ad performance with optional demographic breakdowns. # Add keywords or negatives Source: https://crevio.co/docs/api-reference/ads/add-keywords-or-negatives /developer/api-reference/openapi.json post /ads/keywords Add keywords to a Google Search ad group, or with `negative: true` add negatives to one ad group (`ad_group_id`) or one campaign (`campaign_id`). Every keyword or negative already there is kept. New keywords start spending on the ad group's bids; searches matching a negative stop showing the ads. # Archive lead form Source: https://crevio.co/docs/api-reference/ads/archive-lead-form /developer/api-reference/openapi.json delete /ads/lead-forms/{id} Archive a form (Meta has no hard delete). # Boost a post Source: https://crevio.co/docs/api-reference/ads/boost-a-post /developer/api-reference/openapi.json post /ads/boost Promote an existing published post as an ad. # Bulk pause campaigns Source: https://crevio.co/docs/api-reference/ads/bulk-pause-campaigns /developer/api-reference/openapi.json post /ads/campaigns/bulk-pause Pause up to 50 campaigns in one call. # Bulk resume campaigns Source: https://crevio.co/docs/api-reference/ads/bulk-resume-campaigns /developer/api-reference/openapi.json post /ads/campaigns/bulk-resume Resume up to 50 campaigns in one call. # Connect ads Source: https://crevio.co/docs/api-reference/ads/connect-ads /developer/api-reference/openapi.json post /ads/connect Connect ads for a platform (separate from posting). Required before campaigns/ads sync. Same-token platforms (facebook, instagram, linkedin, pinterest) need no extra OAuth; tiktok, twitter and googleads return an auth_url. ChatGPT ads (openaiads) have no OAuth: send an `api_key` from ChatGPT Ads Manager, which covers exactly one ad account. # Create ad Source: https://crevio.co/docs/api-reference/ads/create-ad /developer/api-reference/openapi.json post /ads Create a standalone ad with its own creative. # Create Click-to-WhatsApp ad Source: https://crevio.co/docs/api-reference/ads/create-click-to-whatsapp-ad /developer/api-reference/openapi.json post /ads/ctwa Create Click-to-WhatsApp ad(s) (Meta). # Create custom audience Source: https://crevio.co/docs/api-reference/ads/create-custom-audience /developer/api-reference/openapi.json post /ads/audiences Create a customer-list, retargeting, or lookalike audience (Meta). # Create lead form Source: https://crevio.co/docs/api-reference/ads/create-lead-form /developer/api-reference/openapi.json post /ads/lead-forms Create a lead-gen form (Meta). # Create pixel Source: https://crevio.co/docs/api-reference/ads/create-pixel /developer/api-reference/openapi.json post /ads/pixels Create a conversion destination (LinkedIn). # Create test lead Source: https://crevio.co/docs/api-reference/ads/create-test-lead /developer/api-reference/openapi.json post /ads/lead-forms/{id}/test-leads Seed a synthetic test lead. # Delete ad Source: https://crevio.co/docs/api-reference/ads/delete-ad /developer/api-reference/openapi.json delete /ads/{id} Cancel an ad (kept for history). # Delete campaign Source: https://crevio.co/docs/api-reference/ads/delete-campaign /developer/api-reference/openapi.json delete /ads/campaigns/{id} Delete a campaign and its hierarchy (Meta). # Delete custom audience Source: https://crevio.co/docs/api-reference/ads/delete-custom-audience /developer/api-reference/openapi.json delete /ads/audiences/{id} Delete a custom audience. # Delete pixel Source: https://crevio.co/docs/api-reference/ads/delete-pixel /developer/api-reference/openapi.json delete /ads/pixels/{id} Delete a conversion destination. # Duplicate campaign Source: https://crevio.co/docs/api-reference/ads/duplicate-campaign /developer/api-reference/openapi.json post /ads/campaigns/{id}/duplicate Duplicate a campaign to scale a winner (Meta + TikTok). # Estimate audience reach Source: https://crevio.co/docs/api-reference/ads/estimate-audience-reach /developer/api-reference/openapi.json post /ads/targeting/reach-estimate Pre-flight audience size for a targeting spec. # Link pixel to campaigns Source: https://crevio.co/docs/api-reference/ads/link-pixel-to-campaigns /developer/api-reference/openapi.json post /ads/pixels/{id}/associations Link a pixel to campaigns. # List ad accounts Source: https://crevio.co/docs/api-reference/ads/list-ad-accounts /developer/api-reference/openapi.json get /ads/ad-accounts Platform ad accounts (Meta, Google, TikTok…) under a connected channel. # List ads Source: https://crevio.co/docs/api-reference/ads/list-ads /developer/api-reference/openapi.json get /ads Ads with metrics, scoped to the tenant's accounts. # List ads connections Source: https://crevio.co/docs/api-reference/ads/list-ads-connections /developer/api-reference/openapi.json get /ads/connections The connected ad accounts (metaads, tiktokads, …) mirrored locally, with their sacct_ ids — referenceable by pixels and conversions. # List campaign ad groups Source: https://crevio.co/docs/api-reference/ads/list-campaign-ad-groups /developer/api-reference/openapi.json get /ads/campaigns/{id}/ad-groups The ad groups (ad sets) within a campaign. # List campaign ads Source: https://crevio.co/docs/api-reference/ads/list-campaign-ads /developer/api-reference/openapi.json get /ads/campaigns/{id}/ads The ads within a campaign. # List campaigns Source: https://crevio.co/docs/api-reference/ads/list-campaigns /developer/api-reference/openapi.json get /ads/campaigns Campaigns with aggregate metrics, scoped to the tenant's accounts. # List custom audiences Source: https://crevio.co/docs/api-reference/ads/list-custom-audiences /developer/api-reference/openapi.json get /ads/audiences Custom audiences for a connected account's ad account. # List form leads Source: https://crevio.co/docs/api-reference/ads/list-form-leads /developer/api-reference/openapi.json get /ads/lead-forms/{id}/leads Leads submitted against one form. # List lead forms Source: https://crevio.co/docs/api-reference/ads/list-lead-forms /developer/api-reference/openapi.json get /ads/lead-forms Lead-gen (Instant) forms (Meta). # List leads Source: https://crevio.co/docs/api-reference/ads/list-leads /developer/api-reference/openapi.json get /ads/leads Submitted leads across forms (Meta lead-gen CRM view). # List pixel associations Source: https://crevio.co/docs/api-reference/ads/list-pixel-associations /developer/api-reference/openapi.json get /ads/pixels/{id}/associations Campaigns linked to a pixel. # List pixels Source: https://crevio.co/docs/api-reference/ads/list-pixels /developer/api-reference/openapi.json get /ads/pixels Pixels / conversion actions / rules for an account. # List TikTok Business Centers Source: https://crevio.co/docs/api-reference/ads/list-tiktok-business-centers /developer/api-reference/openapi.json get /ads/business-centers Business Centers for a connected TikTok Ads channel. # Pause ad Source: https://crevio.co/docs/api-reference/ads/pause-ad /developer/api-reference/openapi.json post /ads/{id}/pause Pause a single ad. # Pause ad group Source: https://crevio.co/docs/api-reference/ads/pause-ad-group /developer/api-reference/openapi.json post /ads/ad-groups/{id}/pause Pause a single ad group. # Pause campaign Source: https://crevio.co/docs/api-reference/ads/pause-campaign /developer/api-reference/openapi.json post /ads/campaigns/{id}/pause Pause every ad in a campaign. # Performance report Source: https://crevio.co/docs/api-reference/ads/performance-report /developer/api-reference/openapi.json get /ads/reports Daily performance time-series for a connected account. # Pixel metrics Source: https://crevio.co/docs/api-reference/ads/pixel-metrics /developer/api-reference/openapi.json get /ads/pixels/{id}/metrics Conversion metrics for a destination. # Query ad insights Source: https://crevio.co/docs/api-reference/ads/query-ad-insights /developer/api-reference/openapi.json get /ads/insights A live performance query for reports the fixed endpoints don't cover, answered by the platform as is (rows snake_cased). The connection's platform picks the contract. Google Ads: any read-only GAQL SELECT in `query` (search terms, keywords and Quality Score, geo, demographics, assets, shopping, `change_event`), with counters as strings and cost in micros. Meta: Graph insights `fields`, `breakdowns` and `filtering` on `object_id`, which must be this connection's ad account (act_…) or one of its campaigns, ad sets or ads. TikTok: `ad_account_id`, `data_level`, `dimensions`, `metrics`, `from` and `to`. A query the platform rejects returns 400 with its message. Follow `next_cursor` for more rows. # Resume ad Source: https://crevio.co/docs/api-reference/ads/resume-ad /developer/api-reference/openapi.json post /ads/{id}/resume Resume a single ad. # Resume ad group Source: https://crevio.co/docs/api-reference/ads/resume-ad-group /developer/api-reference/openapi.json post /ads/ad-groups/{id}/resume Resume a single ad group. # Resume campaign Source: https://crevio.co/docs/api-reference/ads/resume-campaign /developer/api-reference/openapi.json post /ads/campaigns/{id}/resume Resume every ad in a campaign. # Retrieve ad Source: https://crevio.co/docs/api-reference/ads/retrieve-ad /developer/api-reference/openapi.json get /ads/{id} One ad with creative, targeting, status, and metrics. Accepts the Zernio id, Meta numeric id, or story/media id. # Retrieve ad group Source: https://crevio.co/docs/api-reference/ads/retrieve-ad-group /developer/api-reference/openapi.json get /ads/ad-groups/{id} One ad group (ad set), derived from the ad tree. # Retrieve campaign Source: https://crevio.co/docs/api-reference/ads/retrieve-campaign /developer/api-reference/openapi.json get /ads/campaigns/{id} One campaign (derived from the campaign list). # Retrieve custom audience Source: https://crevio.co/docs/api-reference/ads/retrieve-custom-audience /developer/api-reference/openapi.json get /ads/audiences/{id} One custom audience, with fresh platform metadata when available. # Retrieve lead form Source: https://crevio.co/docs/api-reference/ads/retrieve-lead-form /developer/api-reference/openapi.json get /ads/lead-forms/{id} One lead-gen form. # Retrieve pixel Source: https://crevio.co/docs/api-reference/ads/retrieve-pixel /developer/api-reference/openapi.json get /ads/pixels/{id} One pixel / conversion destination. # Search targeting options Source: https://crevio.co/docs/api-reference/ads/search-targeting-options /developer/api-reference/openapi.json get /ads/targeting/search Search interests, locations, behaviors, or income targeting for audience building. # Send conversions Source: https://crevio.co/docs/api-reference/ads/send-conversions /developer/api-reference/openapi.json post /ads/conversions Send server-side conversion events (Meta CAPI / Google / LinkedIn). # Unlink pixel from campaigns Source: https://crevio.co/docs/api-reference/ads/unlink-pixel-from-campaigns /developer/api-reference/openapi.json delete /ads/pixels/{id}/associations Unlink a pixel from campaigns. # Update ad Source: https://crevio.co/docs/api-reference/ads/update-ad /developer/api-reference/openapi.json patch /ads/{id} Live edits to an ad's budget, targeting, or name. # Update ad group Source: https://crevio.co/docs/api-reference/ads/update-ad-group /developer/api-reference/openapi.json patch /ads/ad-groups/{id} Update ad group budget / bid / schedule. # Update campaign Source: https://crevio.co/docs/api-reference/ads/update-campaign /developer/api-reference/openapi.json patch /ads/campaigns/{id} Update campaign budget / bid strategy (Meta). # Update pixel Source: https://crevio.co/docs/api-reference/ads/update-pixel /developer/api-reference/openapi.json patch /ads/pixels/{id} Update a conversion destination. # Upload audience users Source: https://crevio.co/docs/api-reference/ads/upload-audience-users /developer/api-reference/openapi.json post /ads/audiences/{id}/users Upload hashed user data (≤10k) to a customer-list audience. # Allow an email sender Source: https://crevio.co/docs/api-reference/allowed-senders/allow-an-email-sender /developer/api-reference/openapi.json post /email/allowed_senders Lets an address email the agent's inbox. Who may reach the agent is an access change, so an agent's call always asks the user first. It applies from that sender's next email; anything they sent before stays unanswered. Allowing an address that is already allowed returns it unchanged with 200. # List allowed email senders Source: https://crevio.co/docs/api-reference/allowed-senders/list-allowed-email-senders /developer/api-reference/openapi.json get /email/allowed_senders Lists the addresses the agent's inbox answers besides the account owner's. Mail from anyone else gets a short notice instead of a reply. Whole domains are managed in Settings → AI assistant. # Remove an allowed email sender Source: https://crevio.co/docs/api-reference/allowed-senders/remove-an-allowed-email-sender /developer/api-reference/openapi.json delete /email/allowed_senders/{id} Stops the agent's inbox answering an address. Accepts the sender's id or the address itself. # Get business overview Source: https://crevio.co/docs/api-reference/analytics/get-business-overview /developer/api-reference/openapi.json get /analytics Account-wide business pulse in one call: revenue, orders, leads, new customers, and live-site traffic over a date range, each compared against the immediately preceding period of equal length. Defaults to the last 7 days; the range cannot exceed 366 days. Use this as the starting point for any business review — drill into a specific site with GET /sites/{id}/analytics, and into records with the orders/customers list endpoints. # Create API key Source: https://crevio.co/docs/api-reference/apikeys/create-api-key /developer/api-reference/openapi.json post /auth/keys Creates a new API key. The full secret (`token`) is returned only in this response—store it securely, it cannot be retrieved again. `scopes` limits what the key may call (omit them to copy the calling key's), and `kind: "team"` makes a shared key that sees only what the whole account sees. Only an account admin on a plan with API access can create keys (`402 plan_required` otherwise), and OAuth tokens cannot create them (`403 insufficient_scope`). # List API keys Source: https://crevio.co/docs/api-reference/apikeys/list-api-keys /developer/api-reference/openapi.json get /auth/keys Returns the API keys for the current account. The secret is never returned here—only the last four characters (`last4`). Lists team keys and your own personal keys, never other people's personal keys. # Revoke API key Source: https://crevio.co/docs/api-reference/apikeys/revoke-api-key /developer/api-reference/openapi.json delete /auth/keys/{id} Permanently revokes (deletes) an API key. Any request authenticating with it afterward fails. # Rotate API key Source: https://crevio.co/docs/api-reference/apikeys/rotate-api-key /developer/api-reference/openapi.json post /auth/keys/{id}/rotate Issues a new secret for the key and revokes the old one at the same moment. The key keeps its id, name and scopes. The new secret (`token`) is in this response only. # Update API key Source: https://crevio.co/docs/api-reference/apikeys/update-api-key /developer/api-reference/openapi.json patch /auth/keys/{id} Renames a key or replaces its scopes. Scope changes apply from the next request. A key can only grant scopes it holds itself (`403 insufficient_scope`). # Approve an action Source: https://crevio.co/docs/api-reference/approvals/approve-an-action /developer/api-reference/openapi.json post /approvals/{id}/approve Approves and replays the exact frozen action. An action raised over the API runs now, and the approval comes back `executed` (with `result`) or `failed` (with `error`). One raised in a chat comes back `approved`: the agent runs it on its next turn, so poll the approval for the outcome. The Crevio agent can never approve: its calls are refused with 403 `approval_requires_user`. # Deny an action Source: https://crevio.co/docs/api-reference/approvals/deny-an-action /developer/api-reference/openapi.json post /approvals/{id}/deny Denies the action (never replayed). Records the optional reason and unblocks the originating chat turn if any. # Get an approval Source: https://crevio.co/docs/api-reference/approvals/get-an-approval /developer/api-reference/openapi.json get /approvals/{id} Fetch one approval, including its result or error once resolved. # List approvals Source: https://crevio.co/docs/api-reference/approvals/list-approvals /developer/api-reference/openapi.json get /approvals Human-in-the-loop approvals for gated integration actions. Filter by `status`. # Set a tool's approval policy Source: https://crevio.co/docs/api-reference/approvals/set-a-tools-approval-policy /developer/api-reference/openapi.json patch /tool_policies Sets the approval policy for one tool, addressed by its role (e.g. `crevioApi.createProduct`, `pdGmail.sendEmail`): `off` refuses it, `always_ask` freezes each call as an approval, `always_allow` runs it. Covers Crevio API endpoints, connected apps and MCP servers; the agent's built-in platform tools have a fixed policy and answer 422 `policy_fixed`. A choice is kept even when it equals the default. A tool that moves money or changes access (`x-crevio-locked` on a Crevio API operation, this endpoint included) is never set to `always_allow`: the call answers 422 `policy_locked`. # Get artifact download URL Source: https://crevio.co/docs/api-reference/artifacts/get-artifact-download-url /developer/api-reference/openapi.json get /artifacts/{id}/download_url Exchanges an artifact id (`art_...`) from a run's or script run's `artifacts` for a download link. The link needs no credentials and expires after 15 minutes; ask again for a fresh one. Needs the `files:read` scope. # Generate audio Source: https://crevio.co/docs/api-reference/audio/generate-audio /developer/api-reference/openapi.json post /audio/generate Submits an asynchronous audio (text-to-speech) generation job to the fal.ai queue and returns the queued job immediately. It speaks the given text; for a song, soundtrack or instrumental use `POST /v1/audio/music`. Poll `GET /v1/jobs/{id}` or `GET /v1/audio/{id}` for status and results. Credits are charged only when the job completes successfully. # Generate music Source: https://crevio.co/docs/api-reference/audio/generate-music /developer/api-reference/openapi.json post /audio/music Submits an asynchronous music generation job (an original song or instrumental track from a text description) to the fal.ai queue and returns the queued job immediately. Use it for soundtracks, background beds, jingles and intros; for spoken words use `POST /v1/audio/generate`. Poll `GET /v1/jobs/{id}` or `GET /v1/audio/{id}` for status; the finished track is `result.audio`. Credits are charged only when the job completes successfully. # Get audio job Source: https://crevio.co/docs/api-reference/audio/get-audio-job /developer/api-reference/openapi.json get /audio/{id} Convenience alias for `GET /v1/jobs/{id}` that asserts the job is a speech or music generation job (404 otherwise). # List audio models Source: https://crevio.co/docs/api-reference/audio/list-audio-models /developer/api-reference/openapi.json get /audio/models Lists the audio (text-to-speech) generation models available to `POST /v1/audio/generate`, enriched with live fal.ai pricing. # List music models Source: https://crevio.co/docs/api-reference/audio/list-music-models /developer/api-reference/openapi.json get /audio/music/models Lists the music generation models available to `POST /v1/audio/music`, enriched with live fal.ai pricing. # Create billing portal session Source: https://crevio.co/docs/api-reference/billing-portal/create-billing-portal-session /developer/api-reference/openapi.json post /billing_portal/sessions Creates a short-lived link to a customer's hosted billing page on billing.crevio.co, where they can update their payment method and billing address, download invoices and manage subscriptions. Redirect the customer to `url` right away: it must be opened before `expires_at`, then keeps working for an hour in the browser that opened it. Do not store it or put it in emails. # Get blog category Source: https://crevio.co/docs/api-reference/blogcategories/get-blog-category /developer/api-reference/openapi.json get /blog_categories/{id_or_slug} Returns a specific blog category # List blog categories Source: https://crevio.co/docs/api-reference/blogcategories/list-blog-categories /developer/api-reference/openapi.json get /blog_categories Returns a list of blog categories for the current account # Create blog post Source: https://crevio.co/docs/api-reference/blogposts/create-blog-post /developer/api-reference/openapi.json post /blog_posts Creates a new blog post. # Delete blog post Source: https://crevio.co/docs/api-reference/blogposts/delete-blog-post /developer/api-reference/openapi.json delete /blog_posts/{id_or_slug} Deletes a blog post. # Get blog post Source: https://crevio.co/docs/api-reference/blogposts/get-blog-post /developer/api-reference/openapi.json get /blog_posts/{id_or_slug} Returns a specific blog post by ID or slug # List blog posts Source: https://crevio.co/docs/api-reference/blogposts/list-blog-posts /developer/api-reference/openapi.json get /blog_posts Returns a list of blog posts, optionally filtered by status # Update blog post Source: https://crevio.co/docs/api-reference/blogposts/update-blog-post /developer/api-reference/openapi.json patch /blog_posts/{id_or_slug} Updates an existing blog post. # Cancel a booking Source: https://crevio.co/docs/api-reference/bookings/cancel-a-booking /developer/api-reference/openapi.json post /bookings/{id}/cancel Cancels a booking, frees the slot, removes the calendar event, and notifies the attendee. # Create a booking Source: https://crevio.co/docs/api-reference/bookings/create-a-booking /developer/api-reference/openapi.json post /bookings Books a slot on an event type. Free event types confirm immediately; paid event types return a `pending` booking whose `checkout_url`(via the linked checkout) must be paid to confirm. # List bookings Source: https://crevio.co/docs/api-reference/bookings/list-bookings /developer/api-reference/openapi.json get /bookings Returns bookings for the current account, newest first. Filter by `status` to separate confirmed bookings from pending or cancelled ones, or by `event_type_id` to scope to a single bookable service. Use `expand` to inline the related event type and customer instead of following their IDs. # Reschedule a booking Source: https://crevio.co/docs/api-reference/bookings/reschedule-a-booking /developer/api-reference/openapi.json post /bookings/{id}/reschedule Moves a confirmed booking to a new start time, re-validating availability and patching the calendar event. # Retrieve a booking Source: https://crevio.co/docs/api-reference/bookings/retrieve-a-booking /developer/api-reference/openapi.json get /bookings/{id} Retrieves a single booking by ID, including its start and end times, status, and the answers the customer gave when booking. Use `expand` to inline the related event type and customer. # Create bot Source: https://crevio.co/docs/api-reference/bots/create-bot /developer/api-reference/openapi.json post /bots Creates a bot — a named identity that parameterizes the agent Crevio runs for you: its persona, the skills it may load, and the toolsets it may call. `handle` is derived from `name` when omitted, and is unique within the account. `skill_slugs` and `toolsets` are tri-state: `null` means every skill / every toolset, `[]` means none, and a list restricts the bot to exactly those. Omitting a field leaves it unchanged. # Delete bot Source: https://crevio.co/docs/api-reference/bots/delete-bot /developer/api-reference/openapi.json delete /bots/{id} Deletes a bot. Its chats and tasks are kept and unbound from it, so transcripts survive. # Get bot Source: https://crevio.co/docs/api-reference/bots/get-bot /developer/api-reference/openapi.json get /bots/{id} Returns a specific bot. # List bots Source: https://crevio.co/docs/api-reference/bots/list-bots /developer/api-reference/openapi.json get /bots Returns the account's bot roster, newest first. Search by name, handle, or role with `query`. # Update bot Source: https://crevio.co/docs/api-reference/bots/update-bot /developer/api-reference/openapi.json patch /bots/{id} Updates an existing bot. `skill_slugs` and `toolsets` are tri-state: `null` means every skill / every toolset, `[]` means none, and a list restricts the bot to exactly those. Omitting a field leaves it unchanged. # Cancel a broadcast Source: https://crevio.co/docs/api-reference/broadcasts/cancel-a-broadcast /developer/api-reference/openapi.json post /broadcasts/{id}/cancel Cancels a scheduled or in-flight broadcast. Recipients already handed to the email provider will still receive it; the rest are dropped, and the stats collected so far are kept. # Create a broadcast Source: https://crevio.co/docs/api-reference/broadcasts/create-a-broadcast /developer/api-reference/openapi.json post /broadcasts Creates a broadcast. Omit `scheduled_at` to save a draft, pass a future timestamp to schedule it, or pass `send_now: true` to resolve the audience and start sending immediately. Sending a 1:1 email? Use `POST /v1/email/inboxes/{inbox_id}/messages` instead — it creates a tracked thread you can reply within. # Delete a broadcast Source: https://crevio.co/docs/api-reference/broadcasts/delete-a-broadcast /developer/api-reference/openapi.json delete /broadcasts/{id} Permanently deletes a draft or scheduled broadcast. A sent broadcast is a permanent record of what went out and cannot be deleted. # List broadcast link clicks Source: https://crevio.co/docs/api-reference/broadcasts/list-broadcast-link-clicks /developer/api-reference/openapi.json get /broadcasts/{id}/link-clicks Returns click performance for each link in a broadcast: `clicks` counts every click, `unique_clicks` counts distinct recipients. Not paginated — an email has a handful of links. # List broadcast recipients Source: https://crevio.co/docs/api-reference/broadcasts/list-broadcast-recipients /developer/api-reference/openapi.json get /broadcasts/{id}/recipients Lists the addresses in a broadcast's resolved audience with their individual delivery and engagement state. Filter by `status` to pull just the bounces, for example. # List broadcasts Source: https://crevio.co/docs/api-reference/broadcasts/list-broadcasts /developer/api-reference/openapi.json get /broadcasts Lists the account's broadcasts, newest first. Filter by `status`, or by when they went out with `sent_after` / `sent_before`. # Retrieve a broadcast Source: https://crevio.co/docs/api-reference/broadcasts/retrieve-a-broadcast /developer/api-reference/openapi.json get /broadcasts/{id} Returns a broadcast, including its current delivery and engagement `stats`. # Retrieve broadcast stats Source: https://crevio.co/docs/api-reference/broadcasts/retrieve-broadcast-stats /developer/api-reference/openapi.json get /broadcasts/{id}/stats Returns delivery and engagement stats for a single broadcast. The same object is embedded as `stats` on the broadcast itself; this endpoint exists for callers that only want to poll progress. # Send a broadcast Source: https://crevio.co/docs/api-reference/broadcasts/send-a-broadcast /developer/api-reference/openapi.json post /broadcasts/{id}/send Sends a draft or scheduled broadcast immediately, ignoring any `scheduled_at`. Resolves the audience, drops suppressed and unsubscribed addresses, and moves the broadcast to `sending`. # Update a broadcast Source: https://crevio.co/docs/api-reference/broadcasts/update-a-broadcast /developer/api-reference/openapi.json patch /broadcasts/{id} Updates a draft or scheduled broadcast. Only fields included in the request body change. Clearing `scheduled_at` demotes a scheduled broadcast back to a draft; setting it on a draft schedules it. A broadcast that is already sending or sent can no longer be edited. # Get a call Source: https://crevio.co/docs/api-reference/calls/get-a-call /developer/api-reference/openapi.json get /calls/{id} Retrieves a call by id, including its status, transcript, recording, and outcome once it has ended. # List calls Source: https://crevio.co/docs/api-reference/calls/list-calls /developer/api-reference/openapi.json get /calls Lists phone calls (inbound and outbound) for the account, most recent first. # Place a call Source: https://crevio.co/docs/api-reference/calls/place-a-call /developer/api-reference/openapi.json post /calls Places an autonomous outbound phone call. An AI voice agent dials the number and pursues the objective, acting on account data mid-call. Only call numbers that have consented to be contacted. # Create chapter Source: https://crevio.co/docs/api-reference/chapters/create-chapter /developer/api-reference/openapi.json post /experiences/{experience_id}/chapters Adds a chapter to a course experience # Delete chapter Source: https://crevio.co/docs/api-reference/chapters/delete-chapter /developer/api-reference/openapi.json delete /chapters/{id} Deletes a chapter and its lessons # List chapters Source: https://crevio.co/docs/api-reference/chapters/list-chapters /developer/api-reference/openapi.json get /experiences/{experience_id}/chapters Returns the chapters of a course experience # Update chapter Source: https://crevio.co/docs/api-reference/chapters/update-chapter /developer/api-reference/openapi.json patch /chapters/{id} Updates a chapter's title or position # Get chat Source: https://crevio.co/docs/api-reference/chats/get-chat /developer/api-reference/openapi.json get /chats/{id} A chat's title and its latest run. A run id (`trun_...`) also finds its chat. # List chat messages Source: https://crevio.co/docs/api-reference/chats/list-chat-messages /developer/api-reference/openapi.json get /chats/{chat_id}/messages A chat's messages, newest first: what was asked and what the agent answered, without tool calls. # List chats Source: https://crevio.co/docs/api-reference/chats/list-chats /developer/api-reference/openapi.json get /chats The account's conversations with the agent that this key can see, newest first. A team key sees only chats the whole account can see. # Send a chat message Source: https://crevio.co/docs/api-reference/chats/send-a-chat-message /developer/api-reference/openapi.json post /chats/{chat_id}/messages Continues a chat: the agent keeps its context. Resumes a run waiting in `needs_input`, or starts a new run in the same chat when the last one finished. `409 run_busy` while a run is still working. Returns the run like POST /chats. Needs the `agent` scope. # Start a chat Source: https://crevio.co/docs/api-reference/chats/start-a-chat /developer/api-reference/openapi.json post /chats Hands the agent a job in natural language and opens a chat for it. The agent works the account through the API and every connected integration, like a chat in Crevio, and spends credits the same way. Returns the chat's first run: `202` while it works, or `200` with the agent's reply in `result` when it settled within `wait_seconds`. Pass `response_format` to get the reply as validated JSON in `json`. Continue the conversation with POST /chats/{id}/messages. Needs the `agent` scope. `402 insufficient_credits` when the account has no credits left. # Get checkout configuration Source: https://crevio.co/docs/api-reference/checkoutconfiguration/get-checkout-configuration /developer/api-reference/openapi.json get /checkout_configuration Returns the account-wide checkout settings: country allow-list, tax collection, discount codes, the phone / shipping address / tax ID fields shown at checkout, quantity selection, and the post-purchase success URL. Read it before changing anything — omitted fields keep their current value on update. # Update checkout configuration Source: https://crevio.co/docs/api-reference/checkoutconfiguration/update-checkout-configuration /developer/api-reference/openapi.json patch /checkout_configuration Partially updates the account-wide checkout settings; only the fields sent change. `allowed_countries` is an allow-list of ISO 3166-1 alpha-2 codes (`["US", "CA"]` lets only US and Canadian buyers through) — send `[]` to lift the restriction, never the full list of countries. `success_url` must be a full https:// URL; send `null` or `""` to restore the default thank-you page. Saving expires every open checkout session and re-syncs the account's Stripe Tax settings. # Create checkout link Source: https://crevio.co/docs/api-reference/checkoutlinks/create-checkout-link /developer/api-reference/openapi.json post /checkout_links Creates a new shareable checkout link # Delete checkout link Source: https://crevio.co/docs/api-reference/checkoutlinks/delete-checkout-link /developer/api-reference/openapi.json delete /checkout_links/{id} Deletes a checkout link # Get checkout link Source: https://crevio.co/docs/api-reference/checkoutlinks/get-checkout-link /developer/api-reference/openapi.json get /checkout_links/{id} Returns a specific checkout link # List checkout links Source: https://crevio.co/docs/api-reference/checkoutlinks/list-checkout-links /developer/api-reference/openapi.json get /checkout_links Returns a list of checkout links for the current account # Update checkout link Source: https://crevio.co/docs/api-reference/checkoutlinks/update-checkout-link /developer/api-reference/openapi.json patch /checkout_links/{id} Updates an existing checkout link # Create checkout session Source: https://crevio.co/docs/api-reference/checkouts/create-checkout-session /developer/api-reference/openapi.json post /checkouts Creates a new checkout session for purchasing products # Get checkout Source: https://crevio.co/docs/api-reference/checkouts/get-checkout /developer/api-reference/openapi.json get /checkouts/{id} Returns a specific checkout session # Place a test purchase Source: https://crevio.co/docs/api-reference/checkouts/place-a-test-purchase /developer/api-reference/openapi.json post /checkouts/{id}/test_purchase Completes the checkout as a no-charge test order, as an admin of the account. Nothing is charged and Stripe is not called. The order is created with `livemode: false` and sends the same `order.paid` webhook a real sale sends, with `livemode: false`, so a site can test its order handling end to end. Crevio's receipt goes to the admin placing the order, not to a customer. A checkout can be completed once, and an account can place 5 test purchases a minute. # Call a connected app's API directly Source: https://crevio.co/docs/api-reference/connections/call-a-connected-apps-api-directly /developer/api-reference/openapi.json post /connections/{id}/proxy Make an authenticated HTTP request to a connected app's own API, for endpoints no tool covers. Credentials are injected server-side and never exposed - do not send an Authorization header. The app's own status code is returned in the body (`status`), so a 404 there is the app's answer, not a failure of this call. Governed by the same approval policy as /execute: reads run now (200), writes freeze a pending approval (202). Only app connections proxy; MCP servers (use /execute) and social/ads connections (use their native /v1 endpoints) are refused with 409. # Change who can use a connection Source: https://crevio.co/docs/api-reference/connections/change-who-can-use-a-connection /developer/api-reference/openapi.json put /connections/{id}/access Change who can use an app connection without disconnecting it: its credential, tool settings and history stay as they are. `everyone` shares it with the whole team, `only_me` limits it to the caller, and `members` limits it to the listed teammates (include yourself to keep using it). Only those people see its tools, in their chats and in the tasks they created. A personal connection always stays usable by its owner, and naming members shares it with them too. It cannot be opened to `everyone`, because its credential belongs to its owner; connect it again as a Team connection for that. An account admin changes a team connection; only its owner changes a personal one. Only app connections support this. When Crevio's agent calls this, the user approves it first. # Disconnect a connection Source: https://crevio.co/docs/api-reference/connections/disconnect-a-connection /developer/api-reference/openapi.json delete /connections/{id} Disconnect any connection family by its unified public id (best-effort upstream revoke + local prune). A team connection stops working for everyone, and only a new OAuth connect brings it back; when Crevio's agent calls this, the user approves it first. To change who can use a connection, call PUT /connections/{id}/access instead; never disconnect and reconnect. An account admin can disconnect a team connection; only its owner can disconnect a personal one. # Execute a connection tool Source: https://crevio.co/docs/api-reference/connections/execute-a-connection-tool /developer/api-reference/openapi.json post /connections/{id}/execute Run a tool on any connection by its unified id, with the account's approval policy enforced. always_allow runs now (200); always_ask freezes a pending approval (202); off / not-callable refused. Social/ads connections are operated via their native /v1 endpoints (409). # List a connection's tools Source: https://crevio.co/docs/api-reference/connections/list-a-connections-tools /developer/api-reference/openapi.json get /connections/{id}/tools The gateable tools a connection exposes, each with its effective approval policy. Works for any family — the backend dispatches by transport. Social/ads connections return a pointer to their native /v1 endpoints. # List connected integrations Source: https://crevio.co/docs/api-reference/connections/list-connected-integrations /developer/api-reference/openapi.json get /connections/connected This account's connected integrations only, across all families — each with a unified id, status, and a `callable` flag indicating whether an agent can act on it. # List integrations Source: https://crevio.co/docs/api-reference/connections/list-integrations /developer/api-reference/openapi.json get /connections Searchable catalog of connectable integrations across every provider — connectable apps, suggested MCP servers, social/ads platforms — each flagged with whether this account has it connected (and the `connection_id` to act on if so). Forward-paginates over an opaque cursor. # Rename a connection Source: https://crevio.co/docs/api-reference/connections/rename-a-connection /developer/api-reference/openapi.json patch /connections/{id} Set a nickname for a connection, so several accounts of the same app are tellable apart ("work gmail" vs "support gmail"). Send an empty string to clear it and fall back to the provider's own label. Only app connections can be renamed; every other family takes its name from a record the provider owns. # Start a connection Source: https://crevio.co/docs/api-reference/connections/start-a-connection /developer/api-reference/openapi.json post /connections/connect Mint a hosted OAuth link to connect an app; send the user to `redirect_url`. Some apps need setup first (see `setup_fields`). On return the connection appears in GET /connections. # Add tag to customer Source: https://crevio.co/docs/api-reference/customers/add-tag-to-customer /developer/api-reference/openapi.json post /customers/{customer_id}/tags Adds a tag to a customer # Anonymize customer Source: https://crevio.co/docs/api-reference/customers/anonymize-customer /developer/api-reference/openapi.json post /customers/{id}/anonymize Removes a customer's personal data but keeps the customer and their orders for your records. Name, email, phone, notes and tax ID are redacted on the customer, its invoices and checkouts; their form submissions, bookings, calls, reviews, support chats and the emails they exchanged with you are deleted. Use it for customers with orders, who cannot be deleted. Immediate and permanent; `anonymized` is true afterwards. # Create customer Source: https://crevio.co/docs/api-reference/customers/create-customer /developer/api-reference/openapi.json post /customers Creates a new customer record # Delete customer Source: https://crevio.co/docs/api-reference/customers/delete-customer /developer/api-reference/openapi.json delete /customers/{id} Deletes a customer. The customer disappears from lists and lookups right away and is permanently erased 30 days later, together with their notes, form submissions, bookings, calls, support chats and the emails they sent or received. Until then it can be brought back with `POST /v1/customers/{id}/restore` (list pending ones with `GET /v1/customers?deleted=true`). Customers with any orders cannot be deleted (422); anonymize them with `POST /v1/customers/{id}/anonymize` instead. # Get customer Source: https://crevio.co/docs/api-reference/customers/get-customer /developer/api-reference/openapi.json get /customers/{id} Returns a specific customer # List customers Source: https://crevio.co/docs/api-reference/customers/list-customers /developer/api-reference/openapi.json get /customers Returns a list of customers for the current account # Preview customer retention Source: https://crevio.co/docs/api-reference/customers/preview-customer-retention /developer/api-reference/openapi.json get /customers/retention_preview Shows what a retention period would delete: leads (customers without an account) with no form submission, booking, call, checkout or 1:1 email in the last `days` days. Broadcasts don't count as contact. Leads with orders are kept and counted in `exempt_count`. Customers with an account are never deleted by retention. Set the period with `customer_retention_days` on `PATCH /v1/account`; a daily job then deletes matching leads, and they are permanently erased `purge_after_days` later. # Remove tag from customer Source: https://crevio.co/docs/api-reference/customers/remove-tag-from-customer /developer/api-reference/openapi.json delete /customers/{customer_id}/tags/{id} Removes a tag from a customer # Restore customer Source: https://crevio.co/docs/api-reference/customers/restore-customer /developer/api-reference/openapi.json post /customers/{id}/restore Brings back a deleted customer before it is permanently erased (see `purge_at`). Returns 409 when another customer now uses the same email address. # Update customer Source: https://crevio.co/docs/api-reference/customers/update-customer /developer/api-reference/openapi.json patch /customers/{id} Updates an existing customer record # Get a data run Source: https://crevio.co/docs/api-reference/data/get-a-data-run /developer/api-reference/openapi.json get /data/runs/{id} A data run by id: poll a `running` run until it is `succeeded` or `failed`. # Get a data tool Source: https://crevio.co/docs/api-reference/data/get-a-data-tool /developer/api-reference/openapi.json get /data/tools/{id} One data tool with its full input schema and estimated price. Free. # Run a data tool Source: https://crevio.co/docs/api-reference/data/run-a-data-tool /developer/api-reference/openapi.json post /data/runs Runs one data tool (find it with listDataTools) with `input` matching its `input_schema`, and returns the source's data. Billed from what the source charged, usually 1-5 credits; a failed run is free. Tools marked `queued` wait on the source's queue: if one is not done within about 25 seconds the run comes back `running` (HTTP 202), so poll getDataRun until it is `succeeded` or `failed`. # Search data tools Source: https://crevio.co/docs/api-reference/data/search-data-tools /developer/api-reference/openapi.json get /data/tools Searches Crevio's included business data: 70+ read-only tools over website/SEO and AI search visibility, people, companies, local businesses (Google Maps), social media, e-commerce (Amazon, Google Shopping), markets, SEC filings and crypto, jobs, reviews, ad libraries, US real estate, news, app stores, hotels, weather and US law. Pass a short noun phrase (e.g. "tiktok comments", "zillow listings", "backlinks") and read each tool's `input_schema` and `price`, then run one with createDataRun. Free. # Deploy a site Source: https://crevio.co/docs/api-reference/deployments/deploy-a-site /developer/api-reference/openapi.json post /sites/{id}/deploy Builds and publishes the site's current `main` branch to production. Asynchronous: responds `202` with a `pending` deployment; poll `GET /sites/{id}/deployments` for the outcome (`live` or `failed`). If a deploy is already in flight, that one is returned instead of starting a second build — still `202`. A build this call started is `pending` with a null `started_at`; one already running is `building`. # Get deployment build logs Source: https://crevio.co/docs/api-reference/deployments/get-deployment-build-logs /developer/api-reference/openapi.json get /sites/{id}/deployments/{deployment_id}/logs Build output for a deployment, one entry per pipeline stage, oldest first. Each stage's `log` is capped at 64KB of bytes, keeping the tail. Values matching common credential shapes are replaced with `[redacted]` before the log is stored. # List deployments Source: https://crevio.co/docs/api-reference/deployments/list-deployments /developer/api-reference/openapi.json get /sites/{id}/deployments Deployment history for a site, newest first. Append-only — each push to production, rollback or unpublish records a deployment; `is_live` marks the one serving production traffic. `stages` lists the pipeline stages the deploy entered, oldest first, each with `name` (`provisioning`, `fetching`, `attaching`, `installing`, `building`, `checking`, `migrating`, `deploying`, `verifying`, `restoring`), `status` (`active`, `succeeded`, `failed`, `canceled`), `details`, `started_at`, `finished_at` and `duration_seconds`. `current_stage` is the open one, null once the deploy ends. `elapsed_seconds` counts up while it runs; `duration_seconds` is null until it ends. `log` is null here — use the logs endpoint. Reading this endpoint terminalizes deploys whose build worker died without reporting a result. # Roll back a site Source: https://crevio.co/docs/api-reference/deployments/roll-back-a-site /developer/api-reference/openapi.json post /sites/{id}/rollback Re-ships an earlier deployment's commit to production. Defaults to the previous shipped deployment (the "undo the bad deploy" case); pass `deployment_id` to target a specific historical deployment instead. Asynchronous: responds `202` with a new `pending` deployment whose status moves to `live`/`failed`. Poll `GET /sites/{id}/deployments` to track it. # Stream a deployment Source: https://crevio.co/docs/api-reference/deployments/stream-a-deployment /developer/api-reference/openapi.json get /sites/{id}/deployments/{deployment_id}/stream Follow a build over Server-Sent Events instead of polling the deployments list — each event carries the deployment with its stages. Closes when the deployment reaches `live`, `failed`, `superseded`, or `unpublished`. # Create discount Source: https://crevio.co/docs/api-reference/discounts/create-discount /developer/api-reference/openapi.json post /discounts Creates a new discount code # Delete discount Source: https://crevio.co/docs/api-reference/discounts/delete-discount /developer/api-reference/openapi.json delete /discounts/{id} Deletes a discount # Get discount Source: https://crevio.co/docs/api-reference/discounts/get-discount /developer/api-reference/openapi.json get /discounts/{id} Returns a specific discount # List discounts Source: https://crevio.co/docs/api-reference/discounts/list-discounts /developer/api-reference/openapi.json get /discounts Returns a list of discounts for the current account # Update discount Source: https://crevio.co/docs/api-reference/discounts/update-discount /developer/api-reference/openapi.json patch /discounts/{id} Updates an existing discount # Buy a domain Source: https://crevio.co/docs/api-reference/domains/buy-a-domain /developer/api-reference/openapi.json post /domains/purchase Registers a domain through the built-in registrar. If the account has a card on file the purchase is charged immediately (`charged: true`, no redirect); otherwise the response includes a Stripe Checkout URL (`checkout_url`) to complete payment. The domain is created in `pending_payment` and becomes active once payment completes and registration succeeds. Poll GET /domains/{id} for status. # Check a domain's availability and price Source: https://crevio.co/docs/api-reference/domains/check-a-domains-availability-and-price /developer/api-reference/openapi.json get /domains/check Asks the registry, in real time, whether one exact domain can be bought here and what it costs. Search results are cached and only advisory, so check the name the buyer picked before quoting a final price or calling purchase. `price` is the first year and `renewal_price` each later year, both in cents and already retail. When `available` is false, `reason` says why: `domain_unavailable` (taken), `extension_not_supported` or `extension_not_supported_via_api` (that ending can't be bought here; connect the domain instead), or a registry status such as `extension_disallows_registration`. # Connect a domain Source: https://crevio.co/docs/api-reference/domains/connect-a-domain /developer/api-reference/openapi.json post /domains Connect a hostname. web routing defaults on (attached to site_id or the storefront); email capabilities are explicit opt-ins. Pass page (a published page's slug) to serve that one public page at the hostname instead of a site, or pages: true to serve every published page at / (the account's pages domain). The response carries capabilities, records[] with per-record DNS status, and next_step. # Create or replace a zone record Source: https://crevio.co/docs/api-reference/domains/create-or-replace-a-zone-record /developer/api-reference/openapi.json put /zones/{id}/records Creates a DNS record on a Crevio-managed zone, or replaces the existing record with the same type and name. Records Crevio itself manages are protected: set `acknowledge_unowned` to overwrite a record that was not created through the API. # Delete a domain Source: https://crevio.co/docs/api-reference/domains/delete-a-domain /developer/api-reference/openapi.json delete /domains/{id} Disconnects a custom domain: removes its hostname and edge routing record, then deletes the row. # Delete a zone record Source: https://crevio.co/docs/api-reference/domains/delete-a-zone-record /developer/api-reference/openapi.json delete /zones/{id}/records/{record_id} Deletes a DNS record from a Crevio-managed zone. Removing records that Crevio relies on — the storefront, email authentication — will break the features that depend on them. # List domains Source: https://crevio.co/docs/api-reference/domains/list-domains /developer/api-reference/openapi.json get /domains Returns a list of custom domains for the current account. # List the domain endings for sale Source: https://crevio.co/docs/api-reference/domains/list-the-domain-endings-for-sale /developer/api-reference/openapi.json get /domains/extensions Lists every domain ending (`com`, `co`, `io`, `co.uk`, ...) that can be bought here. `extension` is the full ending and `tld` its last label. Use it to answer which endings exist or to suggest alternatives when a name is taken; a listed ending is still only a candidate, so check the exact name before quoting a price. # List zone records Source: https://crevio.co/docs/api-reference/domains/list-zone-records /developer/api-reference/openapi.json get /zones/{id}/records Live DNS records of a Crevio-managed zone (domains purchased through Crevio). # Retrieve a domain Source: https://crevio.co/docs/api-reference/domains/retrieve-a-domain /developer/api-reference/openapi.json get /domains/{id} Retrieves a single custom domain by id. # Search for buyable domains Source: https://crevio.co/docs/api-reference/domains/search-for-buyable-domains /developer/api-reference/openapi.json get /domains/search Searches for available domains from a keyword or phrase, with pricing. # Update a domain Source: https://crevio.co/docs/api-reference/domains/update-a-domain /developer/api-reference/openapi.json patch /domains/{id} Change the site assignment (site_id, null detaches), point the hostname at one public published page (page: its slug, null detaches it), serve every published page by slug (pages: true, false stops it), toggle capabilities (email_sending on/off, email_receiving on), or turn auto-renewal on or off for a domain bought here (auto_renew: false lets it expire at expires_at; a change can take a minute to show on GET). # Verify a domain Source: https://crevio.co/docs/api-reference/domains/verify-a-domain /developer/api-reference/openapi.json post /domains/{id}/verify Idempotent verification across the domain's enabled capabilities. Scope with ?capability=web|email_sending|email_receiving to skip the other providers' checks. # List suppressed addresses Source: https://crevio.co/docs/api-reference/email-suppressions/list-suppressed-addresses /developer/api-reference/openapi.json get /email/suppressions Returns the account's suppression list: addresses no send path will deliver to. Entries are added automatically by hard bounces, spam complaints and one-click unsubscribes, and manually through this API. Scoped to your account — a bounce recorded for one Crevio account never suppresses that address for another. # Remove a suppressed address Source: https://crevio.co/docs/api-reference/email-suppressions/remove-a-suppressed-address /developer/api-reference/openapi.json delete /email/suppressions/{id} Removes an address from the suppression list so it can be emailed again. Accepts either the suppression id or the address itself. Do this only when the owner of the address has asked to be re-subscribed. Re-sending to an address that hard bounced or reported spam damages your sending reputation for every other recipient. # Suppress addresses in bulk Source: https://crevio.co/docs/api-reference/email-suppressions/suppress-addresses-in-bulk /developer/api-reference/openapi.json post /email/suppressions/batch Adds up to 100 addresses in one call, for importing a suppression list carried over from another provider. An invalid address rejects the whole batch rather than applying part of it, so you never have to diff what landed. # Suppress an address Source: https://crevio.co/docs/api-reference/email-suppressions/suppress-an-address /developer/api-reference/openapi.json post /email/suppressions Adds an address to the suppression list so no future send reaches it. Adding an address that is already suppressed returns the existing entry unchanged, rather than rewriting why it was suppressed. `reason` accepts `manual` (default) and `unsubscribed`. `bounced` and `complained` are set only by the provider's delivery events, so the record of why an address bounced stays truthful. # Batch get messages Source: https://crevio.co/docs/api-reference/email/batch-get-messages /developer/api-reference/openapi.json post /email/inboxes/{inbox_id}/messages/batch-get Fetches up to 500 messages by id in one request. Missing or foreign ids are silently omitted; compare the returned count against the ids you sent to detect misses. # Create a draft Source: https://crevio.co/docs/api-reference/email/create-a-draft /developer/api-reference/openapi.json post /email/inboxes/{inbox_id}/drafts Prepares (optionally schedules) an unsent message. # Create an inbox Source: https://crevio.co/docs/api-reference/email/create-an-inbox /developer/api-reference/openapi.json post /email/inboxes Creates a named inbox. With a verified email domain the address is `{local_part}@yourdomain.com`; without one it lands on the shared Crevio domain as `{slug}.{local_part}@ai.crevio.app`, which receives immediately and sends as the account's default outbound address. On the shared domain `local_part` must be one word of lowercase letters, numbers, hyphens or underscores, and an account can hold up to 20 such inboxes. Creating an address that already exists returns that inbox. # Delete a draft Source: https://crevio.co/docs/api-reference/email/delete-a-draft /developer/api-reference/openapi.json delete /email/inboxes/{inbox_id}/drafts/{id} Deletes a draft (cancels scheduled sends). # Delete a message Source: https://crevio.co/docs/api-reference/email/delete-a-message /developer/api-reference/openapi.json delete /email/inboxes/{inbox_id}/messages/{id} Deletes a message. # Delete a thread Source: https://crevio.co/docs/api-reference/email/delete-a-thread /developer/api-reference/openapi.json delete /email/inboxes/{inbox_id}/threads/{id} Deletes a thread and its messages. # Delete an inbox Source: https://crevio.co/docs/api-reference/email/delete-an-inbox /developer/api-reference/openapi.json delete /email/inboxes/{id} Soft-deletes (deactivates) an inbox. # Forward a message Source: https://crevio.co/docs/api-reference/email/forward-a-message /developer/api-reference/openapi.json post /email/inboxes/{inbox_id}/messages/{id}/forward Forwards a message to new recipients. # Get a draft Source: https://crevio.co/docs/api-reference/email/get-a-draft /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/drafts/{id} Retrieves a draft. # Get a message Source: https://crevio.co/docs/api-reference/email/get-a-message /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/messages/{id} Retrieves a message with its body. # Get a message attachment Source: https://crevio.co/docs/api-reference/email/get-a-message-attachment /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/messages/{id}/attachments/{attachment_id} Downloads a raw attachment from the message. # Get a thread Source: https://crevio.co/docs/api-reference/email/get-a-thread /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/threads/{id} Retrieves a thread with its messages. # Get a thread attachment Source: https://crevio.co/docs/api-reference/email/get-a-thread-attachment /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/threads/{id}/attachments/{attachment_id} Downloads a raw attachment from any message in the thread. # Get an inbox Source: https://crevio.co/docs/api-reference/email/get-an-inbox /developer/api-reference/openapi.json get /email/inboxes/{id} Retrieves an inbox. # Get email metrics Source: https://crevio.co/docs/api-reference/email/get-email-metrics /developer/api-reference/openapi.json get /email/metrics Account-wide email performance over a date range, across both send paths: 1:1 messages and broadcasts. Per-broadcast numbers stay on `GET /broadcasts/{id}/stats`; this is the rollup. Two metrics are source-specific, and blending them would misreport: `opened`, `clicked` and `unsubscribed` are broadcast-only (1:1 mail carries no open pixel or link rewriting by design), while `suppressed` is 1:1-only (a broadcast drops suppressed addresses before recipient rows exist). Group by `source` to see them apart. Rates are computed over `sent`. Grouping by `broadcast` returns broadcast rows only; grouping by `inbox` returns message rows only. # Get raw message Source: https://crevio.co/docs/api-reference/email/get-raw-message /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/messages/{id}/raw Returns a minimal RFC 5322 representation of the message. # List drafts Source: https://crevio.co/docs/api-reference/email/list-drafts /developer/api-reference/openapi.json get /email/drafts Lists drafts across all inboxes. # List inbox drafts Source: https://crevio.co/docs/api-reference/email/list-inbox-drafts /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/drafts Lists drafts in an inbox. # List inbox events Source: https://crevio.co/docs/api-reference/email/list-inbox-events /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/events Lists the inbox's audit feed of message lifecycle transitions (received, sent, delivered, bounced, complained, failed) and label changes, newest first. The pull-based complement to the email_message.* webhooks. # List inbox messages Source: https://crevio.co/docs/api-reference/email/list-inbox-messages /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/messages Lists messages in an inbox. # List inbox threads Source: https://crevio.co/docs/api-reference/email/list-inbox-threads /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/threads Lists conversations in an inbox. # List inboxes Source: https://crevio.co/docs/api-reference/email/list-inboxes /developer/api-reference/openapi.json get /email/inboxes Lists active inboxes for the account. # List messages Source: https://crevio.co/docs/api-reference/email/list-messages /developer/api-reference/openapi.json get /email/messages Lists messages across all inboxes. # List threads Source: https://crevio.co/docs/api-reference/email/list-threads /developer/api-reference/openapi.json get /email/threads Lists conversations across all inboxes. # Reply-all to a message Source: https://crevio.co/docs/api-reference/email/reply-all-to-a-message /developer/api-reference/openapi.json post /email/inboxes/{inbox_id}/messages/{id}/reply-all Replies to the sender and all other recipients. # Reply to a message Source: https://crevio.co/docs/api-reference/email/reply-to-a-message /developer/api-reference/openapi.json post /email/inboxes/{inbox_id}/messages/{id}/reply Replies to the sender within the same thread. # Search inbox messages Source: https://crevio.co/docs/api-reference/email/search-inbox-messages /developer/api-reference/openapi.json get /email/inboxes/{inbox_id}/messages/search Full-text search within an inbox. # Search messages Source: https://crevio.co/docs/api-reference/email/search-messages /developer/api-reference/openapi.json get /email/messages/search Full-text search of messages by subject/body. # Search threads Source: https://crevio.co/docs/api-reference/email/search-threads /developer/api-reference/openapi.json get /email/threads/search Full-text search of threads by subject/preview. # Send a 1:1 email from an inbox Source: https://crevio.co/docs/api-reference/email/send-a-1:1-email-from-an-inbox /developer/api-reference/openapi.json post /email/inboxes/{inbox_id}/messages Outbound email to anyone, including external recipients. Creates a tracked thread you can reply within — unlike the broadcast endpoint `POST /v1/broadcasts`. # Send a draft Source: https://crevio.co/docs/api-reference/email/send-a-draft /developer/api-reference/openapi.json post /email/inboxes/{inbox_id}/drafts/{id}/send Sends a draft immediately; converts it to a message and deletes the draft. # Update a draft Source: https://crevio.co/docs/api-reference/email/update-a-draft /developer/api-reference/openapi.json patch /email/inboxes/{inbox_id}/drafts/{id} Updates a draft's fields. # Update an inbox Source: https://crevio.co/docs/api-reference/email/update-an-inbox /developer/api-reference/openapi.json patch /email/inboxes/{id} Updates an inbox's display name or metadata (merged). # Update message labels Source: https://crevio.co/docs/api-reference/email/update-message-labels /developer/api-reference/openapi.json patch /email/inboxes/{inbox_id}/messages/{id} Adds/removes labels on a message. # Update thread labels Source: https://crevio.co/docs/api-reference/email/update-thread-labels /developer/api-reference/openapi.json patch /email/inboxes/{inbox_id}/threads/{id} Adds/removes labels on a thread. # List subscribable events Source: https://crevio.co/docs/api-reference/events/list-subscribable-events /developer/api-reference/openapi.json get /events Returns every event that an AiTask can subscribe to via `trigger_type: "event"` + `event_conditions.event_type`. Splits results into `internal` (always-on Crevio-emitted events like form_submission.created, order.paid) and `external` (this account's deployed event sources, e.g. `external.gmail.new_email`). The two task events, `task_run.completed` and `task_run.failed`, list `required_conditions: ["after_task_id"]`: a task subscribes to them only by naming the task it runs after. # Create event session Source: https://crevio.co/docs/api-reference/eventsessions/create-event-session /developer/api-reference/openapi.json post /experiences/{experience_id}/event_sessions Adds a session to an event experience # Delete event session Source: https://crevio.co/docs/api-reference/eventsessions/delete-event-session /developer/api-reference/openapi.json delete /event_sessions/{id} Deletes an event session # Get event session Source: https://crevio.co/docs/api-reference/eventsessions/get-event-session /developer/api-reference/openapi.json get /event_sessions/{id} Returns a specific event session # List event sessions Source: https://crevio.co/docs/api-reference/eventsessions/list-event-sessions /developer/api-reference/openapi.json get /experiences/{experience_id}/event_sessions Returns the sessions of an event experience # Update event session Source: https://crevio.co/docs/api-reference/eventsessions/update-event-session /developer/api-reference/openapi.json patch /event_sessions/{id} Updates an event session # Create event source Source: https://crevio.co/docs/api-reference/eventsources/create-event-source /developer/api-reference/openapi.json post /event_sources Creates an external event source. Two kinds: - **Connected-app trigger** (default): deploys a third-party trigger. The account must have previously connected the underlying app (Gmail, Slack, Calendar, etc.) at /integrations. Use `GET /event_sources/available?app=...` to discover the `vendor_component_id` values. `configured_props` carries only that trigger's own settings (label, sheet, channel, filters) — the connected account it runs as is resolved automatically from the linked app, and the deploy fails with a message naming the app if none is connected. - **Inbound webhook** (`vendor: "webhook"`): a Crevio-hosted URL any service (Typeform, Stripe, GitHub, Zapier, a custom script) can POST JSON to. `event_name` is a short name (e.g. `typeform_applications`); the source's `event_name` becomes `webhook.`. The response's `inbound_url` carries an unguessable token and is the credential — treat it as a secret. Set `signature_required: true` to also require an HMAC-SHA256 signature (`X-Hub-Signature-256`, `Typeform-Signature`, `X-Signature`, or Standard Webhooks headers); the signing secret is shown only to the account's admins in the Crevio app, never over the API. Unknown or inactive URLs answer 404; bodies over 1 MB answer 413. Once active, every delivery fires `external.` and any AiTask with `trigger_type: "event"` + matching `event_conditions.event_type` runs with the delivered payload as `event.data`. # Delete event source Source: https://crevio.co/docs/api-reference/eventsources/delete-event-source /developer/api-reference/openapi.json delete /event_sources/{id} Revokes the event source on the vendor side and removes it locally. Vendor revocation failures (already-revoked, vendor 404) are tolerated — the local row is always removed. # Get event source Source: https://crevio.co/docs/api-reference/eventsources/get-event-source /developer/api-reference/openapi.json get /event_sources/{id} Returns a specific event source. # List available event triggers for an app Source: https://crevio.co/docs/api-reference/eventsources/list-available-event-triggers-for-an-app /developer/api-reference/openapi.json get /event_sources/available Lists trigger templates available for a given connected app. The returned `id` value is what you pass back as `vendor_component_id` when creating an event source via `POST /event_sources`. # List event sources Source: https://crevio.co/docs/api-reference/eventsources/list-event-sources /developer/api-reference/openapi.json get /event_sources Returns external event source registrations for the current account. Each source represents a deployed third-party trigger (e.g. a Gmail "new email" subscription) and emits as `external.` when fired. # Rotate event source credentials Source: https://crevio.co/docs/api-reference/eventsources/rotate-event-source-credentials /developer/api-reference/openapi.json post /event_sources/{id}/rotate Issues a new `inbound_url` token and signing secret for an inbound webhook source. The old URL answers 404 immediately, so update the sending service with the new `inbound_url`. 422 for sources that are not inbound webhooks. # Test-fire event source Source: https://crevio.co/docs/api-reference/eventsources/test-fire-event-source /developer/api-reference/openapi.json post /event_sources/{id}/test Delivers a sample payload to every task subscribed to this source's `external.` as a **test run**: real research and output, but every write-style tool refuses and every delivery is captured on the run instead of being sent. Called from an agent chat, the chat is signalled when each run ends, so it need not poll. Returns the started runs. 422 when no task listens to the event yet, or when every subscribed task is busy or the account is out of AI credits. # Create an event type Source: https://crevio.co/docs/api-reference/eventtypes/create-an-event-type /developer/api-reference/openapi.json post /event_types Creates a bookable event type (a service customers can book, e.g. a 30-minute call). It is free to book unless a paid price variant is linked to the `experience_id` it returns, via `POST /price_variants/{price_variant_id}/experiences`. # Delete an event type Source: https://crevio.co/docs/api-reference/eventtypes/delete-an-event-type /developer/api-reference/openapi.json delete /event_types/{id} Deletes an event type so it can no longer be booked. Bookings already made against it are retained; delete or cancel those separately if you also want them gone. # List available slots Source: https://crevio.co/docs/api-reference/eventtypes/list-available-slots /developer/api-reference/openapi.json get /event_types/{id}/slots Returns open booking slots for the event type over a date range, accounting for availability, buffers, minimum notice, existing bookings, and (if connected) the account's Google Calendar busy times. # List event types Source: https://crevio.co/docs/api-reference/eventtypes/list-event-types /developer/api-reference/openapi.json get /event_types Returns the bookable services on the account — the templates customers book against, each carrying its duration, pricing, availability schedule and location. Paginated. # Retrieve an event type Source: https://crevio.co/docs/api-reference/eventtypes/retrieve-an-event-type /developer/api-reference/openapi.json get /event_types/{id} Retrieves a single event type, including its duration, buffers, notice and booking-window limits, capacity, location and the availability schedule it references. # Update an event type Source: https://crevio.co/docs/api-reference/eventtypes/update-an-event-type /developer/api-reference/openapi.json patch /event_types/{id} Updates an event type. Only the fields you send are changed. Changes apply to new bookings only — bookings already on the calendar keep the duration, buffers and location they were made with. # Create experience (course, digital download, forum, event, link, etc.) Source: https://crevio.co/docs/api-reference/experiences/create-experience-course-digital-download-forum-event-link-etc /developer/api-reference/openapi.json post /experiences Creates an experience of the given `type` — the entry point for selling a course, community/forum, live event, digital download, bookable session, or link-in-bio. Each `type` builds its own type-specific item with its own nested content endpoints (e.g. a `course` gets chapters → lessons; a `forum` gets topics/posts; an `event` gets sessions). A new experience starts empty — add content via the nested endpoints, set type-specific fields with PATCH /experiences/{id} via `details`, and make it sellable by linking it to a price variant with POST /price_variants/{id}/experiences. See the `type` field for the full list and per-type content model. # Delete digital download file Source: https://crevio.co/docs/api-reference/experiences/delete-digital-download-file /developer/api-reference/openapi.json delete /experiences/{experience_id}/files/{id} Removes a deliverable file from a digital download experience # Delete experience Source: https://crevio.co/docs/api-reference/experiences/delete-experience /developer/api-reference/openapi.json delete /experiences/{id_or_slug} Deletes an experience and its type-specific content # Get experience Source: https://crevio.co/docs/api-reference/experiences/get-experience /developer/api-reference/openapi.json get /experiences/{id_or_slug} Returns a specific experience # Grant experience access Source: https://crevio.co/docs/api-reference/experiences/grant-experience-access /developer/api-reference/openapi.json post /experiences/{experience_id}/grants Grants a customer manual access to an experience # List digital download files Source: https://crevio.co/docs/api-reference/experiences/list-digital-download-files /developer/api-reference/openapi.json get /experiences/{experience_id}/files Returns the deliverable files attached to a digital download experience # List experience grants Source: https://crevio.co/docs/api-reference/experiences/list-experience-grants /developer/api-reference/openapi.json get /experiences/{experience_id}/grants Returns the manual access grants for an experience # List experiences Source: https://crevio.co/docs/api-reference/experiences/list-experiences /developer/api-reference/openapi.json get /experiences Returns a list of experiences for the current account # Revoke experience access Source: https://crevio.co/docs/api-reference/experiences/revoke-experience-access /developer/api-reference/openapi.json delete /experiences/{experience_id}/grants/{id} Revokes a customer's manual access to an experience # Update experience Source: https://crevio.co/docs/api-reference/experiences/update-experience /developer/api-reference/openapi.json patch /experiences/{id_or_slug} Updates an experience's base fields and, via `details`, its type-specific item fields. Collection content (chapters, lessons, link items, posts, event sessions) has its own nested endpoints and is not touched here. # Upload digital download files Source: https://crevio.co/docs/api-reference/experiences/upload-digital-download-files /developer/api-reference/openapi.json post /experiences/{experience_id}/files Attaches already-uploaded files to a digital download experience as deliverables. Upload the bytes first with `POST /files` (presigned upload), then reference the resulting ids here: `{ "file_ids": ["file_..."] }`. Appends to the existing set and de-duplicates, so re-sending an already-attached id is a safe no-op. Returns the full file list. # Confirm file upload Source: https://crevio.co/docs/api-reference/files/confirm-file-upload /developer/api-reference/openapi.json post /files/{id}/uploaded Confirms a file upload after it has been uploaded to storage # Create file Source: https://crevio.co/docs/api-reference/files/create-file /developer/api-reference/openapi.json post /files Create a file. The endpoint discriminates between three intents based on which fields you send: **1. Presigned upload — `{ "filename": "photo.png" }`** Returns an `upload_url` and `upload_headers`. PUT your bytes to that URL, then call `POST /v1/files/{id}/uploaded` to transition the file from `pending` to `ready`. **2. Server-side URL import — `{ "url": "https://..." }`** Crevio downloads the bytes for you. Returns immediately with `upload_status: "processing"`. The status flips to `ready` (or `failed`) once the background download completes; poll `GET /v1/files/{id}` to check. **3. External video embed — `{ "kind": "external_video", "url": "https://youtube.com/..." }`** Pins a YouTube, Vimeo, or Wistia URL as an embeddable reference. No bytes are stored; status returns as `ready` immediately. Non-embed URLs are rejected with 422. # Delete file Source: https://crevio.co/docs/api-reference/files/delete-file /developer/api-reference/openapi.json delete /files/{id} Deletes a file and its associated storage object # Get file Source: https://crevio.co/docs/api-reference/files/get-file /developer/api-reference/openapi.json get /files/{id} Returns a single file by its ID # List files Source: https://crevio.co/docs/api-reference/files/list-files /developer/api-reference/openapi.json get /files Returns a list of files for the current account. Supports filtering by kind. # Update file Source: https://crevio.co/docs/api-reference/files/update-file /developer/api-reference/openapi.json patch /files/{id} Updates a file's mutable metadata. The stored bytes are immutable — re-upload to change a file's contents. All fields are optional and follow PATCH semantics: only the fields you send are changed. For files you can rename via `filename` and set a `description` or `tags`. For external-video embeds you can update the source `url`. # Download formation document Source: https://crevio.co/docs/api-reference/formationdocuments/download-formation-document /developer/api-reference/openapi.json get /formations/{formation_id}/documents/{id} Returns document metadata plus a fresh signed S3 URL valid for ~1 hour. Do not cache the URL. # List formation documents Source: https://crevio.co/docs/api-reference/formationdocuments/list-formation-documents /developer/api-reference/openapi.json get /formations/{formation_id}/documents Documents become available after formation completes. Returned metadata does not include download URLs — fetch a single document to get one. # Execute formation Source: https://crevio.co/docs/api-reference/formations/execute-formation /developer/api-reference/openapi.json post /formations/{id}/submit Submit a paid formation to doola. Idempotent — re-calling after submission returns current state. Also acts as a manual retry surface when SubmitFormationJob has exhausted its automatic retries: resets status from failed to pending and re-enqueues. # Get formation Source: https://crevio.co/docs/api-reference/formations/get-formation /developer/api-reference/openapi.json get /formations/{id} Returns the current state of a formation, including status, documents, and the most recent doola error if any. # List formations Source: https://crevio.co/docs/api-reference/formations/list-formations /developer/api-reference/openapi.json get /formations Returns all business formations for the account, newest first. # List NAICS codes Source: https://crevio.co/docs/api-reference/formations/list-naics-codes /developer/api-reference/openapi.json get /formations/naics_codes Reference data: all NAICS industry codes accepted by doola for formation. Cached for 24h. # Retry formation payment Source: https://crevio.co/docs/api-reference/formations/retry-formation-payment /developer/api-reference/openapi.json post /formations/{id}/retry_payment Regenerate the Stripe Checkout session for a formation whose previous payment attempt expired or failed. Resets the formation to draft and clears any prior doola_error. Refuses if the formation has already been paid for. # Submit formation Source: https://crevio.co/docs/api-reference/formations/submit-formation /developer/api-reference/openapi.json post /formations Create a draft formation and start payment. Returns a Stripe checkout_url unless the account has a saved card, in which case the charge happens inline and charged_inline is true. # Archive form Source: https://crevio.co/docs/api-reference/forms/archive-form /developer/api-reference/openapi.json patch /forms/{id}/archive Soft-deletes a Form by setting archived_at. The form stops appearing in the active list but its fields and submissions are preserved. Idempotent. # Create form Source: https://crevio.co/docs/api-reference/forms/create-form /developer/api-reference/openapi.json post /forms Creates a new Form, optionally with fields nested via form_fields_attributes. Set `delivery_type` (with `delivery_file_id`, `delivery_url` or `experience_id`) to email a file, link or experience to everyone who submits, and `tag_ids` to tag them. With `confirmation_required` (double opt-in), tags and delivery wait until the person confirms. Submissions come in through `POST /forms/{form_id}/submissions`. # Create form submission Source: https://crevio.co/docs/api-reference/forms/create-form-submission /developer/api-reference/openapi.json post /forms/{form_id}/submissions Submits an answer set to a specific Form. Customer is upserted by email; lead-magnet purpose forms also trigger delivery. # Delete form Source: https://crevio.co/docs/api-reference/forms/delete-form /developer/api-reference/openapi.json delete /forms/{id} Permanently deletes a Form. Refuses with a 422 if the form has submissions — archive it instead via PATCH /forms/{id}/archive to preserve them. # Get form Source: https://crevio.co/docs/api-reference/forms/get-form /developer/api-reference/openapi.json get /forms/{id} Retrieves a single form with its fields, in the order they are presented, along with the settings that govern how submissions are collected. # List forms Source: https://crevio.co/docs/api-reference/forms/list-forms /developer/api-reference/openapi.json get /forms Returns all forms for the current account. # Restore form Source: https://crevio.co/docs/api-reference/forms/restore-form /developer/api-reference/openapi.json patch /forms/{id}/restore Unarchives a previously archived Form so it appears in the active list again. Idempotent. # Update form Source: https://crevio.co/docs/api-reference/forms/update-form /developer/api-reference/openapi.json patch /forms/{id} Update a Form's name, settings, confirmation behavior, or auto-tag list. # Create form submission Source: https://crevio.co/docs/api-reference/formsubmissions/create-form-submission /developer/api-reference/openapi.json post /form_submissions Submits a response to a lead magnet form; creates the customer if needed and triggers delivery. # Delete form submission Source: https://crevio.co/docs/api-reference/formsubmissions/delete-form-submission /developer/api-reference/openapi.json delete /form_submissions/{id} Permanently deletes a form submission and its answers. This cannot be undone. # Get form submission Source: https://crevio.co/docs/api-reference/formsubmissions/get-form-submission /developer/api-reference/openapi.json get /form_submissions/{id} Returns a specific form submission # List form submissions Source: https://crevio.co/docs/api-reference/formsubmissions/list-form-submissions /developer/api-reference/openapi.json get /form_submissions Returns a list of form submissions for the current account # Create forum post Source: https://crevio.co/docs/api-reference/forumposts/create-forum-post /developer/api-reference/openapi.json post /experiences/{experience_id}/posts Creates a post in a forum experience # Delete forum post Source: https://crevio.co/docs/api-reference/forumposts/delete-forum-post /developer/api-reference/openapi.json delete /posts/{id} Deletes a forum post # Get forum post Source: https://crevio.co/docs/api-reference/forumposts/get-forum-post /developer/api-reference/openapi.json get /posts/{id} Returns a specific forum post # List forum posts Source: https://crevio.co/docs/api-reference/forumposts/list-forum-posts /developer/api-reference/openapi.json get /experiences/{experience_id}/posts Returns the posts of a forum experience # Update forum post Source: https://crevio.co/docs/api-reference/forumposts/update-forum-post /developer/api-reference/openapi.json patch /posts/{id} Updates a forum post # Edit an image Source: https://crevio.co/docs/api-reference/images/edit-an-image /developer/api-reference/openapi.json post /images/edit Submits an asynchronous image-to-image (editing) job to the fal.ai queue and returns the queued job immediately. Transforms one or more source images according to a text prompt — restyle a product photo, change a background, combine references. Poll `GET /v1/jobs/{id}` for status and results. Credits are charged only when the job completes successfully. # Generate an image Source: https://crevio.co/docs/api-reference/images/generate-an-image /developer/api-reference/openapi.json post /images/generate Submits an asynchronous image generation job to the fal.ai queue and returns the queued job immediately. Poll `GET /v1/jobs/{id}` for status and results. Credits are charged only when the job completes successfully. # List image models Source: https://crevio.co/docs/api-reference/images/list-image-models /developer/api-reference/openapi.json get /images/models Lists the image generation models available to `POST /v1/images/generate`, enriched with live fal.ai pricing. # Search stock photos Source: https://crevio.co/docs/api-reference/images/search-stock-photos /developer/api-reference/openapi.json get /images/stock Searches free Pexels stock photography by keyword and returns ready-to-use, resolvable image URLs. No credits are charged (`credits_used` is always 0). # Upscale an image Source: https://crevio.co/docs/api-reference/images/upscale-an-image /developer/api-reference/openapi.json post /images/upscale Submits an asynchronous image super-resolution job to the fal.ai queue and returns the queued job immediately. Poll `GET /v1/jobs/{id}` for status and results. Credits are charged only when the job completes successfully. # Create invoice Source: https://crevio.co/docs/api-reference/invoices/create-invoice /developer/api-reference/openapi.json post /invoices Creates a new invoice and sends it to the customer via email # Get invoice Source: https://crevio.co/docs/api-reference/invoices/get-invoice /developer/api-reference/openapi.json get /invoices/{id} Returns a specific invoice # List invoices Source: https://crevio.co/docs/api-reference/invoices/list-invoices /developer/api-reference/openapi.json get /invoices Returns a list of invoices for the current account # Void invoice Source: https://crevio.co/docs/api-reference/invoices/void-invoice /developer/api-reference/openapi.json post /invoices/{id}/void Voids an open invoice. Cannot void paid invoices. # Cancel job Source: https://crevio.co/docs/api-reference/jobs/cancel-job /developer/api-reference/openapi.json delete /jobs/{id} Cancels a queued or processing job. No credits are charged for cancelled jobs, so credits_refunded is always 0. Returns 409 if the job is already in a terminal state. # Get job Source: https://crevio.co/docs/api-reference/jobs/get-job /developer/api-reference/openapi.json get /jobs/{id} Returns a specific generation job, including its status, progress, and result. # List jobs Source: https://crevio.co/docs/api-reference/jobs/list-jobs /developer/api-reference/openapi.json get /jobs Returns a list of generation jobs for the current account, most recent first. Filter by status and type. # Stream a job Source: https://crevio.co/docs/api-reference/jobs/stream-a-job /developer/api-reference/openapi.json get /jobs/{id}/stream Follow an async generation job (images, video, audio, web) over Server-Sent Events instead of polling GET /jobs/{id}. Closes when the job reaches `completed`, `failed`, or `cancelled`. # Discover companies Source: https://crevio.co/docs/api-reference/leads/discover-companies /developer/api-reference/openapi.json post /leads/discover Finds companies (and their contacts) matching search filters such as a natural-language query, headcount, industry, technology or location. Backed by Hunter.io. Costs 2 credits per call. # Enrich a company by domain Source: https://crevio.co/docs/api-reference/leads/enrich-a-company-by-domain /developer/api-reference/openapi.json get /leads/company-enrich Returns firmographic details for a company from its domain — name, description, industry, size, location and social profiles. Backed by Hunter.io. Costs 7 credits per call. # Enrich a person by email Source: https://crevio.co/docs/api-reference/leads/enrich-a-person-by-email /developer/api-reference/openapi.json get /leads/enrich Returns known professional details for a person from their email address — name, location, employment and social profiles. Backed by Hunter.io. Costs 2 credits per call. # Find a person's email Source: https://crevio.co/docs/api-reference/leads/find-a-persons-email /developer/api-reference/openapi.json get /leads/email-finder Finds the most likely professional email address for a named person at a domain or company, with a confidence score. Provide `domain` (or `company`) plus either `full_name`, or both `first_name` and `last_name`. Backed by Hunter.io. Costs 7 credits per call. # Search a domain for emails Source: https://crevio.co/docs/api-reference/leads/search-a-domain-for-emails /developer/api-reference/openapi.json get /leads/domain-search Finds professional email addresses associated with a domain (or company name), each with a confidence score and the contact's name, role and department where known. Backed by Hunter.io. Costs 7 credits per 10 emails requested (`limit`), charged upfront. # Verify an email address Source: https://crevio.co/docs/api-reference/leads/verify-an-email-address /developer/api-reference/openapi.json get /leads/email-verifier Checks whether an email address is deliverable, returning a status and detailed deliverability signals (MX records, SMTP check, disposable/webmail flags). Backed by Hunter.io. Costs 2 credits per call. # Get legal page Source: https://crevio.co/docs/api-reference/legalpages/get-legal-page /developer/api-reference/openapi.json get /legal_pages/{id_or_slug} Returns a specific legal page by ID or slug # List legal pages Source: https://crevio.co/docs/api-reference/legalpages/list-legal-pages /developer/api-reference/openapi.json get /legal_pages Returns a list of legal pages (Terms of Service, Privacy Policy, Refund Policy) # Update legal page Source: https://crevio.co/docs/api-reference/legalpages/update-legal-page /developer/api-reference/openapi.json patch /legal_pages/{id_or_slug} Updates a legal page's body. Clearing the Terms of Service body also disables the require_terms_acceptance setting on the account. # Create lesson Source: https://crevio.co/docs/api-reference/lessons/create-lesson /developer/api-reference/openapi.json post /chapters/{chapter_id}/lessons Adds a lesson to a chapter # Delete lesson Source: https://crevio.co/docs/api-reference/lessons/delete-lesson /developer/api-reference/openapi.json delete /lessons/{id} Deletes a lesson # Delete lesson file Source: https://crevio.co/docs/api-reference/lessons/delete-lesson-file /developer/api-reference/openapi.json delete /lessons/{lesson_id}/files/{id} Removes a file attachment from a lesson # Get lesson Source: https://crevio.co/docs/api-reference/lessons/get-lesson /developer/api-reference/openapi.json get /lessons/{id} Returns a specific lesson # List lesson files Source: https://crevio.co/docs/api-reference/lessons/list-lesson-files /developer/api-reference/openapi.json get /lessons/{lesson_id}/files Returns the files attached to a lesson # List lessons Source: https://crevio.co/docs/api-reference/lessons/list-lessons /developer/api-reference/openapi.json get /chapters/{chapter_id}/lessons Returns the lessons in a chapter # Update lesson Source: https://crevio.co/docs/api-reference/lessons/update-lesson /developer/api-reference/openapi.json patch /lessons/{id} Updates a lesson's fields # Upload lesson files Source: https://crevio.co/docs/api-reference/lessons/upload-lesson-files /developer/api-reference/openapi.json post /lessons/{lesson_id}/files Attaches already-uploaded files to a lesson. Upload the bytes first with `POST /files` (presigned upload), then reference the resulting ids here: `{ "file_ids": ["file_..."] }`. Appends to the existing set and de-duplicates, so re-sending an already-attached id is a safe no-op. Returns the full file list. # Create link item Source: https://crevio.co/docs/api-reference/linkitems/create-link-item /developer/api-reference/openapi.json post /experiences/{experience_id}/link_items Adds a link to a link experience # Delete link item Source: https://crevio.co/docs/api-reference/linkitems/delete-link-item /developer/api-reference/openapi.json delete /link_items/{id} Deletes a link item # List link items Source: https://crevio.co/docs/api-reference/linkitems/list-link-items /developer/api-reference/openapi.json get /experiences/{experience_id}/link_items Returns the links of a link experience # Update link item Source: https://crevio.co/docs/api-reference/linkitems/update-link-item /developer/api-reference/openapi.json patch /link_items/{id} Updates a link item # List activity log events Source: https://crevio.co/docs/api-reference/logs/list-activity-log-events /developer/api-reference/openapi.json get /logs Returns the account's append-only activity log — agent/API actions on the account's primitives (gated connection runs, approval decisions), most recent first. Enterprise plan only; other plans get `402 plan_required`. # Get current user profile Source: https://crevio.co/docs/api-reference/me/get-current-user-profile /developer/api-reference/openapi.json get /me Returns the authenticated user's profile data including their roles in the current account # Get order item Source: https://crevio.co/docs/api-reference/orderitems/get-order-item /developer/api-reference/openapi.json get /order_items/{id} Returns details of a specific order item # List order items Source: https://crevio.co/docs/api-reference/orderitems/list-order-items /developer/api-reference/openapi.json get /orders/{order_id}/order_items Returns order items for a specific order # Get order Source: https://crevio.co/docs/api-reference/orders/get-order /developer/api-reference/openapi.json get /orders/{id} Returns a specific order # List orders Source: https://crevio.co/docs/api-reference/orders/list-orders /developer/api-reference/openapi.json get /orders Returns a list of orders for the current account # Delete a page Source: https://crevio.co/docs/api-reference/pages/delete-a-page /developer/api-reference/openapi.json delete /pages/{slug} Deletes a hosted page. Its URL stops serving immediately; publish under the same slug to bring it back. # List pages Source: https://crevio.co/docs/api-reference/pages/list-pages /developer/api-reference/openapi.json get /pages Lists the account's hosted pages: slug, URL, access, title, size, versions kept and timestamps. # Publish a page Source: https://crevio.co/docs/api-reference/pages/publish-a-page /developer/api-reference/openapi.json post /pages Publishes one self-contained HTML document as a hosted web page with a stable link — no site, no build, no deploy wait. For reports, briefs, plans, interactive charts and sortable tables: anything the user should open and keep. The HTML must inline its CSS and JS or load them from absolute CDN URLs, and runs sandboxed with no cookies or localStorage. Publishing the same slug again replaces the page at the same URL and keeps the previous version. Pages are capped at 2 MB. Not for a storefront or anything that needs a database or server logic — that is a site. # Retrieve a page Source: https://crevio.co/docs/api-reference/pages/retrieve-a-page /developer/api-reference/openapi.json get /pages/{slug} Retrieves one hosted page by its slug. # Retrieve a page's HTML Source: https://crevio.co/docs/api-reference/pages/retrieve-a-pages-html /developer/api-reference/openapi.json get /pages/{slug}/source Returns a page's stored HTML, so a page whose source file is gone can be edited and published again under the same slug. Pass `version` for an earlier version instead (1 is the one replaced most recently; the page's `versions` says how many are kept), e.g. to restore it. # List call consents Source: https://crevio.co/docs/api-reference/phone-consents/list-call-consents /developer/api-reference/openapi.json get /phone-consents Returns the consent records on the account — who agreed to be called or messaged, for which purpose, and when. This is the audit trail behind outbound calling, so keep it rather than deriving consent from elsewhere. # Record call consent Source: https://crevio.co/docs/api-reference/phone-consents/record-call-consent /developer/api-reference/openapi.json post /phone-consents Records consent to call a number for a purpose (marketing or transactional). Required before an outbound call can be placed. # Revoke call consent Source: https://crevio.co/docs/api-reference/phone-consents/revoke-call-consent /developer/api-reference/openapi.json delete /phone-consents/{id} Revokes a previously recorded consent. The number can no longer be called for that purpose. # Get a phone number Source: https://crevio.co/docs/api-reference/phone-numbers/get-a-phone-number /developer/api-reference/openapi.json get /phone-numbers/{id} Retrieves a provisioned phone number by id. # List phone numbers Source: https://crevio.co/docs/api-reference/phone-numbers/list-phone-numbers /developer/api-reference/openapi.json get /phone-numbers Lists the phone numbers the account owns. A number is required to receive inbound calls and serves as caller ID for outbound calls. # Provision a phone number Source: https://crevio.co/docs/api-reference/phone-numbers/provision-a-phone-number /developer/api-reference/openapi.json post /phone-numbers Provisions a new phone number for the account and routes its inbound calls to an AI voice agent. Pass `country` (ISO 3166-1 alpha-2, default `US`) for a number in any country Crevio sells; prices differ by country. Most countries provision instantly (201). Regulated countries first need the business verified: the response is 202 with `status: awaiting_verification` and a `verification_url` to send the business owner to (pass `verification_return_url` to bring them back). The number then moves to `in_review`, and becomes `active` (or `declined`, with a `review_note`) once the carrier decides, usually within 1-3 days. The first month is charged in credits when the number becomes active, and each month it is kept after that; a number the balance cannot renew is released. # Release a phone number Source: https://crevio.co/docs/api-reference/phone-numbers/release-a-phone-number /developer/api-reference/openapi.json delete /phone-numbers/{id} Releases a provisioned phone number. Inbound calls to it stop routing; outbound falls back to the shared caller ID. # Update a phone number Source: https://crevio.co/docs/api-reference/phone-numbers/update-a-phone-number /developer/api-reference/openapi.json patch /phone-numbers/{id} Update what the AI does on inbound calls (inbound_objective), pause/resume the number (status), or set where calls reach a person, without releasing the number. `forward_to` is a phone number in the same country as this one (E.164). With `call_routing: agent` (default) the AI answers and transfers callers who ask for a person to `forward_to`; with `call_routing: forward` every call rings `forward_to` directly, and the caller can leave a voicemail if it does not connect. Forwarded minutes use credits. # Add a do-not-call entry Source: https://crevio.co/docs/api-reference/phone-suppressions/add-a-do-not-call-entry /developer/api-reference/openapi.json post /phone-suppressions Adds a number to the account's internal do-not-call list. A suppressed number is never called, overriding any consent. # List do-not-call entries Source: https://crevio.co/docs/api-reference/phone-suppressions/list-do-not-call-entries /developer/api-reference/openapi.json get /phone-suppressions Returns the do-not-call list: numbers that must not be contacted regardless of any consent on record. Suppressions always win over consent. # Remove a do-not-call entry Source: https://crevio.co/docs/api-reference/phone-suppressions/remove-a-do-not-call-entry /developer/api-reference/openapi.json delete /phone-suppressions/{id} Removes a number from the do-not-call list, allowing it to be contacted again where consent exists. Only do this when the owner of the number has asked to be re-subscribed. # List plans Source: https://crevio.co/docs/api-reference/plans/list-plans /developer/api-reference/openapi.json get /plans Returns the plans Crevio sells, as on the pricing page: each plan's credit tiers with their price (the tier this account is on is marked `current`), the features it unlocks, and its limits (`null` means unlimited). # Create price variant Source: https://crevio.co/docs/api-reference/pricevariants/create-price-variant /developer/api-reference/openapi.json post /price_variants Creates a new price variant for a product # Delete price variant Source: https://crevio.co/docs/api-reference/pricevariants/delete-price-variant /developer/api-reference/openapi.json delete /price_variants/{id} Deletes a price variant. # Get price variant Source: https://crevio.co/docs/api-reference/pricevariants/get-price-variant /developer/api-reference/openapi.json get /price_variants/{id} Returns a specific price variant # Link experience to price variant Source: https://crevio.co/docs/api-reference/pricevariants/link-experience-to-price-variant /developer/api-reference/openapi.json post /price_variants/{price_variant_id}/experiences Links an experience to a price variant so buying that variant grants the experience. Back-grants access to everyone who already bought. # List price variants Source: https://crevio.co/docs/api-reference/pricevariants/list-price-variants /developer/api-reference/openapi.json get /price_variants Returns all price variants for the current account. Optionally filter by product. # Unlink experience from price variant Source: https://crevio.co/docs/api-reference/pricevariants/unlink-experience-from-price-variant /developer/api-reference/openapi.json delete /price_variants/{price_variant_id}/experiences/{id} Unlinks an experience from a price variant and revokes the access it granted # Update price variant Source: https://crevio.co/docs/api-reference/pricevariants/update-price-variant /developer/api-reference/openapi.json patch /price_variants/{id} Updates an existing price variant. Set archived to true to archive it. # Create product Source: https://crevio.co/docs/api-reference/products/create-product /developer/api-reference/openapi.json post /products Creates a new product. A product can't be set to `active` until it has at least one price variant — create it as `draft` (the default), add a price variant via POST /price_variants, then PATCH the product to `active`. # Delete product Source: https://crevio.co/docs/api-reference/products/delete-product /developer/api-reference/openapi.json delete /products/{id_or_slug} Deletes a product. Only products with no orders and no Stripe product ID can be deleted. # Get product details Source: https://crevio.co/docs/api-reference/products/get-product-details /developer/api-reference/openapi.json get /products/{id_or_slug} Returns detailed information about a specific product # List products Source: https://crevio.co/docs/api-reference/products/list-products /developer/api-reference/openapi.json get /products Returns a list of products for the current account. Supports filtering by status and searching by name. # Update product Source: https://crevio.co/docs/api-reference/products/update-product /developer/api-reference/openapi.json patch /products/{id_or_slug} Updates an existing product # Create refund Source: https://crevio.co/docs/api-reference/refunds/create-refund /developer/api-reference/openapi.json post /refunds Creates a new refund for an order # Get refund Source: https://crevio.co/docs/api-reference/refunds/get-refund /developer/api-reference/openapi.json get /refunds/{id} Returns a specific refund # List refunds Source: https://crevio.co/docs/api-reference/refunds/list-refunds /developer/api-reference/openapi.json get /refunds Returns a list of refunds for the current account # Create review Source: https://crevio.co/docs/api-reference/reviews/create-review /developer/api-reference/openapi.json post /reviews Creates a new review for a product # Delete review Source: https://crevio.co/docs/api-reference/reviews/delete-review /developer/api-reference/openapi.json delete /reviews/{id} Deletes a review # Get review Source: https://crevio.co/docs/api-reference/reviews/get-review /developer/api-reference/openapi.json get /reviews/{id} Returns a specific review # List reviews Source: https://crevio.co/docs/api-reference/reviews/list-reviews /developer/api-reference/openapi.json get /reviews Returns reviews for products in the current account # Reorder review Source: https://crevio.co/docs/api-reference/reviews/reorder-review /developer/api-reference/openapi.json post /reviews/{id}/position Updates the position of a review within its product's review list. Other reviews are reindexed accordingly. # Update review Source: https://crevio.co/docs/api-reference/reviews/update-review /developer/api-reference/openapi.json patch /reviews/{id} Updates an existing review # Create a schedule Source: https://crevio.co/docs/api-reference/schedules/create-a-schedule /developer/api-reference/openapi.json post /schedules Creates a reusable availability schedule. Event types reference a schedule to determine their open slots. # Delete a schedule Source: https://crevio.co/docs/api-reference/schedules/delete-a-schedule /developer/api-reference/openapi.json delete /schedules/{id} Deletes a schedule. Event types using it keep working but lose their availability until reassigned. # List schedules Source: https://crevio.co/docs/api-reference/schedules/list-schedules /developer/api-reference/openapi.json get /schedules Returns the reusable availability schedules on the account. Event types reference a schedule to decide which slots to offer, so several services can share one set of working hours. Paginated. # Retrieve a schedule Source: https://crevio.co/docs/api-reference/schedules/retrieve-a-schedule /developer/api-reference/openapi.json get /schedules/{id} Retrieves a single availability schedule, including its weekly working hours, its time zone, and any date-specific overrides such as holidays. # Update a schedule Source: https://crevio.co/docs/api-reference/schedules/update-a-schedule /developer/api-reference/openapi.json patch /schedules/{id} Updates a schedule. Passing `availability` or `overrides` replaces that set wholesale. # Cancel script run Source: https://crevio.co/docs/api-reference/scriptruns/cancel-script-run /developer/api-reference/openapi.json post /script_runs/{id}/cancel Cancels a script run that has not started. A running script runs to its end or its timeout (`409 run_not_cancellable`). # Get script run Source: https://crevio.co/docs/api-reference/scriptruns/get-script-run /developer/api-reference/openapi.json get /script_runs/{id} A script run's status, and once it finished its `result`, `output`, `calls` and `artifacts`. Needs the `scripts` scope. # Run a script Source: https://crevio.co/docs/api-reference/scriptruns/run-a-script /developer/api-reference/openapi.json post /script_runs Runs JavaScript on the account's computer with bun, with no agent turn, as the key's owner (account admins only; team keys cannot). `tools..(args)` calls the Crevio API and connected integrations, and the script's last expression is its `result`. `args` reach the script as the global `args` (and `process.argv`). Files written into the directory named by the global `outputDir` (20 at most, 50 MB each) come back as `artifacts`. `200` when it finished within `wait_seconds`, `202` otherwise: poll GET /script_runs/{id}. At most 4 runs in flight per user and 8 per account (`429`). Needs the `scripts` scope. # Create a secret Source: https://crevio.co/docs/api-reference/secrets/create-a-secret /developer/api-reference/openapi.json post /secrets Encrypts and stores a secret. Pass `site_id` to make one site own it, or omit it for a shared secret and list the sites it applies to in `site_ids`. The decrypted `value` comes back in this response only — later reads expose just `last4`. # Delete a secret Source: https://crevio.co/docs/api-reference/secrets/delete-a-secret /developer/api-reference/openapi.json delete /secrets/{secret_id} Deletes the secret and removes it from the environment of every site it applied to. Permanent — the encrypted value cannot be recovered. # List secrets Source: https://crevio.co/docs/api-reference/secrets/list-secrets /developer/api-reference/openapi.json get /secrets Lists the account's environment variables: shared secrets, reusable across its sites, plus a roll-up of every site-owned one. Values are masked here — each entry exposes only `last4`. Read one with the reveal endpoint. # Reveal a secret Source: https://crevio.co/docs/api-reference/secrets/reveal-a-secret /developer/api-reference/openapi.json post /secrets/{secret_id}/reveal Returns the decrypted `value` of a single secret. A POST rather than a GET so the secret never lands in a URL, a request log, or browser history. # Update a secret Source: https://crevio.co/docs/api-reference/secrets/update-a-secret /developer/api-reference/openapi.json patch /secrets/{secret_id} Rotates the value or edits the metadata of an existing secret. A secret's name and owning site are fixed at creation; `site_ids` applies to shared secrets only. # Add a secret to a site Source: https://crevio.co/docs/api-reference/sites/add-a-secret-to-a-site /developer/api-reference/openapi.json post /sites/{id}/secrets Encrypts and stores a new secret on this site, then injects it into the live site as an environment variable (asynchronously, if the site is deployed). The decrypted `value` is returned only in this response — store it if you need it, as later list responses expose just `last4`. Names must be valid environment-variable identifiers and may not use the reserved `CREVIO_` prefix. # Change a database directly Source: https://crevio.co/docs/api-reference/sites/change-a-database-directly /developer/api-reference/openapi.json post /sites/{id}/db/migrate **Structural changes belong on the development database.** Pass `environment: "development"` and reshape it as freely as you like — it holds no customer data, so there is no gate and nothing to approve. Deploying compares the two databases and applies the difference to production as one change; nobody names or numbers it. Structural SQL aimed at production is refused (`structural_change_needs_schema`): production's shape moves only by deploying. What production accepts here is **data** — seeding rows, correcting a value, a backfill — recorded under the filename you choose, checksummed so an edited migration can't silently fail to land. A Time Travel restore point is captured before anything runs and returned as `bookmark`. Statements that destroy data are refused unless `allow_destructive` is true, and only when the target actually holds rows. # Confirm a site's template upgrade Source: https://crevio.co/docs/api-reference/sites/confirm-a-sites-template-upgrade /developer/api-reference/openapi.json post /sites/{id}/template/confirm Records that a site now runs the current template. Call it as the last step of an upgrade, after the port is pushed to main and, for a site that is live, deployed to production: it is refused with `upgrade_not_live` while production runs different code from main. Does not deploy or change any code. # Create site Source: https://crevio.co/docs/api-reference/sites/create-site /developer/api-reference/openapi.json post /sites Creates an additional AI site under the current account. Refuses if the proposed subdomain is taken. # Delete site Source: https://crevio.co/docs/api-reference/sites/delete-site /developer/api-reference/openapi.json delete /sites/{id} Tears down the AI site (unpublishes it, purges its database and file storage, deletes the row). Refuses the default AI site — the account must always own at least one. # Get a site's template status Source: https://crevio.co/docs/api-reference/sites/get-a-sites-template-status /developer/api-reference/openapi.json get /sites/{id}/template Which storefront template a site's repository runs, whether it is behind the current one, and where the latest template can be fetched (a pinned GitHub commit and its tarball URL). Read it before porting a site onto the current template. # Get site Source: https://crevio.co/docs/api-reference/sites/get-site /developer/api-reference/openapi.json get /sites/{id} Returns a specific AI site # Get site analytics Source: https://crevio.co/docs/api-reference/sites/get-site-analytics /developer/api-reference/openapi.json get /sites/{id}/analytics Returns traffic analytics for a site over a date range: pageview/visitor totals, new vs. returning visitors, a default conversion funnel, a per-day time series, and top pages, referrers, and dimensional breakdowns (device, browser, OS, geography, and UTM parameters). Defaults to the last 30 days; the range cannot exceed 366 days. # List a site's secrets Source: https://crevio.co/docs/api-reference/sites/list-a-sites-secrets /developer/api-reference/openapi.json get /sites/{id}/secrets Returns the encrypted runtime secrets injected into this site as environment variables, newest first. The decrypted value is never included here — each entry exposes only its last four characters (`last4`). Use the reveal endpoint to read a value. # List applied database migrations Source: https://crevio.co/docs/api-reference/sites/list-applied-database-migrations /developer/api-reference/openapi.json get /sites/{id}/db/migrations Every change applied to this database, oldest first. Each carries `restore_to` — the state the database was in *before* that change ran — so any of them can be undone with `db/restore` without anyone having captured a restore point in advance. # List sites Source: https://crevio.co/docs/api-reference/sites/list-sites /developer/api-reference/openapi.json get /sites Returns a list of AI sites for the current account # Preview what deploying would change about the schema Source: https://crevio.co/docs/api-reference/sites/preview-what-deploying-would-change-about-the-schema /developer/api-reference/openapi.json get /sites/{id}/db/schema/plan The difference between the development database and the live one, described before it is applied — the statements, what they mean in plain language, and whether anything would be lost. Nothing runs. Show this to the user before deploying: a schema change that only becomes visible once it has happened is one nobody gets to object to. # Query a site's database Source: https://crevio.co/docs/api-reference/sites/query-a-sites-database /developer/api-reference/openapi.json post /sites/{id}/db/query Run SQL against a site's database. **Against production this reads only** — `SELECT`, `WITH`, `PRAGMA`, `EXPLAIN`. A write here would leave no record of what ran, no restore point and nobody asked, so data changes go through `db/migrate` and shape changes go through the development database and a deploy. The development database accepts anything: it holds no customer data, and experimenting on it is what it is for. # Read the database's current schema Source: https://crevio.co/docs/api-reference/sites/read-the-databases-current-schema /developer/api-reference/openapi.json get /sites/{id}/db/schema The schema a database actually has, as the SQL that would recreate it. Pass `environment` to read the development database (what you are building against) or production (what the site is serving). Production's shape is changed only by deploying — it is a diff of development against it — so this is for understanding, not authoring. # Remove a secret from a site Source: https://crevio.co/docs/api-reference/sites/remove-a-secret-from-a-site /developer/api-reference/openapi.json delete /sites/{id}/secrets/{secret_id} Deletes the secret and removes it from the live site's environment. This is permanent — the encrypted value cannot be recovered afterward. # Restore a site's database to a point in time Source: https://crevio.co/docs/api-reference/sites/restore-a-sites-database-to-a-point-in-time /developer/api-reference/openapi.json post /sites/{id}/db/restore Rewinds the site's database to a restore point or an ISO 8601 `timestamp` — the undo for data you didn't mean to lose. One of the two is required. Restore points come from `db/migrations`, where every applied change carries the `restore_to` it began from; nothing has to capture one in advance. The restore overwrites current state, but earlier points are retained, so an overshoot can itself be undone via `previous_bookmark`. Points are kept for 30 days. **This is not how a schema change is removed.** A restore rewinds this database's shape too, but the development database still has the newer one — so the next deploy compares them and puts it back. To drop a table for good, remove it from the development database and deploy. # Reveal a site's secret Source: https://crevio.co/docs/api-reference/sites/reveal-a-sites-secret /developer/api-reference/openapi.json post /sites/{id}/secrets/{secret_id}/reveal Returns the decrypted `value` for a single secret. This is a POST (not GET) so the secret never lands in a URL, request log, or browser history. # Update site Source: https://crevio.co/docs/api-reference/sites/update-site /developer/api-reference/openapi.json patch /sites/{id} Updates an existing AI site. Domain changes trigger the full custom-hostname lifecycle. # Get a skill Source: https://crevio.co/docs/api-reference/skills/get-a-skill /developer/api-reference/openapi.json get /skills/{slug} Retrieves a single published skill by its slug, including its `install_status` for your account. # Install a skill Source: https://crevio.co/docs/api-reference/skills/install-a-skill /developer/api-reference/openapi.json post /skills/{slug}/install Installs the skill into your account's agent skill library, making it available to the AI agent. Returns the skill with its updated `install_status`. Installing an already-installed skill returns an error. # Search skills Source: https://crevio.co/docs/api-reference/skills/search-skills /developer/api-reference/openapi.json get /skills Searches the AI skills catalog, plus the skills your account uploaded (`visibility: "private"`, never in the public catalog). Filter by free-text `search` (matches name and description) and `category`, or pass `installed=true` for only the skills installed on your account. Each result includes `install_status`, `installed_version` and `update_available` for your account. # Uninstall a skill Source: https://crevio.co/docs/api-reference/skills/uninstall-a-skill /developer/api-reference/openapi.json post /skills/{slug}/uninstall Removes the skill from your account's agent skill library. Returns the skill with its updated `install_status`. Uninstalling a skill that isn't installed returns an error. # Update a skill Source: https://crevio.co/docs/api-reference/skills/update-a-skill /developer/api-reference/openapi.json post /skills/{slug}/update Updates an installed skill to the catalog's current `version`. Check `update_available` first: on a skill that is already current this changes nothing. Updating a skill that isn't installed returns an error. # Upload a skill Source: https://crevio.co/docs/api-reference/skills/upload-a-skill /developer/api-reference/openapi.json post /skills/upload Creates a private skill from an upload and installs it for your account. Send one `file` (a `.zip` bundle or a lone `SKILL.md`), or a folder as repeated `files` with `paths` in the same order to preserve subdirectories. As JSON, send the manifest's text as `skill_md`, and any other files as `resources`. The skill is stored exactly as sent. Private skills are visible to your account only; they never enter the public catalog. # Activate social posting Source: https://crevio.co/docs/api-reference/socials/activate-social-posting /developer/api-reference/openapi.json post /socials/activate Enables social posting for the current account. Idempotent. Requires an active subscription. # Bookmark an X post Source: https://crevio.co/docs/api-reference/socials/bookmark-an-x-post /developer/api-reference/openapi.json post /socials/twitter/bookmarks Shelves a post on the connected X account for a later pass, without engaging publicly. Rate limit: 50 requests per 15-minute window. # Create a hosted connect portal Source: https://crevio.co/docs/api-reference/socials/create-a-hosted-connect-portal /developer/api-reference/openapi.json post /socials/portal Returns the URL of Crevio's hosted integrations page, where the user can connect, reconnect, and disconnect every social platform in one place. For a direct per-platform OAuth URL, use POST /socials/connect. # Create a post Source: https://crevio.co/docs/api-reference/socials/create-a-post /developer/api-reference/openapi.json post /socials/posts Creates a draft post, or publishes/schedules it immediately when publish_now or scheduled_at is set. # Delete a comment Source: https://crevio.co/docs/api-reference/socials/delete-a-comment /developer/api-reference/openapi.json delete /socials/posts/{post_id}/comments/{id} Deletes a comment on the post. Supported on Facebook, Instagram, Bluesky, Reddit, YouTube, and LinkedIn. # Delete a post Source: https://crevio.co/docs/api-reference/socials/delete-a-post /developer/api-reference/openapi.json delete /socials/posts/{id} Deletes a post; published posts are unpublished from their platforms first. # Disconnect an account Source: https://crevio.co/docs/api-reference/socials/disconnect-an-account /developer/api-reference/openapi.json delete /socials/accounts/{id} Disconnects a social account. # Edit or reschedule a post Source: https://crevio.co/docs/api-reference/socials/edit-or-reschedule-a-post /developer/api-reference/openapi.json patch /socials/posts/{id} Edits a draft, scheduled or failed post. Send only the fields to change. On a scheduled post, `scheduled_at` moves it to a new time and the other fields change what goes out, checked like a new post; omit `scheduled_at` to keep its time. On a draft or failed post, `scheduled_at` schedules it; a failed post goes out as a new submission and counts against that day's post limit. Posts that are publishing, posted or disconnected return 409. # Follow an X user Source: https://crevio.co/docs/api-reference/socials/follow-an-x-user /developer/api-reference/openapi.json post /socials/twitter/follows Follows as the connected X account. A protected account yields pending_follow: true rather than a completed follow. # Get a post Source: https://crevio.co/docs/api-reference/socials/get-a-post /developer/api-reference/openapi.json get /socials/posts/{id} Retrieves a single social post. # Get account analytics Source: https://crevio.co/docs/api-reference/socials/get-account-analytics /developer/api-reference/openapi.json get /socials/accounts/{id}/analytics Returns analytics for a connected account. # Get an OAuth connect URL Source: https://crevio.co/docs/api-reference/socials/get-an-oauth-connect-url /developer/api-reference/openapi.json post /socials/connect Returns an OAuth URL to connect a social account on the given platform. Activates the account on first connect; requires an active subscription. # Get an X post Source: https://crevio.co/docs/api-reference/socials/get-an-x-post /developer/api-reference/openapi.json get /socials/twitter/tweets/{id} Resolve one X post into its text, author and public metrics. Unlike search this is not limited to the last 7 days, which is what makes it the way to read the parent of a thread before replying to it. Pass a post URL to /socials/twitter/tweets/lookup instead. # Get post analytics Source: https://crevio.co/docs/api-reference/socials/get-post-analytics /developer/api-reference/openapi.json get /socials/posts/{id}/analytics Returns per-post analytics. Null until the post is published. # Get post comments Source: https://crevio.co/docs/api-reference/socials/get-post-comments /developer/api-reference/openapi.json get /socials/posts/{post_id}/comments Returns comments on a published post. # Get social status Source: https://crevio.co/docs/api-reference/socials/get-social-status /developer/api-reference/openapi.json get /socials/status Returns whether social posting is activated and lists the connected accounts. # Hide a comment Source: https://crevio.co/docs/api-reference/socials/hide-a-comment /developer/api-reference/openapi.json post /socials/posts/{post_id}/comments/{id}/hide Hides a comment (visible only to its author and page admins). Supported on Facebook, Instagram, Threads, and X/Twitter. # Label an account Source: https://crevio.co/docs/api-reference/socials/label-an-account /developer/api-reference/openapi.json post /socials/accounts/{id}/label Assigns a custom label to a connected account and returns it. # Like a comment Source: https://crevio.co/docs/api-reference/socials/like-a-comment /developer/api-reference/openapi.json post /socials/posts/{post_id}/comments/{id}/like Likes or upvotes a comment. Supported on Facebook, Twitter/X, Bluesky, and Reddit. Bluesky requires the comment cid. # List comment activity Source: https://crevio.co/docs/api-reference/socials/list-comment-activity /developer/api-reference/openapi.json get /socials/comments Cross-account feed of posts with comment counts across all connected channels, for triaging where to engage. Paginates by opaque cursor (next_cursor). # List connected accounts Source: https://crevio.co/docs/api-reference/socials/list-connected-accounts /developer/api-reference/openapi.json get /socials/accounts Lists all connected social accounts. # List Pinterest boards Source: https://crevio.co/docs/api-reference/socials/list-pinterest-boards /developer/api-reference/openapi.json get /socials/accounts/{id}/boards Lists the boards a connected Pinterest account can pin to. Pass a board's `id` as `platform_data.pinterest.board_id` when creating a post. Returns `422` for an account on any other platform. # List posts Source: https://crevio.co/docs/api-reference/socials/list-posts /developer/api-reference/openapi.json get /socials/posts Lists social posts with optional status/date filtering and pagination. # List uploads Source: https://crevio.co/docs/api-reference/socials/list-uploads /developer/api-reference/openapi.json get /socials/uploads Lists previously uploaded media. # Look up an X post by id or URL Source: https://crevio.co/docs/api-reference/socials/look-up-an-x-post-by-id-or-url /developer/api-reference/openapi.json get /socials/twitter/tweets/lookup Resolve one X post into its text, author and public metrics. Unlike search this is not limited to the last 7 days, which is what makes it the way to read the parent of a thread before replying to it. Takes the identifier as a query parameter so a full post URL, which contains slashes, can be passed. # Publish a post now Source: https://crevio.co/docs/api-reference/socials/publish-a-post-now /developer/api-reference/openapi.json post /socials/posts/{id}/publish Publishes a draft post immediately, or sends a failed post again. A failed post goes out as a new submission and counts against today's post limit. Edit it first with `PATCH /socials/posts/{id}` to fix what made it fail. # Remove an X bookmark Source: https://crevio.co/docs/api-reference/socials/remove-an-x-bookmark /developer/api-reference/openapi.json delete /socials/twitter/bookmarks/{tweet_id} Drops a bookmark from the connected X account. # Reply to a post or comment Source: https://crevio.co/docs/api-reference/socials/reply-to-a-post-or-comment /developer/api-reference/openapi.json post /socials/posts/{post_id}/comments Posts a public reply to the post, or to a specific comment when comment_id is given. Published as the chosen connected account. Requires the post to be published. # Repost an X post Source: https://crevio.co/docs/api-reference/socials/repost-an-x-post /developer/api-reference/openapi.json post /socials/twitter/retweets Reposts as the connected X account. Shares X's 300-per-3-hours creation budget with publishing. # Search X posts Source: https://crevio.co/docs/api-reference/socials/search-x-posts /developer/api-reference/openapi.json get /socials/twitter/search Search public X posts from the last 7 days. The query is passed to X unchanged, so its operators work (`from:user`, `to:user`, `-is:retweet`, `conversation_id:123`, `"exact phrase"`, boolean `OR`). Standalone operators like `is:`/`has:`/`lang:` must be combined with a keyword or `from:` clause. Use this to find mentions to answer; reply by creating a post with `platform_data.twitter.replyToTweetId` set to the id you found. Rate limit: 300 requests per 15-minute window per connected account. # Send a private reply Source: https://crevio.co/docs/api-reference/socials/send-a-private-reply /developer/api-reference/openapi.json post /socials/posts/{post_id}/comments/{id}/private_reply Sends a private message to the author of a comment. Instagram and Facebook only; one reply per comment, within 7 days, text only. # Sync connected accounts Source: https://crevio.co/docs/api-reference/socials/sync-connected-accounts /developer/api-reference/openapi.json post /socials/sync Refreshes the list of connected social accounts. # Undo a repost Source: https://crevio.co/docs/api-reference/socials/undo-a-repost /developer/api-reference/openapi.json delete /socials/twitter/retweets/{tweet_id} Removes the connected X account's repost of a post. # Unfollow an X user Source: https://crevio.co/docs/api-reference/socials/unfollow-an-x-user /developer/api-reference/openapi.json delete /socials/twitter/follows/{target_user_id} Unfollows as the connected X account. # Unhide a comment Source: https://crevio.co/docs/api-reference/socials/unhide-a-comment /developer/api-reference/openapi.json post /socials/posts/{post_id}/comments/{id}/unhide Unhides a previously hidden comment. Supported on Facebook, Instagram, Threads, and X/Twitter. # Unlike a comment Source: https://crevio.co/docs/api-reference/socials/unlike-a-comment /developer/api-reference/openapi.json post /socials/posts/{post_id}/comments/{id}/unlike Removes a like from a comment. Supported on Facebook, Twitter/X, Bluesky, and Reddit. Bluesky requires the like_uri returned when liking. # Upload media Source: https://crevio.co/docs/api-reference/socials/upload-media /developer/api-reference/openapi.json post /socials/upload Uploads media from a public URL for use in posts. # Get API status Source: https://crevio.co/docs/api-reference/status/get-api-status /developer/api-reference/openapi.json get /status Authenticated self-check. A single call confirms the API is operational, your credentials are valid, and which account they resolve to (whoami). For credit balance and plan detail, use Get account usage. # Apply discount to subscription Source: https://crevio.co/docs/api-reference/subscriptions/apply-discount-to-subscription /developer/api-reference/openapi.json put /subscriptions/{id}/discount Applies one of the account's discounts to an existing subscription, replacing any discount already on it. Nothing is charged or refunded now: the discount takes effect from the next invoice and lasts as long as the discount's `duration` says. Applying the discount the subscription already has is a no-op. Payment plans and ended subscriptions can't be discounted, and a discount restricted to specific price variants only applies to subscriptions for those variants. # Cancel subscription Source: https://crevio.co/docs/api-reference/subscriptions/cancel-subscription /developer/api-reference/openapi.json post /subscriptions/{id}/cancel Cancels a subscription. Metered and past-due subscriptions are canceled immediately. Others cancel at the end of the current billing period. # Get subscription Source: https://crevio.co/docs/api-reference/subscriptions/get-subscription /developer/api-reference/openapi.json get /subscriptions/{id} Returns a specific subscription # List subscriptions Source: https://crevio.co/docs/api-reference/subscriptions/list-subscriptions /developer/api-reference/openapi.json get /subscriptions Returns a list of customer subscriptions for the current account # Pause subscription Source: https://crevio.co/docs/api-reference/subscriptions/pause-subscription /developer/api-reference/openapi.json post /subscriptions/{id}/pause Pauses a subscription # Remove discount from subscription Source: https://crevio.co/docs/api-reference/subscriptions/remove-discount-from-subscription /developer/api-reference/openapi.json delete /subscriptions/{id}/discount Removes the discount from a subscription. The next invoice is billed at the full price. Invoices already paid are not changed. # Resume subscription Source: https://crevio.co/docs/api-reference/subscriptions/resume-subscription /developer/api-reference/openapi.json post /subscriptions/{id}/resume Resumes a paused or canceled subscription # Create tag Source: https://crevio.co/docs/api-reference/tags/create-tag /developer/api-reference/openapi.json post /tags Creates a new tag # Delete tag Source: https://crevio.co/docs/api-reference/tags/delete-tag /developer/api-reference/openapi.json delete /tags/{id} Deletes a tag # Get tag Source: https://crevio.co/docs/api-reference/tags/get-tag /developer/api-reference/openapi.json get /tags/{id} Returns a specific tag # List tags Source: https://crevio.co/docs/api-reference/tags/list-tags /developer/api-reference/openapi.json get /tags Returns a list of tags for the current account # Update tag Source: https://crevio.co/docs/api-reference/tags/update-tag /developer/api-reference/openapi.json patch /tags/{id} Updates an existing tag # Cancel a task run Source: https://crevio.co/docs/api-reference/taskruns/cancel-a-task-run /developer/api-reference/openapi.json post /task_runs/{id}/cancel Stop a run that is pending, running, or waiting for input, and cancel the image, audio and video generations it still has in flight (they are billed only when they finish). Stopping is asynchronous, like the agent runtime it asks: a run mid-step finishes that step first. The response is the run with `cancel_requested_at` set; it settles as `cancelled` moments later (poll GET /task_runs/{id}, or listen for `task_run.cancelled`). A run that was not mid-step is cancelled at once. Cancelled runs do not count as failures. Repeating the call returns the run unchanged. 409 `run_not_active` if the run has already settled. # Get task run Source: https://crevio.co/docs/api-reference/taskruns/get-task-run /developer/api-reference/openapi.json get /task_runs/{id} Returns a specific task run record. # List task runs Source: https://crevio.co/docs/api-reference/taskruns/list-task-runs /developer/api-reference/openapi.json get /task_runs Returns a list of task run records for the current account, ordered by most recent first. Supports filtering by status, task_id and created_after. To find runs that went wrong across every task, make one call without task_id, e.g. status=failed,timed_out&created_after=, rather than one call per task. The same one call with only created_after (e.g. the start of today in the user's timezone) answers what ran today: each run names its task in task_name. # Replay a task run's event Source: https://crevio.co/docs/api-reference/taskruns/replay-a-task-runs-event /developer/api-reference/openapi.json post /task_runs/{id}/replay Run the task again on the exact event an earlier run received (its `trigger_event`), not on whatever is newest now. Use it when an event-triggered run failed, was skipped, or did the wrong thing. Starts a new run with `replay_of` set to this run; it skips the task's condition, as Run now does. A real replay does everything the task normally does, sends included, so check what the original run already did first. Pass `test_run: true` to replay it as a test run: writes refused, deliveries captured. 422 `no_trigger_event` if no event started this run, 402 `insufficient_credits` if the account is out of AI credits, 409 if the task already has a run in flight or the account is at its run limit. # Resolve a waiting task run Source: https://crevio.co/docs/api-reference/taskruns/resolve-a-waiting-task-run /developer/api-reference/openapi.json post /task_runs/{id}/resolve Typed resolution for a run paused in `needs_input`. `type: "approvals"` answers the run's pending integration approvals — the submitted set must exactly match `pending_approval_ids` on the run, or the request returns 409 `stale_resolution` (re-read the run and retry). `type: "input"` sends follow-up instructions into the run's chat and starts a new turn. `type: "complete"` closes the run as completed without resuming it. Returns 202 when the run resumes in the background (`approvals`, `input`) and 200 when resolved inline (`complete`). 409 `run_not_waiting` if the run is not in `needs_input`. # Resume a stopped task run Source: https://crevio.co/docs/api-reference/taskruns/resume-a-stopped-task-run /developer/api-reference/openapi.json post /task_runs/{id}/resume Pick a stopped run back up in its own conversation instead of repeating it: the transcript is already the agent's context, so it continues from what it saved rather than redoing the work. Starts a new run that adopts the original's chat. Pass `message` to steer the continuation; without it the agent is told to read back over what it did and carry on. 422 `run_not_resumable` if the run already completed or has no conversation (send it a follow-up instead), 409 `run_busy` if it or another run of the task is still in progress. # Stream a task run Source: https://crevio.co/docs/api-reference/taskruns/stream-a-task-run /developer/api-reference/openapi.json get /task_runs/{id}/stream Follow a task run over Server-Sent Events instead of polling. Closes on `completed`, `failed`, and `needs_input` (resolve via POST /task_runs/{id}/resolve, then re-open the stream). # Update task run Source: https://crevio.co/docs/api-reference/taskruns/update-task-run /developer/api-reference/openapi.json patch /task_runs/{id} Reports the outcome of a running task. Primarily used by the in-sandbox agent server to finalize a run (completed, failed, needs_input) with token usage and credit consumption. Idempotent: re-posting the same status is a safe no-op. # Check the health of your automations Source: https://crevio.co/docs/api-reference/tasks/check-the-health-of-your-automations /developer/api-reference/openapi.json get /tasks/health One verdict per active scheduled or event task you can see, from its real runs in the window: `delete` (its last 5 runs all failed or went undelivered), `consolidate` (same instructions and trigger as an earlier task, named in `duplicate_of`), `add_condition` (runs more than 6 times a day and at least 70% of runs find nothing), `run_less_often` (runs more than daily and at least half find nothing), `switch_model` (a quality-tier task that mostly finds nothing), or `keep`. Each carries the monthly credits it is projected to spend, what the verdict would save, and how many of its latest runs failed in a row with the last error, plus the integrations that need reconnecting and their reconnect links. Read-only: nothing is changed. Report the verdicts and let the owner decide. # Create task Source: https://crevio.co/docs/api-reference/tasks/create-task /developer/api-reference/openapi.json post /tasks Creates a new AI task. Use trigger_type to schedule it: `immediate` runs once right away, `cron` runs on a cron expression, `interval` runs every N seconds, `once` runs at a specific scheduled_at, `event` runs in response to account events, including another task finishing: `event_conditions: {event_type: "task_run.completed", after_task_id: "task_..."}` runs it after each real run of that task completes, so a step that depends on another never needs a polling schedule. For recurring tasks (`cron`/`interval`), add an optional `condition_script` — a cheap JavaScript gate that runs before each fire (no LLM, no credits) and skips the run unless its last expression is truthy, so the agent only wakes when there's work to do. # Delete task Source: https://crevio.co/docs/api-reference/tasks/delete-task /developer/api-reference/openapi.json delete /tasks/{id} Deletes an AI task. # Estimate a task's credit cost Source: https://crevio.co/docs/api-reference/tasks/estimate-a-tasks-credit-cost /developer/api-reference/openapi.json get /tasks/cost_estimate Estimate what a scheduled task costs before you create or change it, and whether the credit balance still lasts until the next refill with it running. Pass `task_id` to price an existing task (any schedule field you also pass overrides the task's), or describe a new one with `trigger_type` and its schedule. `credits_per_run` is the median of the task's own recent completed runs, else of the account's tasks on the same model, else a typical agent run (`basis` says which). Runs per day come from the cron expression or interval; for an event trigger pass `runs_per_day`, or `task_id` to use the task's observed rate. `burn_rate_per_day`, `runs_out_at` and `runs_out_before_refill` describe the account with the task running at that rate (an active `task_id` replaces its own recent spend rather than adding to it). A condition script that skips runs makes the real cost lower. # Get task Source: https://crevio.co/docs/api-reference/tasks/get-task /developer/api-reference/openapi.json get /tasks/{id} Returns a specific AI task. # List tasks Source: https://crevio.co/docs/api-reference/tasks/list-tasks /developer/api-reference/openapi.json get /tasks Returns the current account's AI tasks, each with its most recent runs (`recent_runs`), so one call with limit=100 shows every task's state and whether its last runs failed. Supports filtering by trigger_type and active status, and searching by name or description. # Run a task now Source: https://crevio.co/docs/api-reference/tasks/run-a-task-now /developer/api-reference/openapi.json post /tasks/{id}/run Start a real run of an existing task right away, outside its schedule. It does everything a scheduled run does: writes go through, deliveries are sent, and it appears in the run history. Use it for "run my weekly report now" instead of creating a copy of the task. Pass `instructions` to add something for this run only ("this time also break out refunds"). The run reads them as extra instructions on top of the task's prompt; the saved task, its prompt and its schedule do not change, and later runs do not see them. An inactive task can be run this way; the run does not switch it on. Called from an agent chat, the chat is signalled when the run ends, so it need not poll. 400 if `instructions` is not a string of at most 4000 characters; 422 if the task has expired or already has a run in flight, the account is already running its maximum number of task runs, or it is out of AI credits. # Test-run a task Source: https://crevio.co/docs/api-reference/tasks/test-run-a-task /developer/api-reference/openapi.json post /tasks/{id}/run_test Fire the task once as a test. The run does real research and produces real output, but every write-style tool refuses and every configured delivery is captured on the run instead of being sent. Poll the returned run, then read `captured_deliveries` for the exact message each channel would have received. Called from an agent chat, the chat is signalled when the run ends, so it need not poll. To test an event-triggered task against a sample record (a fake order, lead or form answer), pass `event`: the run receives it as its trigger event exactly as it would a real one, with `type` set to the task's `event_conditions.event_type`. Test the real task this way; there is no need to copy it onto a temporary webhook source. Without `event`, an event task runs with no trigger event. The task's `condition_script` is not applied to a test run. A test run never counts as a run of the task: it does not advance `next_run_at`, does not reset or trip the failure breaker, does not count toward autonomy graduation or `max_runs_per_day`, and does not appear in the run history a later run reads. It does consume credits. 400 if `event` is malformed or the task is not event-triggered; 422 if the task already has a run in flight or the account is out of AI credits. # Update task Source: https://crevio.co/docs/api-reference/tasks/update-task /developer/api-reference/openapi.json patch /tasks/{id} Updates an existing AI task. # Cancel an invitation Source: https://crevio.co/docs/api-reference/team/cancel-an-invitation /developer/api-reference/openapi.json delete /team/invitations/{id} Cancels a pending invitation, addressed by its email. # Invite a team member Source: https://crevio.co/docs/api-reference/team/invite-a-team-member /developer/api-reference/openapi.json post /team/invitations Emails an invitation to join the account. Admin seats depend on the plan: a plan without team invitations answers 402. Only admins invite, and an agent's call always asks the user first. # List pending invitations Source: https://crevio.co/docs/api-reference/team/list-pending-invitations /developer/api-reference/openapi.json get /team/invitations Lists invitations that have not been accepted yet. # List team members Source: https://crevio.co/docs/api-reference/team/list-team-members /developer/api-reference/openapi.json get /team/members Lists the account's members: role, whether they count as a teammate, their place on the agent's allow or block list and why the agent would refuse them, and each teammate's credit limit and spend this billing cycle. # Remove a team member Source: https://crevio.co/docs/api-reference/team/remove-a-team-member /developer/api-reference/openapi.json delete /team/members/{id} Removes a member from the account. The owner cannot be removed; transfer ownership first. # Resend an invitation Source: https://crevio.co/docs/api-reference/team/resend-an-invitation /developer/api-reference/openapi.json post /team/invitations/{id}/resend Emails a pending invitation again. # Retrieve team settings Source: https://crevio.co/docs/api-reference/team/retrieve-team-settings /developer/api-reference/openapi.json get /team What members without the admin role may do (`member_permissions`) and who may use the agent (`agent_access`). Both are changed in Settings → Team. # Transfer account ownership Source: https://crevio.co/docs/api-reference/team/transfer-account-ownership /developer/api-reference/openapi.json post /team/members/{id}/transfer_ownership Makes another member the account owner. Only the current owner can do this, it cannot be undone by the caller, and it must be confirmed with the user first. # Update a team member Source: https://crevio.co/docs/api-reference/team/update-a-team-member /developer/api-reference/openapi.json patch /team/members/{id} Changes a member's role or credit limit. `role` is `admin` or `member`; the owner keeps the admin role until ownership is transferred. `credit_cap` is the most credits the member's chats and tasks may use per billing cycle; `null` removes the limit. Only admins change the team, and an agent's call always asks the user first. # Create topic Source: https://crevio.co/docs/api-reference/topics/create-topic /developer/api-reference/openapi.json post /experiences/{experience_id}/topics Adds a topic to a forum experience # Delete topic Source: https://crevio.co/docs/api-reference/topics/delete-topic /developer/api-reference/openapi.json delete /topics/{id} Deletes a topic # List topics Source: https://crevio.co/docs/api-reference/topics/list-topics /developer/api-reference/openapi.json get /experiences/{experience_id}/topics Returns the topics of a forum experience # Update topic Source: https://crevio.co/docs/api-reference/topics/update-topic /developer/api-reference/openapi.json patch /topics/{id} Updates a topic # Get account usage Source: https://crevio.co/docs/api-reference/usage/get-account-usage /developer/api-reference/openapi.json get /usage Returns the authenticated account's credit balance (and how much of it comes from the plan, top-ups and bonuses), plan status and price, a forecast of whether the balance lasts until the billing cycle ends at the current spend rate, and credit spend for a window (the current billing cycle unless `start_time`/`end_time` say otherwise) broken down by operation, by day, and by the chats and scheduled tasks that spent the most. # List usage transactions Source: https://crevio.co/docs/api-reference/usage/list-usage-transactions /developer/api-reference/openapi.json get /usage/transactions Returns the account's raw credit ledger (newest first), cursor-paginated. Spends are negative; grants are positive. Each entry may carry a `reference` to the resource that triggered the charge (currently generation jobs). # Get user Source: https://crevio.co/docs/api-reference/users/get-user /developer/api-reference/openapi.json get /users/{id} Returns the profile (first/last name, email) of a buyer signed in on a deployed site, resolved from their user_… id or username. Scoped to the account; pair with getUser/verifyUserToken on the site. # Generate a video Source: https://crevio.co/docs/api-reference/video/generate-a-video /developer/api-reference/openapi.json post /videos/generate Submits an asynchronous video generation job to the fal.ai queue and returns the queued job immediately. Poll `GET /v1/jobs/{id}` or `GET /v1/videos/{id}` for status and results. Credits are charged only when the job completes successfully. # Get video job Source: https://crevio.co/docs/api-reference/video/get-video-job /developer/api-reference/openapi.json get /videos/{id} Convenience alias for `GET /v1/jobs/{id}` that asserts the job is a video generation job (404 otherwise). # List video models Source: https://crevio.co/docs/api-reference/video/list-video-models /developer/api-reference/openapi.json get /videos/models Lists the video generation models available to `POST /v1/videos/generate`, enriched with live fal.ai pricing. # Approve a waitlist entry Source: https://crevio.co/docs/api-reference/waitlist-entries/approve-a-waitlist-entry /developer/api-reference/openapi.json post /waitlist_entries/{id}/approve Approves a pending entry: charges the card the buyer saved when joining (or starts their subscription or payment plan), creates the order, grants access and emails the receipt. If the card is declined the entry is denied with `failure_reason: payment_failed`, the buyer is emailed, and the response is a 402 `payment_failed` error. # Approve all pending waitlist entries Source: https://crevio.co/docs/api-reference/waitlist-entries/approve-all-pending-waitlist-entries /developer/api-reference/openapi.json post /waitlist_entries/admit_all Approves every pending entry, or only those for `price_variant_id`, in the background. Each approval charges the buyer's saved card or starts their subscription, grants access and emails a receipt; an entry whose card is declined is denied instead. Returns how many entries were queued. # Deny a waitlist entry Source: https://crevio.co/docs/api-reference/waitlist-entries/deny-a-waitlist-entry /developer/api-reference/openapi.json post /waitlist_entries/{id}/deny Denies a pending entry and emails the buyer. Nothing is charged. # List waitlist entries Source: https://crevio.co/docs/api-reference/waitlist-entries/list-waitlist-entries /developer/api-reference/openapi.json get /waitlist_entries Returns the buyers waiting for approval on price variants that require it, newest first. Filter by `status` (`pending` by default in the dashboard) or by `price_variant_id`. Each entry carries the buyer's email and their answers to the screening questions. # Retrieve a waitlist entry Source: https://crevio.co/docs/api-reference/waitlist-entries/retrieve-a-waitlist-entry /developer/api-reference/openapi.json get /waitlist_entries/{id} Retrieves a single waitlist entry by ID, including its status, the buyer's answers and, once approved, the order it created. # Crawl a site Source: https://crevio.co/docs/api-reference/web/crawl-a-site /developer/api-reference/openapi.json post /web/crawl Crawls a site to markdown across multiple pages. Asynchronous — returns a queued job; poll `GET /v1/jobs/{id}` for the pages. Charges credits on completion. # Deep research Source: https://crevio.co/docs/api-reference/web/deep-research /developer/api-reference/openapi.json post /web/research Researches a question across multiple web sources and returns a cited synthesis. `quick` runs synchronously (200); `thorough` and `exhaustive` return a queued job (202) to poll at `GET /v1/jobs/{id}`. Charges credits on completion. # Extract structured data Source: https://crevio.co/docs/api-reference/web/extract-structured-data /developer/api-reference/openapi.json post /web/extract Extracts structured data across one or more URLs, guided by a prompt and optional JSON schema. Asynchronous — returns a queued job; poll `GET /v1/jobs/{id}` for the data. Charges credits on completion. # Map a site Source: https://crevio.co/docs/api-reference/web/map-a-site /developer/api-reference/openapi.json post /web/map Discovers URLs on a site without fetching content. Fast. Synchronous. Charges credits on success. # Read a URL Source: https://crevio.co/docs/api-reference/web/read-a-url /developer/api-reference/openapi.json post /web/read Fetches a single page as clean markdown. Optional `extract` runs an AI question over the page content. Synchronous. Charges credits on success. # Web search Source: https://crevio.co/docs/api-reference/web/web-search /developer/api-reference/openapi.json post /web/search Searches the web and returns ranked results. Optional `site` scopes the query to one domain; `scrape: true` returns each result's main content as markdown. Synchronous. Charges credits on success. # Create webhook endpoint Source: https://crevio.co/docs/api-reference/webhookendpoints/create-webhook-endpoint /developer/api-reference/openapi.json post /webhook_endpoints Creates a new webhook endpoint. The secret is only returned on creation. # Delete webhook endpoint Source: https://crevio.co/docs/api-reference/webhookendpoints/delete-webhook-endpoint /developer/api-reference/openapi.json delete /webhook_endpoints/{id} Deletes a webhook endpoint # Get webhook endpoint Source: https://crevio.co/docs/api-reference/webhookendpoints/get-webhook-endpoint /developer/api-reference/openapi.json get /webhook_endpoints/{id} Returns a specific webhook endpoint # List available webhook event types Source: https://crevio.co/docs/api-reference/webhookendpoints/list-available-webhook-event-types /developer/api-reference/openapi.json get /webhook_endpoints/events Returns a list of all available event types that can be subscribed to # List webhook endpoints Source: https://crevio.co/docs/api-reference/webhookendpoints/list-webhook-endpoints /developer/api-reference/openapi.json get /webhook_endpoints Returns a list of webhook endpoints for the current account # Test webhook endpoint Source: https://crevio.co/docs/api-reference/webhookendpoints/test-webhook-endpoint /developer/api-reference/openapi.json post /webhook_endpoints/{id}/test Sends a signed test event to the endpoint and returns what the receiver answered. A receiver that responds at all — even with an error status — is a `200` here, with `delivered: false`; `502` means nothing answered (DNS failure, refused connection, timeout). # Update webhook endpoint Source: https://crevio.co/docs/api-reference/webhookendpoints/update-webhook-endpoint /developer/api-reference/openapi.json patch /webhook_endpoints/{id} Updates an existing webhook endpoint # Get webhook event Source: https://crevio.co/docs/api-reference/webhookevents/get-webhook-event /developer/api-reference/openapi.json get /webhook_events/{id} Returns a specific webhook event # List webhook events Source: https://crevio.co/docs/api-reference/webhookevents/list-webhook-events /developer/api-reference/openapi.json get /webhook_events Returns a list of webhook events for the current account # Redeliver webhook event Source: https://crevio.co/docs/api-reference/webhookevents/redeliver-webhook-event /developer/api-reference/openapi.json post /webhook_events/{id}/redeliver Sends a delivered or failed event to its endpoint again, unchanged: same `id`, same payload. Events are kept for 7 days. Returns 409 while the event is still being delivered, or when its endpoint is disabled. # Changelog Source: https://crevio.co/docs/changelog/index Latest updates, new features, and improvements to Crevio — see what is new in the AI platform that builds, launches, and runs your business. Stay up to date with what's new in Crevio. ## October 2026 ### Start a job from a template **Scheduled** has a **Templates** tab with about 30 ready-made jobs, like a morning brief, booking reminders, invoice follow-ups and review requests. Filter by topic or kind of business, and Crevio sets the job up with you in a chat and runs a test before it goes live. See [automation](/docs/features/automation#start-from-a-template). ### Decide what your team can do Admins can now choose whether members may connect apps, change shared connections, create tasks, and publish pages and sites. You can also limit who can talk to your assistant, block people, and group teammates so you can share with several at once. See [team](/docs/features/team#member-permissions). ### See where your credits go **Settings** > **Usage** breaks your spending down by chat and task, teammate, site, and kind of work, with a forecast of when your credits run out. Admins can cap each teammate's credits per billing cycle, and **auto top-up** refills your balance before a long job stops halfway. See [credits](/docs/features/credits#seeing-where-your-credits-go). ### A home for your pages The new **Pages** screen lists every page with who can open it. From there you can change access in bulk, rename a link, duplicate a page, hand it to a teammate, or restore one of its last 10 versions. Pages can now be limited to named people, and can live on your own web address. See [pages](/docs/features/pages#manage-your-pages). ### Connect any app with an API If an app isn't in the directory but has an API, add it as a **Custom API** with its key. Crevio adds the key to each request itself, so the AI never sees it. See [custom APIs](/docs/integrations/custom-apis). ### Accept PayPal Connect your PayPal business account and a **PayPal** button appears at checkout. Use it next to Stripe, or on its own if Stripe doesn't support your country. See [PayPal](/docs/integrations/paypal). ### Win back abandoned checkouts Turn on **Abandoned checkout emails** and buyers who entered their email but didn't pay get one reminder with a link back to their items. Orders from that email are marked **Recovered**. It's off until you turn it on. See [abandoned checkout emails](/docs/features/abandoned-checkout-emails). ### Keep subscribers who want to cancel Show subscribers a message, an option to pause, a discount to stay, or a short question about why they're leaving before their cancellation goes through. See [subscriptions](/docs/features/subscriptions#keep-subscribers-who-want-to-cancel). ### A calendar for your social posts **Socials** in the sidebar shows everything scheduled and posted in Month, Week, Day, and List views. See [social media posting](/docs/features/social#see-everything-on-your-calendar). ### Scheduled tasks, redesigned Start from templates, switch between cards, a list, and a calendar, filter by status, and pause, resume, or run a job now. See [your scheduled tasks page](/docs/features/automation#your-scheduled-tasks-page). ### Pages open beside your chat Open dashboard pages in a panel next to the chat, let Crevio open them for you, and see them refresh when your data changes. Site previews open there too. See [Create with AI](/docs/features/creating-with-ai#work-on-a-page-right-next-to-the-chat). ### Drafted messages you can send When you ask for an email or text, Crevio shows it as a card you can copy, edit, or send. See [Create with AI](/docs/features/creating-with-ai#drafting-messages-for-you). ### Create things by chatting Create buttons across the dashboard now start a chat with Crevio, with the manual form still one click away. See [Create with AI](/docs/features/creating-with-ai#start-new-things-from-chat). ### Drafts folder in your inbox Unsent and scheduled emails, including ones Crevio drafted, now live in a **Drafts** folder. See [email](/docs/features/email-marketing#drafts). ### Site previews are for your team only Preview links ask you to sign in and only open for people in your business. See [sites](/docs/features/sites). ### Connectors and Skills have moved to Customize Apps, tool servers, and skills now live together on a **Customize** page in the sidebar, with **Connectors** and **Skills** tabs. Each tab has views for discovering, managing what you have, and (for connectors) the data included with Crevio. Old Settings links still work. PostHog is now a one-click connection. See [connected apps](/docs/integrations/connected-apps) and [skills](/docs/features/skills). ### Live dashboards Ask for a page that reads your connected tools each time it opens, so the numbers are always current. An account admin approves what it can read once, and it can only ever read. See [pages](/docs/features/pages#live-dashboards). ### Buy and release your assistant's phone number You can now get a phone number from **Settings** > **AI assistant** > **Phone**, in many countries, with the monthly price shown up front, and release it when you no longer need it. See [AI phone calls](/docs/features/calls#get-a-phone-number). ### Mac app and desktop notifications Download the Crevio Mac app from **More ways to reach Crevio**. It signs in through your browser and shows native notifications. See [settings](/docs/features/settings#the-mac-app). ### Rename and delete chats The chats list is cleaner, and each chat has a menu to rename or delete it. See [your chats](/docs/features/settings#your-chats). ### Sites only go live when you say so Crevio no longer publishes your site automatically at the end of a task. If you asked it not to publish, it won't. See [sites](/docs/features/sites#crevio-publishes-it-for-you). ### Ask Crevio from X Post from your connected X account, start the post with @crevioapp, and Crevio gets to work in a chat in your account. @crevioapp replies under your post with the answer when it's fine to say in public, or a short "done" when it isn't. See [social media posting](/docs/features/social#ask-crevio-from-x). ### Let Crevio answer your X mentions The new **X brand presence** job template watches posts that mention your X account and replies where it helps, under a reply policy you can edit. Replies wait for your OK until you trust it, and anything sensitive comes to you instead of getting a public answer. See [social media posting](/docs/features/social#let-crevio-answer-your-own-mentions). ## September 2026 ### Talk to Crevio, and hear it back Click the microphone to dictate a message, attach a voice memo for Crevio to listen to, or ask for a reply "as a voice note" and play it right in the chat. See [Create with AI](/docs/features/creating-with-ai#talk-instead-of-typing). ### Correct what your assistant remembers Your assistant can now update or delete any note it has kept, so telling it "we stopped selling that" actually sticks. Once a day it also tidies its notes, merging duplicates and keeping the newer of two that disagree. See [what your AI remembers](/docs/features/settings#what-your-ai-remembers). ### Discount a subscription that's already running Open a subscription's order and click **Apply discount** to give an existing subscriber a discount from their next invoice, without them checking out again. See [subscriptions](/docs/features/subscriptions#give-an-existing-subscriber-a-discount). ### Media priced by what you get Images, video, and audio now cost exactly what each output takes -- per image, per second of video, per character of speech -- and you can ask for a quick draft or the best quality. See [credits](/docs/features/credits#images-video-and-audio). ### Even more for developers Orders now carry the buyer's [shipping and billing addresses](/docs/developer/guides/subscriptions-and-billing#shipping-and-billing-addresses), including in `order.paid`. `GET /v1/plans` returns the [pricing catalog](/docs/developer/guides/usage-billing#list-plans). Products accept [`seo`](/docs/developer/guides/products-and-pricing#setting-seo-metadata) on create and update. List filters take [comma-separated values and `created_after`](/docs/developer/guides/conventions#filtering-lists), and each task now includes its [recent runs](/docs/developer/guides/tasks#watch-every-task-in-one-call). The new [`x.mention.received`](/docs/developer/guides/events#mentions-of-your-x-account) event triggers tasks and webhooks. ### Redirect Crevio mid-task without losing the conversation Press **Esc** (or click **Stop**) while Crevio is running a tool and just that step is cancelled — Crevio reads what you typed next and carries on from there, instead of the whole response ending. With nothing typed, Esc cancels the current step and stops the turn there; press it again (or with a draft in the box) to stop everything. Sending a message while Crevio is still working now queues it in for the next natural pause instead of interrupting anything. ### Require lessons in order now actually holds students to it **Require students to complete lessons in order**, in a course's settings, only unlocked the next lesson once the previous one was marked complete -- it now checks that properly, instead of letting a student through just for opening it. See [experiences](/docs/features/experiences#courses). ### Your computer sleeps until you wake it Crevio's computer now only starts when you open a chat or click **Wake up** in the screen panel -- just having the panel open on a page no longer keeps it running in the background. When it's powered down, the panel says so and gives you a **Wake up** button instead of trying to connect. See [Create with AI](/docs/features/creating-with-ai#crevio-can-work-on-its-own-computer). ### Apple Pay and Google Pay open more reliably at checkout The wallet sheet could fail to appear when tapping **Pay** on a slow connection, particularly in some mobile in-app browsers. Crevio now checks your details in the background as you fill them in, so tapping **Pay** opens Apple Pay or Google Pay immediately instead of waiting on a network round trip first. ### Sign in with Google now works if you already have an account Signing in with Google using an email that already had a Crevio account (created with a password or a magic link) used to bounce you to the login page instead of letting you in. If Google can vouch for the address, you're now signed straight into your existing account instead. ### General account settings no longer fail to save silently Saving your business name, support email, or social links could silently fail and discard the whole save -- including fields you didn't touch -- with no error shown and your typed changes wiped on reload. Errors now show next to the field they belong to, and a failed save keeps what you typed so you don't lose it. ### Jobs won't let you pick a delivery channel you haven't connected Choosing Telegram, Discord, or Slack for a job's updates now checks that it's actually connected first -- pick one that isn't, and Crevio takes you straight to connect it instead of accepting a channel it can't reach. A run that later can't reach a channel that was disconnected after the fact shows **not delivered** in the run list, and a recurring job on "do it automatically" can now finish a run and send nothing at all when there's genuinely nothing worth reporting. See [automation](/docs/features/automation#how-crevio-tells-you-what-it-did). ### Connect Instagram through Facebook when its own screen won't load Some professional accounts can't get past Instagram's own connect screen. Choose **Connect through Facebook instead** on the Instagram tile and it authorizes the Facebook Page linked to your account instead -- a different screen that works where Instagram's own one doesn't. See [social media posting](/docs/features/social#connect-your-accounts). ### See which connected apps need attention at a glance Each connected app in **Settings** > **Integrations** now shows a colored dot -- green for connected, amber when it needs a reconnect -- so you can spot a problem without opening every tile. See [connected apps](/docs/integrations/connected-apps#when-a-connection-stops-working). ### Skipped job runs show up in the history When a job checks something and finds nothing to do -- a condition that wasn't met, or the daily check-in with no new activity to report -- it now shows up in the run list as **Skipped**, with the reason, instead of looking like it stopped running. See [automation](/docs/features/automation#skipped-runs-show-up-too). ### More of our 3,000+ apps connect on the first try A handful of connectable apps -- Etsy among them -- weren't listed in our directory yet, so connecting one failed with an unknown-app error even though search found it. They connect normally now. See [connected apps](/docs/integrations/connected-apps). ### Waiting on your approval no longer blocks new task runs A task run paused for your approval used to hold one of your account's five run slots indefinitely -- so an old, unanswered approval could quietly stop every other job from starting. It no longer counts against that limit while it waits, and if nobody answers within 7 days Crevio closes it as failed and lets you know instead of leaving it stuck. See [automation](/docs/features/automation#what-it-cant-do). ### Pick up a stopped task run where it left off A task run that stopped before finishing -- timed out, failed, or you stopped it -- now offers **Resume** in the run list. It continues that run's own conversation instead of starting a fresh one, so Crevio doesn't repeat work you already paid credits for. See [automation](/docs/features/automation#pick-up-a-stopped-run-where-it-left-off). ### The computer panel stays out of the way until you open it Crevio's computer panel next to your chat is hidden by default now, so it doesn't crowd the conversation. Click the monitor icon whenever you want to watch it work -- your choice is remembered next time. See [Create with AI](/docs/features/creating-with-ai#crevio-can-work-on-its-own-computer). ### See who you can't email, and why **Email** > **Suppressions** shows the addresses your emails skip -- bounced, marked spam, unsubscribed, or added by you -- with the reason for each and a count per reason. Add an address yourself when someone asks to stop hearing from you, or remove one when they ask to be added back. See [email marketing](/docs/features/email-marketing). ### Email numbers for everything you send **Email** > **Analytics** rolls up broadcasts and one-to-one replies together over the last 7 days, 30 days, 90 days, or 12 months -- sent, delivered, opened, clicked, bounced, and how many recipients were skipped -- with a sending-volume chart and a broadcast-versus-one-to-one breakdown. Opens and clicks stay broadcast-only: a personal reply carries no tracking, on purpose. ## August 2026 ### Get an answer as a page, not a wall of chat Ask for a report, a plan, a comparison, or a dashboard and Crevio can publish it as a real web page with its own link -- charts you can hover, tables you can sort, a layout worth putting in front of someone. Keep it to your team, share it with named teammates, or make it public. Ask for a change and it republishes at the same link. See [Pages](/docs/features/pages). ### Teach Crevio a task by showing it Crevio has its own computer, and now you can record yourself using it. Choose **Teach a task** in the chat, do the job the way you normally would, and stop. Crevio watches the recording back, works out the steps, and writes itself a reusable skill -- then runs it on its own next time. Correct it in chat if it got a step wrong. See [Teach Crevio new skills](/docs/features/skills). ### See everything your assistant has learned The Skills page now shows what your assistant taught *itself*, alongside the skills you installed from the library and any you uploaded. Remove anything you don't want it using. You can also browse the files it keeps -- read-only, properly formatted, so you can see what it's actually working from. ### Ask it to come back to you later For a one-off follow-up -- *"remind me Thursday to chase the supplier"*, *"check back in two hours and tell me if that campaign got clicks"* -- Crevio now schedules itself instead of you setting up a recurring job. At the time you named, the same conversation picks itself back up with everything it already knows. Times are read in your own timezone. ### Files come straight to you in chat When Crevio makes a file for you -- an export, a document, a generated asset -- it now hands it over in the conversation, ready to open or download, instead of describing where it went. ### A calmer, clearer chat Messages now sit in bubbles with time separators between them, so a long conversation is easy to scan. The steps Crevio takes along the way are quieter and tidier, code stands out properly, and when you mention one of your assistants by name it's highlighted and linked. ### Review what has access to your account A new **Settings** > **Applications** page lists every outside tool signed in to your business -- what it can do, who authorized it, and when. Revoke cuts it off for your whole team at once, across every connection it holds. Settings are now grouped into Administration, Features, and Personal, so things are easier to find. ### A faster app Clicking through the sidebar is now instant -- pages respond immediately instead of pausing first. Your assistant's computer also warms up in the background, so the first message of the day gets a reply far quicker than it used to. ### More for developers Checkout defaults -- tax behavior, allowed countries, which inputs buyers see -- are now readable and editable over the API at `/v1/checkout_configuration`. See [the checkouts guide](/docs/developer/guides/checkouts#account-wide-checkout-settings). ### Your assistant finds the right app for the job Describe what you want done -- "text me when an order comes in", "put new leads in a spreadsheet" -- and Crevio works out which of your [connected apps](/docs/integrations/connected-apps) can do it. If none can yet, it names one you could connect instead of telling you it isn't possible. ### Apps reach further than their standard actions Every connected app ships with a set of ready-made actions. When what you need isn't one of them -- a narrower search, an unusual setting, a corner of the app most people never touch -- your assistant can now go to the app directly instead of giving up. Approvals work exactly as before: anything that sends, spends, or changes something still waits for you. ### Name your connections Connect two accounts of the same app and you can tell them apart -- "work gmail" and "support gmail". Ask your assistant to name one, and that's what it uses when it checks which account to act on. ### Connections that need attention say so When an app cuts off access -- a changed password, a revoked permission -- the connection is now flagged as needing a reconnect rather than quietly failing. Your naming and approval settings survive, so reconnecting picks up where you left off. ### Connect apps straight from Slack, Discord, or Telegram Ask your assistant to connect an app while you're chatting on Slack, Discord, or Telegram and it sends you a secure sign-in link right there -- no switching back to the web app. ## July 2026 ### Your app's data, handled safely Apps your AI assistant builds now get a proper safety net around the information they store. Crevio builds and tests against a separate practice copy that holds none of your real data, then applies the change to your live app in one clean step when you publish. Before it does, it tells you what will change in plain words — and anything that would delete saved information stops and asks you first, naming exactly what would go. ### Roll back a site or app — data included Undo a bad update by going back to a previously published version. If the update changed what your app stores, Crevio can rewind that alongside the code, so your app never ends up running old logic against new data. ### A daily check-in on your business Once a day, Crevio sweeps your revenue, orders, leads, customers, refunds, top products, and site traffic against the period before — and surfaces what it notices as insights on your dashboard. It can turn any of them into a job to follow up, and anything that sends, spends, or reaches your customers still waits for your approval. ### Domains renew themselves Web addresses bought through Crevio now renew automatically and track their own expiry date, so your site can't go dark because a renewal slipped. If a purchase ever fails at the registry, you're refunded and notified right away. ### Clearer plan allowances Connected social accounts and ad accounts now come with a per-plan allowance you're told about when you connect — social posting starts on Starter, ad accounts on Pro. Storage is metered per account too, so you can see how much room your uploads and generated files are using. ### A faster dashboard A broad speed pass across the app: orders and customers load as you scroll instead of all at once, pages carry far less to download, and moving between chats and dashboard pages is noticeably quicker. ### Invoices, tax, and VAT A new Invoices settings page lets you customize your invoice footer and add VAT and tax details. Generated invoices and orders now show tax amounts, so your paperwork is complete and ready for the books. ### One home for your AI assistant settings Your assistant's email address, phone allowlist, and Slack channels now live together on a single AI Assistant settings page — easier to find and manage in one place. ### Auto top-up for AI credits Set a custom top-up amount and let Crevio automatically refill your AI credits when they run low, so your assistant never stops mid-task. Buying credits — one-off or automatic — is part of a paid plan. ### Preview attachments in chat Files you attach in chat now preview inline — including PDFs — and are saved to your media library so you can reuse them anywhere. ### Redesigned chat switcher Searching and switching between chats is faster, with live updates as new conversations come in. ### Your AI assistant remembers more Improved memory means your assistant holds on to more context about you and your business across conversations. ### Behind-the-scenes reliability and security A wave of improvements to keep everything running smoothly: more accurate AI credit charges, faster and more resilient site deployments, and hardening across checkout, subscriptions, and account security. *** ## June 2026 ### Buy a domain without leaving Crevio Search for and purchase a brand-new domain directly inside Crevio. We handle the registration and connect it to your site automatically — no separate registrar account needed. ### Spin up new sites in seconds Create a brand-new site from a simple prompt — or from an existing repository — and your AI assistant builds it for you. A refreshed sites overview makes it easy to jump between everything you're running. ### Control who can see each site Decide who gets in: make a site fully public, limit it to logged-in customers, or restrict it to your team. Visitors are checked at the door before the page ever loads. ### Finer control over AI integrations Set approval rules for individual tools, so you can auto-approve the routine actions and review only the ones that matter. ### More for developers A big expansion of the public API: manage your sites (database queries, deployment history, analytics, secrets, and domains), send and manage email, and generate images, video, audio, and stock photos through native endpoints. We also added endpoints for usage and credits, API key creation, and agent discovery for building autonomous integrations. *** ## May 2026 ### Manage your social media from Crevio Connect your social accounts and schedule, publish, and track posts without leaving Crevio. Reply to, like, and hide comments across platforms — or let your AI assistant handle it all for you. ### Chat with your AI assistant in Slack Bring your AI business assistant into Slack. Message it directly or in a thread, watch its thinking unfold in real time, and get daily summaries of your business delivered to your workspace. ### Form your company without leaving Crevio Register your LLC or business directly inside Crevio. Track your formation status and documents every step of the way. ### Analytics for AI-built sites The sites and apps your AI assistant builds now come with full analytics — page views, visitor sources, UTM tracking, and custom events — right in your dashboard. ### Run multiple sites from one account Your account can now host more than one site, so you can manage several websites or projects side by side. Multiple sites are part of the Business plan. ### Trigger AI tasks from anything Connect external events — a new email, a form submission, an app webhook — to automatically kick off work for your AI assistant. ### Sell in more countries Added support for more payout countries and currencies, including Brazil and Malaysia, plus controls to limit sales to specific countries. ### Sharper lead and conversion tracking Improved Meta Pixel and Conversions API tracking means more accurate measurement of leads and sales from your Facebook and Instagram campaigns. ### Referral program upgrades Referral codes are now harder to guess and self-referrals are blocked, keeping your program fair. You can also earn AI credits by sharing Crevio on X. ### Refreshed sign-in A cleaner look for the login and signup pages, with email confirmation added to keep accounts secure and reduce abuse. ### Forms API and OAuth for integrations Developers can now manage forms through the API, including archiving and restoring. The Crevio MCP server also added full OAuth 2.1 support for secure third-party connections. *** ## April 2026 ### Your AI assistant now builds and ships real websites Our biggest update yet. Your AI assistant can now build, deploy, and host complete websites and apps for you — each on its own infrastructure. Describe what you want, and it builds the real thing, not just a mockup. ### A task board for your AI assistant A new Tasks page with a kanban board shows everything your AI assistant is working on. Watch tasks run in real time, schedule recurring work, and review results as they complete. ### AI builds your website during setup New businesses now get a landing page built by AI as part of onboarding — so you start with a real, live page instead of a blank slate. ### Report bugs and suggest features New built-in tools let you report a problem or request a feature without leaving the app. Your feedback goes straight to our team. ### Connect multiple accounts per integration You can now connect more than one account for the same integration — for example, several email or social accounts — and your AI assistant can use them all. ### Reply to your AI assistant by email Replies to Crevio emails now route straight to your AI assistant, so you can keep the conversation going from your inbox. ### No more user limits We removed user-count limits across plans — invite as many team members as you need. ### More API endpoints New endpoints for tasks, reviews, legal pages, tags, and categories. We also standardized request formats and added idempotency key support for safer integrations. *** ## March 2026 ### Put your AI assistant on autopilot Schedule your AI business agent to run tasks on a recurring basis — and get the results delivered straight to Telegram or Discord. ### Stay in control of AI actions Your AI assistant now asks for your approval before taking actions on your behalf, so nothing happens without your say-so. ### Email your customers directly Send emails to customers right from Crevio. Set up a custom email address on your own domain for a professional touch. ### Generate images with AI Need a product image or social graphic? Ask your AI assistant to create one for you, right inside the chat. ### 3,000+ connected apps Connect Crevio to over 3,000 third-party apps directly from your dashboard. Your AI assistant can now take action across the tools you already use -- send emails, update CRMs, sync spreadsheets, post to social media, and more. Browse by category or search for any app under **Settings** > **Integrations**. ### See how your AI thinks Watch your AI assistant's thought process in real time as it works through your request. You can also stop a response mid-stream if you change your mind. ### Track your AI usage See exactly how you're using your AI credits with a full usage history in your billing settings. ### Ask your AI about your business data Your AI assistant can now pull up sales figures, customer data, and other business insights when you ask — all without leaving the chat. ### File uploads through the API Developers building on Crevio can now upload and manage files through the API. ### Order and user profile endpoints New API endpoints for retrieving order details and user profiles, making it easier to build custom integrations. *** ## February 2026 ### Build custom forms Create forms with any fields you need — text, dropdowns, checkboxes, and more. Collect submissions and connect them to your lead magnets. ### Smarter AI chat Your AI assistant got a major upgrade. It can now search the web, remember your preferences across conversations, accept file attachments, and run code to generate reports, tables, and charts. ### Connect AI tools to your Crevio data AI tools like Claude Code can now connect directly to your Crevio account to manage products, orders, and customers on your behalf. ### AI credit packs Buy credits for AI features as you need them. Track your usage and get notified before you run out. ### Full public API Build custom integrations with a complete API covering products, pricing, invoices, subscriptions, checkout links, discounts, and orders. ### Use your own domain Connect your own domain to your Crevio website. We handle the technical setup — just point your DNS and you're live. ### Real-time notifications See new orders, reviews, and team activity the moment they happen — no need to refresh. ### Faster page loads Your website and dashboard now load noticeably faster thanks to behind-the-scenes performance work. ### Better search engine visibility Your products and content are now more discoverable in Google with richer search result listings. ### Refreshed login and signup The sign-in experience has been redesigned with a cleaner two-step flow and more signup options. ### Order numbers Every order now gets a unique number, and you can search orders by number for quick lookup. ### Developer docs A new developer documentation site with API reference, webhooks guide, and integration examples. ### Danish language support Crevio is now available in Danish. ### Blog improvements The blog is now faster, with better image loading and improved search engine visibility. ### Website refinements Cleaner URLs and improved reliability for your website pages. *** ## January 2026 ### Faster error detection Issues are now flagged to the team in Slack the moment they happen, so we can fix problems faster. ### Improved translations Better translation management means more accurate and consistent text across all supported languages. ### Website subdomains Each website now gets its own subdomain (yourname.crevio.app) with reliable, fast routing. *** ## December 2025 ### Faster websites Your website pages now load faster with global content delivery and smarter caching. ### Customer insights See how your customer base is growing with new metrics that compare this period to last — right on your customers page. ### See pricing at a glance Expand any product row in your dashboard to see all its pricing options and included content without leaving the page. ### Blog author pages Each blog author now has a dedicated page, making it easy for readers to find all posts by a specific writer. ### Glossary section A new glossary helps your audience understand key terms, with links back to relevant content. ### Automatic event reminders Your event attendees now receive reminder emails before their session starts. Customize the template to match your brand. ### Safety net for pricing You can no longer accidentally archive your last active pricing option on a product — Crevio will stop you before that happens. ### API documentation Developers can now explore your API with auto-generated documentation and get started with a ready-to-use access token. *** ## November 2025 ### AI business assistant Meet your new AI assistant. Ask questions about your business, get suggestions, search the web for answers, and pick up conversations where you left off. ### Webhooks Get notified when things happen in your Crevio account — like new orders, subscription changes, or customer signups — by sending events to any URL you choose. ### Blog management Write and publish blog posts with categories, right inside Crevio. No separate blogging platform needed. ### Email alerts for key moments Get notified by email when a customer cancels their membership or when a new lead comes in. ### Low stock warnings See when inventory is running low on your products, so you never oversell. ### Event tickets Sell event tickets with session scheduling, RSVP tracking, calendar integration, and automatic invitation emails. ### Choose your plan during setup New businesses now pick their plan as part of the onboarding flow — no guessing which plan to start with. ### Integrations page A dedicated settings page for managing your connected apps and integrations. ### Product reviews See and manage customer reviews for each product directly from your dashboard. ### Quick-copy product IDs Developers can now copy product and pricing IDs with one click for use in custom integrations. *** ## October 2025 ### Invoices Create, send, and track invoices. Mark them as paid, void them, or flag overdue ones — all from your dashboard. ### Media library Upload and organize all your product images and videos in one place. Crop, reorder, and reuse media across products. ### Event sessions with seat limits Set up events with individual sessions, seat limits, and automatic inventory tracking. ### Automatic lead magnet delivery When someone grabs your lead magnet, Crevio delivers the file or content to them automatically. ### Multiple quantities at checkout Customers can now buy more than one of the same item in a single checkout. ### Apple Pay at checkout Your customers can now pay with Apple Pay for a faster checkout experience. ### Watermark your downloads Protect your digital files with automatic watermarking when customers download them. ### AI-generated product descriptions Let AI write your product descriptions for you. Just provide the basics and get polished copy in seconds. ### Free SEO tools New free tools on the website — YouTube Money Calculator, Coupon Code Generator, and more — to help drive traffic to your website. ### In-app help Get help without leaving your dashboard. A new help dialog gives you quick answers and links to relevant guides. ### Stronger account security Two-factor authentication is now smoother and more reliable. ### Mexican Peso support You can now price your products in Mexican Pesos (MXN). *** ## September 2025 ### Idea Validator tool A free interactive tool that helps you validate your product idea before you build it. ### Course engagement tracking See how students are progressing through your courses — which lessons they complete and where they drop off. ### Faster blog pages Blog posts now load faster with improved caching. *** ## August 2025 ### Magic link login Your customers can now sign in with a link sent to their email — no password needed. ### Bulk email sending Send an email to multiple customers at once, right from your dashboard. ### Italian language support Crevio is now available in Italian. ### Download without logging in Customers can download their purchased files using a secure link from their order confirmation — no account required. ### Smoother error handling If something goes wrong on the page, it's now handled gracefully instead of breaking the whole screen. ### Improved content editing Editing your content is now faster with a streamlined dialog-based editor. *** ## July 2025 ### Telegram integration Deliver premium content through Telegram. Grant customers access to private Telegram groups automatically when they purchase. ### Community forums Build a community around your products with discussion forums. Create topics, let members post and comment, and moderate conversations. ### AI product images Generate product images with AI directly from the product editor — no design tools needed. ### Redesigned product editor The product editing experience has been rebuilt from the ground up. Drag and drop your content, reorder sections, and see a clear breakdown of what each pricing tier includes. ### Switch between accounts faster A new sidebar lets you jump between your accounts with one click, and reorder them by dragging. ### Never lose unsaved work You'll now get a warning if you try to leave a page with unsaved changes. ### Share your new product After publishing a product, a new dialog gives you quick sharing options to spread the word. ### Faster page navigation Pages now start loading before you click, so navigation feels near-instant. ### Rich text editor A new editor for writing product descriptions, course lessons, and blog posts — with support for embedding videos. ### Developer settings Manage your API tokens from a dedicated developer page in your account settings. *** ## June 2025 ### Discord integration Grant customers access to your private Discord server automatically when they purchase. ### Sign in with Google Customers and business owners can now sign in with their Google account for a faster login experience. ### Automatic currency conversion Prices are now automatically shown in your customer's local currency, powered by Stripe Adaptive Pricing. ### Cross-selling at checkout Suggest related products to customers during checkout to increase order value. ### Pay-what-you-want pricing Let your customers choose what they want to pay. Set a minimum or leave it open-ended. ### Different content per pricing tier Assign different content to each pricing tier — so your premium tier can include extras that the basic tier doesn't. ### Order notifications with confetti Get a notification (and a little confetti) every time you make a sale. ### Abuse reporting Customers can now report inappropriate content, and your team gets notified in Slack. ### Referral program Reward your fans for spreading the word with a built-in referral program and customizable referral fees. ### German language support Crevio is now available in German. *** ## May 2025 ### Checkout links Create direct links to checkout for any product. Share them anywhere — social media, emails, QR codes — and skip the website entirely. ### Refreshed design system The entire interface got a visual refresh with a cleaner, more consistent look and feel. ### Notification preferences Choose which emails you want to receive with granular notification controls. ### Team invitations Invite team members to help manage your account, with the ability to transfer ownership. ### Smoother checkout The checkout flow is now fully embedded in your website — customers never leave your page. ### Discount codes Create and manage discount codes for your products. Set percentage or fixed-amount discounts with optional expiration dates. ### Saved payment methods Your customers can save their payment details for faster purchases next time. ### Install as an app Crevio can now be installed as an app on your phone or desktop for quick access. ### Smart website templates New businesses automatically get a website template matched to their niche — ready to customize right away. ### Export customers to CSV Download your full customer list as a CSV file for use in other tools. *** ## April 2025 ### Subscription products Sell recurring subscriptions with flexible billing intervals, free trials, and multi-currency support. Your customers can manage their own subscriptions from their account. ### New marketing website A brand new website with pricing, blog, and everything potential customers need to learn about Crevio. ### Lead tracking See how many leads you're capturing with a dedicated lead analytics view. ### Free starter plan Get started with Crevio for free. No monthly fee — just a small platform fee on each sale. ### Faster loading Pages load noticeably faster thanks to smaller file sizes and smarter resource loading. ### Spam protection Signup forms now block disposable email addresses to keep your customer list clean. *** ## March 2025 ### Website editor Build your website with customizable blocks, drag-and-drop reordering, and ready-made templates to get started fast. ### Checkout and payments Accept payments for your digital products with a smooth checkout experience powered by Stripe. ### Online courses Create and sell online courses with lessons, chapters, video hosting, progress tracking, and completion certificates. ### Subscription checkout Customers can now subscribe to recurring products directly at checkout, with support for multiple currencies. ### Custom domains Use your own domain for your website. Point your DNS to Crevio and your site is live at your own web address. ### Guided onboarding A step-by-step setup wizard walks you through creating your account, connecting payments, and publishing your first product. ### Payouts Connect your Stripe account to receive payouts directly to your bank account. ### Lead magnets Capture leads directly from your website with customizable lead forms. ### Customer management View, search, and manage all your customers and leads in one place. ### Customer tags Organize your customers with tags for better segmentation. Filter and group them however makes sense for your business. ### Product reviews Customers can now leave reviews on your products, building social proof for future buyers. ### Cancellation feedback When subscribers cancel, a survey collects their reasons — so you can learn and improve. ### Video embeds in courses Embed Loom videos and other hosted video content in your course lessons. ### Analytics Understand how your business is performing with revenue and page-view charts, product analytics, session recordings, and funnel tracking. Compare time periods to see how you're trending. ### Meta Pixel tracking Track conversions from your Facebook and Instagram ads with built-in Meta Pixel support. ### Pricing on the website Transparent pricing plans are now visible on the marketing website, so potential customers can compare options easily. ### Faster file delivery File storage was upgraded for faster downloads and better reliability worldwide. ### Multi-language support Crevio speaks your customers' language, with support for multiple languages so you can reach a global audience from day one. *** > [!NOTE] > > This changelog covers recent product updates. For API changes, see the [API reference](/docs/developer/api-reference/introduction). # How to access what you bought Source: https://crevio.co/docs/customers/access-your-purchase Find your course, download, or content after you've bought it -- and log in using your email. > [!NOTE] > > This article is written for buyers. If you're a business owner, you can share this article with your customers. Thanks for your purchase! Getting to what you bought is quick. Whether it's a course, a file to download, a community, or any other content, here's how to find it. ## Right after you buy As soon as your payment goes through, two things happen: * You see a **confirmation page** with a link or button to access what you bought. * You get a **confirmation email** at the address you used to pay. This email is your backup -- keep it. The fastest way in is to use the link on that confirmation page or in your email. ## Log in with your email You don't need to remember a password. Access is tied to the **email address you used when you bought**. **1. Go to the seller's site** Open the link from your confirmation email, or visit the site you bought from. **2. Choose to log in** Select **Log in** and enter the email address you used at checkout. **3. Check your inbox** You'll be sent a secure sign-in link by email. Open it to log in -- no password needed. **4. Open your purchase** Once you're logged in, you'll find everything you've bought in your account, ready to access. > [!TIP] > > Use the exact same email you paid with. If you log in with a different address, you won't see your purchase. ## What you'll find, depending on what you bought * **A course** opens so you can start watching or reading right away. * **A download** gives you a button to save the file to your device. * **A community, group, or chat** gives you a link or invite to join. * **An event or call** shows you the details and joining instructions. ## If something goes wrong * **You can't find your confirmation email.** Check your spam or promotions folder, and search your inbox for the seller's name or "receipt". * **The sign-in link doesn't work.** These links expire after a while for your security. Just request a new one and use it promptly. * **You logged in but don't see your purchase.** You may have signed in with a different email. Log out and try the exact address you used to pay. * **Still stuck?** Reply to your confirmation email or contact the seller directly -- they can help. See [How to get help with your order](/docs/customers/get-help-with-an-order). ## Related > **[Update your payment method](/docs/customers/update-payment-method)** > > Change the card on file for a subscription. > **[Manage or cancel your subscription](/docs/customers/manage-subscription)** > > Pause or stop a recurring payment. > **[Get help with your order](/docs/customers/get-help-with-an-order)** > > Reach the seller or request a refund. # How to get help with your order or request a refund Source: https://crevio.co/docs/customers/get-help-with-an-order Reach the seller, sort out a problem with your order, and ask for a refund the easy way. > [!NOTE] > > This article is written for buyers. If you're a business owner, you can share this article with your customers. If something's not right with your order -- you can't access what you bought, you were charged unexpectedly, or you'd like your money back -- the quickest fix is to contact the **seller you bought from**. They run their own business and can sort most things out directly. ## Before you reach out A few things solve themselves in seconds: * **Can't find your purchase?** See [How to access what you bought](/docs/customers/access-your-purchase). You usually just need to log in with the email you paid with. * **A subscription you want to stop?** See [How to manage or cancel your subscription](/docs/customers/manage-subscription). * **A card that needs updating?** See [How to update your payment method](/docs/customers/update-payment-method). If none of those fit, contact the seller. ## Contact the seller **1. Find your confirmation email** Look for the receipt or confirmation email you got when you bought. It comes from the seller and is the best place to start. **2. Reply or use their contact details** Reply to that email, or use the contact or support details on the seller's site. **3. Explain clearly** Say what you bought, the email you used, and what's wrong. The more detail you give, the faster they can help. > [!TIP] > > Mention the email address you used at checkout. It's how the seller finds your order quickly. ## Requesting a refund Refunds are handled by the seller, so the way to ask is to **contact them directly** using the steps above. Let them know: * What you bought and when. * The email you used at checkout. * Why you'd like a refund. If the seller approves it, the money goes back to the **same card you paid with**. Refunds typically take **5 to 10 business days** to appear in your account, depending on your bank -- that wait is set by the banks, not the seller. > [!NOTE] > > Each seller sets their own refund policy. Checking it before you buy -- and when you ask -- helps set expectations. ## If something goes wrong * **The seller hasn't replied.** Give them a little time, then follow up. Check your spam folder in case their reply landed there. * **You can't find any way to contact them.** Reply to your original confirmation email -- it always reaches the seller. * **Your approved refund hasn't arrived.** Allow up to 10 business days. If it's been longer, check with your bank, since the money has already been sent. ## Related > **[Access what you bought](/docs/customers/access-your-purchase)** > > Find your course, download, or content. > **[Manage or cancel your subscription](/docs/customers/manage-subscription)** > > Pause or stop a recurring payment. > **[Update your payment method](/docs/customers/update-payment-method)** > > Change the card on file. # How to manage or cancel your subscription Source: https://crevio.co/docs/customers/manage-subscription View your subscription, change your plan, and cancel whenever you like -- all from your account. > [!NOTE] > > This article is written for buyers. If you're a business owner, you can share this article with your customers. A subscription is a payment that repeats on a schedule -- for example, a monthly membership. You're always in control of it. You can check when your next payment is due, update your card, and cancel any time, right from your account. ## See your subscription **1. Open Billing** Go to the site you subscribed to and select **Billing** from your account menu. **2. Log in** Enter the email address you used to sign up and select **Send link**. You'll get a secure sign-in link by email -- no password needed. Open it soon after it arrives, since it expires after a short while. **3. Open your subscription** Your subscriptions are listed on the billing page, along with the renewal date and amount for each. ## Cancel your subscription **1. Open Billing** Log in to your billing page as above. **2. Choose to cancel** Find the subscription and select **Cancel subscription**. **3. Answer the seller's questions** Some sellers show you a short message or ask why you're leaving. You can skip past each step. **4. Confirm** Select **Cancel subscription** once more to finish. When you cancel, you won't be charged again. You usually **keep your access until the end of the period you've already paid for**, and then it stops. So if you cancel halfway through a month you've paid for, you can keep enjoying it until that month ends. > [!NOTE] > > Paying off a fixed number of instalments (a payment plan) rather than an ongoing subscription? It doesn't show a cancel option -- it ends on its own after the final payment. ## Pause instead of cancelling If the seller offers it, you'll see a pause option when you start to cancel. Choose how long to pause and select **Pause subscription**. You won't be charged during the pause, and your subscription restarts on its own when it ends -- the billing page shows the date. To restart sooner, select **Resume billing**. > [!TIP] > > Don't see a pause option? Ask the seller -- it's often easier than cancelling and signing up again later. ## Change your plan or card * To **switch plans** (for example, from monthly to yearly), contact the seller directly -- this isn't something you can change yourself from the billing page. * To **update the card** you pay with, see [How to update your payment method](/docs/customers/update-payment-method). ## If something goes wrong * **You can't log in.** Use the same email you signed up with, and request a fresh sign-in link if the last one expired. * **You don't see your subscription.** You may be logged in with a different email. Log out and try the address your subscription is under. * **You were charged after cancelling.** A cancellation stops *future* payments -- the most recent charge may have happened just before you cancelled, covering the current period. If it looks wrong, contact the seller; see [How to get help with your order](/docs/customers/get-help-with-an-order). * **You changed your mind and want to stay.** If you cancelled but are still within your paid period, you can usually resubscribe. Contact the seller if you need a hand. ## Related > **[Update your payment method](/docs/customers/update-payment-method)** > > Change the card on file. > **[Access what you bought](/docs/customers/access-your-purchase)** > > Find your course, download, or content. > **[Get help with your order](/docs/customers/get-help-with-an-order)** > > Reach the seller or request a refund. # How to update your payment method Source: https://crevio.co/docs/customers/update-payment-method Change the card used for your subscription so your payments keep going through. > [!NOTE] > > This article is written for buyers. If you're a business owner, you can share this article with your customers. If you pay for something on a repeating basis -- a membership, a subscription, or a payment plan -- you'll want to keep the card on file up to date. If your card expires or you switch banks, updating it takes a minute and keeps your access uninterrupted. ## When to update your card * Your card is about to expire or already has. * You got a new card or changed banks. * A payment failed and you were asked to update your details. ## Update your card **1. Open Billing** Go to the site you bought from and select **Billing** from your account menu. **2. Log in** Enter the email address you used when you signed up and select **Send link**. You'll get a secure sign-in link by email -- no password needed. **3. Update your payment method** On your billing page, select **Update payment method**. You'll be taken to a secure page to enter your new card details. **4. Save** Confirm your new card. Your next payment will use it. > [!TIP] > > Update your card before your next payment date, not after. That way you avoid a failed payment and any pause in your access. ## If a payment already failed Don't worry -- a failed payment usually just means your card details need refreshing. Once you add a working card, your payment will go through and your access continues as normal. You may receive an email asking you to update your details; the link in it takes you straight to the right place. ## If something goes wrong * **You can't log in.** Make sure you're using the same email you used to sign up. Request a fresh sign-in link if the last one expired. * **You don't see a billing or subscription section.** You may be logged in with a different email than the one your subscription is under. Log out and try the correct address. * **Your new card is declined.** Check the number, expiry, and security code, and that the card allows online and recurring payments. If it still won't go through, contact your bank. * **Still stuck?** Contact the seller -- see [How to get help with your order](/docs/customers/get-help-with-an-order). ## Related > **[Manage or cancel your subscription](/docs/customers/manage-subscription)** > > Pause or stop a recurring payment. > **[Access what you bought](/docs/customers/access-your-purchase)** > > Find your course, download, or content. > **[Get help with your order](/docs/customers/get-help-with-an-order)** > > Reach the seller or request a refund. # API reference Source: https://crevio.co/docs/developer/api-reference/introduction Programmatically manage your Crevio website with the REST API — authentication, error handling, and endpoints for products, orders, and customers. The Crevio API lets you manage products, pricing, checkouts, orders, customers, invoices, subscriptions, and more. All endpoints return JSON with snake\_case keys following Stripe conventions. ## Base URL ``` https://api.crevio.co/v1 ``` For local development: ``` https://api.crevio.dev/v1 ``` ## Authentication All API requests require a Bearer token in the `Authorization` header. ```bash theme={null} curl https://api.crevio.co/v1/products \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Generate API tokens from **Settings > Developer > API tokens** in your dashboard. > [!WARNING] > > Keep your API tokens secure. Do not expose them in client-side code or public repositories. ## Object types Every API resource includes an `object` field that identifies the resource type: ```json theme={null} { "id": "prod_abc123", "object": "product", "name": "My Course", "slug": "my-course" } ``` All IDs are prefixed strings that encode the resource type (e.g., `prod_abc123`, `cus_ghi789`). ## Slug lookup Products, blog posts, experiences, and legal pages can be retrieved by slug instead of ID: ```bash theme={null} curl https://api.crevio.co/v1/products/my-course \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` This works anywhere an ID is accepted for these resources. ## List responses List endpoints return a consistent envelope: ```json theme={null} { "object": "list", "data": [ { "id": "prod_abc123", "object": "product", "name": "My Course" }, { "id": "prod_def456", "object": "product", "name": "Templates Pack" } ], "has_more": true, "url": "/v1/products" } ``` Use `starting_after` and `limit` query parameters to paginate. Pass the `id` of the last item to fetch the next page: ```bash theme={null} curl "https://api.crevio.co/v1/products?starting_after=prod_abc123&limit=20" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Default limit is 20, maximum is 100. ## Expandable fields Some endpoints support an `expand` query parameter to include related data inline. Pass a comma-separated list of fields: ```bash theme={null} curl "https://api.crevio.co/v1/orders?expand=line_items,customer" ``` Without expand, related resources appear as collapsed IDs: ```json theme={null} { "customer": "cus_abc123" } ``` With expand, they become full objects: ```json theme={null} { "customer": { "id": "cus_abc123", "object": "customer", "email": "jane@example.com", "name": "Jane Doe" } } ``` ## Delete responses Delete endpoints return a confirmation: ```json theme={null} { "id": "disc_abc123", "object": "discount", "deleted": true } ``` ## Errors All errors follow this format: ```json theme={null} { "error": { "type": "validation_error", "code": "validation_failed", "message": "Email can't be blank", "errors": { "email": ["can't be blank"] } } } ``` | Status | Type | Code | Description | | - | - | - | - | | 400 | `invalid_request_error` | `parameter_missing` | A required parameter is missing | | 401 | `invalid_request_error` | `authentication_required` | Invalid or missing API token | | 404 | `invalid_request_error` | `resource_missing` | Resource not found | | 422 | `validation_error` | `validation_failed` | Request failed validation | | 500 | `api_error` | — | Internal server error | ## SDKs ### TypeScript Install the official [TypeScript SDK](/docs/developer/guides/sdk): ```bash theme={null} npm install @crevio/sdk ``` ```typescript theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN", }); const products = await crevio.products.list(); ``` > **[Full endpoint reference](/docs/developer/api-reference/introduction)** > > Browse all available endpoints below. # Ads & Voice Source: https://crevio.co/docs/developer/guides/ads-and-voice Run multi-platform paid ad campaigns and place autonomous AI phone calls through the API — campaigns, audiences, pixels, and leads on the ads side; AI calls, phone numbers, and consent management on the voice side. **Ads and Voice are Crevio's two outbound-growth surfaces: launch and optimize paid ad campaigns across platforms, and have an AI place real phone calls on your behalf — both metered as you go.** You can just ask Crevio to launch a campaign for a product or call a lead to book a demo. Or drive it through the API: the ads surface manages the full campaign hierarchy, audiences, pixels, and leads; the voice surface places AI phone calls with a clear objective, manages your numbers, and tracks consent. Both domains have many endpoints — this guide covers the workflow and the key calls. See the [API reference](/docs/developer/api-reference/introduction) for the exhaustive parameter lists. ## Ads Crevio ads run across multiple platforms with a standard hierarchy: **Campaign → Ad Group → Ad**, plus custom audiences, pixels & conversions, and lead forms. ### Connect an ads account first Ads need their own connection — separate from your other integrations — before you can sync or create campaigns. ```bash theme={null} curl -X POST https://api.crevio.co/v1/ads/connect \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ChatGPT ads have no OAuth step. Create an API key in ChatGPT Ads Manager under Settings and send it with `platform: "openaiads"`; one key covers exactly one ad account. OpenAI has no read-only scope, so the key carries full campaign write access. ```bash theme={null} curl -X POST https://api.crevio.co/v1/ads/connect \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"platform": "openaiads", "api_key": "sk-ads-..."}' ``` A ChatGPT ad is a chat card: `headline` (3–50 characters), `body` (up to 100), `image_url` and `link_url` are all required. Budgets are lifetime-only with an `end_date`, `bid_strategy` plus `bid_amount` are required, and targeting is by country only. > [!WARNING] > > Campaign creation will fail until an ads account is connected. Always run `POST /ads/connect` first. ### The campaign hierarchy Once connected, build top-down: ```bash theme={null} # 1. Create a campaign curl -X POST https://api.crevio.co/v1/ads/campaigns \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Listing promo", "objective": "conversions" }' # 2. Add an ad group under it, then 3. ads under the group curl -X POST https://api.crevio.co/v1/ads/ad-groups \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "campaign": "adcmp_abc123", "name": "Lookalike — buyers" }' ``` ### Audiences, targeting, pixels, and conversions * **Custom audiences** — build and reuse audience segments. * **Targeting search & reach estimates** — search targeting options and estimate audience reach before you spend. * **Pixels & conversions** — install pixels and report conversions back for optimization. * **Lead forms & leads** — collect leads with on-platform forms and pull the resulting leads. ### Boost a post and Click-to-WhatsApp Turn an existing organic [social](/docs/developer/guides/social) post into a paid ad: ```bash theme={null} curl -X POST https://api.crevio.co/v1/ads/boost \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "post": "post_abc123", "budget": 5000 }' ``` Click-to-WhatsApp campaigns are supported for driving conversations directly into WhatsApp. ### Performance reports Pull performance reports to see spend, results, and ROAS across the hierarchy, then feed that back into optimization — or let a [Task](/docs/developer/guides/tasks) do the optimizing on a schedule. ### Insights queries `GET /ads/insights` runs a live performance query against the platform behind a connection, for anything the fixed reports don't cover. The connection's platform decides what you send: * **Google Ads**: any read-only GAQL `SELECT` in `query`, for example search terms, keywords with Quality Score, geo, devices, assets or conversion actions. * **Meta**: Graph insights `fields`, `breakdowns` and `filtering` on `object_id`, which must be the connection's ad account (`act_...`) or one of its campaigns, ad sets or ads. * **TikTok**: `ad_account_id`, `data_level`, `dimensions`, `metrics`, `from` and `to`. Rows come back as the platform returned them, with keys in snake\_case. Google counters are strings and cost is in micros. Follow `next_cursor` for more rows. A query the platform rejects returns `400` with its message. ```bash theme={null} curl -G https://api.crevio.co/v1/ads/insights \ -H "Authorization: Bearer YOUR_API_TOKEN" \ --data-urlencode "account_id=sacct_abc123" \ --data-urlencode "query=SELECT search_term_view.search_term, search_term_view.status, metrics.cost_micros, metrics.conversions FROM search_term_view WHERE segments.date DURING LAST_30_DAYS ORDER BY metrics.cost_micros DESC" ``` `search_term_view.status` says whether a term is already a keyword (`ADDED`), a negative (`EXCLUDED`) or neither (`NONE`). ### Keywords and negatives `POST /ads/keywords` adds keywords to a Google Search ad group (`ad_group_id`), keeping the ones already there. With `"negative": true` it adds negatives to one ad group (`ad_group_id`) or one campaign (`campaign_id`), never both, and keeps every negative already there. Each keyword is `{ "text": ..., "match_type": "exact" | "phrase" | "broad" }`. ```bash theme={null} curl -X POST https://api.crevio.co/v1/ads/keywords \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "account_id": "sacct_abc123", "negative": true, "campaign_id": "21345678901", "keywords": [{ "text": "free", "match_type": "broad" }] }' ``` Adding a campaign-level negative reads the campaign's current list live first. When Google's daily API quota is used up, that read can't be trusted, so the request fails with `503 ad_provider_unavailable` instead of overwriting newer negatives. Retry later, or add the negative at the ad-group level. When the agent makes these changes, it always asks for approval first. ## Voice Crevio places **autonomous AI phone calls** — inbound and outbound. You give the AI an objective and an opening line, and it makes the call. Voice is billed per minute. ### Place a call `POST /calls` starts an outbound AI call. | Field | Purpose | | - | - | | `to_number` | The number to call | | `objective` | What the AI should accomplish on the call | | `first_message` | The opening line the AI says | | `purpose` | The reason/category for the call | ```bash cURL theme={null} curl -X POST https://api.crevio.co/v1/calls \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "to_number": "+15551234567", "objective": "Follow up with the lead about the home they inquired about and book a viewing.", "first_message": "Hi, this is Maple Realty following up on the listing you asked about.", "purpose": "lead_follow_up" }' ``` ```typescript SDK theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN" }); await crevio.calls.create({ to_number: "+15551234567", objective: "Follow up with the lead about the home they inquired about and book a viewing.", first_message: "Hi, this is Maple Realty following up on the listing you asked about.", purpose: "lead_follow_up", }); ``` ```text MCP (agent) theme={null} Call +1 555 123 4567 to follow up on the listing they inquired about and book a viewing. ``` ### Call events Subscribe a [webhook](/docs/developer/guides/webhooks#calls) or an event-triggered [Task](/docs/developer/guides/events) to `call.started` and `call.ended` instead of polling `GET /calls`. Both carry the call object; `call.ended` arrives after the call is billed, with its transcript and `credits_charged`. The calls API and these events cover phone calls only. A call the account owner takes with their assistant in the browser stays in that chat: `GET /calls` doesn't list it, and it sends no events. ### Phone numbers Provision a number to call from (and to receive inbound calls), and release it when you're done. ```bash theme={null} # Provision a number curl -X POST https://api.crevio.co/v1/phone-numbers \ -H "Authorization: Bearer YOUR_API_TOKEN" # Release a number curl -X DELETE https://api.crevio.co/v1/phone-numbers/phon_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ### Consent and do-not-call (TCPA) Voice includes compliance tooling. Record **TCPA consents** before calling, and maintain **do-not-call suppressions** so the AI never dials a suppressed number. ```bash theme={null} # Record consent curl -X POST https://api.crevio.co/v1/phone-consents \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "phone_number": "+15551234567" }' # Suppress a number (do not call) curl -X POST https://api.crevio.co/v1/phone-suppressions \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "phone_number": "+15559876543" }' ``` > [!WARNING] > > Calls are billed per minute and draw down credits. Always confirm you have valid consent before placing outbound calls. ## Next steps > **[Social](/docs/developer/guides/social)** > > Boost organic posts into paid ads. > **[Tasks](/docs/developer/guides/tasks)** > > Automate campaign optimization and follow-up calls. > **[Usage & credits](/docs/developer/guides/usage-billing)** > > See how per-minute calls and ad operations bill. > **[API reference](/docs/developer/api-reference/introduction)** > > Every ads and voice endpoint and parameter. # AI & Agents (overview) Source: https://crevio.co/docs/developer/guides/agents-overview Crevio is AI-native — anything a user can do, an agent can do. Learn the agentic model: the MCP/agent surface, the two agent types, and Tasks that turn the agent into an autonomous workforce. **Crevio is AI-native: anything a user can do in the dashboard, an agent can do through the API.** The same controllers that power `crevio.co/app` power the [REST API](/docs/developer/guides/api-overview), the [TypeScript SDK](/docs/developer/guides/sdk), and the [MCP server](/docs/developer/mcp) — so an AI agent has full parity with a human operator. It can create products, run checkouts, send broadcasts, post to social, build and deploy a website, place phone calls, and research the web. Crevio is the platform that *runs* your business; the agent surface is how you let AI run it programmatically. ## The agentic model There are three layers, from "tell the agent what to do right now" to "let the agent run your business on its own." > **MCP / agent surface** > > Delegate work to the Crevio agent from any MCP client (`ask_crevio`, runs, `send_message`), or let the connected LLM run scripts against the **entire** Crevio API and your integrations (`list_integrations` + `run_script`). > **Tasks** > > A persisted instruction + schedule + agent + autonomy level. Crevio's own AI workforce, running on triggers you define. > **Events** > > Internal and third-party signals (an order paid, a form submitted) that fire Tasks automatically. ## "Anything a user can do, an agent can do" This is the core design principle. There is no separate, reduced "agent API." When an agent calls `POST /v1/products`, it routes through the exact same controller, authorization, validation, and tenant isolation as a human clicking **Create product** in the dashboard. Two consequences: * **Same capabilities.** Every domain in the [API catalog](/docs/developer/guides/api-overview#what-you-can-do-with-the-api) — products, checkouts, customers, discounts, email, socials, sites, domains, calls, images, web research — is available to an agent. * **Same rules.** The same [gotchas](/docs/developer/guides/conventions) apply: params are unwrapped (top-level), associations are bare prefix-id strings (`product: "prod_abc123"`), money is in cents, and creation order matters (a product needs a price variant before it can go `active`). ## The MCP / agent surface The MCP server has two surfaces. **Delegation** hands the Crevio agent a job in plain English — `ask_crevio` waits for the result, `start_chat` / `wait_for_run` / `send_message` follow and continue longer jobs — and every delegated job is a Task with one run. **Scripts** are for when the connected LLM wants the controls itself: rather than exposing one MCP tool per endpoint (which burns tens of thousands of tokens before the agent does anything), the agent writes JavaScript that runs on your account's Crevio computer, against the same `tools` the Crevio agent itself calls. **Discover** `list_integrations` names what a script can call — `crevioApi`, `platform`, and each connected integration — and `list_integration_tools` lists one namespace's functions with their parameters and a runnable snippet. ```json theme={null} { "namespace": "crevioApi", "search": "discounts" } ``` **Run** `run_script` runs the code and chains as many calls as it needs in a single round-trip. The last expression is the result. ```js theme={null} const product = await tools.crevioApi.createProduct({ body: { name: "My Course" } }); await tools.crevioApi.createPriceVariant({ body: { product: product.id, name: "Standard", amount_type: "fixed", amount: 4900, currency: "usd", billing_type: "one_time" }, }); product.id ``` LLMs write code better than they navigate large JSON schemas. The agent discovers only what it needs, keeps its context lean, and a multi-step workflow that would otherwise take 10+ tool calls collapses into one run. See the [MCP guide](/docs/developer/mcp) for the full pattern, security model, and connection setup. ## The two agent types Every Task (and the dashboard chat) runs as one of two agents. Pick the one whose job matches the work. | Agent | What it does | Typical work | | - | - | - | | **`business`** (default) | Operates your business through the API — the marketing/ops/sales surface. | Launch a product, write and send broadcasts, post to social, research competitors, follow up with leads, place calls. | | **`engineering`** | Writes and ships code on one of your [Sites](/docs/developer/guides/sites). The site's repo is mounted as its workspace; it can build and deploy. | Add a page to your website, fix a bug, redesign a section, ship a new feature, deploy to production. | The `engineering` agent is scoped to a specific site via `site_id` (the repo is mounted as its workspace and defaults to your account's default site). The `business` agent works across your whole account. ## Tasks: the agent as an autonomous workforce A single API call does one thing once. A **Task** is a *standing instruction*: a prompt, an agent, a schedule, and an autonomy level, persisted on your account. Crevio runs it on the trigger you choose — once, on an interval, on a cron schedule, or whenever an event fires — and each execution is a **Task Run** you can inspect, approve, or respond to. ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Weekly sales digest", "prompt": "Summarize this week’s orders, revenue, and top products, then email me the report.", "trigger_type": "cron", "cron_expression": "0 9 * * MON", "timezone": "America/New_York", "agent": "business", "approval_mode": "autonomous", "delivery_methods": ["email", "notification"] }' ``` This is what makes Crevio an *autonomous workforce* rather than just an API: you describe outcomes once, choose how much oversight you want, and the agent does the work on schedule — surfacing results (or asking for approval) through the delivery channels you pick. > [!NOTE] > > Task runs consume credits — every AI operation (messages, media generation, web research, calls) is metered pay-per-call. Check your balance and spend with [`GET /usage`](/docs/developer/guides/usage-billing). ## The building blocks | Primitive | Prefix | What it is | | - | - | - | | **MCP tools** | — | `ask_crevio` & co. delegate work to the agent; `list_integrations` + `run_script` run scripts against the whole API and your integrations. | | **Task** | `task_` | A standing instruction: prompt + agent + trigger + autonomy + delivery. | | **Task Run** | `trun_` | One execution of a Task — status, summary, credits consumed, tool calls. | | **Event** | — | An internal signal (`order.paid`, `form_submission.created`) that can trigger an event-Task. | | **Event Source** | — | A third-party trigger (a connected app's event) that fires an event-Task. | | **Site** | `site_` | A website the `engineering` agent builds and deploys to. | ## Next steps > **[Tasks (your AI workforce)](/docs/developer/guides/tasks)** > > Triggers, agents, autonomy modes, delivery, and responding to supervised runs. > **[Events & Event Sources](/docs/developer/guides/events)** > > Fire Tasks automatically from internal events and third-party apps. > **[MCP Server](/docs/developer/mcp)** > > Connect Claude, Cursor, or any agent to the full API via Code Mode. > **[Connections](/docs/developer/guides/connections)** > > Run a connected app's tools, call its API directly, and gate every write behind an approval. > **[Usage & credits](/docs/developer/guides/usage-billing)** > > See how AI operations are metered and check your balance. # AI content generation Source: https://crevio.co/docs/developer/guides/ai-content Generate images, video, speech, music, and run live web research from the API — the same AI media engine that powers Crevio, available as metered API calls. **Crevio turns prompts into production media and live web intelligence.** Generate product images, marketing video, voiceovers, and run agentic web research — all through the API, billed per call against your credit balance. These operations are **metered** (they consume credits — see [Usage & billing](/docs/developer/guides/usage-billing)). Media operations are **asynchronous**: you kick off a job, then poll for the result. Finished media is saved to your **MediaLibrary** as `file_…` ids that you can attach directly to products, posts, and more. ## How generation works Most media calls don't return the finished asset inline. They start a background **Job** and return a job you poll until it's done. **1. Start a generation** Call `POST /images/generate`, `POST /videos/generate`, `POST /audio/generate`, or `POST /audio/music`. You get back a job. **2. Poll the job** Poll `GET /jobs/{id}` (or list with `GET /jobs`) until its status is terminal. The completed job references the resulting MediaLibrary file. **3. Use the file** The output lands in your MediaLibrary as a `file_…` id. Use it anywhere a file is accepted — e.g. a product's `images` array. > [!NOTE] > > Generated media always lands in the MediaLibrary first. You attach the `file_…` id — you never hand a raw CDN URL to a product or post. ## Pricing Pick a model with the `model` parameter; omit it to use the default. The simplest thing to pass is a **quality tier** — `fast`, `balanced` or `quality` — which resolves to the best current model at that price point for the endpoint you called. Tiers are chosen against independent blind-comparison rankings ([Artificial Analysis](https://artificialanalysis.ai) arenas) per workload, and survive model churn, so prefer them unless you need a specific model. `GET /images/models` (and the video/audio equivalents) shows which id each tier currently resolves to. ```json theme={null} { "model": "balanced", "input": { "prompt": "a paper boat in a gutter" } } ``` Per-unit prices in USD. Note the unit differs per model — an image, a second of video, a megapixel or 1,000 characters. You are charged the quantity the provider actually bills, so a 10-second clip on a per-second model costs ten times its listed price, and a job that fails or is cancelled costs nothing. ### Images | Tier | Model | Price | | - | - | - | | `fast` | `fal-ai/z-image/turbo` | \$0.005 / megapixel | | `balanced` | `fal-ai/nano-banana-2` | \$0.08 / image — the default | | `quality` | `openai/gpt-image-2.5/flare/text-to-image` | metered per request; highest-ranked text-to-image model, and the strongest at in-image text | ### Video | Tier | Model | Price | | - | - | - | | `fast` | `fal-ai/veo3.1/lite` | \~\$0.05 / second — the cheapest, with native audio; 4, 6 or 8-second clips | | `balanced` | `minimax/h3-max/text-to-video` | \~\$0.05 / second — no audio | | `quality` | `google/gemini-omni-flash/v1.1/text-to-video` | \~\$0.10 / second — native audio with lip-sync | These are what generations are actually billed per second of output; fal's listed unit price is not always per second. `GET /v1/videos/models` returns each model's current rate in credits as `credits_per_second`. `fal-ai/veo3.1` (\~\$0.40 / second) is available but untiered: about four times the `quality` tier for similar rankings. Reach for it only when you need 4K output. ### Audio (text-to-speech) | Tier | Model | Price | | - | - | - | | `fast` | `fal-ai/inworld-tts` | \$0.01 / 1,000 chars | | `balanced` | `fal-ai/elevenlabs/tts/turbo-v2.5` | \$0.05 / 1,000 chars | | `quality` | `alibaba/qwen-audio-3-tts` | \$0.05 / 1,000 chars — highest-ranked voice on fal | `fal-ai/elevenlabs/tts/multilingual-v2` (\$0.10 / 1,000 chars) stays the default when you pass no model, and `eleven-v3` is available for ElevenLabs' most expressive delivery. Tiers switch voice families, so a `voice` value from one tier will not carry to another. ### Music | Tier | Model | Price | | - | - | - | | `fast` | `minimax/music-3` | \$0.002 / second of output | | `balanced` | `fal-ai/lyria3/pro` | \$0.08 / track — the default | | `quality` | `mureka/api/generate/instrumental` | \$0.225 / track — instrumental only | Tiers follow the Artificial Analysis instrumental arena. `balanced` and `quality` rank statistically level, so `balanced` is the default at about a third of the price. > [!TIP] > > These are the featured models, listed live with current pricing at `GET /images/models`, `GET /videos/models`, `GET /audio/models`, and `GET /audio/music/models` — not a closed set. Any [fal.ai](https://fal.ai/models) endpoint id is accepted, so you can pass a model that isn't listed here (for example a newer video model) and it will be billed at that endpoint's own rate. An endpoint fal doesn't serve is rejected with `invalid_model`. ## Images `POST /images/generate` starts an image generation. The one thing that trips people up: **the prompt goes under `input: { prompt }`**, not at the top level. The `input` object is forwarded verbatim to the underlying model, so any model-specific fields go there too. > [!WARNING] > > Image generation is the exception to Crevio's "params at the top level" rule. The prompt must be nested under `input`. A top-level `prompt` is ignored. **cURL** ```bash theme={null} curl -X POST https://api.crevio.co/v1/images/generate \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "model": "quality", "input": { "prompt": "bold brand hero image for a creative marketing agency, abstract gradient shapes and confident typography, studio lighting" } }' ``` **SDK (TypeScript)** ```typescript theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN" }); const job = await crevio.images.generate({ model: "quality", input: { prompt: "bold brand hero image for a creative marketing agency, abstract gradient shapes and confident typography, studio lighting", }, }); ``` **MCP (agent)** ``` Generate a bold brand hero image for my marketing agency with abstract gradient shapes and confident typography, and save it to my library. ``` The call returns a job. Poll it until it finishes: ```bash theme={null} curl https://api.crevio.co/v1/jobs/JOB_ID \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` When the job completes, the generated image is in your MediaLibrary as a `file_…` id. ### Edit, upscale, and stock | Operation | What it does | | - | - | | `POST /images/edit` | Edit an existing image with a prompt (image-to-image) | | `POST /images/upscale` | Increase resolution of an existing image | | `GET /images/stock` | Search royalty-free stock imagery | | `GET /images/models` | List featured image models, their tier, and live pricing | ## Video `POST /videos/generate` follows the same shape family — pass a tier (or a model id from `GET /videos/models`), describe what you want, then poll for the result. Video has no default model, because it bills per second. ```bash theme={null} curl -X POST https://api.crevio.co/v1/videos/generate \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "model": "balanced", "input": { "prompt": "energetic social banner clip for a personal fitness coach, dynamic motion graphics over a vibrant gradient backdrop" } }' ``` Poll `GET /videos/{id}` (or `GET /jobs/{id}`) until the render is done. Video can take a while — these are long-running jobs. ## Audio (text-to-speech) `POST /audio/generate` turns text into a voiceover. Pricing is per 1,000 characters, so pass the text you want spoken. ```bash theme={null} curl -X POST https://api.crevio.co/v1/audio/generate \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "model": "balanced", "input": { "text": "Welcome to your free consultation. In this first call we will map out your goals." } }' ``` Poll `GET /audio/{id}` for the finished audio file. ## Music `POST /audio/music` makes an original track from a text description: a soundtrack, a background bed, a jingle or a song. Write `prompt` as a brief (genre, mood, tempo, instruments, energy) and say "instrumental, no vocals" for a bed under narration. ```bash theme={null} curl -X POST https://api.crevio.co/v1/audio/music \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "model": "balanced", "input": { "prompt": "Hard-hitting country rock, driving drums, crunchy electric guitar, banjo lead, 140 BPM, instrumental, no vocals" } }' ``` Poll `GET /audio/{id}` (or `GET /jobs/{id}`); the track is `result.audio`. Tracks come back at the model's own length, often a few minutes, so trim them to fit. Only the `fast` tier takes `input.duration`, an upper bound in seconds. The models take text only, so a reference recording can't be passed. Describe its style instead. ## Web tools Beyond media, Crevio exposes a suite of **live web** operations — the same tools your AI Tasks use to research the open web. All are metered. | Endpoint | What it does | | - | - | | `POST /web/search` | Run a web search and return ranked results | | `POST /web/read` | Fetch and clean a single URL into readable text | | `POST /web/map` | Map the URLs/structure of a site | | `POST /web/crawl` | Crawl a site and collect its pages | | `POST /web/extract` | Pull structured data from one or more pages | | `POST /web/research` | Agentic multi-step research with a synthesized answer | `POST /web/research` is the heavyweight: give it a `query` and a `depth`, and it fans out searches, reads sources, and synthesizes a cited answer. ```bash theme={null} curl -X POST https://api.crevio.co/v1/web/research \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "query": "freelance web design pricing benchmarks 2026", "depth": "thorough" }' ``` The `depth` enum controls how hard it digs — at the cost of more credits and time: | `depth` | Behavior | | - | - | | `quick` | Fast, shallow pass (default) | | `thorough` | Broader fan-out, more sources | | `exhaustive` | Deep, multi-round research | ## Worked example: generate a product image and attach it A common flow — create a draft product, generate a cover image, and attach it. **1. Create a draft product** ```bash theme={null} curl -X POST https://api.crevio.co/v1/products \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Strategy Consulting Session", "status": "draft" }' ``` Returns the product (e.g. `"id": "prod_abc123"`). **2. Generate the cover image** ```bash theme={null} curl -X POST https://api.crevio.co/v1/images/generate \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "input": { "prompt": "polished professional brand shot of a business consultant at a desk, warm office light, on a clean background" } }' ``` Returns a job — note its id. **3. Poll until the image is ready** ```bash theme={null} curl https://api.crevio.co/v1/jobs/JOB_ID \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` When complete, the job references a MediaLibrary file (e.g. `file_def456`). **4. Attach the file to the product** ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/products/prod_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "images": ["file_def456"] }' ``` The first id in `images` becomes the cover. An empty array clears the gallery. > [!TIP] > > Want the whole thing in one breath? Over [MCP](/docs/developer/mcp) you can just ask: "Generate a cover image for my Strategy Consulting Session and set it as the product photo." ## Next steps > **[Launch a paid course](/docs/developer/guides/recipe-launch-paid-course)** > > Chain products, pricing, and checkout end to end. > **[Tasks](/docs/developer/guides/tasks)** > > Hand web research and content jobs to your AI workforce. > **[Usage & billing](/docs/developer/guides/usage-billing)** > > How metered credits are consumed per call. > **[Conventions](/docs/developer/guides/conventions)** > > The rules every endpoint follows. # AI gateway Source: https://crevio.co/docs/developer/guides/ai-gateway Call any major LLM with your Crevio API key. One endpoint, OpenAI-compatible, billed to your credit balance — no provider account and no second key to manage. **Your Crevio API key is also an LLM key.** Point any OpenAI-compatible SDK at `https://ai-gateway.crevio.co/v1`, pass the key you already have, and call GPT, Claude, Gemini, Grok, or any other model in the catalog. Tokens are billed to your Crevio credit balance at the provider's price plus a 50% platform fee. There is no separate signup, no provider account, and no second key to rotate. Apps that Crevio builds and deploys for you get the endpoint wired up automatically. ## Quickstart ```ts TypeScript theme={null} import OpenAI from "openai"; const client = new OpenAI({ apiKey: process.env.CREVIO_API_KEY, baseURL: "https://ai-gateway.crevio.co/v1", }); const completion = await client.chat.completions.create({ model: "anthropic/claude-sonnet-5", messages: [{ role: "user", content: "Write a product tagline for a ceramics studio." }], }); console.log(completion.choices[0].message.content); ``` ```python Python theme={null} from openai import OpenAI client = OpenAI( api_key=os.environ["CREVIO_API_KEY"], base_url="https://ai-gateway.crevio.co/v1", ) completion = client.chat.completions.create( model="anthropic/claude-sonnet-5", messages=[{"role": "user", "content": "Write a product tagline for a ceramics studio."}], ) ``` ```bash curl theme={null} curl https://ai-gateway.crevio.co/v1/chat/completions \ -H "Authorization: Bearer $CREVIO_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "anthropic/claude-sonnet-5", "messages": [{"role": "user", "content": "Write a product tagline for a ceramics studio."}] }' ``` > [!WARNING] > > **Server-side only.** The gateway spends your credits, so treat the key like any other secret. Never ship it to a browser, and never put an unauthenticated route in front of it — an open chat endpoint is a free LLM for anyone who finds it, billed to you. ## Inside a Crevio-built app Apps that Crevio deploys already have `CREVIO_API_KEY` and `CREVIO_AI_GATEWAY_URL` in their environment. Nothing to configure: ```ts theme={null} const client = new OpenAI({ apiKey: process.env.CREVIO_API_KEY, baseURL: process.env.CREVIO_AI_GATEWAY_URL, }); ``` ## The `crevio` model: your agent behind the API Pass `model: "crevio"` and the request runs your Crevio agent instead of a bare model. It works your account through the Crevio API and every connected integration, the same as a chat in Crevio, and answers in the wire format you called. Existing OpenAI and Anthropic code works with only the base URL, key and model changed. | Method | Endpoint | Protocol | | - | - | - | | `POST` | `/v1/chat/completions` | OpenAI Chat Completions | | `POST` | `/v1/responses` | OpenAI Responses | | `POST` | `/v1/messages` | Anthropic Messages (base URL `https://ai-gateway.crevio.co`, key in `x-api-key`) | ```ts OpenAI theme={null} const reply = await client.chat.completions.create({ model: "crevio", messages: [{ role: "user", content: "Summarize yesterday's orders." }], }); ``` ```ts Anthropic theme={null} import Anthropic from "@anthropic-ai/sdk"; const anthropic = new Anthropic({ apiKey: process.env.CREVIO_API_KEY, baseURL: "https://ai-gateway.crevio.co" }); const message = await anthropic.messages.create({ model: "crevio", max_tokens: 1024, messages: [{ role: "user", content: "Summarize yesterday's orders." }], }); ``` How it differs from a bare model: * **Each call is an agent run**, so it takes from seconds to minutes and spends credits like any other run, not per token. Calls are capped at 10 minutes; a longer run answers `504 run_still_working` with the run id to read later at `GET /v1/task_runs/{id}`. `usage` is always zero. * **Your system messages are added to the agent's instructions**, never swapped in for them. Earlier messages in the request are passed along as the conversation so far. * **Continuing a conversation.** Chat Completions and Messages are stateless: send the history each time. Or continue the agent's own chat, with its earlier tool results: every reply carries an `x-crevio-response-id` header (the run id), and passing it back as `previous_response_id` in the body (or the `x-crevio-previous-response-id` header for Messages) with only the new message continues that chat. On the Responses API the response `id` is that value, so `previous_response_id` works as it does on OpenAI. * **Structured output.** `response_format` (Chat Completions), `text.format` (Responses) or `output_format` (Messages) with a JSON Schema makes the reply the validated JSON. The full validation result is in the `crevio` object beside the reply: `json`, `json_error`, plus `run_id`, `chat_id`, `status`, `credits_consumed` and `artifacts`. * **Streaming** (`stream: true`) is supported on all three. The stream opens at once and stays alive while the agent works, then carries the whole reply in one piece when the run finishes. It does not stream the agent's tokens as it writes them. * **Approvals.** A run that stops to ask you something (status `needs_input`) answers with its question as the reply. Answer by continuing the chat. A run that fails or is cancelled answers `502` with the reason. * Tool declarations in the request are ignored: the agent uses your connected integrations, not tools you pass. The key needs the `agent:run` scope. Raw models need `models:run` (see [API keys](/docs/developer/guides/api-overview#scopes)). ## Streaming Set `stream: true` and read the response as you would from OpenAI. Tokens are forwarded as they arrive — the gateway adds no buffering of its own. ```ts theme={null} const stream = await client.chat.completions.create({ model: "openai/gpt-5.6-luna", messages: [{ role: "user", content: "Draft a launch email." }], stream: true, }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content ?? ""); } ``` ## Models Models are addressed as `provider/model`, the same ids the [Cloudflare model catalog](https://developers.cloudflare.com/ai/models/) uses (Workers AI models start with `@cf/`). ### Aliases A slug you pin today is a slug that retires. The gateway also answers to three stable names, and Crevio repoints them as models are released and retired — an app built against an alias keeps working without a redeploy. | Alias | Resolves to | | - | - | | `automatic` | A strong general-purpose model. Use this unless you have a reason not to | | `fast` | The lowest-latency model, for high-volume or interactive work | | `smart` | The most capable model, for reasoning and long-form output | ```ts theme={null} const completion = await client.chat.completions.create({ model: "automatic", messages: [{ role: "user", content: "Summarise this order in one line." }], }); ``` The response's `model` field names the slug that actually served the request, and that is what the charge is recorded against. | Model | Good for | | - | - | | `anthropic/claude-sonnet-5` | Long-form writing, careful reasoning | | `openai/gpt-5.6-luna` | Code and structured output | | `google/gemini-3.5-flash-lite` | High-volume, latency-sensitive work | | `z-ai/glm-5.2` | General purpose, low cost | `GET /v1/models` returns the aliases followed by the full live catalog: ```bash theme={null} curl https://ai-gateway.crevio.co/v1/models \ -H "Authorization: Bearer $CREVIO_API_KEY" ``` A `model` that isn't in that list is rejected with `model_not_found` rather than silently substituted. ## What it costs Gateway usage is billed at **the provider's list price plus a 50% platform fee**, which covers payment processing and provider top-up fees. The cost of a request is converted to credits and deducted from your balance once the response completes, including for streamed responses. Every request answers with your remaining balance: ``` X-Credits-Balance: 8412 ``` Charges appear in your credit history as **AI gateway**, tagged with the model. See [Usage & billing](/docs/developer/guides/usage-billing) for how credits work. > [!NOTE] > > Credits are only deducted for requests that reach a model. A rejected request — bad model, failed auth, provider error — costs nothing. ## Limits and errors Errors use the same envelope as the OpenAI API, so SDK error handling works unchanged: ```json theme={null} { "error": { "message": "Account balance too low. Add credits to continue.", "type": "invalid_request_error", "code": "insufficient_credits" } } ``` | Status | Code | Meaning | | - | - | - | | `401` | `authentication_required` | Missing or unrecognised API key | | `403` | `insufficient_scope` | The key lacks `models:run` (raw models) or `agent:run` (the `crevio` model) | | `400` | `model_not_found` | The `model` isn't in the catalog | | `402` | `insufficient_credits` | No spendable balance — top up to continue | | `429` | `daily_limit_exceeded` | This key hit its daily spend cap | | `503` | `gateway_unavailable` | The gateway couldn't reach its control plane; retry | Each key carries a **daily credit cap** that bounds the damage from a leaked key or a runaway loop. Contact support if your workload needs a higher one. Errors returned by the model provider itself — rate limits, context-length overruns, content filters — pass through unchanged, so you see the real reason rather than a rewritten one. # API overview Source: https://crevio.co/docs/developer/guides/api-overview The Crevio REST API at a glance — base URL, bearer authentication, the primitives you can build on, and where to go next. **Crevio exposes its entire AI-native platform as a REST API at `https://api.crevio.co/v1`.** Use it to build custom websites, sync data with other systems, generate content, and run autonomous AI work. This page is the hub. For the rules every endpoint follows see [Conventions](/docs/developer/guides/conventions); for failure handling see [Errors](/docs/developer/guides/errors); to get going fast see the [Quickstart](/docs/developer/guides/quickstart). ## Authentication Every request is authenticated with a **bearer token** sent in the `Authorization` header. ```bash theme={null} curl https://api.crevio.co/v1/products \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Create tokens in your dashboard under **Settings → Developer**. A token is shown once — store it in an environment variable or secrets manager, never in client-side code. Requests without a valid token get a `401`. See the [Quickstart](/docs/developer/guides/quickstart) for the full setup. Only admins of an account can use its API. Every request acts as the person behind the credential, and is refused with `403 account_forbidden` when that person is not an admin of the account. An API key stops working once the person who created it is no longer an admin of the account. ### Scopes API keys and OAuth tokens share one set of scopes, checked the same way on the REST API, MCP and the AI gateway. Give each credential only the scopes its integration needs. A request outside them gets `403 insufficient_scope`, with the missing scope in `param` and in the `WWW-Authenticate` header (`Bearer error="insufficient_scope", scope="write"`), so an OAuth client knows what to ask for when it reconnects. A scope is `:`, or one of the two broad scopes `read` and `write`. There are three actions: * `read` sees data. * `write` creates, changes and deletes Crevio data, and includes `read`. * `run` makes something act for you: the agent, a script, a connected app or a model. No other scope includes a `run` scope. | Scope | Allows | | - | - | | `read` | Every `GET`, except the activity log and file downloads | | `write` | Creating, changing and deleting resources, plus everything `read` allows | | `agent:run` | Handing the agent work: `POST /chats`, `POST /chats/{id}/messages`, task run control, running a task, and the AI gateway's `crevio` model | | `scripts:run` | Script runs (`/script_runs`) | | `models:run` | Raw models through the [AI gateway](/docs/developer/guides/ai-gateway) | | `connections:read` | Listing the team's connections and their tools. `read` includes it | | `connections:run` | Calling a connection's tools (`/connections/{id}/execute` and `/proxy`) | | `files:read` | Exchanging artifact ids for download links | | `audit:read` | `GET /logs` | Work a credential starts can do no more than the credential itself. Without `write`, chats it starts run read-only (asking for another `approval_mode` is refused), it cannot continue, run or resume a task that can make changes, it cannot approve the agent's pending actions, and its scripts cannot change anything. `GET /me` needs no scope. Keys made before scopes existed have `scopes: null` and keep full access until you set some. A key can grant only scopes it holds itself, so a narrow key cannot mint a wider one. OAuth clients ask for any of these scopes at authorization. Two shorthands from before they existed still work: `read_only` grants `read`, and `read_write` grants every scope. Discovery (`scopes_supported`) advertises only the shorthands, and a client that asks for nothing gets `read_only`. OAuth tokens cannot create API keys. A key is **personal** (the default) or **team** (`kind: "team"`). A personal key acts as you and sees your private chats and runs. A team key is for shared automations: it sees only what the whole account sees, the chats it starts are visible to the whole account, and it cannot run scripts. Edit a key's name or scopes with `PATCH /auth/keys/{id}`; the change applies to its next request. `POST /auth/keys/{id}/rotate` issues a new secret and revokes the old one at the same moment, keeping the key's id, name and scopes. `GET /auth/keys` lists team keys and your own personal keys, never other people's. MCP clients connecting with a key see only the tools its scopes allow. ### Handing the agent work `POST /chats` gives the agent a job in plain language and returns its run. Pass `wait_seconds` (up to 90) to get the reply in the same response, in `result`; otherwise poll `GET /task_runs/{id}`, which carries `result`, `json` and `artifacts` once the run settles. Continue the conversation with `POST /chats/{id}/messages`. ```bash theme={null} curl https://api.crevio.co/v1/chats \ -H "Authorization: Bearer $CREVIO_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: weekly-summary-2026-10-21" \ -d '{ "message": "How many orders did we get yesterday?", "wait_seconds": 60, "response_format": {"type": "json_schema", "json_schema": {"name": "orders", "schema": {"type": "object", "properties": {"count": {"type": "integer"}}, "required": ["count"]}}} }' ``` With a `response_format`, the agent is told the schema and its reply is parsed and validated: `json` holds the value, or `json_error` says why it did not match. `json` is never a value that fails the schema. Files the agent delivered during a run come back in `artifacts`. Exchange an artifact's `id` for a download link at `GET /artifacts/{id}/download_url`; the link needs no credentials and expires after 15 minutes. `POST /script_runs` runs JavaScript on the account's computer with no agent turn. `args` reach the script as the global `args`, and files it writes into the directory named by the global `outputDir` (20 at most, 50 MB each) come back as `artifacts`. ### Reading the activity log `GET /logs` returns the account's append-only activity log, newest first: membership and permission changes, API keys, connections, approval decisions and, at the **Full** capture level, every app and tool the assistant uses. The log is part of the Enterprise plan; on other plans it returns `402` with the code `plan_required`. Filter with `action`, `actor_type`, `entity_type`, `entity_id` and `after`. It needs the `audit:read` scope, which `read` alone does not grant. How long events are kept is an account setting (30 to 730 days); see [Security](/docs/features/security#audit-log). ## Base URL ``` https://api.crevio.co/v1 ``` ## What you can build on Crevio's primitives span the whole business, not just commerce. Operations marked **metered** consume credits (see [Usage & billing](/docs/developer/guides/usage-billing)). | Primitive | What it does | Metered | | - | - | - | | Products & price variants | Sellable products and their pricing/billing models | — | | Checkouts & checkout links | Create payment sessions; shareable buy links | — | | Orders, invoices, refunds | The money lifecycle | — | | Customers & subscriptions | Buyers, leads, and recurring billing | — | | Discounts & reviews | Promo codes and social proof | — | | Experiences | Course/content delivery (read-only) | — | | Files & media generation | Uploads + AI images, video, audio | media gen | | Sites & domains | AI website builder, domain purchase/connect | site builds | | Email & socials | Broadcast email and multi-platform social posts | — | | Web tools | Research, crawl, map, read, extract, search | yes | | Tasks & task runs | Your scheduled AI workforce | yes | | Calls & phone numbers | Autonomous AI phone calls | yes | | Webhooks & events | React to platform events in real time | — | | Usage | Plan, credit balance, and spend | — | > [!NOTE] > > Almost every operation here is also available to AI agents over [MCP](/docs/developer/mcp) — you can script it, or just ask the agent to do it. ## Core conventions, in brief * **Unwrapped params** — fields go at the top level, not under a resource key. * **Associations** — bare name + prefixed id (`product: "prod_abc123"`, not `product_id`). * **Money** — integer cents, lowercase currency (`amount: 4900`, `currency: "usd"`). * **Lists** — return `{ object: "list", data: [...], has_more }`; single resources return the object directly. * **IDs** — prefixed strings (`prod_`, `cus_`, `price_`, `ord_`…) that encode the type. The full rules — pagination, slug lookup, expand, delete responses, and the complete ID-prefix table — live in [Conventions](/docs/developer/guides/conventions). ## Errors Failures return a JSON envelope you can branch on: ```json theme={null} { "error": { "type": "validation_error", "code": "validation_failed", "message": "Email can't be blank", "errors": { "email": ["can't be blank"] } } } ``` See [Errors](/docs/developer/guides/errors) for every status code and how to debug each. ## Rate limiting Crevio allows **600 requests per 60-second window** per owner: all of one person's keys and OAuth tokens on an account share it, and the account's team keys share another. Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset`; exceeding the limit returns `429` with code `rate_limit_exceeded`. Back off and retry using the `X-RateLimit-Reset` timing. See [Rate limits](/docs/developer/guides/rate-limits) for the full details. > [!TIP] > > The [`@crevio/sdk`](/docs/developer/guides/sdk) handles retries and backoff automatically. ## TypeScript SDK The official [`@crevio/sdk`](/docs/developer/guides/sdk) wraps the API with types, Zod validation, retries, and multi-runtime support (Node.js, browsers, Cloudflare Workers, Deno, Bun). ```bash npm theme={null} npm install @crevio/sdk ``` ```bash bun theme={null} bun add @crevio/sdk ``` ```bash pnpm theme={null} pnpm add @crevio/sdk ``` ```bash yarn theme={null} yarn add @crevio/sdk ``` ```typescript theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN" }); const products = await crevio.products.list(); const product = await crevio.products.get({ id: "prod_abc123" }); const checkout = await crevio.checkouts.create({ email: "customer@example.com", lineItems: [{ priceVariant: "price_xyz789", quantity: 1 }], }); ``` ## Next steps > **[Quickstart](/docs/developer/guides/quickstart)** > > Key to first call in under five minutes. > **[Conventions](/docs/developer/guides/conventions)** > > The rules every endpoint follows. > **[Errors](/docs/developer/guides/errors)** > > Decode and fix every status code. > **[Usage & billing](/docs/developer/guides/usage-billing)** > > How metered pay-per-call credits work. # Checkouts Source: https://crevio.co/docs/developer/guides/checkouts Take payment with one-off checkouts and reusable checkout links — line items, customers, discount codes, and paying invoices. **A checkout is a single pay-for-this session; a checkout link is a reusable, shareable URL that opens one.** Both turn your published price variants into money. You can ask Crevio to "send Jane a checkout for the \$99 course with the LAUNCH20 code" and the agent builds it through the same API below. For programmatic flows — custom websites, "buy now" buttons, invoicing — you'll create checkouts directly. ## Creating a checkout `POST /checkouts` takes one or more line items, each pointing at a price variant by id: ```bash theme={null} curl -X POST https://api.crevio.co/v1/checkouts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "email": "jane@example.com", "line_items": [ { "price_variant": "price_abc123", "quantity": 1 } ] }' ``` The response is a checkout (`"object": "checkout"`, id like `co_...`) with a URL the buyer visits to pay. When they complete it, an [order](/docs/developer/guides/subscriptions-and-billing#orders-the-read-model) is created. ### Checkout fields | Field | Type | Notes | | - | - | - | | `line_items` | array | Each item is `{ price_variant (required), quantity, amount }`. Add multiple to sell a bundle in one checkout. `amount` is only for pay-what-you-want items, see below. | | `email` | string | The buyer's email. Use this for a brand-new buyer. | | `customer` | string | An existing customer id (`cus_...`). Use instead of `email` to attach the purchase to a known customer. | | `discount_code` | string | A discount code applied to this checkout, matched case-insensitively. It applies even when buyers can't enter codes themselves. A code that doesn't exist, is inactive, hasn't started, has expired, has reached `max_redemptions`, doesn't cover every line item, misses its `minimum_amount`, or that this `customer` or `email` can't use under `once_per_customer` or `first_order_only` returns `400` and no checkout is created. A free checkout ignores it, and it can't be combined with `invoice`. See [Discounts](/docs/developer/guides/discounts). | | `invoice` | string | An invoice id (`inv_...`) to pay — an alternative to `line_items`. See below. | ### Multiple line items ```bash theme={null} curl -X POST https://api.crevio.co/v1/checkouts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "customer": "cus_xyz789", "discount_code": "LAUNCH20", "line_items": [ { "price_variant": "price_abc123", "quantity": 1 }, { "price_variant": "price_def456", "quantity": 2 } ] }' ``` ### Pay-what-you-want items For a price variant with `amount_type: "custom"`, pass the buyer's chosen unit price in `amount` (smallest currency unit, e.g. cents). The checkout `total`, each item's `amount` in `checkout_items`, discount eligibility, and the resulting order all use it. ```bash theme={null} curl -X POST https://api.crevio.co/v1/checkouts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "email": "buyer@example.com", "line_items": [{ "price_variant": "price_pwyw123", "quantity": 1, "amount": 2500 }] }' ``` * Omit `amount` and the item uses the variant's `preset_amount`, then its `minimum_amount`, then the smallest price Crevio charges in that currency. * An `amount` below `minimum_amount`, above `maximum_amount`, between zero and the currency's smallest chargeable price, or that is not an integer returns `400` with code `invalid_parameter`. `0` is accepted only when `minimum_amount` is `0`. * An `amount` on a `fixed` or `free` price variant returns `400`. * The buyer can still change the amount on the hosted checkout page (`purchase_url`) within the same bounds before paying. ### Paying an invoice Instead of line items, pass an `invoice` id to create a checkout that settles that invoice: ```bash theme={null} curl -X POST https://api.crevio.co/v1/checkouts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "invoice": "inv_abc123" }' ``` See [Subscriptions & billing](/docs/developer/guides/subscriptions-and-billing#invoices) for creating and managing invoices. ## Worked example: sell to a customer end-to-end ```typescript theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN" }); // 1. Create (or look up) the customer. const customer = await crevio.customers.create({ email: "jane@example.com", name: "Jane Doe", customer_type: "lead", }); // 2. Create a checkout for them, applying a launch discount. const checkout = await crevio.checkouts.create({ customer: customer.id, discount_code: "LAUNCH20", line_items: [{ price_variant: "price_abc123", quantity: 1 }], }); // 3. Send the buyer to the checkout URL to pay. console.log(checkout.purchaseUrl); ``` When the buyer pays, listen for the `order.paid` [webhook event](/docs/developer/guides/webhooks) to fulfill the purchase. To run that whole path without charging a card, complete the checkout with `POST /v1/checkouts/{id}/test_purchase`, or open the `purchase_url` while signed in as the store's owner and complete a test purchase. See [Testing a paid order end to end](/docs/developer/guides/webhooks#testing-a-paid-order-end-to-end). ## Reusable checkout links When you want one durable URL to share — in a bio link, an email, a "buy now" button — create a **checkout link** with `POST /checkout_links`: ```bash theme={null} curl -X POST https://api.crevio.co/v1/checkout_links \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Guitar course launch", "price_variants": ["price_abc123"], "discount": "disc_launch20", "allow_discount_codes": true, "success_url": "https://example.com/thanks", "metadata": { "campaign": "summer-launch" } }' ``` ### Checkout link fields | Field | Type | Notes | | - | - | - | | `name` | string | Internal label for the link. | | `price_variants` | array | The price variant ids (`price_...`) the link sells. | | `discount` | string | A discount id (`disc_...`) applied automatically. See [Discounts](/docs/developer/guides/discounts). | | `allow_discount_codes` | bool | Whether buyers can enter their own code at checkout. | | `success_url` | string | Where to send the buyer after a successful purchase. | | `metadata` | object | Arbitrary key/values that flow through to the resulting order — handy for attribution. | The response includes an id (`cl_...`) and the shareable URL. Checkout links support full CRUD — update, list, retrieve, and delete them like any other resource. > [!TIP] > > Use a **checkout** for a one-off, often personalized sale (you know the buyer), and a **checkout link** for an evergreen, shareable offer (anyone can open it). ## Account-wide checkout settings The defaults every checkout inherits — tax, address collection, which inputs the buyer sees — live on a single account-wide resource at `/v1/checkout_configuration`. It is a singleton: no id, `GET` to read and `PATCH` to change. ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/checkout_configuration \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "collect_tax": true, "tax_behavior": "exclusive", "allowed_countries": ["US", "CA", "GB"], "show_tax_id_input": true }' ``` | Field | Type | Notes | | - | - | - | | `allowed_countries` | array | ISO country codes the buyer's address may be in. Empty means no restriction. | | `collect_tax` | bool | Whether tax is calculated at checkout. | | `tax_behavior` | string | `unspecified`, `inclusive`, or `exclusive` — whether your prices already include tax. | | `tax_code` | string | The product tax code applied by default (`txcd_…`). | | `allow_discount_codes` | bool | Whether buyers can enter a code, unless a checkout overrides it. | | `show_tax_id_input` | bool | Show a business tax ID field (needed for B2B VAT reverse charge). | | `show_phone_number_input` | bool | Collect a phone number. | | `collect_call_consent` | bool | Ask for explicit consent to be called. | | `collect_shipping_address` | bool | Collect a shipping address. Required for [physical goods](/docs/developer/guides/products-and-pricing). | | `allow_multiple_quantity` | bool | Let buyers change quantity at checkout. | | `success_url` | string \| null | Default post-purchase redirect. Must be a full `https://` URL. | | `abandoned_checkout_emails` | bool | Email buyers who gave an email but didn't pay, with a link back to the same items. Off by default. See [Abandoned checkout emails](/docs/features/abandoned-checkout-emails). | | `abandoned_checkout_email_delay_hours` | integer | Hours after a checkout starts before its reminder is due, `1` to `72`. Defaults to `4`. | > [!WARNING] > > Changing this configuration **expires every open checkout on the account** (except changes to the two `abandoned_checkout_*` fields), so buyers mid-purchase get a fresh session on the new settings rather than one priced under the old ones. Expect to re-create any checkout id you were holding on to. When `collect_tax` or `tax_behavior` changes, your Stripe tax settings are updated to match. ## Next steps > **[Discounts](/docs/developer/guides/discounts)** > > Build the promo codes you apply via `discount_code` and `discount`. > **[Subscriptions & billing](/docs/developer/guides/subscriptions-and-billing)** > > Orders, invoices, refunds, and managing recurring revenue after checkout. > **[Products & pricing](/docs/developer/guides/products-and-pricing)** > > Create the price variants your checkouts and links reference. > **[Webhooks](/docs/developer/guides/webhooks)** > > React to `checkout.created`, `order.paid`, and other events in real time. # Commerce (overview) Source: https://crevio.co/docs/developer/guides/commerce-overview The mental model for selling on Crevio — how accounts, products, price variants, experiences, checkouts, orders, and subscriptions fit together. **Commerce on Crevio is a small set of primitives that compose into anything you can sell** — a one-time download, a monthly membership, a payment-plan course, or a pay-what-you-want lead magnet. You rarely have to assemble all of this by hand. Crevio is AI-native: you can just ask the agent to "create a \$49 course with a 3-payment plan and a launch discount" and it will build the products, price variants, and discounts for you through the same API documented here. The primitives below are what those tools (and your own integrations) operate on. ## The mental model Everything hangs off your **account** (the tenant). Within it, the flow looks like this: ``` Account └─ Product (the thing you list — draft → active → archived) └─ Price Variant (how it's priced & billed — free | fixed | custom; one_time | subscription | payment_plan) └─ Experience (what the buyer actually receives — course, content, download, booking) Checkout (a buyer pays for one or more price variants) └─ Order (the completed purchase — a read model) └─ Order Item (one line per price variant bought) └─ Charge (the payment) Subscription (recurring price variants) Invoice (a request to pay) Refund (money back on an order) ``` Read it as a sentence: **a product bundles experiences via its price variants; a buyer pays through a checkout, which produces an order made of order items; recurring purchases become subscriptions, and you can invoice or refund along the way.** ## The primitives | Primitive | Prefix | What it is | | - | - | - | | Product | `prod_` | The listing a buyer sees. Has a lifecycle (`draft` → `active` → `archived`). Bundles experiences through its price variants. | | Price variant | `price_` | How a product is priced and billed. A single product can have several (e.g. "monthly" and "annual"). Drives free / fixed / pay-what-you-want and one-time / subscription / payment-plan behavior. | | Experience | `exp_` | What the buyer actually receives — a course, content library, download, or booking. **Courses and content live under `/experiences`, not `/products`.** Read-only over the API. | | Checkout | `co_` | A pay-for-this session. Takes line items (`{ price_variant, quantity }`), an email or customer, and optional discount code. Can also pay an invoice. | | Checkout link | `cl_` | A reusable, shareable URL that opens a pre-built checkout. Great for "buy now" buttons and campaigns. | | Order | `ord_` | A completed purchase. A read model — you create orders indirectly by completing checkouts. | | Order item | `ordi_` | One line of an order: a price variant and quantity. | | Charge | `ch_` | The payment record attached to an order. | | Customer | `cus_` | A buyer or lead (`paid` \| `free` \| `lead`). | | Subscription | `sub_` | A recurring purchase. Cancel / pause / resume over the API. | | Invoice | `inv_` | A request for payment. Paid by creating a checkout with the `invoice` param. | | Discount | `disc_` | A code (`percentage` \| `fixed`) that reduces price at checkout. | | Refund | — | Money returned on an order, full or partial. | > [!NOTE] > > **Products vs. experiences.** A product is the *listing and pricing*; an experience is the *deliverable*. When you sell a course, the course content is an experience, and the product is what wraps it in a name, images, and one or more price variants. The Experiences API is read-only (`GET` list and `GET` one) — you create and shape deliverables in the dashboard or by asking Crevio. ## Two conventions that trip people up Crevio's API follows a few consistent conventions. Two are worth internalizing before you write any commerce code: * **Money is in cents.** `amount: 4900` is \$49.00. `currency` is lowercase ISO, e.g. `"usd"`. * **Associations are a bare resource name plus a prefix-id string.** Link a price variant to a product with `product: "prod_abc123"` — not `product_id`. The same holds for `customer`, `order`, `discount`, and `price_variant`. ```bash theme={null} # Create a price variant for an existing product curl -X POST https://api.crevio.co/v1/price_variants \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": "prod_abc123", "name": "One-time", "amount_type": "fixed", "billing_type": "one_time", "amount": 4900, "currency": "usd" }' ``` > [!WARNING] > > **Creation order matters.** Publishing a product requires at least one price variant. Creating a product with `status: "active"` in a single call fails with `422`. The correct sequence is always: create the product as a draft → add one or more price variants → `PATCH` the product to `status: "active"`. See [Products & pricing](/docs/developer/guides/products-and-pricing). ## Next steps > **[Products & pricing](/docs/developer/guides/products-and-pricing)** > > The product lifecycle and the full price variant model, with worked examples for every billing type. > **[Checkouts](/docs/developer/guides/checkouts)** > > Create one-off checkouts and reusable checkout links to take payment. > **[Subscriptions & billing](/docs/developer/guides/subscriptions-and-billing)** > > Manage recurring revenue, invoices, refunds, and the order read model. > **[Discounts](/docs/developer/guides/discounts)** > > Build promo codes and apply them at checkout or on checkout links. # Connections Source: https://crevio.co/docs/developer/guides/connections One API over every third-party app an account has connected — list them, run their tools, call their APIs directly, and gate every write behind an approval. **A connection is a third-party account your Crevio account has linked — a Gmail inbox, a Notion workspace, a Slack team, an ad account.** The Connections API is one surface over all of them: the same endpoints list, inspect, run, rename, and disconnect every family, and the transport underneath never appears in the contract. Under the hood a connection is one of several things — an OAuth app connection, a remote MCP server, a social or ads channel — but you address all of them the same way, by a single unified id. | Endpoint | Purpose | | - | - | | `GET /connections` | Searchable catalog of everything connectable, each flagged with whether you've connected it | | `GET /connections/connected` | Only what this account has connected | | `POST /connections/connect` | Mint a hosted OAuth link to send a user through | | `GET /connections/{id}/tools` | The tools a connection exposes, each with its approval policy | | `POST /connections/{id}/execute` | Run one of those tools | | `POST /connections/{id}/proxy` | Call the app's own API directly, for endpoints no tool covers | | `PATCH /connections/{id}` | Give the connection a nickname | | `PUT /connections/{id}/access` | Change who can use it, without disconnecting it | | `DELETE /connections/{id}` | Disconnect it | ## The unified id Every connection carries one id, returned by `GET /connections` and `GET /connections/connected`. **Treat it as opaque** — store it and pass it back verbatim wherever an endpoint takes `{id}`. Don't parse it or build one yourself; its internal shape is not part of the contract. Alongside it, `kind` tells you which family the connection belongs to — an app connection, a remote MCP server, a social or ads channel, or a native integration. Compare that value if you need to branch, but you rarely do: listing, inspecting, and disconnecting work identically across families. Only `execute` and `proxy` care, and they tell you when you've reached for the wrong one. ## Connecting an app `POST /connections/connect` mints a **hosted** OAuth link — no frontend SDK required. Send the user to `redirect_url`; when they come back, the connection shows up in `GET /connections/connected`. ```bash cURL theme={null} curl -X POST https://api.crevio.co/v1/connections/connect \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "toolkit": "gmail", "callback_url": "https://yourapp.com/connected" }' ``` ```typescript SDK theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKey: process.env["CREVIO_API_KEY"] ?? "" }); const link = await crevio.connections.connect({ toolkit: "gmail", callbackUrl: "https://yourapp.com/connected", }); // → send the user to link.redirectUrl ``` > [!NOTE] > > `proxy` and the rename endpoint are new; the TypeScript SDK picks them up on its next generated release. Call them over REST in the meantime — every other connection operation is already available as `crevio.connections.*`. Pass `scope: "user"` to make the connection **personal** to the calling user rather than shared with the whole account. Personal connections are invisible to everyone else on the account — use them when each teammate links their own inbox, and the default (team) when the business links its one Notion. ## What's connected ```bash theme={null} curl https://api.crevio.co/v1/connections/connected \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```json theme={null} { "object": "list", "data": [ { "object": "connection", "id": "", "kind": "", "app": "gmail", "app_name": "Gmail", "label": "work gmail", "status": "active", "disconnectable": true, "callable": true, "connected_at": "2026-08-01T09:12:44Z" } ], "has_more": false } ``` | Field | Meaning | | - | - | | `id` | Opaque handle — what every other endpoint takes as `{id}` | | `kind` | The connection's family. Opaque; compare it, don't parse it | | `app` | Which service it is, such as `gmail` or `hubspot`. Pick a connection by this | | `app_name` | The service's display name, such as `Gmail` | | `label` | What to show a human — the nickname if one is set, otherwise the app's own label | | `status` | `active` when it can be used. Otherwise what's stopping it: `pending` (setup isn't finished), `off` (switched off on the account), `reconnect_required` (its sign-in or key stopped working; connect it again) or `error` (the app refuses it for a reason reconnecting won't fix) | | `status_detail` | Why it isn't `active`, in the app's own words, when the app gives a reason. Otherwise `null` | | `callable` | Whether an agent can act through this connection at all | | `disconnectable` | Whether `DELETE` applies | | `access` | `everyone` (the whole team), `members` (only the people in `members`), or `personal` (only its owner) | | `members` | Emails of the people who can use it, or `null` when the whole team can | > [!NOTE] > > **`status: "error"` does not mean the connection is gone.** The record survives — along with its approval policies and its place in your UI — so the user can reconnect the same app rather than setting it up from scratch. Calls through it fail until they do. Surface it as "needs reconnecting", not "disconnected". ## Running a tool Most apps expose a fixed set of actions. `GET /connections/{id}/tools` lists them with the approval policy each one resolves to for this account: ```json theme={null} { "object": "connection_tool", "name": "gmail-send-email", "label": "Send Email", "description": "Send an email from your Gmail account", "policy": "always_ask", "default_policy": "always_ask" } ``` `policy` is what will actually happen; `default_policy` is what Crevio classified the tool as before any account override. Both are one of: | Policy | Behavior on `execute` | | - | - | | `always_allow` | Runs immediately, `200` | | `always_ask` | Freezes a pending approval, `202` | | `off` | Refused, `403 tool_disabled` | Reads generally classify as `always_allow` and writes as `always_ask`. Account owners override any tool from the dashboard's approval settings. ```bash theme={null} curl -X POST https://api.crevio.co/v1/connections/$CONNECTION_ID/execute \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "tool": "gmail-send-email", "arguments": { "to": "sam@example.com", "subject": "Hi" } }' ``` `arguments` is passed through to the provider verbatim — Crevio does not reshape it. Get the exact field names from the tool's own schema rather than guessing. ### When a call needs approval A `202` is not an error. It means the action was **frozen intact** and nothing has run yet. The response body is the [Approval](/docs/developer/api-reference/introduction) that's now waiting, and the `Location` header points at it: ```json theme={null} { "object": "approval", "id": "apr_9fQ2xk", "status": "pending_approval", "action_type": "connections.execute", "title": "Send Email on work gmail", "app_slug": "gmail", "tool_name": "gmail-send-email" } ``` A teammate approves or denies it in Crevio, or you call `POST /approvals/{id}/approve` or `/deny` as a person. Approving replays the exact frozen request, so don't send it again: a second call creates a second approval. Poll `GET /approvals/{id}` for the outcome. It ends `executed` with `result`, `failed` with `error`, or `denied` with `reason`. A person may take hours to answer, so store the id and check back later instead of holding a request open. In the TypeScript SDK, the same call returns either the result or the approval. Check `object` to tell them apart: ```typescript theme={null} const run = await crevio.connections.execute({ id: connectionId, requestBody: { tool: "gmail-send-email", arguments: { to: "ana@example.com" } }, }); if (run.object === "approval") { console.log("Waiting for approval:", run.id); } else { console.log(run.result); } ``` ## Calling an app's API directly Tools cover the common actions. When the thing you need isn't among them — an unusual endpoint, a field mask, a filter the action can't express — `POST /connections/{id}/proxy` makes an **authenticated HTTP request to the app's own API** on the connection's behalf. ```bash theme={null} curl -X POST https://api.crevio.co/v1/connections/$CONNECTION_ID/proxy \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "endpoint": "/gmail/v1/users/me/messages?q=is:unread newer_than:1d", "method": "GET" }' ``` | Field | Notes | | - | - | | `endpoint` | A path relative to the app's own API base, or an absolute URL on the app's domain. Required | | `method` | `GET` (default), `POST`, `PUT`, `PATCH`, `DELETE` | | `body` | Sent verbatim. Ignored on `GET` | | `headers` | Extra headers forwarded upstream | > [!WARNING] > > **Never send a credential.** The connected account's token is injected server-side and is never held by Crevio nor exposed to the caller. `Authorization`, `Host`, `Cookie`, `Accept-Encoding`, `Content-Length`, and `Connection` are stripped from `headers` — an `Authorization` you set yourself would fight the injected credential rather than authenticating anything. ### Reading the response ```json theme={null} { "object": "connection_proxy_response", "connection": "", "endpoint": "/gmail/v1/users/me/messages?q=is:unread newer_than:1d", "status": 200, "truncated": false, "body": { "messages": [] } } ``` **`status` is the app's status code, not Crevio's.** A `200` from this endpoint with `"status": 404` in the body means the call succeeded and the app answered "not found" — that's an answer to read, not a failure to retry. Crevio's own HTTP status only reports whether the request could be made at all. `truncated: true` means the app's response exceeded 256 KB and `body` was cut. Paginate or narrow the query rather than working from a partial payload. ### Governance The proxy is gated exactly like a tool call, keyed on the **method**: reads run now, writes freeze a `202` approval, and an account override still wins. That's what stops the raw-request path from being a way around the approval a named tool would have asked for. > [!TIP] > > **Prefer a real tool when one exists.** It validates its inputs and reads far better in the approval card a human has to decide on. Reach for the proxy when nothing covers the endpoint. ### What can't be proxied | Family | Response | | - | - | | Remote MCP servers | `409 use_execute` — they speak tools, not HTTP. Use `/tools` and `/execute` | | Social & ads channels | `409 use_native_endpoints` — operate them through `/v1/socials` and `/v1/ads` | ## Naming a connection With two Gmails linked, "work gmail" and "support gmail" is what makes a connection addressable by a human — and what an agent echoes back when it asks which account to act on. ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/connections/$CONNECTION_ID \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "nickname": "work gmail" }' ``` The nickname is up to 60 characters and becomes the connection's `label`. Send an empty string to clear it and fall back to the provider's own label. Only app connections can be renamed — every other family takes its name from a record the provider owns, and a rename there would be overwritten on the next sync (`422 not_renameable`). ## Who can use a connection A team connection is usable by everyone on the account. Narrow it without disconnecting, so the credential, nickname and approval settings stay put: ```bash theme={null} curl -X PUT https://api.crevio.co/v1/connections/$CONNECTION_ID/access \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"access": "members", "members": ["you@example.com", "sam@example.com"]}' ``` | `access` | Who can use it | | - | - | | `everyone` | The whole team | | `only_me` | The caller | | `members` | The account members listed in `members`, which replaces the current list | Only the people a connection is limited to can use it, in their own chats and in the tasks they created; it is hidden from everyone else's agent and from `GET /connections/connected`. An account admin changes a team connection (`403 not_allowed` otherwise); only its owner changes a personal one. A personal connection always stays usable by its owner and can be shared with named members, but not opened to `everyone`, because its credential belongs to its owner (`422 personal_connection`). Only app connections support this (`422 access_not_supported`). ## Disconnecting ```bash theme={null} curl -X DELETE https://api.crevio.co/v1/connections/$CONNECTION_ID \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Revokes upstream where the provider supports it and prunes the local record either way. An account admin disconnects a team connection; only its owner disconnects a personal one. To change who can use a connection, use `PUT /connections/{id}/access` instead: a disconnected team connection only comes back through a new OAuth connect. ## Errors Beyond the [standard error codes](/docs/developer/guides/errors), these are specific to connections: | Status | Code | Meaning | | - | - | - | | `403` | `tool_disabled` | The account turned this tool — or raw requests to this connection — off | | `403` | `not_allowed` | Only an account admin (or a personal connection's owner) can change access or disconnect it | | `403` | `personal_connection` | A teammate's personal connection, or one limited to other members | | `404` | — | No connection with that id on this account | | `409` | `use_execute` | MCP connections are driven through `/execute` | | `409` | `use_native_endpoints` | Social and ads connections have typed `/v1` endpoints | | `409` | `onboarding_incomplete` | The account is still in setup; third-party integrations aren't available yet | | `422` | `not_callable` | This connection can't be acted on | | `422` | `not_renameable` | Only app connections carry a nickname | | `422` | `access_not_supported` | Only app connections have per-member access | | `502` | `execution_failed` | The call reached the app and the app failed | | `503` | `feature_not_configured` | Connections aren't configured for this workspace | > **[Approvals](/docs/developer/api-reference/introduction)** > > Resolve the pending actions that gated writes freeze. > **[Agents overview](/docs/developer/guides/agents-overview)** > > How connections become capabilities an agent can use on a schedule. # Conventions Source: https://crevio.co/docs/developer/guides/conventions The request and response rules every Crevio endpoint follows — unwrapped params, association ids, creation order, money in cents, pagination, and more. **The Crevio API is Stripe-shaped, with a few rules that trip up every new integration on day one. Learn them here and the rest of the API is predictable.** These conventions hold across all of `https://api.crevio.co/v1`. Read this page before writing more than a quickstart call — most `400`/`404`/`422` errors come from breaking one of the rules below. ## Parameters are unwrapped (top-level) Send request fields at the **top level** of the JSON body. There is **no** resource wrapper key. A nested wrapper like `{"product": {...}}` is rejected with a `400 parameter_unknown` error naming the wrapper — see [Errors](/docs/developer/guides/errors#parameter_unknown). ```bash theme={null} # Do — fields at the top level curl https://api.crevio.co/v1/products \ -H "Authorization: Bearer $CREVIO_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Intro to Watercolor", "status": "draft" }' ``` ```bash theme={null} # Don't — wrapped curl https://api.crevio.co/v1/products \ -H "Authorization: Bearer $CREVIO_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": { "name": "Intro to Watercolor" } }' ``` ## Associations are a bare name + a prefixed id To link a resource, use the **bare resource name** as the key and pass the **prefixed id string** as the value. Do **not** append `_id`. ```jsonc theme={null} // Do { "product": "prod_abc123" } { "customer": "cus_abc123" } { "order": "ord_abc123" } { "discount": "disc_abc123" } { "price_variant": "price_abc123" } ``` ```jsonc theme={null} // Don't — these keys are not recognized { "product_id": "prod_abc123" } { "customer_id": "cus_abc123" } ``` > [!WARNING] > > **Exceptions exist — match the schema field name exactly.** A few fields keep the `_id` suffix because they take ids directly: `site_id` (e.g. on Tasks), `tag_ids` (an array, e.g. on Customers and Forms), `account_ids`, and `upload_ids`. The rule of thumb is "bare name", but check the [API reference](/docs/developer/api-reference/introduction) for the endpoint you're calling. ## Creation order matters Some resources have prerequisites. The big one: **a product can't be published without at least one price variant.** Creating a product with `status: "active"` in a single call fails with `422`. **1. Create the product as a draft** `POST /products` with `status: "draft"`. **2. Create one or more price variants** `POST /price_variants` with `product: "prod_..."`. **3. Publish** `PATCH /products/{id}` with `status: "active"`. ## Money is in cents; currency is lowercase All monetary amounts are **integers in the smallest currency unit** (cents for USD). Currency codes are **lowercase** ISO 4217. ```jsonc theme={null} { "amount": 4900, "currency": "usd" } // $49.00 USD { "amount": 49.00, "currency": "USD" } // wrong — not a float, not uppercase ``` ## List responses vs single objects **List endpoints** return a consistent envelope. The items are in `data`. ```json theme={null} { "object": "list", "data": [ { "id": "prod_abc123", "object": "product", "name": "My Course" }, { "id": "prod_def456", "object": "product", "name": "Templates Pack" } ], "has_more": true, "url": "/v1/products" } ``` **Single-resource endpoints** return the object directly (no envelope): ```json theme={null} { "id": "prod_abc123", "object": "product", "name": "My Course" } ``` ## Pagination Cursor-based. Pass `limit` (1–100, default 15) and `starting_after` (the `id` of the last item you received). When `has_more` is `false`, you're on the last page. ```bash theme={null} # First page curl "https://api.crevio.co/v1/products?limit=10" \ -H "Authorization: Bearer $CREVIO_API_TOKEN" # Next page — cursor is the last id from the previous page curl "https://api.crevio.co/v1/products?limit=10&starting_after=prod_def456" \ -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` ## Filtering lists List endpoints that support a filter take it as a query parameter named after the field, e.g. `?status=active`. Which filters an endpoint accepts is listed in the [API reference](/docs/developer/api-reference/introduction). * **Enum filters take a comma-separated list** and match any of the values: `?status=failed,timed_out`. An unknown value is a `400` that lists the valid ones, so a typo can't silently match nothing. * **Parent filters take the parent's id**: `GET /task_runs?task_id=task_abc123`. * **Time filters take an ISO 8601 timestamp**, such as `GET /task_runs?created_after=2026-09-30T00:00:00Z`. Write it in UTC (`Z`) or URL-encode the `+` of an offset, which a query string otherwise reads as a space. ```bash theme={null} # Every failed or timed-out task run since midnight UTC, across all tasks curl "https://api.crevio.co/v1/task_runs?status=failed,timed_out&created_after=2026-09-30T00:00:00Z" \ -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` ## Metadata Products, customers, orders, checkouts, checkout links, and sites carry a `metadata` object — key-value storage that's yours, not ours. Use it to store your own system's IDs, campaign labels, or anything else you need to correlate Crevio objects with the rest of your stack. Crevio never interprets it. * Up to 50 keys per object; keys max 40 characters, values stored as strings up to 500 characters. * Updates merge key by key. Set a key to `null` (or `""`) to remove it. * Metadata set on a checkout is copied to the order it produces, and it's echoed in webhook payloads — so an `order.paid` webhook already carries your correlation IDs. * List endpoints filter by it: `?metadata[campaign]=spring` (all pairs must match). ```bash theme={null} # Tag a customer with your CRM id curl -X POST https://api.crevio.co/v1/customers \ -H "Authorization: Bearer $CREVIO_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"email": "jane@example.com", "metadata": {"crm_id": "12345", "source": "webinar"}}' # Find them again by it curl "https://api.crevio.co/v1/customers?metadata[crm_id]=12345" \ -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` ## Slug lookup Products, blog posts, experiences, and legal pages accept **either an id or a slug** in the `{id_or_slug}` path position. ```bash theme={null} curl https://api.crevio.co/v1/products/prod_abc123 # by id curl https://api.crevio.co/v1/products/intro-to-watercolor # by slug ``` ## Expanding related resources By default, related resources appear as bare id strings. Pass `expand` to inline them. Multiple fields are comma-separated. ```bash theme={null} curl "https://api.crevio.co/v1/orders/ord_abc123?expand=customer,line_items" \ -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` ```jsonc theme={null} // Without expand { "id": "ord_abc123", "object": "order", "customer": "cus_xyz789" } // With ?expand=customer { "id": "ord_abc123", "object": "order", "customer": { "id": "cus_xyz789", "object": "customer", "email": "jane@example.com" } } ``` ## Delete responses Delete endpoints return a confirmation object, not an empty body: ```json theme={null} { "id": "disc_abc123", "object": "discount", "deleted": true } ``` ## The object discriminator Every resource carries an `object` field identifying its type. Use it to branch on heterogeneous responses. ```json theme={null} { "id": "cus_abc123", "object": "customer", "email": "jane@example.com" } ``` ## ID prefixes Every id is a prefixed string encoding its type. Use these — never raw database ids. | Resource | Prefix | `object` value | | - | - | - | | Account | `acct_` | `account` | | Product | `prod_` | `product` | | Price variant | `price_` | `price_variant` | | Experience | `exp_` | `experience` | | Order | `ord_` | `order` | | Order item | `ordi_` | `order_item` | | Charge | `ch_` | `charge` | | Customer | `cus_` | `customer` | | Checkout | `co_` | `checkout` | | Checkout link | `cl_` | `checkout_link` | | Invoice | `inv_` | `invoice` | | Subscription | `sub_` | `subscription` | | Discount | `disc_` | `discount` | | Blog post | `post_` | `blog_post` | | Review | `rev_` | `review` | | File | `file_` | `file` | | Form | `form_` | `form` | | Tag | `tag_` | `tag` | | Task | `task_` | `task` | | Task run | `trun_` | `task_run` | | Site | `site_` | `site` | | Webhook endpoint | `wh_` | `webhook_endpoint` | | Webhook event | `whev_` | `webhook_event` | > [!NOTE] > > Courses and other content live under `/experiences`, not `/products`. A product bundles experiences through its price variants. The Experiences API is read-only (list + retrieve). ## Next steps > **[Errors](/docs/developer/guides/errors)** > > Every status code, what it means, and how to debug it. > **[Quickstart](/docs/developer/guides/quickstart)** > > Apply these rules in a real product creation. > **[API reference](/docs/developer/api-reference/introduction)** > > Per-endpoint parameters and schemas. > **[TypeScript SDK](/docs/developer/guides/sdk)** > > The SDK enforces most of these conventions for you. # Discounts Source: https://crevio.co/docs/developer/guides/discounts Create percentage and fixed-amount discount codes, scope them to specific price variants, and apply them at checkout or on checkout links. **A discount is a code that reduces price at checkout — percentage-off or fixed-amount, optionally limited in duration, redemptions, and which price variants it covers.** Create it once, then apply it wherever buyers pay. You can ask Crevio to "make a 20% launch code that expires in two weeks" and the agent creates the discount through the same API below. For programmatic campaigns, you'll create them directly. ## The discount model `POST /discounts` returns a discount with an id like `disc_...`. The shape is centered on two enums: the **type** of discount and its **duration**. | Field | Type | Notes | | - | - | - | | `code` | string | The code buyers enter, e.g. `LAUNCH20`. | | `discount_type` | enum | `percentage` or `fixed`. | | `percent_off` | number | The percentage off (for `percentage` discounts), e.g. `20`. | | `amount_off` | int (cents) | The amount off (for `fixed` discounts), e.g. `1000` = \$10.00. | | `currency` | string | Lowercase ISO, required for `fixed` discounts. | | `duration` | enum | `forever`, `once`, or `repeating` — how long the discount applies to a subscription. | | `duration_in_months` | int | Required when `duration` is `repeating`. | | `starts_at` | date-time | The code is rejected at checkout before this. Omit to make it usable right away. | | `redeem_by` | date-time | Expiry — the code stops working after this. | | `max_redemptions` | int | How many live orders can use the code, across all customers. Test purchases don't count. | | `times_redeemed` | int | Read-only. Live orders that used the code so far. | | `minimum_amount` | int (cents) | Smallest subtotal, before the discount, that can use the code. Requires `currency`; a checkout in another currency is refused. | | `once_per_customer` | boolean | Each customer can use the code on one live order. Default `false`. | | `first_order_only` | boolean | Only customers with no earlier live paid order from this business can use the code. Free orders and test purchases don't count as earlier orders. Default `false`. | | `price_variants` | array | Price variant ids (`price_...`) the discount is scoped to. Every line item must be in scope, or the code is refused. Omit to apply account-wide. | > [!NOTE] > > `duration` matters most for subscriptions: `once` discounts only the first charge, `repeating` discounts for `duration_in_months`, and `forever` discounts every charge. For one-time purchases the discount simply applies to that purchase. ## Worked example: a 20% launch code A percentage code, capped at 500 redemptions, expiring in two weeks, applying to everything: ```bash theme={null} curl -X POST https://api.crevio.co/v1/discounts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "code": "LAUNCH20", "discount_type": "percentage", "percent_off": 20, "duration": "once", "redeem_by": "2026-07-05T00:00:00Z", "max_redemptions": 500 }' ``` ```typescript theme={null} const discount = await crevio.discounts.create({ code: "LAUNCH20", discount_type: "percentage", percent_off: 20, duration: "once", max_redemptions: 500, }); ``` ## Worked example: \$10 off, scoped to one variant A fixed-amount code that only works on a specific price variant: ```bash theme={null} curl -X POST https://api.crevio.co/v1/discounts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "code": "SAVE10", "discount_type": "fixed", "amount_off": 1000, "currency": "usd", "duration": "once", "price_variants": ["price_abc123"] }' ``` Because `price_variants` lists a single variant, `SAVE10` is rejected at checkout for any other item. ## Worked example: a welcome code for new customers 15% off a first order of at least \$50, usable once per customer: ```bash theme={null} curl -X POST https://api.crevio.co/v1/discounts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "code": "WELCOME15", "discount_type": "percentage", "percent_off": 15, "duration": "once", "minimum_amount": 5000, "currency": "usd", "once_per_customer": true, "first_order_only": true }' ``` `minimum_amount`, `once_per_customer`, and `first_order_only` can be changed later with `PATCH /v1/discounts/{id}`. Send `"minimum_amount": null` to remove the minimum. ## Eligibility and redemptions Crevio, not Stripe, decides whether a code applies. The checks run in this order, and the first failure is the reason the buyer sees: | Check | Message | | - | - | | `status` is `active` | That discount code isn't valid. | | `starts_at` has passed | That discount code isn't active yet. | | `redeem_by` hasn't passed | That discount code has expired. | | `times_redeemed` is below `max_redemptions` | That discount code has reached its usage limit. | | Every line item is in `price_variants` | That code only applies to specific products, which aren't in your cart. | | Subtotal meets `minimum_amount` in the same currency | That code needs an order of at least \$50.00. | | `once_per_customer`: the customer hasn't redeemed it | You've already used that discount code. | | `first_order_only`: the customer has no earlier live paid order | That code is only for your first order. | The two customer checks need to know who is buying. A checkout created with `customer` or `email` is checked when it's created. On the hosted checkout page, a guest is checked again with the email they enter, before payment is taken. If a payment still completes with an ineligible code, the order is kept and the redemption is recorded. A redemption is recorded when a live order paid with the code is created, which increments `times_redeemed`. Test purchases never count. A discount with at least one redemption can't be deleted; set `status` to `inactive` instead. ## Applying a discount A discount reaches a buyer in one of two ways: ### At checkout — `discount_code` Pass the code's string when creating a checkout. Every eligibility check above runs against the checkout's line items and its `customer` or `email`. A code that fails returns `400` with `code: "invalid_parameter"` and the reason as `message`, and no checkout is created: ```bash theme={null} curl -X POST https://api.crevio.co/v1/checkouts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "email": "jane@example.com", "discount_code": "LAUNCH20", "line_items": [{ "price_variant": "price_abc123", "quantity": 1 }] }' ``` ### On a checkout link — `discount` Attach a discount **by id** to a reusable [checkout link](/docs/developer/guides/checkouts#reusable-checkout-links) so it's applied automatically, and decide whether buyers may also enter their own code: ```bash theme={null} curl -X POST https://api.crevio.co/v1/checkout_links \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Launch link", "price_variants": ["price_abc123"], "discount": "disc_launch20", "allow_discount_codes": false }' ``` ### In a link — `?discount=` Append `?discount=CODE` to a buy link (`/buy/{price_variant_or_checkout_link_id}`) or a hosted checkout URL (`/checkout/{checkout_id}`). The checkout opens with the code applied, even when `allow_discount_codes` is `false`. An unusable code never errors: the checkout opens without it and shows the buyer the reason from the table above. > [!TIP] > > At checkout you reference a discount by its **code** (`discount_code: "LAUNCH20"`); on a checkout link you reference it by its **id** (`discount: "disc_launch20"`). Set `allow_discount_codes: false` to lock a link to just its attached discount. Discounts support full CRUD — create, update, delete, list, and retrieve. ## Next steps > **[Checkouts](/docs/developer/guides/checkouts)** > > Apply discounts via `discount_code` and on reusable checkout links. > **[Products & pricing](/docs/developer/guides/products-and-pricing)** > > Create the price variants you scope discounts to. > **[Subscriptions & billing](/docs/developer/guides/subscriptions-and-billing)** > > How `duration` shapes discounts on recurring subscriptions. > **[Commerce overview](/docs/developer/guides/commerce-overview)** > > See where discounts sit in the full commerce model. # Domains Source: https://crevio.co/docs/developer/guides/domains Search, buy, and attach custom domains to your AI-built sites — or connect a domain you already own — with email as a capability on the same domain, all through the API. **A domain is one resource with capabilities: it can serve your storefront (`web`), send email (`email_sending`), and receive email (`email_receiving`) — search for a name, buy it or connect one you own, and verify.** A freshly built [Site](/docs/developer/guides/sites) lives at `https://.crevio.app`. The Domains API moves it to `https://yourbrand.com`. Buy through Crevio and DNS is configured for you automatically — zero records to add. Connect a domain you own and the response tells you exactly which records to add and tracks each one individually. Domains carry their own resource ID, returned by the purchase and create calls. > [!NOTE] > > Custom domains require the Pro or Business plan. Below Pro, `POST /domains`, `POST /domains/purchase`, and a `PATCH /domains/{id}` that attaches a site or enables an email capability return `402` with code `plan_required` and a message naming the required plan. Listing, search, detaching, disabling capabilities, and deleting stay available. ## The flow at a glance **1. Search for a buyable domain** `GET /domains/search` returns available names and prices. **2. Purchase it — or connect your own** `POST /domains/purchase` registers the domain and auto-configures every DNS record. `POST /domains` connects a domain you already own. **3. Check what's left** `GET /domains/{id}` returns per-capability statuses, every DNS record with its own status, and a `next_step` sentence. **4. Verify** `POST /domains/{id}/verify` confirms DNS and goes live. ## Worked example: buy a domain and attach it to a site ### 1. Search for an available domain ```bash theme={null} curl "https://api.crevio.co/v1/domains/search?query=kilnandco" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` The result lists available names with prices so you can pick one to buy. ### 2. Purchase it `domain` is required. ```bash cURL theme={null} curl -X POST https://api.crevio.co/v1/domains/purchase \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "domain": "kilnandco.com" }' ``` ```typescript SDK theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN" }); const domain = await crevio.domains.purchase({ domain: "kilnandco.com" }); ``` ```text MCP (agent) theme={null} Buy kilnandco.com and put my Kiln & Co site on it. ``` Crevio owns the DNS zone for purchased domains, so routing and email records are written for you — poll `GET /domains/{id}` until the capabilities you care about read `active`. `GET /domains/{id}` carries `purchase_status` for domains bought through Crevio, and `next_step` spells the same thing out in a sentence. It's the answer to "did my payment go through?" — the DNS capabilities stay `pending` until the registration lands, so read the purchase first: | `purchase_status` | What it means | | - | - | | `pending_payment` | Nothing charged, nothing registered. Finish the checkout. | | `registering` | Paid. The registrar is registering it — usually a few minutes. Don't pay again. | | `registered` | Bought and yours. DNS setup continues under `capabilities`. | | `failed` | Registration failed and the payment was released — nothing was charged. | Domain purchases are platform charges, not storefront orders, so they never appear in `GET /orders`. > [!NOTE] > > With no card on file the response carries a `checkout_url` instead, and the domain sits at `pending_payment` until it's paid. Checkout links expire after a day — call `POST /domains/purchase` again for the same domain to get a fresh one. A domain that's already paid for (`registering`) or already yours (`registered`) refuses a repeat purchase and says so. ### 3. Assign it to a site Site assignment is an attribute — set `site_id` (or pass it at create time). `"site_id": null` detaches. ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/domains/dom_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "site_id": "site_abc123" }' ``` ### 4. Verify Verification is idempotent and re-checks every enabled capability. Scope it with `?capability=web|email_sending|email_receiving` to skip the other providers' checks. ```bash theme={null} curl -X POST https://api.crevio.co/v1/domains/dom_abc123/verify \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` > [!NOTE] > > Verification can take time to propagate. If it doesn't pass immediately, the platform re-checks in the background, so a verify that returns "pending" will often resolve on its own. ## Connect a domain you already own If you registered a domain elsewhere, create it instead of purchasing. The response carries the DNS records to add at your registrar — each with its own `status` — plus a `next_step` telling you whose move it is. | Field | Purpose | | - | - | | `name` | The domain (or subdomain) to connect — required | | `site_id` | The site to attach it to — optional, defaults to your account's site | | `capabilities` | e.g. `{ "email_sending": true }` to also set up sending email from the domain | ```bash theme={null} curl -X POST https://api.crevio.co/v1/domains \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "shop.example.com", "site_id": "site_abc123", "capabilities": { "email_sending": true } }' ``` `GET /domains/{id}` is the source of truth while you set up DNS: `records[]` shows each record as `pending`, `verified`, or `failed` (the provider's last check could not find it), and `capabilities` shows `web` / `email_sending` / `email_receiving` as `pending`, `active`, `error`, or `null` (off). Toggle capabilities later with `PATCH /domains/{id} { "capabilities": { ... } }`. ## DNS zone management For domains purchased through Crevio, the DNS zone itself is manageable — add an MX record, a TXT verification record, or a CNAME for a subdomain. The zone's ID is on the domain payload as `zone_id`. ```bash List records theme={null} curl https://api.crevio.co/v1/zones/zone_abc123/records \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```bash Add a record theme={null} curl -X PUT https://api.crevio.co/v1/zones/zone_abc123/records \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "type": "TXT", "name": "@", "content": "v=spf1 include:_spf.crevio.co ~all" }' ``` ```bash Delete a record theme={null} curl -X DELETE https://api.crevio.co/v1/zones/zone_abc123/records/rec_xyz789 \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` > [!TIP] > > Connected (bring-your-own) domains have no zone — their DNS lives at your registrar. `GET /domains/{id}` still shows you every record Crevio expects and whether it resolves. ## Next steps > **[Sites](/docs/developer/guides/sites)** > > Build the site you'll attach this domain to. > **[Email](/docs/developer/guides/email)** > > Send from your own address once email\_sending is active. > **[API reference](/docs/developer/api-reference/introduction)** > > Every domain endpoint and parameter. > **[Usage & credits](/docs/developer/guides/usage-billing)** > > How domain registration is billed. # Email Source: https://crevio.co/docs/developer/guides/email Send broadcasts and transactional email to your customers, and operate a full email client — inboxes, threads, drafts, replies, labels, and sending domains — through the API. **Email in Crevio is two things: a simple way to broadcast to your customers, and a full email client — inboxes, threads, messages, drafts, search, and replies — that lets you (or an agent) run your inbox programmatically.** Use the broadcast side to blast an announcement to every paid customer, and the client side to read, reply to, and label inbound mail. You can just ask Crevio to draft and send a launch email, or wire up an agent that watches for incoming messages and replies on your behalf. > [!WARNING] > > **Sending a 1:1 email? Use an inbox, not a broadcast.** Broadcasts are one-to-many: they don't live in a thread, so there is nowhere to reply from. `POST /email/inboxes/{inbox_id}/messages` creates a tracked thread instead. Every account always has an inbox — no domain verification needed — so there is no reason to reach for a broadcast for a single recipient. ## Part 1 — Broadcasts A broadcast is one email sent to many people, persisted end to end: you draft it, schedule it, send it, then read back who received it, who opened it, and which links they clicked. | Endpoint | Purpose | | - | - | | `POST /broadcasts` | Create a draft, schedule a send, or send immediately | | `GET /broadcasts` | List broadcasts (filter by `status`, `sent_after`, `sent_before`) | | `GET /broadcasts/{id}` | Retrieve one, with its current `stats` | | `PATCH /broadcasts/{id}` | Edit a draft or scheduled broadcast | | `DELETE /broadcasts/{id}` | Delete a draft or scheduled broadcast | | `POST /broadcasts/{id}/send` | Send now, ignoring `scheduled_at` | | `POST /broadcasts/{id}/cancel` | Cancel a scheduled or in-flight send | | `GET /broadcasts/{id}/stats` | Poll delivery and engagement counts | | `GET /broadcasts/{id}/recipients` | Per-recipient delivery state | | `GET /broadcasts/{id}/link-clicks` | Clicks per link | ### The lifecycle `draft` → `scheduled` → `sending` → `sent`, with `canceled` and `failed` as exits. Omit `scheduled_at` and you get a **draft**. Pass a future timestamp and it becomes **scheduled** — a cron picks it up when it comes due, so a deploy or restart can't strand it. Pass `send_now: true` and it goes out immediately. A draft or scheduled broadcast stays editable; once it starts **sending**, the rendered body and recipient list are frozen so what you report can't drift from what recipients actually received. ### Choosing an audience `audience` is how you say who receives a broadcast. Filters combine as a union and are deduplicated by address: | Field | Purpose | | - | - | | `audience.send_to_all` | Every customer on the account | | `audience.customer_types` | `paid`, `free`, and/or `lead` | | `audience.tag_ids` | Customers carrying these tags | | `audience.to` | Literal addresses, for recipients who aren't customers | Addresses on your suppression list — hard bounces, spam complaints, and unsubscribes — are dropped before the send is counted, so `stats.recipients` reflects what the provider will actually attempt. A broadcast with no reachable recipients is rejected rather than silently sending to nobody. ### Content | Field | Purpose | | - | - | | `subject` | Email subject. Required to send | | `body` | Email body (HTML). Required to send | | `preview_text` | The line shown after the subject in the inbox | | `from` | Override the sending address (must be on a verified domain) | | `reply_to` | Override the Reply-To address | | `styled` | Wrap the body in your branded layout (default `true`) | | `metadata` | Your own key/value storage, returned as-is and filterable on list | > [!NOTE] > > Every broadcast carries a per-recipient unsubscribe link and the RFC 8058 `List-Unsubscribe` headers that let mailbox providers show a native "Unsubscribe" button. An opt-out adds that address to your suppression list, so it is honoured by every send path afterwards. This is not optional and cannot be turned off — bulk marketing mail requires it, and it is what protects your sending reputation. > > With `styled: false` the link is appended under your body. To place it yourself, put `{{unsubscribe_url}}` in an `href` and it is replaced with the recipient's link instead. ### Worked example: broadcast to all paid customers ```bash cURL theme={null} curl -X POST https://api.crevio.co/v1/broadcasts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "subject": "Doors to the mastermind open Monday", "preview_text": "Your member space unlocks Monday morning", "body": "Thanks for joining — our coaching mastermind kicks off Monday and your member space unlocks then.", "audience": { "customer_types": ["paid"] }, "send_now": true }' ``` ```typescript SDK theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN" }); const broadcast = await crevio.broadcasts.create({ subject: "Doors to the mastermind open Monday", previewText: "Your member space unlocks Monday morning", body: "Thanks for joining — our coaching mastermind kicks off Monday and your member space unlocks then.", audience: { customerTypes: ["paid"] }, sendNow: true, }); // Engagement keeps accruing after the send finishes. const stats = await crevio.broadcasts.stats({ id: broadcast.id }); ``` ```text MCP (agent) theme={null} Email all my paid customers letting them know the mastermind kicks off Monday. ``` ### Reading the results `stats` is embedded on every broadcast and also available on its own endpoint. Rates are fractions of `sent`, not of `recipients` — a recipient never handed to the provider can't have opened anything. ```json theme={null} { "recipients": 412, "sent": 412, "delivered": 404, "bounced": 6, "complained": 1, "failed": 0, "opened": 198, "clicked": 57, "unsubscribed": 3, "delivery_rate": 0.9806, "open_rate": 0.4806, "click_rate": 0.1383, "progress": 100.0, "status": "sent" } ``` `opened` and `clicked` count **distinct recipients**. For per-person detail use `GET /broadcasts/{id}/recipients`, and for per-link detail use `GET /broadcasts/{id}/link-clicks`, which reports both total `clicks` and `unique_clicks`. > [!WARNING] > > **Treat `open_rate` as a soft signal.** Apple Mail Privacy Protection prefetches images for every Apple Mail recipient, so those register as opens whether or not anyone read the message. Open rates are inflated by an amount you can't measure. `click_rate` is the number to trust. Subscribe to `broadcast.sent`, `broadcast.canceled`, and `broadcast.failed` to react without polling. See [Webhooks](/docs/developer/guides/webhooks). ### Open and click tracking Tracking is **off until the account has its own verified email domain**, and turns itself on from there — no configuration. Click tracking works by rewriting every link in the body to redirect through a tracking host. Whose host that is decides whether it costs you deliverability: * URL blocklists score the hosts appearing in a message body, so a tracking host shared across many senders carries whatever reputation the worst of them earns. * Links pointing somewhere other than the domain the mail is authenticated as is structurally what phishing looks like, and inbox providers weigh that alignment. So Crevio never puts your links on a shared tracking host. When you verify a domain, it also claims `click.yourdomain.com` and publishes the CNAME for it — written straight into your DNS when Crevio hosts the zone, or shown alongside the other records for you to add when it doesn't. Once that record resolves, click and open tracking switch on, links stay on your domain, and the reputation is yours alone. Until then `stats.clicked` and `link-clicks` stay empty. That's deliberate: sending on the shared platform domain *and* tracking through a shared host is the configuration most likely to cost inbox placement, and click data isn't worth that trade. > [!NOTE] > > If something already lives at `click.yourdomain.com`, Crevio leaves it alone rather than overwriting it — the record is surfaced in domain settings instead, and tracking stays off until it's resolved. > [!TIP] > > Let Crevio write the copy: ask it to draft the broadcast, review the draft, then send. See [Tasks](/docs/developer/guides/tasks). ### Sending limits Broadcasts draw on a per-account daily send limit set by your plan. Exceeding it returns `429` with `quota_exceeded`; a *scheduled* broadcast that hits the cap stays scheduled and is retried after the limit resets at UTC midnight, rather than failing outright. ## Part 2 — The email client Crevio also operates as a real mailbox built around **inboxes → threads → messages**, with drafts, search, labels, and attachments. Every account has a built-in inbox at `{slug}@ai.crevio.app` that works immediately — listing inboxes creates it if it doesn't exist yet. Mail sent from it goes out on Crevio's verified sending domain with replies routed back to that address. `POST /v1/email/inboxes` adds named inboxes. Without a verified domain they live on the shared domain under your slug: `local_part: "invoices"` gives `{slug}.invoices@ai.crevio.app`, which receives straight away and sends like the built-in inbox. An account can hold up to 20 of these. Verify a domain of your own to get `support@yourbrand.com` instead and send from your own address. ### Inboxes, threads, and messages ```bash theme={null} # List inboxes curl https://api.crevio.co/v1/email/inboxes \ -H "Authorization: Bearer YOUR_API_TOKEN" # List threads in an inbox curl https://api.crevio.co/v1/email/threads \ -H "Authorization: Bearer YOUR_API_TOKEN" # Read the messages in a thread curl https://api.crevio.co/v1/email/threads/thread_abc123/messages \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ### Worked example: reply to an inbound message Reading a thread gives you its messages; reply directly to one. ```bash theme={null} curl -X POST https://api.crevio.co/v1/email/messages/msg_abc123/reply \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "body": "Hi Jordan — yes, the group coaching calls are included. Want me to add you to the next mastermind cohort?" }' ``` The client also supports `reply-all` and `forward` on a message, the same way. ### Drafts, search, and labels ```bash theme={null} # Create a draft curl -X POST https://api.crevio.co/v1/email/drafts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "to": ["jordan@example.com"], "subject": "Mastermind options", "body": "..." }' # Search across mail curl "https://api.crevio.co/v1/email/search?query=refund" \ -H "Authorization: Bearer YOUR_API_TOKEN" # Label a thread curl -X POST https://api.crevio.co/v1/email/threads/thread_abc123/labels \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "label": "support" }' ``` Attachments are available on messages, and drafts can be sent once finalized. ### Sending domains To send from your own domain (rather than the platform default), enable the `email_sending` capability on the domain. This is what makes broadcasts arrive from `hello@yourbrand.com`. ```bash theme={null} # Enable sending on a domain (creates it if not yet connected) curl -X POST https://api.crevio.co/v1/domains \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "mastermind.coach", "capabilities": { "email_sending": true } }' # Re-check DNS whenever you like curl -X POST "https://api.crevio.co/v1/domains/dom_abc123/verify?capability=email_sending" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` > [!NOTE] > > The response's `records[]` lists the DNS records to add at your registrar, each with its own status. For domains purchased through Crevio they're written automatically. See [Domains](/docs/developer/guides/domains). ## Email webhooks Both halves are event-driven. Subscribe instead of polling: * **Inbox** — `email_message.received`, `email_message.sent`, `email_message.delivered`, `email_message.bounced`, `email_message.complained`, `email_message.failed`. * **Broadcasts** — `broadcast.sent` (every recipient handed to the provider), `broadcast.canceled`, `broadcast.failed`. A common pattern: listen for `email_message.received`, run a [Task](/docs/developer/guides/tasks) to draft a reply, and send it. See [Webhooks](/docs/developer/guides/webhooks). ## Next steps > **[Webhooks](/docs/developer/guides/webhooks)** > > React to inbound mail with `email_message.*` events. > **[Tasks](/docs/developer/guides/tasks)** > > Let an agent triage and reply to your inbox. > **[Customers](/docs/developer/api-reference/introduction)** > > Segment who your broadcasts reach. > **[Domains](/docs/developer/guides/domains)** > > Manage DNS for your sending domain. # Errors Source: https://crevio.co/docs/developer/guides/errors Crevio's error model in full — the error envelope, the type/code/message/param/errors fields, and how to debug every HTTP status. **Every Crevio error returns the same JSON envelope, so you can handle failures the same way everywhere.** Read the `code` to branch programmatically and the `errors` object to surface field-level problems to users. ## The error envelope When a request fails, the body is a single `error` object: ```json theme={null} { "error": { "type": "validation_error", "code": "validation_failed", "message": "Email can't be blank", "param": "email", "errors": { "email": ["can't be blank"] }, "doc_url": "https://crevio.co/docs/developer/guides/errors#validation_failed" } } ``` | Field | Description | | - | - | | `type` | Error category — `invalid_request_error`, `validation_error`, or `api_error`. | | `code` | Machine-readable code you can switch on — `parameter_missing`, `parameter_unknown`, `authentication_required`, `plan_required`, `resource_missing`, `validation_failed`, etc. Present when the error is one you can handle programmatically; unexpected server errors (`500`) have none. | | `message` | Human-readable description of what went wrong. | | `param` | The offending parameter. Present on parameter, plan, and validation errors that trace to one field; on a `422` with several invalid fields it names the first. | | `errors` | Field-level validation errors keyed by field name. Present on `422`, and on a `402` raised by a field. | | `doc_url` | Link to this page's section for the `code`. Present when the code is documented here. | > [!TIP] > > Branch on `error.code`, not `message` — messages are for humans and may change. When there is no `code`, branch on `type` and the HTTP status. Every failed response also returns an `x-request-id` header; include it when reporting an issue. ## `parameter_missing` **HTTP `400`.** A required field is absent. Check `param` for which one. ```json theme={null} { "error": { "type": "invalid_request_error", "code": "parameter_missing", "message": "Missing required parameter: name", "param": "name" } } ``` **Fix:** include the named `param`. ## `parameter_unknown` **HTTP `400`.** The body is wrapped in a resource key; `param` names it — see [Conventions](/docs/developer/guides/conventions#parameters-are-unwrapped-top-level). ```json theme={null} { "error": { "type": "invalid_request_error", "code": "parameter_unknown", "message": "Received unknown parameter: product. Send fields at the top level of the body, not nested under \"product\".", "param": "product" } } ``` **Fix:** move the nested fields to the top level of the body. ## `authentication_required` **HTTP `401`.** The token is missing, malformed, or revoked. ```json theme={null} { "error": { "type": "invalid_request_error", "code": "authentication_required", "message": "No valid API token provided." } } ``` **Fix:** send `Authorization: Bearer YOUR_API_TOKEN`. Confirm the token wasn't deleted in **Settings → Developer**, and that you didn't leak a trailing newline into the env var. ## `account_forbidden` **HTTP `403`.** The credential is valid, but the person behind it is not an admin of the account it acts on. Members of an account, such as customers who bought from it, cannot use its API. An API key also gets this once its creator is removed from the account or loses the admin role. **Fix:** authenticate as an admin of the account. For an API key, have a current admin create a new one. ## `insufficient_scope` **HTTP `403`.** The API key or OAuth token lacks the [scope](/docs/developer/guides/api-overview#scopes) the request needs. `param` names it, and so does the `WWW-Authenticate` header (`Bearer error="insufficient_scope", scope="write"`). No OAuth token can create API keys. **Fix:** for an API key, add the scope in **Settings → Developer** or use a key that has it. For an OAuth token, send the user through authorization again and request the scope. Create API keys in **Settings → Developer**. ## `plan_required` **HTTP `402`.** The request was valid, but the account's plan doesn't include what it asks for — for example, turning off a site's referral badge below the Business plan, or creating a site past the plan's site limit. `param` names the field when one field is responsible. Nothing in the request is applied. ```json theme={null} { "error": { "type": "invalid_request_error", "code": "plan_required", "message": "Show referral badge can only be turned off on the Business plan", "param": "show_referral_badge", "errors": { "show_referral_badge": ["can only be turned off on the Business plan"] } } } ``` **Fix:** retrying won't help. Tell the user which plan the feature needs, or drop the field and resend. ## `resource_missing` **HTTP `404`.** The resource doesn't exist for your account. ```json theme={null} { "error": { "type": "invalid_request_error", "code": "resource_missing", "message": "No such product: prod_doesnotexist" } } ``` > [!WARNING] > > On `POST`/`PATCH`, a `404` almost always means a **bad or nil association id in your body** — not a routing problem. For example, passing a non-existent `product: "prod_xxx"` to `POST /price_variants` returns `resource_missing` for the *product*, not for the price-variants route. Double-check every prefixed id you're sending. **Fix:** verify the prefixed id (it must be a `prod_…`/`cus_…`/etc., not a raw database id) and that it belongs to your account. ## `validation_failed` **HTTP `422`.** The request was well-formed but the data is invalid. Field errors are listed in `errors`. ```json theme={null} { "error": { "type": "validation_error", "code": "validation_failed", "message": "Validation failed", "errors": { "email": ["can't be blank"], "amount": ["must be greater than 0"] } } } ``` A classic `422` is publishing a product with no price variant (`status: "active"` on a product with zero prices). See [creation order](/docs/developer/guides/conventions#creation-order-matters). **Fix:** map each key in `errors` to a form field and show the message inline. ## `rate_limit_exceeded` **HTTP `429`.** You've exceeded the rate limit (600 requests per 60-second window, shared by every key and token one person holds on the account). ```json theme={null} { "error": { "type": "invalid_request_error", "code": "rate_limit_exceeded", "message": "Too many requests. Please retry later." } } ``` **Fix:** back off and retry, using the `X-RateLimit-Reset` header to time your retry. The [`@crevio/sdk`](/docs/developer/guides/sdk) retries with exponential backoff automatically. See [Rate limits](/docs/developer/guides/rate-limits) for the headers and recommended backoff strategy. ## `account_at_capacity` **HTTP `429`.** The account already has 5 agent runs going, the most it runs at once. It comes back when you start or continue a chat, run a task, or resume a parked run. ```json theme={null} { "error": { "type": "invalid_request_error", "code": "account_at_capacity", "message": "This account is already running 5 tasks. Wait for one to finish." } } ``` **Fix:** retry after the `Retry-After` header's delay. A slot frees as soon as one of the account's runs settles. Nothing was started, so retrying cannot do the job twice. ## `resource_busy` **HTTP `409`, type `api_error`.** Another request was changing the same resource at the same moment, and this one was rolled back so the two could not corrupt each other. It happens when many calls write to one resource in parallel, such as attaching several files to the same experience at once. ```json theme={null} { "error": { "type": "api_error", "code": "resource_busy", "message": "Another request was changing the same resource at the same time. Retry the request." } } ``` **Fix:** retry the same request after the `Retry-After` header's delay. Nothing from the failed attempt was saved. To avoid it, send writes to one resource one after another, or batch them into a single call (for example, one `file_ids` array instead of one call per file). ## Server errors **HTTP `500`, type `api_error`.** An unexpected server error. There is no `code` and no `doc_url` — nothing about the request is yours to fix. ```json theme={null} { "error": { "type": "api_error", "message": "An unexpected error occurred" } } ``` **Fix:** retry idempotently. If it persists, report it with the `x-request-id` header from the response. ## Handling errors in the SDK The SDK throws typed errors with a `statusCode` you can branch on: ```typescript theme={null} try { const product = await crevio.products.get({ id: "prod_nonexistent" }); } catch (error) { if (error.statusCode === 404) { // resource_missing — bad id } } ``` ## Next steps > **[Conventions](/docs/developer/guides/conventions)** > > Most errors trace back to a broken convention. > **[Quickstart](/docs/developer/guides/quickstart)** > > A clean, error-free first integration. > **[API reference](/docs/developer/api-reference/introduction)** > > Per-endpoint required params and constraints. > **[Usage & billing](/docs/developer/guides/usage-billing)** > > Check credits before calls fail for balance reasons. # Events & Event Sources (event-triggered tasks) Source: https://crevio.co/docs/developer/guides/events Make your AI workforce reactive — fire Tasks automatically when something happens. Learn internal Events, event_conditions, and third-party Event Sources, and how they differ from webhooks. **Events make your [Tasks](/docs/developer/guides/tasks) reactive: instead of running on a clock, an event-triggered task fires the moment something happens.** A buyer pays, a form is submitted, a connected app reports a change — and the agent goes to work. Crevio recognizes two kinds of triggers: **internal Events** (things that happen inside your Crevio account) and **Event Sources** (things that happen in third-party apps you connect). Both drive Tasks with `trigger_type: event`. ## Three things that sound alike — keep them straight | Concept | Direction | What it does | | - | - | - | | **Events** | Crevio → your agent | Internal signals that **trigger Tasks** to run inside Crevio. | | **Event Sources** | Third-party app → your agent | A connected app's events that **trigger Tasks**, so external activity can drive your workforce. | | **[Webhooks](/docs/developer/guides/webhooks)** | Crevio → your server | HTTP notifications pushed to **your own backend** so your code can react. | The rule of thumb: **Events and Event Sources trigger Crevio's AI; webhooks notify your code.** The two systems share an event vocabulary (e.g. `order.paid` exists in both) but do different jobs — and you can use both for the same event. ## Internal Events `GET /v1/events` lists the events you can subscribe a Task to, each with a description, plus an `external` array describing third-party triggers available through Event Sources. ```bash theme={null} curl https://api.crevio.co/v1/events \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` The subscribable internal events: | Domain | Events | | - | - | | **Leads & forms** | `lead.created`, `form_submission.created`, `form_submission.confirmed` | | **Customers** | `customer.confirmed`, `customer.tag_added`, `customer.tag_removed` | | **Checkout & orders** | `checkout.created`, `order.created`, `order.paid` | | **Refunds** | `refund.created`, `refund.updated` | | **Invoices** | `invoice.created`, `invoice.paid`, `invoice.past_due`, `invoice.voided` | | **Subscriptions** | `subscription.created`, `subscription.renewed`, `subscription.canceled`, `subscription.paused`, `subscription.resumed`, `subscription.past_due`, `subscription.ended` | | **Products** | `product.created`, `product.updated` | | **Calls** | `call.started`, `call.ended` | | **AI tasks** | `task.created`, `task_run.completed`, `task_run.failed`, `task_run.needs_input` | | **Jobs** | `job.completed`, `job.failed` | | **Email** | `email_message.received`, `email_message.sent`, `email_message.delivered`, `email_message.bounced`, `email_message.complained`, `email_message.failed` | | **Social** | `x.mention.received` | ## Triggering a Task from an event Create a Task with `trigger_type: event` and use `event_conditions.event_type` to say which event fires it. ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Onboard paid buyers", "prompt": "When an order is paid, send the buyer a personalized thank-you email referencing what they bought, then add them to the onboarding email sequence.", "trigger_type": "event", "event_conditions": { "event_type": "order.paid" }, "agent": "business", "approval_mode": "autonomous" }' ``` Every time an order is paid in your account, a new [Task Run](/docs/developer/guides/tasks#task-runs) starts, the agent receives **that order's payload** as the triggering event (so it never has to guess which record it was), and it carries out the prompt. Use `approval_mode: supervised` if you want to approve the agent's actions before they take effect. > [!TIP] > > Combine event triggers with autonomy: an `autonomous` event-task is a hands-off automation, while a `supervised` one is an assistant that drafts the response and waits for your go-ahead. ### Narrowing which events actually run the agent `event_type` takes exactly one event, and every occurrence of it starts a run. To react to a *subset* — orders over \$100, email from one sender — add a **`condition_script`**: JavaScript evaluated on your account's computer before the run, with no LLM involved — a fraction of the cost of a run. The triggering payload is available as `event` (`{ type, data }`), and the run happens only when the script's last expression is truthy. ```json theme={null} { "trigger_type": "event", "event_conditions": { "event_type": "order.paid" }, "condition_script": "(event?.data?.amount_total ?? 0) >= 10000;" } ``` Filtering here rather than in the prompt is what keeps a chatty event cheap: a run that the agent would only have dismissed never starts. ### Mentions of your X account `x.mention.received` fires when people mention the account's connected X account. X doesn't push mentions, so Crevio polls for them every five minutes. **It only polls for an account that has an active task with `event_conditions.event_type: "x.mention.received"`**: with no such task, the event never fires, and a [webhook endpoint](/docs/developer/guides/webhooks) subscribed to it receives nothing either. One event carries every new mention found by that poll, oldest first. The payload's `data.object` is an `x_mentions` resource: ```json theme={null} { "object": "x_mentions", "account_id": "acct_abc123", "handle": "yourbrand", "mentions": [ { "id": "1975000000000000001", "author_id": "44196397", "author_username": "jordan", "text": "@yourbrand does the course include the backing tracks?", "conversation_id": "1974999999999999999", "image_urls": [], "referenced": [ { "id": "1974999999999999999", "type": "replied_to", "author_username": "yourbrand", "text": "Our beginner guitar course is live." } ] } ] } ``` `text` is what the author typed, without the handles X prepends to a reply. `referenced` holds the posts a mention replies to or quotes. Posts by the account itself and by @crevioapp are left out. Each poll that finds new mentions is charged at X's per-read price, as **X mentions** in [usage](/docs/developer/guides/usage-billing#what-consumes-credits). A poll that finds none costs nothing. > [!TIP] > > You don't have to write this task yourself. The **X brand presence** template in the dashboard creates a supervised `x.mention.received` task that replies under a policy the merchant can edit, and saves original posts as drafts. ## Event Sources (third-party triggers) The `external` array in `GET /v1/events` is currently driven by **Event Sources** — connectors that let events from third-party apps trigger your Tasks. This is how activity *outside* Crevio (a new row in a sheet, a message in a channel, a payment in another tool) can put your AI workforce to work. ### 1. Connect the app Event Sources sit on top of a connected app. Connect Gmail, Google Calendar, Sheets, or whatever else you're triggering on at **/integrations** first — the trigger is deployed as that connected account. A team connection (available to everyone in the account) is the best fit for automations; a personal connection works too, and Crevio deploys the trigger under that member's credential. ### 2. Discover what you can connect ```bash theme={null} curl "https://api.crevio.co/v1/event_sources/available?app=gmail" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` `app` is required — it's the app slug (`gmail`, `google_sheets`, `notion`). Add `&q=` to search within it. Each result describes an `id` (the value you pass back as `vendor_component_id`) and the `configurable_props` that trigger accepts — labels, sheets, channels, filters. ### 3. Create the Event Source ```bash theme={null} curl -X POST https://api.crevio.co/v1/event_sources \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "vendor_component_id": "gmail-new-email-received", "event_name": "gmail.new_email", "configured_props": { "labelIds": ["INBOX"] } }' ``` `event_name` is yours to choose (lowercase, dot-separated). Only the trigger's own settings go in `configured_props` — the connected account is filled in for you from the app you linked in step 1, so there's no account id to look up. If the app isn't connected, the call fails and tells you which one to connect. ### 4. Point a Task at it External events are namespaced with an `external.` prefix — an `event_name` of `gmail.new_email` is subscribed to as `external.gmail.new_email`: ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Triage inbound email", "prompt": "Summarize the email, and if it is a customer asking about an order, look up their order and draft a reply.", "trigger_type": "event", "event_conditions": { "event_type": "external.gmail.new_email" }, "condition_script": "(event?.data?.from || \"\").includes(\"@importantclient.com\");" }' ``` External activity now drives your agent the same way internal events do — the third-party payload arrives as `event.data`, both in the condition script and in the agent's context. ### Manage event sources ```bash theme={null} # List your connected sources curl https://api.crevio.co/v1/event_sources \ -H "Authorization: Bearer YOUR_API_TOKEN" # Remove one curl -X DELETE https://api.crevio.co/v1/event_sources/SOURCE_ID \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` A connected-app source removes itself ten minutes after the last task listening to it is deleted or switched to another trigger, so it stops checking the app for nothing. A task that subscribes within those ten minutes keeps it. Inbound webhook sources are never removed this way: their URL may still be pasted into another service. ## Worked example: the same event, three ways Say you want everything to happen when **`order.paid`** fires: 1. **Trigger the agent** — an event-Task (`trigger_type: event`, `event_conditions: { "event": "order.paid" }`) sends a personalized welcome and starts onboarding. 2. **React in your own code** — a [webhook endpoint](/docs/developer/guides/webhooks) subscribed to `order.paid` provisions the buyer in your external system. 3. **React to external activity** — an Event Source lets a payment in a *connected app* trigger a Crevio task too. Events and webhooks are independent and complementary: use Events to put Crevio's AI to work, and webhooks to keep your own systems in sync. ## Next steps > **[Tasks (your AI workforce)](/docs/developer/guides/tasks)** > > Triggers, agents, autonomy modes, and responding to supervised runs. > **[Webhooks](/docs/developer/guides/webhooks)** > > Notify your own server when events happen — and verify signatures. > **[AI & Agents overview](/docs/developer/guides/agents-overview)** > > How Events fit into Crevio's broader agentic model. > **[MCP Server](/docs/developer/mcp)** > > Let an agent discover and create event sources in code. # Products & pricing Source: https://crevio.co/docs/developer/guides/products-and-pricing Create products, attach price variants, and publish — covering the draft → active lifecycle and every billing type from one-time to pay-what-you-want. **A product is the listing; a price variant is how it's priced and billed — and a product needs at least one price variant before it can go live.** Get the creation order right and the rest is a small, predictable set of fields. You can hand all of this to the agent — "create a $49 course, monthly option at $19, and a 3-payment plan" — and Crevio builds the product and its price variants for you. The model below is what those tools operate on, and what your own integrations will use directly. ## The product lifecycle A product moves through three states via its `status` field: | Status | Meaning | | - | - | | `draft` | Created but not visible or purchasable. The starting state. | | `active` | Published and available for purchase. Requires **at least one price variant**. | | `archived` | Retired — no longer listed or purchasable, but kept for history. | > [!WARNING] > > **You cannot publish in one call.** Creating a product with `status: "active"` and no price variants returns `422 validation_failed`. The required sequence is: > > 1. `POST /products` → creates a **draft**. > 2. `POST /price_variants` (one or more) → attach pricing via `product: "prod_..."`. > 3. `PATCH /products/{id}` with `status: "active"` → publish. ### Step 1 — Create the draft product ```bash theme={null} curl -X POST https://api.crevio.co/v1/products \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "The Complete Guitar Course", "description": "Go from zero to playing real songs.", "slug": "complete-guitar-course" }' ``` The response is a product with `"status": "draft"` and an `id` like `prod_abc123`. Other fields you can set at creation: `body_html`, `button_cta`, `available_from` / `available_until` (date-times for scheduled availability), `tax_code`, and `images` (covered below). ### Step 2 — Attach a price variant Every price variant **must** reference its product: ```bash theme={null} curl -X POST https://api.crevio.co/v1/price_variants \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": "prod_abc123", "name": "Full course", "amount_type": "fixed", "billing_type": "one_time", "amount": 9900, "currency": "usd" }' ``` ### Step 3 — Publish ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/products/prod_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "status": "active" }' ``` > [!TIP] > > With the [`@crevio/sdk`](/docs/developer/guides/api-overview#available-sdks) the same flow reads naturally: > > ```typescript theme={null} > const product = await crevio.products.create({ > name: "The Complete Guitar Course", > slug: "complete-guitar-course", > }); > > await crevio.priceVariants.create({ > product: product.id, > name: "Full course", > amount_type: "fixed", > billing_type: "one_time", > amount: 9900, > currency: "usd", > }); > > await crevio.products.update({ id: product.id, status: "active" }); > ``` ## The price variant model A single product can carry several price variants (a "monthly" and an "annual", say), and each is defined by two key enums plus a handful of modifiers. ### `amount_type` — what the buyer pays | Value | Behavior | | - | - | | `free` | No charge. Used for lead magnets and free tiers. | | `fixed` | A set price in `amount` (cents). | | `custom` | Pay-what-you-want. The buyer chooses, bounded by `minimum_amount` / `maximum_amount`, with `preset_amount` as the suggested default. `one_time` only. A `minimum_amount` of `0` lets the buyer pay nothing; otherwise it must be at least the currency's smallest chargeable price. Pass the chosen amount per line item when [creating a checkout](/docs/developer/guides/checkouts#pay-what-you-want-items). | ### `billing_type` — how often they pay | Value | Behavior | | - | - | | `one_time` | A single charge. | | `subscription` | Recurring billing on `recurring_interval` (`day` \| `week` \| `month` \| `year`) × `interval_count`. | | `payment_plan` | A fixed number of installments (`installment_count`) — pay in parts, then it ends. | ### Modifier fields | Field | Type | Applies to | Notes | | - | - | - | - | | `amount` | int (cents) | fixed | The price. `4900` = \$49.00. | | `currency` | string | all | Lowercase ISO, e.g. `"usd"`. | | `recurring_interval` | enum | subscription | `day` \| `week` \| `month` \| `year`. | | `interval_count` | int | subscription | Multiplier — e.g. `month` × `3` = quarterly. | | `installment_count` | int | payment\_plan | Number of installments. | | `setup_fee_amount` | int (cents) | subscription / payment\_plan | One-time fee charged up front. | | `trial_period_days` | int | subscription | Free trial length before first charge. | | `revoke_after_days` | int | all | Auto-revoke access N days after purchase. | | `minimum_amount` / `maximum_amount` | int (cents) | custom (PWYW) | Bounds on what a buyer may pay. | | `preset_amount` | int (cents) | custom (PWYW) | Suggested default amount. | | `quantity_available` | int | all | Caps how many can be sold — e.g. seats in a cohort or limited spots. | | `waitlist` | bool | all | Buyers apply instead of buying; approve them with `POST /v1/waitlist_entries/{id}/approve`, which charges the card they saved. | | `form_id` | string | all | A form (`form_...`) asked at every checkout of this variant, including waitlist applications. Answers become a form submission on the order or waitlist entry (`form_submissions`). `null` detaches it. | | `hidden` | bool | all | Hide this variant from the website (still purchasable by link). | | `archived` | bool | all | Retire this variant. | > [!NOTE] > > The response also returns `discounted_from_amount` (for showing a strike-through "was" price), `benefits`, `purchase_url`, and `position` (ordering among a product's variants). ## Worked examples Each example below assumes you've already created a draft product `prod_abc123` and shows just the price variant. Remember to `PATCH` the product to `active` once at least one variant exists. **One-time** A single \$49 charge — the simplest sellable thing. ```bash theme={null} curl -X POST https://api.crevio.co/v1/price_variants \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": "prod_abc123", "name": "Lifetime access", "amount_type": "fixed", "billing_type": "one_time", "amount": 4900, "currency": "usd" }' ``` **Monthly subscription** \$19/month with a 7-day free trial. ```bash theme={null} curl -X POST https://api.crevio.co/v1/price_variants \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": "prod_abc123", "name": "Monthly membership", "amount_type": "fixed", "billing_type": "subscription", "amount": 1900, "currency": "usd", "recurring_interval": "month", "interval_count": 1, "trial_period_days": 7 }' ``` **Payment plan** $300 total, split into 3 monthly installments of $100. ```bash theme={null} curl -X POST https://api.crevio.co/v1/price_variants \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": "prod_abc123", "name": "Pay in 3", "amount_type": "fixed", "billing_type": "payment_plan", "amount": 10000, "currency": "usd", "recurring_interval": "month", "interval_count": 1, "installment_count": 3 }' ``` > [!NOTE] > > `amount` here is the per-installment charge. Three installments of `10000` (=$100.00) total $300. **Pay-what-you-want** Custom pricing — buyer chooses between $5 and $100, defaulting to \$25. ```bash theme={null} curl -X POST https://api.crevio.co/v1/price_variants \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": "prod_abc123", "name": "Name your price", "amount_type": "custom", "billing_type": "one_time", "currency": "usd", "minimum_amount": 500, "maximum_amount": 10000, "preset_amount": 2500 }' ``` **Free lead magnet** No charge — capture leads in exchange for a download. ```bash theme={null} curl -X POST https://api.crevio.co/v1/price_variants \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": "prod_abc123", "name": "Free download", "amount_type": "free", "billing_type": "one_time", "currency": "usd" }' ``` ## Adding images A product's gallery is set by passing an array of **MediaLibrary file ids** in `images`. The first id is the cover. ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/products/prod_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "images": ["file_cover123", "file_detail456"] }' ``` Get those `file_...` ids by uploading via `POST /files`, or by generating artwork with `POST /images/generate` (generated images land in your MediaLibrary automatically). Passing an empty array (`"images": []`) clears the gallery. > [!TIP] > > You can ask Crevio to do this end-to-end: "generate cover art for the guitar course and set it as the product image." The agent generates the image, persists it to the MediaLibrary, and patches the product's `images` for you. ## Setting SEO metadata A product's search-engine title and description live under `seo`, in the same shape on write as on read: ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/products/prod_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "seo": { "title": "Beginner Guitar Course: Play 10 Songs in 30 Days", "description": "Video lessons that take you from your first chord to ten full songs in a month." } }' ``` `POST /products` and `PATCH /products/{id}` both accept it. Each key is optional: a key you leave out keeps its current value, and `null` clears it. On create, Crevio generates any field you leave out from the product details when it can; a value you pass always wins over the generated one. Changing either field emits `product.updated`, so a storefront that renders meta tags from the product can refresh them from the webhook. ## Next steps > **[Checkouts](/docs/developer/guides/checkouts)** > > Turn published price variants into payments with checkouts and checkout links. > **[Subscriptions & billing](/docs/developer/guides/subscriptions-and-billing)** > > Manage the subscriptions, invoices, and refunds your price variants generate. > **[Discounts](/docs/developer/guides/discounts)** > > Add promo codes scoped to specific price variants. > **[Commerce overview](/docs/developer/guides/commerce-overview)** > > Step back to the full mental model of how the primitives connect. # Quickstart Source: https://crevio.co/docs/developer/guides/quickstart From API key to your first successful Crevio call in under five minutes — then create your first product the right way. **Get an API key, make your first call, and create a real product — in three surfaces (cURL, SDK, MCP) and under five minutes.** The Crevio API is a REST API. Every request is authenticated with a bearer token and hits `https://api.crevio.co/v1`. The official [`@crevio/sdk`](/docs/developer/guides/sdk) wraps it with types and retries, and the same operations are exposed to AI agents over [MCP](/docs/developer/mcp). ## Get your key and make a call **1. Create an API key** In your dashboard, go to **Settings → Developer** and click **New API token**. Give it a descriptive name. The token is shown **once** — copy it and store it in an environment variable. ```bash theme={null} export CREVIO_API_TOKEN="your_token_here" ``` > [!WARNING] > > Treat tokens like passwords. Never commit them or ship them in client-side code. A token acts on behalf of your account. **2. Make your first call** The friendliest first call is `GET /status` — a lightweight health check that confirms your token works and tells you which account you're authenticated as. **cURL** ```bash theme={null} curl https://api.crevio.co/v1/status \ -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` **SDK (TypeScript)** ```typescript theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: process.env.CREVIO_API_TOKEN }); const status = await crevio.status.get(); console.log(status.status, status.account.name); ``` **MCP (agent)** With Crevio's MCP server connected, just ask: ```text theme={null} Check my Crevio status and tell me which account I'm connected to. ``` A successful response looks like: ```json theme={null} { "status": "operational", "api_version": "v1", "authenticated": true, "account": { "id": "acct_abc123", "name": "Acme Studio" }, "documentation_url": "https://docs.crevio.co", "timestamp": "2026-06-21T10:30:00Z" } ``` **3. List your products** Now hit a real resource. List endpoints return a `{ object: "list", data: [...] }` envelope. **cURL** ```bash theme={null} curl "https://api.crevio.co/v1/products?limit=5" \ -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` **SDK (TypeScript)** ```typescript theme={null} const products = await crevio.products.list({ limit: 5 }); for (const product of products) { console.log(product.id, product.name); } ``` **MCP (agent)** ```text theme={null} List my five most recent Crevio products. ``` ## Create your first product the right way Publishing a product takes **three calls in order**. A product can't go live without at least one price variant, so creating one with `status: "active"` in a single call fails with `422`. Do it like this: **1. Create the product as a draft** Parameters go at the **top level** (not wrapped in a `product` key). ```bash theme={null} curl https://api.crevio.co/v1/products \ -H "Authorization: Bearer $CREVIO_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Intro to Watercolor", "status": "draft", "description": "A beginner-friendly painting course." }' ``` The response includes the new id, e.g. `"id": "prod_abc123"`. **2. Add a price variant** Reference the product by its **bare association name** (`product`, not `product_id`) and its prefixed id. Money is in **integer cents** with a **lowercase** ISO currency. ```bash theme={null} curl https://api.crevio.co/v1/price_variants \ -H "Authorization: Bearer $CREVIO_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": "prod_abc123", "name": "Full course", "amount_type": "fixed", "amount": 4900, "currency": "usd", "billing_type": "one_time" }' ``` `amount: 4900` is \$49.00. The response id looks like `"id": "price_xyz789"`. **3. Publish the product** Now that a price exists, flip the product to `active` with a `PATCH`. ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/products/prod_abc123 \ -H "Authorization: Bearer $CREVIO_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "status": "active" }' ``` > [!TIP] > > Prefer to skip the choreography? Ask the agent over MCP: *"Create a one-time \$49 course called Intro to Watercolor and publish it."* It runs the same three steps for you. ## Next steps > **[Conventions](/docs/developer/guides/conventions)** > > The full set of request and response rules — read before building. > **[Errors](/docs/developer/guides/errors)** > > Decode every status code and fix it fast. > **[TypeScript SDK](/docs/developer/guides/sdk)** > > Type-safe access with automatic retries. > **[Usage & billing](/docs/developer/guides/usage-billing)** > > How metered pay-per-call credits work. # Rate limits Source: https://crevio.co/docs/developer/guides/rate-limits How Crevio throttles API requests — the per-owner limit, the RateLimit headers on every response, and how to back off cleanly on a 429. **Every Crevio API request is rate limited, and every response tells you exactly where you stand.** Read the `RateLimit` headers to pace yourself, and back off on a `429` instead of hammering. ## The limit Crevio allows **600 requests per 60-second window** per owner on the free tier, and **3,000** on a paid plan. | Tier | Limit | Window | | - | - | - | | `free` — no active subscription | 600 requests | 60 seconds (fixed) | | `paid` — any active subscription | 3,000 requests | 60 seconds (fixed) | Over the limit you get a `429` with code `rate_limit_exceeded`, a `Retry-After` header, and your `plan_tier` in the error body. The window is **fixed**, not rolling: the counter resets to zero at the moment given by `X-RateLimit-Reset`, not 60 seconds after each individual request. > [!NOTE] > > The limit is uniform across **all** `https://api.crevio.co/v1` endpoints — reads and writes draw from the same counter. There are no per-endpoint tiers. ## Reading your quota before you need it The response headers tell you where you stand *after* a request. To know your ceiling up front — on startup, or to size a batch — call [`GET /v1/status`](/docs/api-reference/status/get-api-status): ```json theme={null} { "limits": { "rate_limit": { "tier": "paid", "limit": 3000, "window_seconds": 60, "remaining": 2984, "resets_at": "2026-09-02T18:41:00Z" }, "task_runs": { "max_concurrent_per_account": 5, "max_concurrent_per_task": 1, "max_runtime_seconds": 14400 }, "pagination": { "default_limit": 15, "max_limit": 100 } } } ``` Prefer these values over hard-coding the numbers in this page — they move with your plan. `max_concurrent_per_account` counts runs that are `pending` or `running`. Starting a run while the account is at the cap (`POST /v1/chats`, `POST /v1/chats/{chat_id}/messages`, `POST /v1/tasks/{id}/run`, resuming a parked run) returns `429` with code `account_at_capacity` and a `Retry-After` header: a slot frees as soon as one of the account's runs settles. A run parked in `needs_input` holds no slot until it resumes, and it stays parked until you retry. ## Who shares a budget The counter is keyed to the **owner** of the credential, not the credential itself, so creating more keys does not raise your limit: * **Personal API keys and OAuth tokens** — every key and token one person holds on an account draws from one budget. Two scripts running on two of your keys share it. * **Team API keys** — all of an account's team keys share the account's own budget, separate from each person's. * **IP address** — unauthenticated requests are counted per IP. Two people on the same account each have their own budget, and so do two accounts. ## Response headers Every response — success or failure — carries your current standing. Read these instead of guessing. Crevio sends two families of headers. Prefer the standard `RateLimit` pair; the `X-RateLimit-*` triple is kept for existing integrations and will not be removed without notice under our [deprecation policy](/docs/developer/guides/versioning). ### Standard (recommended) These are the IETF [RateLimit header fields](https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-ratelimit-headers), encoded as [structured fields](https://www.rfc-editor.org/rfc/rfc9651). | Header | Meaning | | - | - | | `RateLimit-Policy` | The quota policy: `q` is the allowance, `w` the window in seconds. Constant. | | `RateLimit` | Your current standing: `r` is requests remaining, `t` seconds until the window resets. | ```http theme={null} HTTP/1.1 200 OK RateLimit-Policy: "default";q=600;w=60 RateLimit: "default";r=594;t=42 ``` ### Legacy | Header | Meaning | | - | - | | `X-RateLimit-Limit` | Maximum requests allowed in the window (`600`). | | `X-RateLimit-Remaining` | Requests left in the current window. | | `X-RateLimit-Reset` | UTC epoch seconds (Unix timestamp) when the window resets and `Remaining` returns to the limit. | ```http theme={null} X-RateLimit-Limit: 600 X-RateLimit-Remaining: 594 X-RateLimit-Reset: 1735689600 ``` > [!TIP] > > When the remaining count gets low, wait out the window rather than retrying into a wall: `RateLimit`'s `t` parameter is already the number of seconds to sleep. ## The 429 response Exceed the limit and the request is rejected with HTTP `429` and the standard [error envelope](/docs/developer/guides/errors): ```json theme={null} { "error": { "type": "invalid_request_error", "code": "rate_limit_exceeded", "message": "Too many requests. Please retry later." } } ``` The `429` carries `Retry-After` with the number of seconds to wait, alongside the same `RateLimit` headers. ## Handling limits gracefully **1. Retry with exponential backoff and jitter** On a `429`, wait, then retry — doubling the delay each attempt and adding a small random jitter so concurrent clients don't retry in lockstep. Prefer `Retry-After` when it's present. **2. Use webhooks instead of polling** Don't poll a task or order for status changes in a tight loop. Subscribe to [webhooks](/docs/developer/guides/webhooks) and let Crevio push the update to you. **3. Paginate, don't fan out** Walk list endpoints with cursor [pagination](/docs/developer/guides/conventions#pagination) (`limit` + `starting_after`) rather than firing many parallel requests. **4. Cache what rarely changes** Avoid re-fetching values that seldom move (product catalogs, account settings) on every request. > [!TIP] > > The [`@crevio/sdk`](/docs/developer/guides/sdk) already retries `429` (and transient `5xx`) responses with exponential backoff for you — most integrations on the SDK never need to handle this by hand. ## Next steps > **[Errors](/docs/developer/guides/errors)** > > The full error model, including the `429` envelope. > **[Webhooks](/docs/developer/guides/webhooks)** > > Replace polling loops with pushed events. > **[Conventions](/docs/developer/guides/conventions)** > > Cursor pagination and the rest of the API's ground rules. > **[TypeScript SDK](/docs/developer/guides/sdk)** > > Automatic retry and backoff out of the box. # Spin up an AI-built website on a custom domain Source: https://crevio.co/docs/developer/guides/recipe-ai-website Brief Crevio to build a site from a prompt, poll the build task until it's live, then buy and assign a custom domain. **Describe the site you want and Crevio builds it — then put it on a domain you own.** This recipe goes from a one-line brief to a live site on a custom domain. Builds and deploys run **asynchronously**, so the pattern throughout is: kick off → poll a Task until it's done. > [!NOTE] > > A site build is driven by an AI **Task**. `POST /sites` returns a `build_task_id` — that's the [Task](/docs/developer/guides/tasks) doing the engineering work. You poll the site (or that task) until `is_live` is true. ## Recipe **1. Brief Crevio to build the site** The `prompt` is the build brief — your brand, what you sell, the look and feel. It kicks off an AI engineering build. ```bash theme={null} curl -X POST https://api.crevio.co/v1/sites \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Flow Yoga Studio", "prompt": "A warm, minimal site for a yoga and fitness studio that sells class memberships. Calm palette, bold class schedule, a featured unlimited-membership subscription, and an about page telling our instructors story.", "access_mode": "public" }' ``` ```json theme={null} { "id": "site_def456", "object": "site", "name": "Flow Yoga Studio", "subdomain": "flow-yoga-studio", "app_url": "https://flow-yoga-studio.crevio.app", "is_live": false, "build_task_id": "task_build01", "domain": null, "domain_verified": false } ``` The site exists immediately, but it's still building. Note `build_task_id`. **2. Poll the build task until the site is live** Poll the task (or re-fetch the site) until the build finishes and `is_live` becomes true. ```bash theme={null} curl https://api.crevio.co/v1/tasks/task_build01 \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```bash theme={null} curl https://api.crevio.co/v1/sites/site_def456 \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```json theme={null} { "id": "site_def456", "object": "site", "is_live": true, "app_url": "https://flow-yoga-studio.crevio.app" } ``` Once `is_live` is true, the website is reachable at its `app_url`. Now attach a custom domain. **3. Search for an available domain** ```bash theme={null} curl "https://api.crevio.co/v1/domains/search?query=flowstudio" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Returns availability and pricing for matching domains. **4. Purchase the domain** ```bash theme={null} curl -X POST https://api.crevio.co/v1/domains/purchase \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "domain": "flowstudio.fit" }' ``` ```json theme={null} { "id": "domain_ghi789", "object": "domain", "domain": "flowstudio.fit", "verified": false } ``` Already own a domain elsewhere? Use `POST /domains` with `{ "name": "flowstudio.fit", "site_id": "site_def456" }` instead. **5. Assign the domain to your site** Assignment is an attribute — set `site_id` (null detaches). ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/domains/domain_ghi789 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "site_id": "site_def456" }' ``` **6. Verify the domain** Verification kicks off DNS setup and validation. It runs asynchronously — re-check until `verified` is true. ```bash theme={null} curl -X POST https://api.crevio.co/v1/domains/domain_ghi789/verify \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```json theme={null} { "id": "domain_ghi789", "object": "domain", "domain": "flowstudio.fit", "verified": true } ``` Once verified, your AI-built website is live on your own domain. > [!TIP] > > Building from your own GitHub repo instead of a prompt? Pass `repository: "owner/repo"` to `POST /sites` (then `prompt` is optional). Multi-site is a paid feature. ## Next steps > **[Tasks](/docs/developer/guides/tasks)** > > The engine behind site builds — your AI workforce. > **[Launch a paid course](/docs/developer/guides/recipe-launch-paid-course)** > > Add sellable products to your new site. > **[Autonomous outreach](/docs/developer/guides/recipe-autonomous-outreach)** > > Drive traffic to your site with a research-and-email agent. > **[API overview](/docs/developer/guides/api-overview)** > > The full set of primitives. # Run an autonomous outreach agent Source: https://crevio.co/docs/developer/guides/recipe-autonomous-outreach Schedule a Task that researches leads on the web and drafts outreach email — with supervised approval before anything sends. **A Task is an AI worker you schedule once and let run on its own.** This recipe creates a recurring Task that uses live web research to find leads, drafts personalized outreach email, and surfaces each run for your approval before anything goes out. > [!NOTE] > > Tasks are your AI workforce. Each scheduled execution is a **Task Run** you can inspect. With `approval_mode: "supervised"`, runs that want to act pause as `needs_input` and show up in your dashboard for sign-off. See [Tasks](/docs/developer/guides/tasks). ## Recipe **1. Create the outreach Task** The `prompt` is the agent's standing instructions. `trigger_type: "cron"` plus a `cron_expression` schedules it; `approval_mode: "supervised"` means it won't send anything without you. ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Weekly lead outreach", "agent": "business", "trigger_type": "cron", "cron_expression": "0 9 * * 1", "timezone": "America/New_York", "approval_mode": "supervised", "delivery_methods": ["email"], "prompt": "Each Monday, use web research to find 10 local businesses — dentists, law firms, and restaurants — whose websites look outdated or aren't mobile-friendly. For each, draft a short, personalized outreach email pitching our web-design studio's redesign service. Summarize who you found and attach the drafts for my review." }' ``` ```json theme={null} { "id": "task_out01", "object": "task", "name": "Weekly lead outreach", "agent": "business", "trigger_type": "cron", "cron_expression": "0 9 * * 1", "approval_mode": "supervised", "delivery_methods": ["email"], "active": true, "next_run_at": "2026-06-22T13:00:00Z", "total_runs_count": 0 } ``` `agent: "business"` is the default operator agent (use `engineering` only for code/site builds). The cron `0 9 * * 1` runs every Monday at 09:00 in the given `timezone`. **2. Read the Task's runs** Every execution creates a Task Run. List them to see what the agent did and what's awaiting you. ```bash theme={null} curl "https://api.crevio.co/v1/task_runs?task_id=task_out01" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```json theme={null} { "object": "list", "data": [ { "id": "trun_run01", "object": "task_run", "task_id": "task_out01", "status": "needs_input", "summary": "Found 10 local businesses; drafted 10 outreach emails awaiting approval.", "credits_consumed": 42, "tool_calls_count": 18, "started_at": "2026-06-22T13:00:02Z" } ], "has_more": false } ``` A `status` of `needs_input` means the supervised run is paused for your review. **3. Approve a supervised run** Supervised runs are reviewed and resumed in the dashboard — that's where the drafts and the agent's reasoning are shown for interactive approval. To resolve a run's state programmatically, `PATCH /task_runs/{id}`: ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/task_runs/trun_run01 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "status": "completed" }' ``` > [!TIP] > > Interactive input (editing a draft, approving a send) happens in the dashboard and via notifications. The API `PATCH` resolves the run's status; it doesn't carry an approval payload. ## Variation: trigger on an event instead of a schedule Instead of cron, fire the agent when something happens in your account. Use `trigger_type: "event"` with `event_conditions` — for example, kick off a follow-up sequence whenever an order is paid. ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Post-purchase follow-up", "agent": "business", "trigger_type": "event", "approval_mode": "autonomous", "delivery_methods": ["email"], "event_conditions": { "event": "order.paid" }, "prompt": "When an order is paid, draft and send a warm thank-you email to the client with next steps and a link to book their project kickoff call." }' ``` > [!NOTE] > > Event-triggered Tasks and [Webhooks](/docs/developer/guides/webhooks) both react to platform events, but they're different tools: a webhook notifies **your** server so your code acts; an event Task wakes up **Crevio's** AI to act on your behalf. See [Events](/docs/developer/guides/events) for the subscribable event list. ## Next steps > **[Tasks](/docs/developer/guides/tasks)** > > Full Task model — triggers, agents, approval modes. > **[Events](/docs/developer/guides/events)** > > Internal and third-party triggers for event Tasks. > **[AI content generation](/docs/developer/guides/ai-content)** > > The web research tools your agent uses under the hood. > **[Usage & billing](/docs/developer/guides/usage-billing)** > > How Task runs consume credits. # Launch a paid course Source: https://crevio.co/docs/developer/guides/recipe-launch-paid-course Create a product, price it, publish it, and generate a shareable checkout link — the full sequence, in the order that works. **Selling a paid course is four chained calls, and the order matters.** You create the product as a draft, attach at least one price variant, flip it to active, then mint a checkout link. Skip a step or reorder it and you'll hit a `422`. > [!WARNING] > > You cannot create a product with `status: "active"` in one shot — publishing requires at least one price variant first. Always: create draft → add price variant → PATCH to active. > [!NOTE] > > Course **content** (lessons, modules, drip) lives under [Experiences](/docs/developer/guides/conventions), managed in-app. The Experiences API is read-only (`GET /experiences`). A product bundles experiences through its price variants. This recipe covers the sellable side — product, price, and checkout. ## Recipe **1. Create the product as a draft** Money is never involved here yet — just the listing. ```bash theme={null} curl -X POST https://api.crevio.co/v1/products \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Mastering Espresso at Home", "status": "draft", "description": "A 6-week video course on dialing in espresso." }' ``` ```json theme={null} { "id": "prod_abc123", "object": "product", "name": "Mastering Espresso at Home", "status": "draft", "slug": "mastering-espresso-at-home", "images": [], "created_at": "2026-06-21T10:00:00Z" } ``` Hold onto `prod_abc123`. **2. Add a fixed price variant** Associations are bare-name + prefixed id: `product: "prod_abc123"`, not `product_id`. Money is integer **cents** with a lowercase currency. ```bash theme={null} curl -X POST https://api.crevio.co/v1/price_variants \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "product": "prod_abc123", "name": "Full course", "amount_type": "fixed", "amount": 14900, "currency": "usd", "billing_type": "one_time" }' ``` ```json theme={null} { "id": "price_xyz789", "object": "price_variant", "product": "prod_abc123", "name": "Full course", "amount_type": "fixed", "amount": 14900, "currency": "usd", "billing_type": "one_time", "purchase_url": "https://yourname.crevio.app/..." } ``` `amount: 14900` is **\$149.00**. For a subscription, use `billing_type: "subscription"` plus `recurring_interval` and `interval_count`. **3. Publish the product** Now that a price exists, flip the product to `active`. ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/products/prod_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "status": "active" }' ``` ```json theme={null} { "id": "prod_abc123", "object": "product", "status": "active" } ``` **4. Create a shareable checkout link** A checkout link is a reusable buy URL you can drop in emails, social posts, or your site. ```bash theme={null} curl -X POST https://api.crevio.co/v1/checkout_links \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Espresso course launch", "price_variants": ["price_xyz789"], "allow_discount_codes": true }' ``` ```json theme={null} { "id": "cl_link01", "object": "checkout_link", "name": "Espresso course launch", "price_variants": ["price_xyz789"], "allow_discount_codes": true } ``` Share the link's URL and you're live. **5. (Optional) Add a launch discount** Create a promo code and scope it to this price variant. ```bash theme={null} curl -X POST https://api.crevio.co/v1/discounts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "code": "LAUNCH20", "discount_type": "percentage", "percent_off": 20, "duration": "once", "price_variants": ["price_xyz789"] }' ``` ```json theme={null} { "id": "disc_promo01", "object": "discount", "code": "LAUNCH20", "discount_type": "percentage", "percent_off": 20, "duration": "once" } ``` Because the checkout link was created with `allow_discount_codes: true`, buyers can enter `LAUNCH20` at checkout. > [!TIP] > > Programmatic checkout instead of a shareable link? Call `POST /checkouts` with `line_items: [{ price_variant: "price_xyz789", quantity: 1 }]` and optionally a `discount_code`. ## Next steps > **[AI content generation](/docs/developer/guides/ai-content)** > > Generate a cover image and attach it to the product. > **[Spin up a website](/docs/developer/guides/recipe-ai-website)** > > Put your product on an AI-built site with a custom domain. > **[Webhooks](/docs/developer/guides/webhooks)** > > Get notified on `order.paid` to fulfill automatically. > **[Conventions](/docs/developer/guides/conventions)** > > Why draft-before-active and cents matter. # Recipes Source: https://crevio.co/docs/developer/guides/recipes End-to-end, copy-pasteable workflows that chain Crevio API calls in the correct order to ship a real outcome. **Recipes are complete, ordered walkthroughs — not endpoint reference.** Each one strings several calls together in the exact sequence that works, with real payloads and responses, so you can go from nothing to a shipped result. Reference pages tell you what one endpoint does. Recipes tell you how to combine them. If you've read the [Conventions](/docs/developer/guides/conventions) — unwrapped params, prefixed ids, cents for money, draft-before-active ordering — these put them to work. > **[Launch a paid course](/docs/developer/guides/recipe-launch-paid-course)** > > Create a draft product, add a fixed-price variant, publish it, and generate a shareable checkout link — in the order that doesn't 422. > **[Spin up an AI-built website on a custom domain](/docs/developer/guides/recipe-ai-website)** > > Brief Crevio to build a site from a prompt, poll the build task until it's live, then buy and assign a custom domain. > **[Run an autonomous outreach agent](/docs/developer/guides/recipe-autonomous-outreach)** > > Schedule a Task that researches leads on the web and drafts outreach email, with supervised approval before anything sends. ## Next steps > **[Conventions](/docs/developer/guides/conventions)** > > The rules every recipe relies on. > **[API overview](/docs/developer/guides/api-overview)** > > The primitives these recipes combine. # TypeScript SDK Source: https://crevio.co/docs/developer/guides/sdk Use the official @crevio/sdk TypeScript client to interact with the Crevio API — type-safe access to products, checkouts, accounts, and users. The `@crevio/sdk` package provides a type-safe TypeScript client for the [Crevio API](/docs/developer/guides/api-overview). It works in Node.js, browsers, Cloudflare Workers, and Deno. ## Installation ```bash npm theme={null} npm install @crevio/sdk ``` ```bash bun theme={null} bun add @crevio/sdk ``` ```bash pnpm theme={null} pnpm add @crevio/sdk ``` ## Quick start ```typescript theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN", }); ``` ## Usage examples ### List products ```typescript theme={null} const products = await crevio.products.list(); for (const product of products) { console.log(product.name, product.id); } ``` ### Get a product Retrieve by ID or slug: ```typescript theme={null} // By ID const product = await crevio.products.get({ id: "prod_abc123" }); // By slug const product = await crevio.products.get({ id: "my-course" }); ``` ### Get a product with reviews expanded ```typescript theme={null} const product = await crevio.products.get({ id: "my-course", expand: "reviews", }); for (const review of product.reviews ?? []) { console.log(review.rating, review.customerName, review.content); } ``` ### Create a checkout ```typescript theme={null} const checkout = await crevio.checkouts.create({ email: "customer@example.com", lineItems: [ { priceVariant: "price_xyz789", quantity: 1, }, ], }); console.log(checkout.clientSecret); // Use with Stripe.js ``` ### List orders with expanded data ```typescript theme={null} const orders = await crevio.orders.list({ expand: "line_items,customer", limit: 50, }); ``` ### Create a customer ```typescript theme={null} const customer = await crevio.customers.create({ email: "customer@example.com", firstName: "Jane", lastName: "Doe", }); ``` ### Create a discount ```typescript theme={null} const discount = await crevio.discounts.create({ code: "SUMMER20", discountType: "percent_off", percentOff: 20, duration: "once", maxRedemptions: 100, }); ``` ### Manage webhook endpoints ```typescript theme={null} // Create a webhook endpoint const webhook = await crevio.webhookEndpoints.create({ url: "https://example.com/webhooks/crevio", enabledEvents: ["order.paid", "checkout.created"], }); // Save the secret for signature verification console.log(webhook.secret); // List available event types const events = await crevio.webhookEndpoints.listEvents(); ``` See the [webhooks guide](/docs/developer/guides/webhooks) for the full list of event types and how to verify signatures. ### Pay an invoice Create a checkout to pay an existing invoice: ```typescript theme={null} const checkout = await crevio.checkouts.create({ invoice: "inv_abc123", }); // Redirect customer to checkout.url console.log(checkout.url); ``` ### List refunds ```typescript theme={null} // List all refunds const refunds = await crevio.refunds.list(); // List refunds for a specific order const orderRefunds = await crevio.refunds.list({ order: "ord_abc123", }); ``` ### Manage files ```typescript theme={null} // Upload a file via external URL const file = await crevio.files.create({ sourceType: "external", url: "https://example.com/image.png", }); // Create a direct upload const upload = await crevio.files.create({ sourceType: "upload", filename: "document.pdf", }); // Use upload.uploadUrl and upload.uploadHeaders to PUT the file, // then confirm: await crevio.files.uploaded({ id: upload.id }); ``` ### Send a broadcast ```typescript theme={null} const broadcast = await crevio.broadcasts.send({ subject: "Your purchase is ready", body: "Thank you! Your download is ready.", to: ["customer@example.com"], }); ``` ### List webhook events ```typescript theme={null} // List recent webhook events const events = await crevio.webhookEvents.list(); // Filter by event type const orderEvents = await crevio.webhookEvents.list({ type: "order.paid", }); ``` ## Error handling The SDK throws typed errors that you can catch: ```typescript theme={null} try { const product = await crevio.products.get({ id: "prod_nonexistent", }); } catch (error) { if (error.statusCode === 404) { console.log("Product not found"); } } ``` ## Runtime support | Runtime | Supported | | - | - | | Node.js 18+ | Yes | | Browsers | Yes | | Cloudflare Workers | Yes | | Deno | Yes | | Bun | Yes | > [!NOTE] > > The SDK is generated from the Crevio OpenAPI spec and includes Zod validation, opt-in retries (retried writes reuse one idempotency key), and full TypeScript type definitions. # Sites (AI website builder) Source: https://crevio.co/docs/developer/guides/sites Describe what you want and Crevio's AI builds, deploys, and runs a real website for you — then manage its analytics, database, secrets, domains, and deployments through the API. **A Site is an AI-built, fully-hosted website that Crevio creates from a one-paragraph brief — you describe the brand and what you sell, and an engineering agent writes the code, deploys it, and gives you back a live URL.** You don't pick a template or wire up hosting. You `POST /sites` with a `prompt`, Crevio kicks off an AI build, and you poll a Task until the site is live at a `*.crevio.app` subdomain. From there the API exposes the whole platform surface around the site: visitor analytics, the site's own database, encrypted secrets (env vars), custom domains, and deployment history. Sites use the `site_` prefix and have the object type `site`. ## Build a site from a prompt The `prompt` is a build brief — describe the brand, what you sell, and the look and feel. Crevio's **engineering agent** turns it into a real codebase and deploys it. The response comes back immediately with a `build_task_id` you poll to watch the build. ```bash cURL theme={null} curl -X POST https://api.crevio.co/v1/sites \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A clean, modern landing site for a ceramics studio called Kiln & Co. Earthy palette, hero with a newsletter signup, a shop section, and an about page. Warm and handmade feel.", "name": "Kiln & Co", "access_mode": "public" }' ``` ```typescript SDK theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN" }); const site = await crevio.sites.create({ prompt: "A clean, modern landing site for a ceramics studio called Kiln & Co. " + "Earthy palette, hero with a newsletter signup, a shop section, and an about page.", name: "Kiln & Co", access_mode: "public", }); ``` ```text MCP (agent) theme={null} Build me a website for my ceramics studio "Kiln & Co" — earthy, handmade feel, with a shop and a newsletter signup. ``` The response includes the build task to poll plus the addressable URLs: ```json theme={null} { "id": "site_abc123", "object": "site", "name": "Kiln & Co", "subdomain": "kiln-and-co", "app_url": "https://kiln-and-co.crevio.app", "is_live": false, "access_mode": "public", "show_referral_badge": true, "build_task_id": "task_def456", "domain": null, "domain_verified": false, "github_repo_full_name": "crevio-sites/kiln-and-co" } ``` > [!NOTE] > > The site is created instantly, but `is_live` is `false` until the AI build finishes. The build runs as a [Task](/docs/developer/guides/tasks) — that's what `build_task_id` is for. ### Poll the build task A build is an `engineering` agent Task. Poll it until its status settles, then check the site's `is_live`. ```bash cURL theme={null} # Watch the build task curl https://api.crevio.co/v1/tasks/task_def456 \ -H "Authorization: Bearer YOUR_API_TOKEN" # Then confirm the site is live curl https://api.crevio.co/v1/sites/site_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```typescript SDK theme={null} const task = await crevio.tasks.get({ id: "task_def456" }); if (task.status === "completed") { const site = await crevio.sites.get({ id: "site_abc123" }); console.log(site.is_live, site.app_url); } ``` > [!TIP] > > Prefer not to poll? Subscribe to the `task_run.completed` webhook and react when the build finishes. See [Webhooks](/docs/developer/guides/webhooks). ## Start from an existing GitHub repo Already have a codebase? Pass `repository` (an `owner/repo` you've connected) instead of a `prompt`. Crevio mounts that repo as the site's workspace, so the engineering agent — and your build/deploy pipeline — work directly against your code. ```bash theme={null} curl -X POST https://api.crevio.co/v1/sites \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "repository": "kiln-co/website", "name": "Kiln & Co Website", "access_mode": "account" }' ``` > [!NOTE] > > `prompt` is required **unless** you provide `repository`. One or the other must be present. ## Access modes and visibility `access_mode` controls who can reach the deployed site. Gating is enforced at the edge, not just in the app. | `access_mode` | Who can view the site | | - | - | | `public` | Anyone with the URL (the default for websites) | | `members` | Your customers — anyone with a customer record on your account — plus your team | | `account` | Signed-in members of your account's team | | `admins_only` | Account admins only | | `me_only` | Just you — useful while a build is in progress | The `show_referral_badge` flag toggles the "Powered by Crevio" badge. It defaults to on for all plans, and turning it off requires the Business plan — on any other plan, `PATCH /sites/{id}` with `show_referral_badge: false` returns `402` with code `plan_required` and `param: "show_referral_badge"`, and nothing in the request is applied. Turning it back on is always allowed. ### Member sessions When a viewer signs in to a deployed site, the edge sets a host-only session cookie on that site's own hostname and forwards a signed token to your app on every request as `x-crevio-user-token`. Verify it with `verifyUserToken()` from `@crevio/sdk`; it returns the viewer's id and `kind`: | `kind` | `userId` | Who | | - | - | - | | `member` | `cus_…` | One of your customers. Use this id with `access.check` and `customers.get`. | | `platform` | `user_…` | A member of your Crevio team. | A site's signed-in viewer is identified as your **customer**, not as a Crevio account — so the same person who bought from your store is the same `cus_…` id you see in orders, grants and the customer list. A **development preview** (`--preview-.crevio.app`) opens only to your Crevio team, and forwards the same header for the team member viewing it: `kind` is `platform` and `userId` is their `user_…` id. The token is bound to the preview host, so verify it without `audience`: passing the deployed site's worker name rejects it. **Sign-out** is a hosted URL on the site's own host, so a members area can link to it without owning any session code: ``` https:///__crevio/auth/logout?return_to=/ ``` It clears the site's session cookie and redirects to `return_to` (a same-origin path; anything else falls back to `/`). It ends the session on that site only — it never signs the viewer out of Crevio itself. Sessions cannot be ended from inside your app's code: the cookie is `HttpOnly` and set by the edge, which is what makes it impossible for a page to leak or forge one. Link to the URL above instead. **Billing** is a hosted URL too. It opens your store's billing page on `billing.crevio.co` for the signed-in customer: ``` https:///__crevio/billing?return_to=/dashboard ``` The customer can update their payment method and billing address, download invoices, and cancel or renew subscriptions (payment plans run to their final payment). The page's **Return** link goes back to `return_to` (a same-origin path). A signed-out visitor is sent to sign in first. Link to it with a full navigation (a plain ``), not a fetch. ## Custom domains A new site lives at `https://.crevio.app`. To put it on your own domain, attach one — either bought through Crevio or one you already own — then verify it. The full purchase-and-attach flow lives in [Domains](/docs/developer/guides/domains); the short version: ```bash theme={null} # Attach a domain you own (or bought via Crevio) to this site curl -X PATCH https://api.crevio.co/v1/domains/dom_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "site_id": "site_abc123" }' # Then verify DNS curl -X POST https://api.crevio.co/v1/domains/dom_abc123/verify \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Once verified, the site's `domain` and `domain_verified` fields update. ## The platform surface around a site Beyond the website itself, each site exposes the operational tooling Crevio runs on its behalf. ### Site analytics Pull visitor and traffic analytics for a site. ```bash theme={null} curl https://api.crevio.co/v1/sites/site_abc123/analytics \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ### Site database Sites get a real database. Inspect the schema and run read queries through the API — handy for letting an agent answer "how many signups this week?" without leaving Crevio. ```bash theme={null} # List the tables curl https://api.crevio.co/v1/sites/site_abc123/db/tables \ -H "Authorization: Bearer YOUR_API_TOKEN" # Run a query curl -X POST https://api.crevio.co/v1/sites/site_abc123/db/query \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "sql": "SELECT count(*) FROM newsletter_signups WHERE created_at > now() - interval '\''7 days'\''" }' ``` ### Site secrets (encrypted env vars) Sites need API keys and config — Stripe keys, a third-party token, a feature flag. Store them as encrypted secrets that are injected into the deployed worker as environment variables. Values are write-once-readable: list shows masked values, and you reveal a single secret explicitly. A secret takes a `name` (required), a `value` (required), and an optional `description`. The `name` must be uppercase letters, digits, and underscores, and cannot start with a digit. ```bash List theme={null} curl https://api.crevio.co/v1/sites/site_abc123/secrets \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```bash Add theme={null} curl -X POST https://api.crevio.co/v1/sites/site_abc123/secrets \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "STRIPE_SECRET_KEY", "value": "sk_live_...", "description": "Live Stripe secret key" }' ``` ```bash Reveal theme={null} curl https://api.crevio.co/v1/sites/site_abc123/secrets/STRIPE_SECRET_KEY/reveal \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```bash Remove theme={null} curl -X DELETE https://api.crevio.co/v1/sites/site_abc123/secrets/STRIPE_SECRET_KEY \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` > [!WARNING] > > The names Crevio sets on every site (`CREVIO_API_KEY`, `CREVIO_APP_URL`, `CREVIO_API_BASE_URL`, `CREVIO_AI_GATEWAY_URL`, `CREVIO_ACCOUNT_ID`, `CREVIO_SITE_AUDIENCE`, `CREVIO_JWKS_URL`, `CREVIO_SIGN_IN_URL`) can't be set by hand; any other name, including other `CREVIO_` ones, is yours. Removing a secret also removes it from the live worker. ### Deployments Every build and redeploy is recorded. List deployment history to see what's live, building, or failed. ```bash theme={null} curl https://api.crevio.co/v1/sites/site_abc123/deployments \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` > [!WARNING] > > **Deploys run asynchronously.** Triggering a deploy returns immediately and the build continues in the background — a single deploy can take several minutes. Poll the deployments list (or watch for the deploy to finish) rather than expecting a synchronous result. You'll see statuses like `building`, `live`, and `failed` with the live URL once it's up. ### Template upgrades A Crevio-hosted site keeps the storefront template it was forked from. `GET /sites/{id}/template` returns its `generation` and `template_commit`, the `latest_generation` and `latest_commit`, a pinned `archive_url` for that commit, and `upgrade_available`, which is true when the site is on an older generation or commit (or its commit can't be told). A site built from your own GitHub repo never runs the template, and the endpoint answers `422 repository_not_hosted`. The port itself is ordinary repository work: back up, port onto the new template, test on the preview, then deploy. As the last step, `POST /sites/{id}/template/confirm` records that the site now runs the current generation. It changes no code and deploys nothing. For a live site it is refused with `422 upgrade_not_live` while production runs different code from `main`, and with `422 repository_not_hosted` for a site on your own repo. Confirming needs the permission to publish sites. Asking the agent to "update my site to the latest version" runs this whole flow for you, and restores the site if anything fails. ## Next steps > **[Domains](/docs/developer/guides/domains)** > > Buy a domain and attach it to your site. > **[Tasks](/docs/developer/guides/tasks)** > > Understand the Task you poll while a site builds. > **[Webhooks](/docs/developer/guides/webhooks)** > > Get notified when a build completes instead of polling. > **[Usage & credits](/docs/developer/guides/usage-billing)** > > See how AI builds and deploys draw down credits. # Social Source: https://crevio.co/docs/developer/guides/social Connect 10+ social platforms, then publish, schedule, and manage posts and comments across all of them from a single API — or let Crevio write and schedule them for you. **Social lets you publish to ten-plus platforms — X, LinkedIn, Instagram, Facebook, YouTube, TikTok, Pinterest, Threads, Reddit, and Bluesky — through one API, with scheduling, drafts, per-platform overrides, comment management, and analytics.** You can just ask Crevio to write and schedule a week of posts, or drive it yourself: connect accounts once, then `POST /socials/posts` with your content and a list of platforms. One call fans out to every channel, and you manage the replies and analytics from the same place. ## Connect platforms Posting requires at least one connected account. Two ways to connect: ```bash OAuth (per platform) theme={null} # Returns a connect URL to send the user through curl -X POST https://api.crevio.co/v1/socials/connect \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "platform": "linkedin" }' ``` ```bash Hosted portal (all platforms) theme={null} # Returns a hosted page where the user can connect everything curl -X POST https://api.crevio.co/v1/socials/portal \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Supported platforms (use these exact lowercase values): `twitter`, `linkedin`, `instagram`, `facebook`, `youtube`, `tiktok`, `pinterest`, `threads`, `reddit`, `bluesky`. ## Publish a post `content` and `platforms` are required. Without `publish_now` or `scheduled_at`, the post is saved as a **draft**. | Field | Purpose | | - | - | | `content` | The post text (required) | | `platforms` | Array of target platforms (required) | | `publish_now` | `true` to post immediately | | `scheduled_at` | ISO-8601 time to schedule for later | | `media_urls` | Public image/video URLs | | `upload_ids` | IDs from prior `POST /socials/upload` | | `platform_data` | Per-platform overrides keyed by platform | | `youtube_type` | `SHORT` or `VIDEO` (for YouTube) | | `title` | YouTube video title or Pinterest pin title, up to 100 characters. Other platforms ignore it | ## Worked example: schedule a post to three platforms This schedules one post to LinkedIn, X, and Threads, with a LinkedIn-specific override and an attached image. ```bash cURL theme={null} curl -X POST https://api.crevio.co/v1/socials/posts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "content": "Fall portrait mini-sessions are open — booking a handful of slots only.", "platforms": ["linkedin", "twitter", "threads"], "scheduled_at": "2026-07-01T15:00:00Z", "media_urls": ["https://cdn.example.com/mini-sessions.jpg"], "platform_data": { "linkedin": { "content": "Now booking fall portrait mini-sessions for families and professionals. A limited number of slots are available this month." } } }' ``` ```typescript SDK theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN" }); const post = await crevio.socials.posts.create({ content: "Fall portrait mini-sessions are open — booking a handful of slots only.", platforms: ["linkedin", "twitter", "threads"], scheduled_at: "2026-07-01T15:00:00Z", media_urls: ["https://cdn.example.com/mini-sessions.jpg"], platform_data: { linkedin: { content: "Now booking fall portrait mini-sessions for families and professionals. " + "A limited number of slots are available this month.", }, }, }); ``` ```text MCP (agent) theme={null} Schedule a post for July 1st about my fall portrait mini-sessions to LinkedIn, X, and Threads, with a more professional spin on LinkedIn. ``` > [!TIP] > > Upload media first via `POST /socials/upload` and pass the returned IDs in `upload_ids` when you want to reuse the same asset across posts, instead of re-fetching a URL each time. ### Pinterest A Pinterest pin is an image, so a Pinterest post is rejected with `422` unless you attach media via `media_urls` or `upload_ids`. Pins also need a board. If you don't name one, Crevio pins to the first board on the connected account; pass `platform_data.pinterest.board_id` to choose, using an `id` from `GET /socials/accounts/{id}/boards`. An account with no boards at all fails with a message telling you to create one. ```bash theme={null} curl -X POST https://api.crevio.co/v1/socials/posts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "content": "Fall portrait mini-sessions are open.", "platforms": ["pinterest"], "publish_now": true, "media_urls": ["https://cdn.example.com/mini-sessions.png"], "platform_data": { "pinterest": { "board_id": "1234567890", "title": "Fall mini-sessions", "link": "https://example.com/book" } } }' ``` List the boards a connected Pinterest account can pin to: ```bash theme={null} curl https://api.crevio.co/v1/socials/accounts/sacct_abc123/boards \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Keys inside `platform_data` work in either `snake_case` or `camelCase` (`board_id` and `boardId` are the same field). ### Publish a draft later Posts created without `publish_now`/`scheduled_at` stay as drafts until you publish them. ```bash theme={null} curl -X POST https://api.crevio.co/v1/socials/posts/post_abc123/publish \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ## Manage comments Crevio surfaces incoming comments so you (or an agent) can engage without leaving the API. Reply publicly, hide spam, like, send a private reply, or delete. ```bash theme={null} # Reply to a comment curl -X POST https://api.crevio.co/v1/socials/comments/cmt_abc123/reply \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "content": "Thanks! Booking opens next week." }' # Hide / unhide curl -X POST https://api.crevio.co/v1/socials/comments/cmt_abc123/hide \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Other comment actions follow the same shape: `unhide`, `like`, `private_reply`, and `delete`. > [!TIP] > > Pair this with a [Task](/docs/developer/guides/tasks) to let Crevio triage and reply to comments automatically on a schedule. ## X (Twitter) engagement `/v1/socials/twitter/*` covers the X-only reads and engagement that have no cross-platform equivalent: searching public posts, resolving one by id or URL, and reposting, bookmarking and following with their inverses. > [!NOTE] > > Nothing under `/socials/twitter` publishes. A reply is still a post — `POST /socials/posts` with `platform_data.twitter.replyToTweetId` set to the id you found — so there is exactly one endpoint that says something publicly. Every call acts as your connected X account. `SocialAccount` holds one row per platform, so the account is unambiguous and the optional `account_id` (a `sacct_…` id) is an explicit override, not a required selector. With no X account connected you get a `404`; pointing `account_id` at a non-X account gets a `400`. | Endpoint | Purpose | | - | - | | `GET /socials/twitter/search` | Search public posts from the last 7 days | | `GET /socials/twitter/tweets/{id}` | Read one post by numeric id | | `GET /socials/twitter/tweets/lookup?id=` | Read one post by id **or** URL | | `POST`/`DELETE /socials/twitter/retweets` | Repost / undo a repost | | `POST`/`DELETE /socials/twitter/bookmarks` | Bookmark / remove a bookmark | | `POST`/`DELETE /socials/twitter/follows` | Follow / unfollow a user | ### Search `query` is passed to X unchanged, so its own operators (`from:`, `to:`, `-is:retweet`, `conversation_id:`, quoted phrases, boolean `OR`) all work. Standalone operators like `is:`, `has:` and `lang:` must be combined with a keyword or a `from:` clause. Results are cursor-paginated, and search is limited to 300 requests per 15-minute window per connected account. ```bash theme={null} curl -G https://api.crevio.co/v1/socials/twitter/search \ -H "Authorization: Bearer YOUR_API_TOKEN" \ --data-urlencode 'query=("mini sessions" OR "portrait session") -is:retweet' \ -d limit=25 -d sort_order=recency ``` | Parameter | Notes | | - | - | | `query` | Required, at most 512 characters | | `limit` | 10–100 — X rejects smaller pages | | `since_id` / `until_id` | Numeric X post ids | | `start_time` / `end_time` | ISO-8601 bounds | | `cursor` | Opaque cursor from the previous page | | `sort_order` | `recency` or `relevancy` | Each result carries `id`, `text`, `created`, `conversation_id`, `in_reply_to_tweet_id`, `lang`, `author`, and the public counts (`like_count`, `reply_count`, `retweet_count`, `quote_count`). > [!TIP] > > Poll mentions by re-running the same query with `since_id` set to the highest `id` you have already seen. Search only reaches back 7 days; **lookup does not**, which makes it the way to read the parent of a thread before replying to it. ### Lookup and engagement A tweet URL carries slashes, so it can't ride in a path segment — pass it to `tweets/lookup` as a query parameter instead. ```bash theme={null} # By URL (or by id) — not limited to the last 7 days curl -G https://api.crevio.co/v1/socials/twitter/tweets/lookup \ -H "Authorization: Bearer YOUR_API_TOKEN" \ --data-urlencode 'id=https://x.com/someone/status/1234567890123456789' # Repost, bookmark, follow — the id goes in the body curl -X POST https://api.crevio.co/v1/socials/twitter/retweets \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "tweet_id": "1234567890123456789" }' # The inverses take it in the path curl -X DELETE https://api.crevio.co/v1/socials/twitter/retweets/1234567890123456789 \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` `retweets` and `bookmarks` take `tweet_id`; `follows` takes the target's numeric `target_user_id`. Follow answers with `following` and `pending_follow` — a protected account yields a pending follow request rather than a completed follow. > [!WARNING] > > Reposting shares X's 300-per-3-hours creation budget with publishing, so a repost loop competes with your scheduled posts. ## Analytics Pull performance at the account level (across all connected channels) or for an individual post. ```bash theme={null} # Account-level analytics curl https://api.crevio.co/v1/socials/analytics \ -H "Authorization: Bearer YOUR_API_TOKEN" # A single post's analytics curl https://api.crevio.co/v1/socials/posts/post_abc123/analytics \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ## Next steps > **[Tasks](/docs/developer/guides/tasks)** > > Have Crevio write and schedule social posts on a recurring basis. > **[Images](/docs/developer/guides/ai-content)** > > Generate post visuals with AI. > **[Ads & Voice](/docs/developer/guides/ads-and-voice)** > > Turn a high-performing post into a paid ad. > **[API reference](/docs/developer/api-reference/introduction)** > > Every social endpoint and parameter. # Subscriptions & billing Source: https://crevio.co/docs/developer/guides/subscriptions-and-billing Manage recurring revenue, invoices, and refunds — cancel/pause/resume subscriptions, bill with invoices, and return money on orders. **Once buyers start paying, Crevio gives you the read-and-act surface for the money side: subscriptions, invoices, refunds, and the order record behind every purchase.** Subscriptions and orders are largely read models you act on; invoices and refunds you create. You can ask Crevio to "pause Jane's subscription until next month" or "refund order ord\_abc123" and the agent calls the same endpoints below. For automated billing flows, you'll call them directly. ## Subscriptions A subscription (`sub_...`) is created when a buyer pays for a `subscription` price variant. You don't create subscriptions over the API — you list, retrieve, and change their state. ### List and retrieve ```bash theme={null} # List subscriptions curl https://api.crevio.co/v1/subscriptions \ -H "Authorization: Bearer YOUR_API_TOKEN" # Retrieve one curl https://api.crevio.co/v1/subscriptions/sub_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ### Change subscription state Each lifecycle action is its own `POST` sub-route: | Action | Endpoint | | - | - | | Cancel | `POST /subscriptions/{id}/cancel` | | Pause | `POST /subscriptions/{id}/pause` | | Resume | `POST /subscriptions/{id}/resume` | ```bash theme={null} # Pause a subscription curl -X POST https://api.crevio.co/v1/subscriptions/sub_abc123/pause \ -H "Authorization: Bearer YOUR_API_TOKEN" # Resume it later curl -X POST https://api.crevio.co/v1/subscriptions/sub_abc123/resume \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```typescript theme={null} await crevio.subscriptions.cancel({ id: "sub_abc123" }); ``` > [!NOTE] > > Subscription lifecycle is observable via webhooks: `subscription.created`, `subscription.renewed`, `subscription.canceled`, `subscription.paused`, `subscription.resumed`, `subscription.past_due`, and `subscription.ended`. See [Webhooks](/docs/developer/guides/webhooks#available-events). ### Cancellation feedback When a customer cancels from the hosted billing page, the subscription carries what they told you in `cancellation_details` -- on `GET /subscriptions/{id}` and in the `subscription.*` webhook payloads, including `subscription.canceled`: ```json theme={null} "cancellation_details": { "reason": "too_expensive", "comment": "Money is tight this month.", "requested_at": "2026-10-20T09:14:02Z" } ``` `reason` is one of `too_expensive`, `missing_features`, `switched_service`, `unused`, `customer_service`, `too_complex`, `low_quality`, `other`, or `null` when the reason question was turned off. `cancellation_details` is `null` for a subscription that was never cancelled from the billing page, and it keeps the most recent cancellation if the customer cancelled, resumed, and cancelled again. What the billing page shows before a cancellation goes through is set on the checkout configuration (`PATCH /checkout_configuration`): | Field | Meaning | | - | - | | `cancellation_message` | Text shown first. `null` skips the step. | | `cancellation_pause_max_intervals` | Offer a pause of 1 to this many billing periods (1-12). `null` turns it off. | | `cancellation_discount` | A discount ID (`disc_...`) offered once per customer. `null` turns it off. | | `cancellation_reasons` | The reasons offered, from the list above. `[]` skips the question. Defaults to all eight. | ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/checkout_configuration \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"cancellation_pause_max_intervals": 3, "cancellation_discount": "disc_abc123"}' ``` A subscription paused from the billing page reads `"paused": true` and restarts billing on its own when the pause ends. ### Discount an existing subscription A subscription carries at most one discount, exposed as `discount` on the subscription object (an ID by default, the full object with `?expand=discount`). Set it with `PUT`, clear it with `DELETE`: ```bash theme={null} # Apply a discount (replaces any discount already on the subscription) curl -X PUT https://api.crevio.co/v1/subscriptions/sub_abc123/discount \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"discount": "disc_abc123"}' # Remove it curl -X DELETE https://api.crevio.co/v1/subscriptions/sub_abc123/discount \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Nothing is charged or refunded when you call either endpoint. The change takes effect from the **next invoice**, and how long it lasts follows the discount's `duration` (`once`, `repeating`, or `forever`). The subscription itself is untouched -- same customer, price, billing date, and access -- so use this instead of cancelling and re-creating a subscription to change what a customer pays. `PUT` is idempotent: applying the discount a subscription already has returns it unchanged. The request is rejected with `400` when the subscription has ended, is a payment plan (its total is fixed), or when the discount is inactive, expired, or restricted to price variants the subscription isn't for. ## Invoices An invoice (`inv_...`) is a request for payment you send to a customer. Create one, then the customer pays it by opening a checkout. ### Create an invoice ```bash theme={null} curl -X POST https://api.crevio.co/v1/invoices \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "customer": "cus_xyz789", "customer_name": "Jane Doe", "email_address": "jane@example.com", "price_variant": "price_abc123", "description": "Consulting session — June", "due_at": "2026-07-01T00:00:00Z" }' ``` | Field | Notes | | - | - | | `customer` | The customer id (`cus_...`) being billed. | | `customer_name` / `email_address` | Recipient details for the invoice. | | `price_variant` | The price variant (`price_...`) this invoice charges for. | | `description` | Free-text line shown on the invoice. | | `due_at` | When payment is due (date-time). | ### Pay an invoice Paying an invoice goes through a checkout — pass the invoice id as the `invoice` param: ```bash theme={null} curl -X POST https://api.crevio.co/v1/checkouts \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "invoice": "inv_abc123" }' ``` The returned checkout URL is what the customer uses to pay. See [Checkouts](/docs/developer/guides/checkouts#paying-an-invoice). ### Void an invoice To cancel an unpaid invoice: ```bash theme={null} curl -X POST https://api.crevio.co/v1/invoices/inv_abc123/void \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` > [!NOTE] > > Invoice lifecycle is observable via webhooks: `invoice.created`, `invoice.paid`, `invoice.past_due`, and `invoice.voided`. ## Refunds A refund returns money on an existing order. The only required field is the `order`; omit `amount` for a full refund, or pass an amount in cents for a partial one. ### Full refund ```bash theme={null} curl -X POST https://api.crevio.co/v1/refunds \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "order": "ord_abc123" }' ``` ### Partial refund ```bash theme={null} curl -X POST https://api.crevio.co/v1/refunds \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "order": "ord_abc123", "amount": 2000, "reason": "requested_by_customer", "notes": "Refunding one of two seats." }' ``` `amount: 2000` refunds \$20.00 of the order. The optional `reason` and `notes` are recorded with the refund. Refunds are also listable and retrievable, and emit `refund.created` / `refund.updated` webhooks. An order whose `status` is `disputed` can't be refunded: the request returns `422` with `Order is not refundable`, because Stripe rejects refunds on a disputed charge. Once the dispute is won the order is refundable again. `GET /v1/refunds` lists refunds of test purchases next to real ones, newest first. A test refund has `livemode: false`, `provider: "test"` and an id starting with `re_test_`. It moved no money and never counts toward revenue. ## Orders (the read model) An order (`ord_...`) is the record of a completed purchase or a paid subscription renewal. You don't create orders directly — they appear when a checkout is paid, and again for each paid renewal of a subscription or payment plan. Orders are made of **order items** (`ordi_...`), one per price variant purchased, and carry a **charge** (`ch_...`) for the payment. ```bash theme={null} # List orders curl https://api.crevio.co/v1/orders \ -H "Authorization: Bearer YOUR_API_TOKEN" # Retrieve one, inlining the customer and line items curl "https://api.crevio.co/v1/orders/ord_abc123?expand=customer" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Use the `expand` query param to inline related resources (e.g. `customer`) that otherwise appear as bare id strings. Individual line items are also retrievable directly via the order items endpoints. > [!TIP] > > The reliable signal that a sale is final is the `order.paid` webhook — fulfill purchases there rather than at checkout creation, since a created checkout isn't yet a paid order. > > ### Renewal orders > > Each paid renewal is its own order with `billing_reason: "subscription_cycle"`, the `subscription` id it renews, the purchase's `line_items` and `customer`, and its own `charge`, `amount` and refunds. It has `checkout: null` and empty `metadata`. The order that started the subscription has `billing_reason: "subscription_create"`, and one-time orders have `null`. Renewals send `order.created` and `order.paid` like any order, so a handler that fulfils on `order.paid` should skip `subscription_cycle` orders. See [Subscription renewals](/docs/developer/guides/webhooks#subscription-renewals). > > Refunding a renewal order returns that payment only. It doesn't touch the subscription or the buyer's access; cancel the subscription for that. > > ### Shipping and billing addresses > > An order carries the addresses the buyer entered at checkout as `shipping_address` and `billing_address`, each with `name`, `line1`, `line2`, `city`, `state`, `postal_code` and `country` (ISO 3166-1 alpha-2). Either is `null` when the checkout collected none. A shipping address is collected only when [`collect_shipping_address`](/docs/developer/guides/checkouts#account-wide-checkout-settings) is on; a billing address only when Stripe asked the buyer for one, for example to calculate tax. > > ```json theme={null} > { > "id": "ord_abc123", > "object": "order", > "shipping_address": { > "name": "Jordan Lee", > "line1": "500 Market St", > "line2": "Apt 4", > "city": "San Francisco", > "state": "CA", > "postal_code": "94105", > "country": "US" > }, > "billing_address": null > } > ``` > > A renewal order carries the addresses of the purchase that started its subscription. Both are a snapshot of what the buyer typed for that purchase, not the customer's current address, so they stay correct for shipping even if the customer moves later. Because a webhook's `data.object` is the API resource, `order.created`, `order.paid` and the refund events carry them too — a print-on-demand or fulfillment integration can place the shipment straight from the `order.paid` payload. ## Next steps > **[Checkouts](/docs/developer/guides/checkouts)** > > Create the checkouts that produce orders and pay invoices. > **[Products & pricing](/docs/developer/guides/products-and-pricing)** > > Configure subscription and payment-plan price variants. > **[Webhooks](/docs/developer/guides/webhooks)** > > Subscribe to `order.paid`, `invoice.paid`, `refund.created`, and more. > **[Commerce overview](/docs/developer/guides/commerce-overview)** > > See how subscriptions, invoices, and refunds fit the whole model. # Tasks (your AI workforce) Source: https://crevio.co/docs/developer/guides/tasks Tasks turn Crevio's AI into an autonomous workforce — standing instructions that run on a schedule or event, with the autonomy level you choose. Learn triggers, agents, approval modes, delivery, and how to respond to supervised runs. **A Task is a standing instruction you give Crevio's AI: a prompt, an agent, a schedule, and an autonomy level — persisted on your account and run automatically.** Where a single API call does one thing once, a Task does it on the trigger you choose (now, on an interval, on a cron schedule, once at a time, or whenever an event fires) and records every execution as a **Task Run** you can inspect, approve, or feed input into. This is how the agent becomes a workforce instead of a one-shot tool. Tasks have the prefix `task_` (object type `task`); runs have the prefix `trun_` (object type `task_run`). > [!NOTE] > > Tasks consume credits. Every run is one or more AI operations (messages, media generation, web research, calls), all metered pay-per-call. The Task object tracks lifetime spend in `total_credits_consumed`; each run reports its own `credits_consumed`. Check your balance with [`GET /usage`](/docs/developer/guides/api-overview). ## Anatomy of a Task `POST /v1/tasks` accepts these fields (params are top-level — no `task` wrapper): **name** `string` The task's display name. **description** `string` An optional human description. **prompt** `string` *required* What you want the agent to do — the instruction it runs every time. **trigger\_type** `enum` *required* One of `immediate`, `cron`, `interval`, `once`, `event`. See below. **agent** `enum` `business` (default) or `engineering`. Business operates your account through the API; engineering writes and ships code on a Site. **approval\_mode** `enum` `autonomous`, `supervised`, or `read_only`. Controls how much human oversight each run requires. **delivery\_methods** `array` Where results are delivered: any of `notification`, `email`, `telegram`, `discord`, `slack`. Defaults to `["notification", "email"]` when omitted; `[]` delivers nowhere. **event\_conditions** `object` For `event` triggers: filters that must match the incoming event for the task to fire. See [Events](/docs/developer/guides/events). **site\_id** `string` The Site (`site_...`) the task works on. Its repo is mounted as the agent's workspace. Defaults to your account's default site. Most relevant for the `engineering` agent. **model\_id** `string` Override the model used for the run. **cron\_expression** `string` Cron schedule (for `trigger_type: cron`). **interval\_seconds** `integer` Seconds between runs (for `trigger_type: interval`). **scheduled\_at** `date-time` When to run (for `trigger_type: once`). **timezone** `string` Timezone for `cron`/`scheduled_at`, e.g. `America/New_York`. **expires\_at** `date-time` After this time the task stops running. **active** `boolean` Whether the task is enabled. Set `false` to pause without deleting. A created Task also returns scheduling and accounting state: `next_run_at`, `last_run_at`, `total_runs_count`, `consecutive_failure_count`, and `total_credits_consumed`. ## Choosing an agent | Agent | What it does | When to use it | | - | - | - | | **`business`** (default) | Operates your business through the API: products, checkouts, customers, email, socials, web research, calls. | Marketing, ops, sales, reporting, follow-ups. | | **`engineering`** | Writes and ships code on a Site — the repo is mounted as its workspace; it can build and deploy. Scope it with `site_id`. | Website changes, bug fixes, new features, deploys. | ## Triggers `trigger_type` decides *when* a task runs. There are five, each with its own scheduling field. ### `immediate` — run once, right now Fires a single run the moment you create the task. Good for kicking off ad-hoc work asynchronously. ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Draft launch tweets", "prompt": "Write 5 launch tweets for my new pottery course and save them as social drafts.", "trigger_type": "immediate", "agent": "business", "approval_mode": "supervised" }' ``` ### `cron` — run on a cron schedule Recurring, calendar-based. Pair `cron_expression` with a `timezone`. ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Monday sales digest", "prompt": "Summarize last week’s orders, revenue, refunds, and top 5 products. Email me the report.", "trigger_type": "cron", "cron_expression": "0 9 * * MON", "timezone": "America/New_York", "agent": "business", "approval_mode": "autonomous", "delivery_methods": ["email", "notification"] }' ``` ### `interval` — run every N seconds Fixed cadence, independent of the wall clock. Set `interval_seconds`. ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Hourly inbox triage", "prompt": "Check new customer emails, label them, and draft replies to anything urgent.", "trigger_type": "interval", "interval_seconds": 3600, "agent": "business", "approval_mode": "supervised", "delivery_methods": ["slack"] }' ``` ### `once` — run a single time at a future moment Schedule a one-off with `scheduled_at`. ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Black Friday price drop", "prompt": "Apply the BLACKFRIDAY discount to all active courses and announce it on social.", "trigger_type": "once", "scheduled_at": "2026-11-27T13:00:00Z", "timezone": "America/New_York", "agent": "business", "approval_mode": "autonomous" }' ``` ### `event` — run when something happens The task lies dormant until a matching event fires (e.g. `order.paid`). Constrain *which* events trigger it with `event_conditions`. ```bash theme={null} curl -X POST https://api.crevio.co/v1/tasks \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Welcome new buyers", "prompt": "When an order is paid, send the buyer a personalized welcome email and add them to the onboarding sequence.", "trigger_type": "event", "event_conditions": { "event": "order.paid" }, "agent": "business", "approval_mode": "autonomous" }' ``` See the [Events guide](/docs/developer/guides/events) for the full list of subscribable events and how `event_conditions` works. ## Autonomy: `approval_mode` `approval_mode` is the human-in-the-loop dial. It decides whether a run can act on its own, must pause for your approval, or can only observe. | Mode | Behavior | | - | - | | **`autonomous`** | The agent runs end-to-end and takes actions (writes, sends, deploys) without asking. Best for trusted, well-scoped tasks. | | **`supervised`** | The agent pauses at decisions that require approval. The run enters a **needs-input** state and waits for you to approve, deny, or provide input before continuing. | | **`read_only`** | The agent can read and analyze but cannot make changes. Best for reporting, audits, and research. | ### The supervised loop A supervised run pauses instead of acting, which fires the `task_run.needs_input` [webhook event](/docs/developer/guides/webhooks) (and notifies you via your `delivery_methods`). You review it in the Crevio dashboard — approving the pending action or giving the agent direction — and it resumes from where it stopped. The cycle: **1. Run starts and reaches a checkpoint** The agent does its work until it hits an action that needs approval (or it needs information from you). **2. Run pauses in needs\_input** The Task Run status becomes `needs_input`; `task_run.needs_input` fires and you're notified. **3. You review and respond in the dashboard** Approve the pending action or give the agent more direction from the Crevio dashboard or notification. (Over the API you can read run state and update its `status`/`summary` — see below.) **4. Run resumes** The agent continues from the checkpoint and completes (or pauses again at the next one). A parked run waits up to 7 days. After that Crevio denies its pending approvals, closes the run as `failed`, and notifies you through the task's `delivery_methods`; run the task again when you're ready. ## Task Runs Each execution of a Task is a Task Run (`trun_`, object type `task_run`). Runs are read-mostly: you **list** and **get** them to inspect what happened, and **PATCH** them to update their `status`/`summary`. ### The run object | Field | Description | | - | - | | `task_id` | The parent task (`task_...`). | | `status` | Lifecycle state (e.g. running, needs-input, completed, failed). | | `summary` | The agent's natural-language summary of what it did. | | `error_message` | Populated when the run failed. | | `input_tokens` / `output_tokens` | Token usage for the run. | | `credits_consumed` | Credits this run cost, including images, voice and video it generated. While the run is live it shows what has been charged so far: model usage is added when the agent's turn ends. | | `tool_calls_count` | How many API/tool calls the agent made. | | `duration_ms` | Time the agent spent working, in milliseconds, summed across every resumed segment. Time parked in `needs_input` is not counted; use `created_at` and `completed_at` for wall clock. | | `started_at` / `completed_at` | Timestamps. | | `result`, `json`, `json_error`, `artifacts` | On `GET /task_runs/{id}` only, once the run settled: the agent's full final reply (up to 24,000 characters), the reply validated against a `response_format` the run was [started with](/docs/developer/guides/api-overview#handing-the-agent-work), and the files it delivered. | ### List and get runs **cURL** ```bash theme={null} # List recent runs (optionally filter by task) curl https://api.crevio.co/v1/task_runs \ -H "Authorization: Bearer YOUR_API_TOKEN" # Get one run curl https://api.crevio.co/v1/task_runs/trun_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` **MCP (agent)** ```js theme={null} // Inside run_script const { data } = await tools.crevioApi.listTaskRuns({}); data.filter((r) => r.status === "needs_input").map((r) => ({ id: r.id, summary: r.summary })) ``` List responses use the standard envelope: `{ "object": "list", "data": [...], "has_more": bool }`. `GET /task_runs` filters by `task_id`, by `status` (one or a comma-separated list of `pending`, `running`, `completed`, `failed`, `needs_input`, `timed_out`, `unknown` and `skipped`), and by `created_after`, an ISO 8601 timestamp. Results are newest first. ### Watch every task in one call To check on the whole account, don't list runs task by task. Two calls cover it: ```bash theme={null} # Everything that went wrong in the last 15 minutes, across all tasks curl "https://api.crevio.co/v1/task_runs?status=failed,timed_out&created_after=2026-09-30T09:45:00Z" \ -H "Authorization: Bearer YOUR_API_TOKEN" # Or each task with its newest runs inline curl "https://api.crevio.co/v1/tasks?limit=100" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` Every task object carries `recent_runs`: its newest executed runs, at most five and newest first, each with `id`, `status`, `created_at`, `completed_at`, `error_message` (cut to 500 characters) and `chat_id`. Skipped and test runs are left out, so a task whose `recent_runs` are all `failed` really has been failing. A task created with an immediate run returns that run here straight away. ### Updating a run's state `PATCH /v1/task_runs/{id}` updates a run's state. The body accepts: **status** `enum` `pending`, `running`, `completed`, `failed`, or `needs_input`. **summary** `string | null` The run's summary text. **error\_message** `string | null` An error message for a failed run. **input\_tokens** `integer` Recorded input token count. **output\_tokens** `integer` Recorded output token count. For a run paused in `needs_input`, you resume or close it out by PATCHing `status` (and optionally `summary`/`error_message`) — for example set `status` to `running` to release it, or to `completed`/`failed` to close it. ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/task_runs/trun_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "status": "completed", "summary": "Reviewed and approved — sent the broadcast to paid customers." }' ``` > [!NOTE] > > The API lets you **read run state and update `status`/`summary`** — there is no field for sending free-form instructions back to the agent. The interactive back-and-forth for a supervised run (approving a pending action or giving the agent more direction in plain English) happens in the **Crevio dashboard and notifications**, not over the API. > [!TIP] > > Don't poll for paused runs — subscribe to the `task_run.needs_input`, `task_run.completed`, and `task_run.failed` [webhook events](/docs/developer/guides/webhooks) and react as they arrive. ## Managing tasks ```bash theme={null} # Pause a task without deleting it curl -X PATCH https://api.crevio.co/v1/tasks/task_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "active": false }' # Delete a task curl -X DELETE https://api.crevio.co/v1/tasks/task_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` A delete returns `{ "id": "task_abc123", "object": "task", "deleted": true }`. ## Limits Every value below is also returned live by [`GET /v1/status`](/docs/api-reference/status/get-api-status) under `limits`, so you can read the current numbers rather than hard-coding these. ### Concurrency | | Limit | What happens past it | | - | - | - | | Active runs per task | **1** | A second start (scheduled, `run_now`, or a test run) is refused while one is in flight. The next scheduled tick retries. | | Active runs per account | **5** | Further runs are deferred, not dropped — the dispatcher re-considers them on its next tick, and manual starts return `422`. | "Active" means `pending`, `running`, or `needs_input` — a run parked on an approval still occupies its slot, so resolve or cancel it to free capacity. `POST /v1/task_runs/{id}/cancel` stops any active run, along with its image, audio and video generations still in flight. Stopping is asynchronous: a run mid-step finishes that step first, so the response may still read `running` with `cancel_requested_at` set; it then settles as `cancelled` and fires `task_run.cancelled`. A cancelled run is not a failure: it doesn't count toward the task's failure streak and doesn't trigger tasks chained on `task_run.failed`. Repeating the call is harmless. ### Runtime | | Limit | | - | - | | Maximum run duration | **4 hours**, after which the run ends as `timed_out` | | `condition_script` | 15s, 10,000 characters | | `pre_run_script` | 30s, 10,000 characters | | Task `prompt` | 10,000 characters | A turn itself is deliberately uncapped below that 4-hour ceiling — a site build can legitimately run for a long time. The ceiling exists so a wedged run can't spin forever, and it is reported as `timed_out` rather than `failed` so you can tell "it never finished" from "it broke". ### Truncation Values a run produces are bounded before they reach the model, so a large result is trimmed rather than rejected: | | Limit | | - | - | | Script and command output | \~10,000 tokens each | | Triggering event payload in run context | 8,000 characters | | Run `summary` | 500 characters | | `error_message` | 1,000 characters | ## Next steps > **[Events & Event Sources](/docs/developer/guides/events)** > > Fire event-Tasks from internal events and third-party apps. > **[AI & Agents overview](/docs/developer/guides/agents-overview)** > > How Tasks fit into Crevio's broader agentic model. > **[Webhooks](/docs/developer/guides/webhooks)** > > Get notified when runs complete, fail, or need your input. > **[Usage & credits](/docs/developer/guides/api-overview)** > > See how task runs are metered and check your balance. # Usage & billing Source: https://crevio.co/docs/developer/guides/usage-billing Crevio is metered pay-per-call on credits — check your balance, forecast and spend (by operation, day and chat) with GET /usage, see per-charge history with GET /usage/transactions, and price AI media generation. **The Crevio API is metered pay-per-call: AI work is billed in credits drawn from your account balance.** Plain CRUD (listing products, reading orders) is cheap or free; the spend comes from AI operations — chat messages, media generation, Tasks, web research, and phone calls. Two endpoints give you full visibility: `GET /usage` for your plan, balance, forecast and a breakdown of your spend, and `GET /usage/transactions` for the individual metered charges behind it. ## Check your balance and spend `GET /usage` returns your plan, remaining credit balance and where it came from, a forecast of whether the balance lasts until your billing cycle ends, and your spend over a window (the current billing cycle unless you pass `start_time`/`end_time`) broken down by operation, by day, and by the chats and scheduled tasks that spent the most. For a common window, pass `period` instead of timestamps: `cycle` (the default), `today`, `last_7_days`, `last_30_days`, `this_month` or `last_month`. Days are counted in your time zone, and `last_7_days` and `last_30_days` include today. `period` can't be combined with `start_time` or `end_time`. ```bash theme={null} curl "https://api.crevio.co/v1/usage?period=last_30_days" -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` **cURL** ```bash theme={null} curl "https://api.crevio.co/v1/usage?start_time=2026-06-18T00:00:00Z&end_time=2026-06-25T00:00:00Z" \ -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` **SDK (TypeScript)** ```typescript theme={null} const usage = await crevio.usage.get({ startTime: new Date("2026-06-18T00:00:00Z"), endTime: new Date("2026-06-25T00:00:00Z") }); console.log(usage.credits.balance, usage.spend.byChat); ``` **MCP (agent)** ```text theme={null} How many Crevio credits do I have left, and what's been using them this week? ``` An example response (Business plan, a 7-day window, `by_day` trimmed to three days): ```json theme={null} { "object": "usage", "plan": { "name": "Business", "status": "active", "is_paid": true, "on_trial": false, "trial_ends_at": null, "renews_at": "2026-07-01T00:00:00Z", "price": 5000, "currency": "usd", "interval": "month", "has_payment_method": true }, "credits": { "balance": 1840, "plan_credits": 1240, "top_up_credits": 500, "bonus_credits": 100, "monthly_allowance": 2500, "limit_reached": false, "auto_top_up": false }, "spend": { "period_start": "2026-06-18T02:00:00+02:00", "period_end": "2026-06-25T02:00:00+02:00", "time_zone": "Europe/Paris", "total_credits": 410, "today_credits": 35, "by_operation": [ { "operation": "ai_message", "description": "AI message", "credits": 340 }, { "operation": "image_generation", "description": "Image generation", "credits": 50 }, { "operation": "web_operation", "description": "Web search & scraping", "credits": 20 } ], "by_day": [ { "date": "2026-06-22", "credits": 120 }, { "date": "2026-06-23", "credits": 0 }, { "date": "2026-06-24", "credits": 35 } ], "by_chat": [ { "type": "task", "id": "aitask_…", "title": "Weekly newsletter", "credits": 180, "runs": 2, "last_charged_at": "2026-06-22T09:04:00Z" }, { "type": "chat", "id": "aichat_…", "title": "New homepage banner", "credits": 95, "runs": null, "last_charged_at": "2026-06-24T13:02:00Z" } ] }, "forecast": { "burn_rate_per_day": 58.6, "runs_out_at": "2026-07-26T08:00:00Z", "projected_balance_at_period_end": 1430, "will_run_out": false } } ``` **plan** `object` Your current plan: `name`, `status`, `is_paid`, `on_trial`, `trial_ends_at`, `renews_at`, and its `price` (in cents, per `interval`) and `currency`. `has_payment_method` says whether a card is on file. **credits** `object` `balance` is what's left. `plan_credits`, `top_up_credits` and `bonus_credits` split it by where it came from: a paid plan's credits expire when the billing cycle renews, top-ups and bonuses don't. `monthly_allowance` is what the plan grants each month, `limit_reached` is true once the balance hits zero, and `auto_top_up` says whether the account refills itself. **spend** `object` Spend between `period_start` (inclusive) and `period_end` (exclusive): `total_credits`, `today_credits` (always today, whatever the window), `by_operation[]`, `by_day[]` (every day of the window up to today, in `time_zone`, zero days included), and `by_chat[]` — the 10 chats and scheduled tasks that spent the most, with every run of a task summed under the task. `by_chat` lists only chats you can read and leaves out charges not tied to a chat (API calls, web operations), so it can sum to less than `total_credits`. **forecast** `object` The last 7 days' spend rate (or since the billing cycle began, if sooner): `burn_rate_per_day`, the moment the balance `runs_out_at` at that rate, the `projected_balance_at_period_end` of the billing cycle, and `will_run_out` before it renews. `start_time` (inclusive) and `end_time` (exclusive) are ISO 8601 timestamps. Omit them for the current billing cycle, or the calendar month without a subscription; for the previous cycle, pass the current `period_start` as `end_time` and one cycle earlier as `start_time`. A window can't exceed 366 days. Write times in UTC (`Z`) or URL-encode the `+` of an offset, which a query string otherwise reads as a space. The window only moves `spend`: `credits`, `plan` and `forecast` always describe the current billing cycle. Days are cut in your time zone, else the account's. ## See individual charges `GET /usage/transactions` lists each metered charge so you can attribute spend precisely. ```bash theme={null} curl "https://api.crevio.co/v1/usage/transactions?limit=20" \ -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` It returns the standard list envelope (`object: "list"`, `data`, `has_more`) — paginate it with `limit` and `starting_after` like any other [list endpoint](/docs/developer/guides/conventions#pagination). ## List plans `GET /plans` returns the pricing catalog as the pricing page sells it — one entry per plan and billing interval — read from the same records that bill the account, so you never have to hardcode a price or a limit. ```bash theme={null} curl https://api.crevio.co/v1/plans \ -H "Authorization: Bearer $CREVIO_API_TOKEN" ``` An example entry (tiers and limits trimmed): ```json theme={null} { "object": "plan", "id": "plan_abc123", "name": "Pro", "interval": "month", "currency": "usd", "trial_period_days": 0, "tiers": [ { "credits": 1000, "price": 2000, "current": true }, { "credits": 2500, "price": 5000, "current": false } ], "features": ["custom_domain", "team_invitations", "webhooks"], "limits": [ { "name": "marketing_emails_per_day", "value": 100 }, { "name": "active_products", "value": null } ] } ``` **tiers** `array` Each credit tier of the plan, smallest first: its `credits` and its `price` in the smallest currency unit (cents) per `interval`. The tier this account is subscribed to has `current: true`. **features** `string[]` What the plan unlocks: any of `custom_domain`, `team_invitations`, `webhooks`, `api_access` and `remove_branding`. **limits** `array` Every quota by `name` — `active_products`, `sites`, `storage_megabytes`, `marketing_emails_per_day`, `voice_calls_per_day` and more — with its `value` on this plan. `null` means unlimited. The response is a single page (`has_more: false`). Pair it with `GET /usage`, whose `plan` says which plan the account is on now. ## What consumes credits Operations that run AI or external compute are metered: | Operation | What it covers | | - | - | | AI messages | Chat and agent reasoning turns. | | Image generation | Generating, editing, and upscaling images (`POST /images/generate`, `/images/edit`, `/images/upscale`). | | Video generation | `POST /videos/generate`. | | Text to speech | Voice notes and `POST /audio/generate`. | | Audio transcription | The agent transcribing audio and video files. | | Video analysis | The agent watching a video to describe or answer questions about it. | | X mentions | Reading new mentions of your connected X account for an [`x.mention.received`](/docs/developer/guides/events#internal-events) task, at X's per-read price. | | Tasks | Each Task run (your scheduled AI workforce). | | Web research | `POST /web/research` and other `/web/*` tools. | | Phone calls | AI inbound/outbound calls (`POST /calls`), billed per minute. | Reading and managing your own data (products, orders, customers, webhooks) is not AI-metered. ## AI media pricing Media generation is priced in **USD** per unit and converted to credits. Pick the cheapest model that meets your quality bar — the default is the most economical. ### Images (per megapixel, unless noted) | Model | Price | | - | - | | `fal-ai/nano-banana-2` (default) | \$0.08 / image | | `fal-ai/bytedance/seedream/v4.5/text-to-image` | \$0.04 / image | | `fal-ai/z-image/turbo` | \$0.005 / MP | ### Video (per second, unless noted) | Model | Price | | - | - | | Kling v1.6 standard (text-to-video) | \$0.056 / s | | Kling v1.6 pro (image-to-video) | \$0.098 / s | | MiniMax `video-01` | \$0.50 / video | | Luma Dream Machine | \$0.50 / video | ### Audio / TTS (per 1,000 characters) | Model | Price | | - | - | | ElevenLabs `multilingual-v2` (default) | \$0.10 / 1k chars | | ElevenLabs `turbo-v2.5` | \$0.05 / 1k chars | | MiniMax `speech-02-hd` | \$0.10 / 1k chars | > [!TIP] > > Generated media lands in your Media Library as a `file_…` id you can reuse — for example in a product's `images` array. Always reuse the file id rather than re-generating. > [!NOTE] > > Run `GET /images/models`, `GET /videos/models`, and `GET /audio/models` for the live model list — new models appear there before this table is updated. ## Next steps > **[Conventions](/docs/developer/guides/conventions)** > > List envelopes and pagination apply to transactions too. > **[Errors](/docs/developer/guides/errors)** > > How balance and rate issues surface. > **[MCP & agents](/docs/developer/mcp)** > > Tasks and agent work are the main credit consumers. > **[API reference](/docs/developer/api-reference/introduction)** > > Full usage and media generation schemas. # Versioning & deprecation Source: https://crevio.co/docs/developer/guides/versioning How the Crevio API is versioned, what we promise not to break, and how a deprecation is announced — the Deprecation and Sunset response headers, and the timeline behind them. **Crevio versions its API in the URL path, and never removes anything without announcing it in the response itself.** An integration written against `/v1` today keeps working; when something is on its way out, the responses tell you before the docs do. ## The version is in the path Every REST endpoint lives under a version prefix: ``` https://api.crevio.co/v1/products ``` There is one live version, `v1`. The [MCP server](/docs/developer/mcp/connection) and the [`@crevio/sdk`](/docs/developer/guides/sdk) client speak the same version — the SDK pins it for you. ## What is a breaking change We treat these as breaking, and they only ship in a new version prefix: * Removing an endpoint, a field, or an enum value * Renaming an endpoint, a field, or an `operationId` * Making an optional request field required, or narrowing an accepted type * Changing the type or meaning of an existing response field * Removing or repurposing a webhook event These are **not** breaking, and can ship to `v1` at any time — write clients that tolerate them: * Adding a new endpoint, an optional request field, or a response field * Adding a new enum value to a field already documented as extensible * Adding a new webhook event type * Changing the wording of an error `message` (the `type` and `code` are stable) * Changing the ordering of results where no order is documented > [!TIP] > > Ignore response fields you do not recognise rather than failing on them. The > SDK already does this. ## How a deprecation is announced When an endpoint or field is scheduled for removal, every response from it carries two standard headers: | Header | Meaning | | - | - | | `Deprecation` | A structured-field date ([RFC 9745](https://www.rfc-editor.org/rfc/rfc9745)) — an `@` followed by a Unix timestamp — marking when the resource became deprecated. Its presence alone is the signal. | | `Sunset` | An HTTP date ([RFC 8594](https://www.rfc-editor.org/rfc/rfc8594)) after which the resource stops responding. | | `Link` | A `rel="deprecation"` link to the documentation explaining the replacement. | ```http theme={null} HTTP/1.1 200 OK Deprecation: @1775001600 Sunset: Thu, 01 Oct 2026 00:00:00 GMT Link: ; rel="deprecation" ``` The guarantee: **at least six months between `Deprecation` and `Sunset`**, and the replacement is live and documented before the `Deprecation` header appears. Nothing is removed without both headers having been served for that whole window. > [!WARNING] > > Agents and long-running integrations should log the presence of a `Deprecation` > header and surface it. It is the only warning you get that is delivered in-band. ## Checking programmatically ```bash theme={null} curl -sI https://api.crevio.co/v1/products \ -H "Authorization: Bearer $CREVIO_API_KEY" \ | grep -iE 'deprecation|sunset' ``` No output means nothing you are calling is scheduled for removal. ## Machine-readable surfaces The [OpenAPI description](/docs/developer/guides/api-overview) marks a deprecated operation or field with `"deprecated": true` before the header ever appears, so a generated client can warn at build time: ``` https://crevio.co/docs/developer/api-reference/openapi.json ``` # Webhooks Source: https://crevio.co/docs/developer/guides/webhooks Receive real-time HTTP notifications when events happen in your Crevio account — orders, payments, leads, AI task runs, email, and more. **Webhooks push events to your server the moment they happen — no polling.** You register an HTTPS endpoint, choose which events to receive, and Crevio sends a signed JSON `POST` whenever one fires. Use them to sync data, trigger your own automations, fulfill purchases, and feed analytics — anything where your code needs to react to something happening in Crevio. > [!NOTE] > > Webhooks notify **your** server so **your** code acts. If you instead want **Crevio's AI** to act on an event, use an event-triggered [Task](/docs/developer/guides/tasks). See [How webhooks differ from event-triggered Tasks](#how-webhooks-differ-from-event-triggered-tasks). ## Creating an endpoint Create endpoints from the dashboard, via the [API](/docs/developer/guides/api-overview), or with the [TypeScript SDK](/docs/developer/guides/sdk). ### Via dashboard **1. Open Developer settings** In your dashboard, go to **Settings → Developer**. **2. Create a new endpoint** Click **New webhook endpoint** and enter the HTTPS URL that should receive events. (HTTP is allowed only in local development.) **3. Select events** Choose which event types to subscribe to, individually or all at once. **4. Save and copy the secret** Crevio generates a **signing secret** (prefixed `whsec_`) shown once. Copy it now — you'll use it to verify incoming requests. ### Via API Like every Crevio endpoint, params go at the **top level** (no `{"webhook_endpoint": {...}}` wrapper). Subscribe with `enabled_events`. **cURL** ```bash theme={null} curl -X POST https://api.crevio.co/v1/webhook_endpoints \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com/webhooks/crevio", "status": "active", "enabled_events": ["order.paid", "checkout.created"] }' ``` **SDK (TypeScript)** ```typescript theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ apiKeyAuth: "YOUR_API_TOKEN" }); const endpoint = await crevio.webhookEndpoints.create({ url: "https://example.com/webhooks/crevio", status: "active", enabledEvents: ["order.paid", "checkout.created"], }); ``` The response includes a `secret` — returned **only on creation**: ```json theme={null} { "id": "wh_abc123", "object": "webhook_endpoint", "url": "https://example.com/webhooks/crevio", "api_version": "v1", "status": "active", "enabled_events": ["order.paid", "checkout.created"], "secret": "whsec_...", "created_at": "2026-06-21T10:30:00Z", "updated_at": "2026-06-21T10:30:00Z" } ``` > [!WARNING] > > Copy your signing secret immediately. It's shown once on creation and cannot be retrieved later — you'll need it to verify signatures. The `url` can point at a Crevio site that only signed-in visitors can open, on any path. Crevio's deliveries to your own account's sites pass its sign-in check, while anyone else is still asked to sign in. Verify the signature in your handler all the same, as you would on a public site. List the available event types programmatically: ```bash theme={null} curl https://api.crevio.co/v1/webhook_endpoints/events \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ## Testing an endpoint Send a synthetic event to any active endpoint to verify your handler: ```bash theme={null} curl -X POST "https://api.crevio.co/v1/webhook_endpoints/wh_abc123/test?event_type=order.paid" \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` `event_type` must be one the endpoint is subscribed to. A test delivery is signed like a real one, but it carries `"test": true`, `"livemode": false` and an **empty** `data.object` — acknowledge it as soon as the signature checks out, or your own validation will fail a test that was never going to carry an order. The response is what your server answered, so a handler that rejects the event tells you why: ```json theme={null} { "delivered": false, "response_code": 401, "response_body": "{\"error\":\"invalid signature\"}", "message": "HTTP 401: Unauthorized" } ``` ```javascript theme={null} // verify first, then: if (event.test) return new Response(null, { status: 204 }); ``` `delivered` is `true` for any `2xx`. If nothing answers at all — DNS failure, refused connection, timeout — the call returns `502` instead. The test event is signed like a real one, so it exercises your signature check. You can also test from the dashboard: **Settings → Developer → Send test**, then pick an event type. Test deliveries include `"test": true` in the body and are **not** persisted to your delivery history. > [!TIP] > > Use [webhook.site](https://webhook.site) or [ngrok](https://ngrok.com) during development to inspect payloads without standing up a server. ### Testing a paid order end to end A test event proves your endpoint is reachable and your secret is right. To run your real fulfillment code on a real order without charging a card, make a **test purchase**: **1. Create the checkout the way your site does** `POST /v1/checkouts` with your line items and `metadata`, exactly as in production. See [Checkouts](/docs/developer/guides/checkouts). **2. Complete it as a test purchase** `POST /v1/checkouts/{id}/test_purchase` with a key or OAuth token of an account admin. Or open its `purchase_url` in a browser signed in to Crevio as an admin of the store: the card form is replaced by a **Test purchase** notice. **3. Watch your endpoint** No card is charged and Stripe is not called. Crevio creates the order and sends `order.created` and `order.paid` to your endpoint, plus `subscription.created` when the checkout starts a subscription. Each checkout can be completed once, so create a new one for every run. An account can place 5 test purchases a minute. These are ordinary events, not test events: they have no `test` flag, they are signed and retried like any other, and `data.object` is the full order. The checkout's `metadata` is copied onto the order, so the key your site saved before checkout comes back in the event. What marks the order as a test is `livemode`. It is on the event itself and on the order: ```json theme={null} { "type": "order.paid", "livemode": false, "data": { "object": { "id": "ord_xyz789", "object": "order", "livemode": false, "status": "succeeded", "metadata": { "order_number": "CC-1042" } } } } ``` Branch on the event's `livemode` wherever your handler acts on the outside world. Every event has it, including events whose `data.object` has no `livemode` of its own, so one check covers all of them: ```javascript theme={null} if (!event.livemode) { // send the confirmation and the kitchen ticket to yourself only, and skip fulfillment } ``` The order's customer is the signed-in owner who made the test purchase, not the `email` or `customer` on the checkout, so Crevio's own receipt goes to you. A test order uses up no stock and doesn't count toward sales. Its `amount` is what the checkout would have charged, and `charge` is `null`. The rest of the order's life works without Stripe too, and every event it sends has `livemode: false`: | You do | Your endpoint gets | | - | - | | Refund the test order from the dashboard or `POST /v1/refunds` | `refund.created`, then `refund.updated` once the order is `refunded` or `partially_refunded`. The refund's id starts with `re_test_` | | Wait for a test subscription's period to end | `order.created` and `order.paid` for the [renewal order](#subscription-renewals), then `subscription.renewed` | | Cancel the test subscription and wait for its period to end | `subscription.ended` | Test subscriptions renew and end on an hourly check, so `subscription.renewed` and `subscription.ended` can arrive up to an hour after the period closes. A test renewal sends no renewal receipt, because nothing was charged. `GET /v1/refunds` and `GET /v1/refunds/{id}` return test refunds too, with `livemode: false`. > [!WARNING] > > The event goes to the URL registered on your endpoint, nowhere else. If your site has a preview copy with its own database, an order saved there will not be found by the live site when the event arrives. Test from the site your endpoint points to. There is no Stripe test mode for checkouts, so test card numbers like `4242 4242 4242 4242` are declined. A test purchase covers everything except the card charge itself. ## Available events These are the event types you can subscribe to via `enabled_events`. Each has a dedicated page under **Webhook Events** in the [API reference](/docs/developer/api-reference/introduction) showing its exact payload. ### Commerce | Event | Fires when | | - | - | | `checkout.created` | A checkout session is created | | `order.created` | An order is created | | `order.paid` | An order is paid | | `order.disputed` | The buyer disputes the payment with their bank (a chargeback or an early inquiry) | | `order.dispute_closed` | A dispute is closed, won or lost | | `refund.created` | A refund is issued | | `refund.updated` | A refund's status changes | | `invoice.created` | An invoice is created | | `invoice.paid` | An invoice is paid | | `invoice.past_due` | An invoice passes its due date | | `invoice.voided` | An invoice is voided | | `subscription.created` | A customer completes checkout for a subscription | | `subscription.renewed` | A recurring payment succeeds | | `subscription.canceled` | A subscription is set to end when its current period closes | | `subscription.paused` | Payment collection is paused | | `subscription.resumed` | A paused or canceled subscription is resumed | | `subscription.past_due` | A renewal payment fails and retries begin | | `subscription.ended` | A subscription has ended and access is revoked | `subscription.canceled` means the customer keeps access until `ends_at`. A subscription that is canceled immediately skips it and sends only `subscription.ended`. These events fire however the change was made — the API, the customer's billing portal, or Stripe. ### Subscription renewals Every paid renewal of a subscription or payment plan is recorded as a new order. Each one sends `order.created` and `order.paid`, then `subscription.renewed`. Tell a renewal apart from a purchase by the order's `billing_reason`, named as Stripe names the invoice: | `billing_reason` | The order is | | - | - | | `subscription_create` | The purchase that started the subscription | | `subscription_cycle` | A paid renewal | | `null` | A one-time purchase | Both subscription values come with `subscription`, the id of the subscription (`sub_…`) the order started or renewed. A renewal order has the purchase's `line_items` and `customer`, its own `charge` and `amount`, `checkout: null`, and empty `metadata`: the metadata you set on the checkout stays on the purchase order, so your own order numbers are never reused. A handler that fulfils purchases on `order.paid` should branch on it, or every renewal will look like a new sale: ```javascript theme={null} if (event.type === "order.paid") { const order = event.data.object if (order.billing_reason === "subscription_cycle") { // record the payment against order.subscription; don't ship or grant again } else { // fulfil the purchase } } ``` A renewal paid in full by a discount charges nothing and creates no order, but still sends `subscription.renewed`. A subscription that starts with a free trial has no payment to tie it to an order, so its `order` is `null`. `customer` is always present. ### Leads & customers | Event | Fires when | | - | - | | `lead.created` | A new lead is captured | | `form_submission.created` | A form submission is received | | `form_submission.confirmed` | A pending submission is confirmed (double opt-in) | | `customer.confirmed` | A customer confirms their email (double opt-in) | | `customer.tag_added` | A tag is added to a customer | | `customer.tag_removed` | A tag is removed from a customer | Filter on `data.tag.id` to react to one specific tag. Bulk CSV imports and deleting a tag outright do not send per-customer tag events. ### Catalog | Event | Fires when | | - | - | | `product.created` | A product is created | | `product.updated` | A product is updated | ### Calls | Event | Fires when | | - | - | | `call.started` | An outbound call starts dialing, or an inbound call reaches your number | | `call.ended` | A call ends, fails, or goes unanswered | `data.object` is the same [call](/docs/developer/guides/ads-and-voice#voice) `GET /v1/calls/:id` returns. On `call.ended`, read `status` (`ended` or `failed`) and `ended_reason` to tell a finished call from one nobody picked up. `transcript`, `duration_seconds` and `credits_charged` are final; `summary` is written by a separate analysis a few seconds later, so fetch the call again if you need it. A call that fails before it is dialed (a suppressed number, or not enough credits) sends only `call.ended`. A call handed to a person sends `call.ended` once the person's leg hangs up, not when the AI voice does. Calls you take in the browser with your own assistant are not phone calls and send neither event. ### AI Tasks & Jobs | Event | Fires when | | - | - | | `task.created` | An AI task is created | | `task_run.completed` | A task run finishes successfully | | `task_run.failed` | A task run fails | | `task_run.needs_input` | A supervised task run is awaiting input | | `job.completed` | A background job (e.g. media generation) completes | | `job.failed` | A background job fails | ### Email | Event | Fires when | | - | - | | `email_message.received` | An inbound email is received | | `email_message.sent` | An email is sent | | `email_message.delivered` | An email is delivered | | `email_message.bounced` | An email bounces | | `email_message.complained` | A recipient marks an email as spam | | `email_message.failed` | An email fails to send | ### Social | Event | Fires when | | - | - | | `x.mention.received` | New posts mention your connected X account. Polled every five minutes, and only while the account has an active task triggered by this event — see [Mentions of your X account](/docs/developer/guides/events#mentions-of-your-x-account) | ## Payload format Every delivery is an HTTP `POST` with a JSON body in this shape: ```json theme={null} { "id": "whev_abc123", "object": "event", "created_at": "2026-06-21T10:30:00Z", "type": "order.paid", "livemode": true, "api_version": "v1", "data": { "object": { "id": "ord_xyz789", "object": "order", "livemode": true, "status": "succeeded", "amount": 4900, "currency": "usd", "customer": { "id": "cus_abc123", "object": "customer", "email": "john@example.com" }, "created_at": "2026-06-21T10:29:55Z" } } } ``` | Field | Description | | - | - | | `id` | Unique id for this event (`whev_…`) — use it to deduplicate | | `object` | Always `event` | | `created_at` | ISO 8601 timestamp the event was created | | `type` | The event type (e.g. `order.paid`) | | `livemode` | `false` when a test purchase or a dashboard test event caused the event, `true` otherwise | | `api_version` | The payload version this endpoint is pinned to — see [Versioning](#versioning) | | `data.object` | The resource the event is about | `data.object` is the resource exactly as the API returns it — an `order.paid` event carries the same object as `GET /v1/orders/{id}`, so one parser handles both. References are ids you can fetch (`checkout`, `order`), and the ones you almost always need arrive already expanded: `customer` on checkout, order, refund, invoice and subscription events, plus `line_items` on orders and `order.line_items` on subscriptions. Refund events carry the refunded `order` as `data.object` — its `amount_refunded` and `status` reflect the refund. Dispute events carry the disputed `order`. On `order.disputed` its `status` is `disputed`. On `order.dispute_closed` the `status` tells you the outcome: back to `succeeded` (or `partially_refunded`) when the dispute was won or the inquiry closed, still `disputed` when it was lost. A lost dispute also removes the buyer's access, as a full refund does, except on a renewal order: access there comes from the subscription, which keeps running. Tag events carry the customer as `data.object` and the tag that was added or removed as `data.tag`. ## Delivery history Each delivered event is persisted as a **webhook event** you can inspect. List your delivery history: ```bash theme={null} curl https://api.crevio.co/v1/webhook_events \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` ```json theme={null} { "object": "list", "data": [ { "id": "whev_abc123", "object": "webhook_event", "type": "order.paid", "created_at": "2026-06-21T10:30:00Z" } ], "has_more": false } ``` Narrow the list to one endpoint with `?webhook_endpoint=wh_abc123`, or by `status` and `event_type`. Fetch a single delivery with `GET /webhook_events/{id}`; add `?expand[]=request` to see the response code, response body and attempt count. ### Redelivering an event Send a delivered or failed event again, unchanged: ```bash theme={null} curl -X POST https://api.crevio.co/v1/webhook_events/whev_abc123/redeliver \ -H "Authorization: Bearer YOUR_API_TOKEN" ``` The redelivery carries the same `id` and the same payload, so a handler that deduplicates on `id` treats it as the event it already saw. Events are kept for **7 days**. The call returns `409` while the event is still being delivered, or when its endpoint is disabled. ## Versioning Every endpoint is pinned to a payload version — `api_version` on the endpoint, repeated in each event. A new endpoint is pinned to the current version, and **that never changes for you**: when a payload changes in a way that could break a parser, it ships as a new version, and existing endpoints keep receiving the one they were built against. Opt in when you are ready: ```bash theme={null} curl -X PATCH https://api.crevio.co/v1/webhook_endpoints/wh_abc123 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"api_version": "v1"}' ``` New fields and new event types are not breaking changes and reach every version, so write parsers that ignore what they don't recognise. The current version is `v1`. ## Retry behavior Crevio expects a `2xx` response within **5 seconds**. Redirects are not followed. Anything else — a timeout, a `4xx`, a `5xx` — counts as a failure, and the event is retried on this schedule: | Attempt | Wait before it | | - | - | | 2 | 30 seconds | | 3 | 2 minutes | | 4 | 8 minutes | | 5 | 30 minutes | | 6 | 1 hour | | 7 | 3 hours | | 8 | 6 hours | | 9–13 | 12 hours each | That is about **three days** in all. After the last attempt the event is marked **failed**; you can still [redeliver](#redelivering-an-event) it for 7 days. Delivery is **at least once**, and **order is not guaranteed** — a retry of an older event can land after a newer one. Deduplicate on `id`, and fetch the resource from the API when order matters. ### When an endpoint keeps failing * After **24 hours** in which every delivery failed, the account owner gets a warning email. * After **72 hours**, the endpoint is switched to `inactive` and the owner is told. Events still waiting to retry are marked failed. One successful delivery at any point resets both clocks. Once the receiving end is fixed, set the endpoint back to `active` and redeliver what it missed. ### Endpoint statuses | Status | Meaning | | - | - | | `active` | Receiving events normally | | `inactive` | Disabled — receives no events | Deactivate an endpoint without deleting it; reactivating resumes delivery for new events. Crevio sets `inactive` itself only after [72 hours of failures](#when-an-endpoint-keeps-failing). ## Security ### Verifying signatures Crevio signs deliveries to the [Standard Webhooks](https://www.standardwebhooks.com) specification, so you verify them with an existing library instead of writing HMAC code. Every request carries three headers: | Header | Value | | - | - | | `webhook-id` | The event's id — the same on every retry, and the same as `id` in the body | | `webhook-timestamp` | Unix seconds when this attempt was sent | | `webhook-signature` | `v1,` | ```javascript Node.js theme={null} // npm install standardwebhooks import { Webhook } from "standardwebhooks"; const webhook = new Webhook(process.env.CREVIO_WEBHOOK_SECRET); // the whole whsec_… string export async function POST(request) { const rawBody = await request.text(); // never request.json() — verification needs the exact bytes let event; try { event = webhook.verify(rawBody, Object.fromEntries(request.headers)); } catch { return new Response("invalid signature", { status: 401 }); } if (event.type === "order.paid") { const order = event.data.object; // … } return new Response(null, { status: 204 }); } ``` ```python Python theme={null} # pip install standardwebhooks from standardwebhooks.webhooks import Webhook webhook = Webhook(os.environ["CREVIO_WEBHOOK_SECRET"]) # the whole whsec_… string def handle(raw_body: bytes, headers: dict): event = webhook.verify(raw_body, headers) # raises WebhookVerificationError ... ``` ```ruby Ruby theme={null} # gem "standardwebhooks" webhook = StandardWebhooks::Webhook.new(ENV.fetch("CREVIO_WEBHOOK_SECRET")) # Rails: raises StandardWebhooks::WebhookVerificationError on a bad signature event = webhook.verify(request.raw_post, { "webhook-id" => request.headers["webhook-id"], "webhook-timestamp" => request.headers["webhook-timestamp"], "webhook-signature" => request.headers["webhook-signature"] }) ``` The libraries also reject a `webhook-timestamp` more than five minutes old, which is what stops a captured request being replayed. > **Verifying without a library** > > The signature is the **base64** HMAC-SHA256 of `..`. The key is the bytes your secret encodes: strip the `whsec_` prefix and base64-decode the rest — do not use the secret's text as the key. Compare in constant time against the part of `webhook-signature` after `v1,`, and reject a timestamp more than five minutes old. > [!WARNING] > > Always verify the signature before processing a payload. Without it, anyone could forge events to your endpoint. ### Best practices * **Respond fast** — return `200` immediately, then process asynchronously to avoid timeouts. * **Deduplicate** — use the event `id` (`whev_…`); the same event may arrive more than once. * **Use HTTPS** — required in production. * **Protect your secret** — store it in env vars or a secrets manager; never commit it. ## Output formats Beyond the default JSON, Crevio can format deliveries for chat platforms: | Format | Use case | | - | - | | Raw (default) | Standard JSON for your own server | | Slack | Pre-formatted for Slack incoming webhooks | | Discord | Pre-formatted for Discord webhook URLs | Select the format when creating or editing the endpoint. ## How webhooks differ from event-triggered Tasks Both react to platform events, but they do different jobs: | | Webhook | Event-triggered [Task](/docs/developer/guides/tasks) | | - | - | - | | Who acts | Your server / your code | Crevio's AI agent | | You provide | An HTTPS endpoint | A natural-language prompt | | Best for | Syncing, custom fulfillment, analytics | Autonomous follow-ups, drafting, decisions | | Setup | `POST /webhook_endpoints` | `POST /tasks` with `trigger_type: "event"` | The subscribable internal events (and any third-party triggers) are documented under [Events](/docs/developer/guides/events). ## Next steps > **[Events](/docs/developer/guides/events)** > > Internal and third-party triggers for event Tasks. > **[Tasks](/docs/developer/guides/tasks)** > > Let Crevio's AI react to events on your behalf. > **[Autonomous outreach](/docs/developer/guides/recipe-autonomous-outreach)** > > A worked event-triggered Task on `order.paid`. > **[API overview](/docs/developer/guides/api-overview)** > > The full set of primitives. # Crevio for developers Source: https://crevio.co/docs/developer/index Build on the AI-native platform that runs your business — REST API, TypeScript SDK, and an MCP agent surface you can just talk to. **Crevio is an AI-native, all-in-one platform that runs your business — and everything it does is available to you as a REST API, a typed SDK, and an agent you can talk to.** You describe what you want to sell and Crevio builds, launches, and grows it. For developers that means three surfaces over the same primitives: a REST API at `https://api.crevio.co/v1`, the official [`@crevio/sdk`](/docs/developer/guides/sdk) TypeScript client, and an [MCP](/docs/developer/mcp) endpoint that exposes the platform to AI agents. > [!NOTE] > > **The AI-native thesis:** almost anything you can do with the API, you can also just *ask* Crevio's agent to do over MCP — "launch a paid course", "research my competitors and draft three posts", "spin up a landing page". The agent and the API share the same primitives, so you can mix scripted calls with delegated work. ## Pick your path > **[Quickstart](/docs/developer/guides/quickstart)** > > **Pick this if you just got an API key.** Go from zero to your first successful call — and your first product — in under five minutes. > **[Build a custom website or checkout](/docs/developer/guides/sdk)** > > **Pick this if you're a frontend or full-stack dev** building your own buying experience. Use `@crevio/sdk` to read products and create checkouts; payments stay on Crevio's rails. > **[Run an AI agent (Tasks & MCP)](/docs/developer/mcp)** > > **Pick this if you want autonomous work**, not just CRUD. Schedule Tasks (your AI workforce) or wire Crevio's MCP into your own agent. > **[Generate content with AI](/docs/developer/guides/usage-billing)** > > **Pick this if you're building content tooling** — images, video, audio, web research, and social posts via metered pay-per-call endpoints. > **[Sync data & webhooks](/docs/developer/guides/webhooks)** > > **Pick this if you're integrating Crevio with another system.** List and paginate resources, then react to events with signed webhooks. > **[Conventions & gotchas](/docs/developer/guides/conventions)** > > **Read this before you write code.** Unwrapped params, association ids, creation order, money in cents — the rules that prevent most first-day errors. ## Start here > **[Quickstart](/docs/developer/guides/quickstart)** > > Key to first call, fast. > **[Conventions](/docs/developer/guides/conventions)** > > The request and response rules every endpoint follows. > **[API reference](/docs/developer/api-reference/introduction)** > > Every endpoint, parameter, and schema — auto-generated. > **[MCP & agents](/docs/developer/mcp)** > > Let an AI agent drive Crevio. # MCP Server Source: https://crevio.co/docs/developer/mcp Connect Claude, Cursor, or any MCP-compatible agent to your Crevio account: delegate work to the Crevio agent with ask_crevio, follow and continue runs, and run scripts against the whole Crevio API and your integrations. **The Crevio MCP server lets any MCP-compatible agent delegate work to Crevio — and, when it wants the controls itself, run scripts against the entire Crevio API and your integrations.** One server, two surfaces: * **Delegation** — `ask_crevio` hands the Crevio agent a job in plain English ("refund the last order from jane@…", "write and schedule this week's posts") and returns the result. Longer jobs run in the background; you follow them as **runs**, continue the conversation, answer approval gates, and read the transcript. * **Scripts** — `list_integrations` and `list_integration_tools` show what a script can call, and `run_script` runs JavaScript on your account's Crevio computer against every REST endpoint and connected integration, with the same authorization and validation as [the API](/docs/developer/guides/api-overview). | | | | - | - | | **URL** | `https://mcp.crevio.co/mcp` | | **Transport** | Streamable HTTP (stateless — every request is self-contained) | | **Authentication** | `Authorization: Bearer ` — the same [API token](/docs/developer/guides/api-overview#authentication) you use for REST — or `X-Api-Key: ` for clients that can only set a custom header. OAuth 2.1 is also supported; see [Connecting](/docs/developer/mcp/connection). | | **Discovery** | `https://mcp.crevio.co/mcp/server-card` | > [!NOTE] > > New to Crevio's agentic model? Start with the [AI & Agents overview](/docs/developer/guides/agents-overview) to see how MCP, [Tasks](/docs/developer/guides/tasks), and [Events](/docs/developer/guides/events) fit together. Under the hood a delegated job **is** a Task with one run, so everything here is also visible in your dashboard and through `/v1/tasks` and `/v1/task_runs`. ## Setup **1. Create an API token** In Crevio go to **Settings → Developers → API tokens** and create one. An MCP connection has exactly the permissions of the token behind it — everything the account can do. **2. Configure your client** **Claude Code** ```bash theme={null} claude mcp add --transport http crevio https://mcp.crevio.co/mcp \ --header "Authorization: Bearer $CREVIO_API_TOKEN" ``` **Claude Desktop / Cursor / other clients** — add to the client's MCP config (`claude_desktop_config.json`, `~/.cursor/mcp.json`, …): ```json theme={null} { "mcpServers": { "crevio": { "url": "https://mcp.crevio.co/mcp", "headers": { "Authorization": "Bearer " } } } } ``` Client-specific steps, OAuth, and raw `curl` examples are on the [Connecting](/docs/developer/mcp/connection) page. **3. Verify with whoami** Ask the connected agent to call `whoami`. It returns the account and user behind the token, the credential, plan, credit balance, rate limit, wait limits, and the list of tools — no arguments, no side effects. If `whoami` works, everything else will. ```json theme={null} { "object": "whoami", "account": { "id": "acct_7k2m…", "name": "Jane's Studio", "slug": "janes-studio" }, "user": { "id": "user_9qx…", "email": "jane@example.com", "name": "Jane Doe" }, "credential": { "type": "api_key", "id": "token_3fa…", "name": "Claude Desktop", "expires_at": null }, "plan": "Pro", "credits": 1840, "rate_limit": { "limit": 600, "window_seconds": 60 }, "limits": { "ask_timeout_default_seconds": 300, "ask_timeout_max_seconds": 300, "message_max_chars": 10000 }, "tools": ["whoami", "ask_crevio", "start_chat", "wait_for_run", "get_run", "list_chats", "get_chat", "send_message", "resolve_approvals", "cancel_run", "list_runs", "list_messages", "list_integrations", "list_integration_tools", "run_script", "wait_for_script_run", "get_script_run", "cancel_script_run"] } ``` ## Recommended workflows ### One-off jobs: `ask_crevio` For work that needs judgement or writing. One call starts a run, waits for it, and returns the run with the agent's final reply in `result`. Each job is a full agent run, from half a minute to several minutes — to read or change data directly, a [script](#scripts-run_script) takes seconds. ```json theme={null} { "name": "ask_crevio", "arguments": { "message": "Which three products made the most revenue this month, and how does that compare to last month?", "idempotency_key": "monthly-top-products-2026-08" } } ``` ```json theme={null} { "object": "task_run", "id": "trun_8d1k…", "task_id": "task_2nq…", "task_name": "Which three products made the most revenue this month, and how does that…", "chat_id": "aichat_5pz…", "status": "completed", "summary": "Top three by revenue this month: …", "result": "Top three by revenue this month:\n1. Lightroom Presets Vol. 2 — $2,140 (+18% vs July)\n2. …", "error_message": null, "pending_approval_ids": [], "credits_consumed": 4, "started_at": "2026-08-20T09:14:02Z", "completed_at": "2026-08-20T09:14:31Z", "created_at": "2026-08-20T09:14:01Z" } ``` * The wait defaults to, and is capped at, **300 seconds** when your client accepts a streamed reply (`Accept: text/event-stream`, which MCP clients send by default), and 90 seconds otherwise. A streamed reply sends a progress notification every 10 seconds while it waits — pass a `progressToken` in `_meta` to receive them. Pass `timeout_seconds` to wait less. * If the run is still going when the wait ends, the reply is **not an error**: it is the run with `wait_timed_out: true`. Call `wait_for_run` with its `id` to keep waiting, and don't call `ask_crevio` again — that would start the job a second time. Nothing is lost; the run continues on Crevio's side. * `idempotency_key` makes retries safe: the same key returns the run the first call started instead of starting (and paying for) another. Always pass one. * `speed: "faster"` has the agent think less, for simple jobs where a quicker answer matters more than depth. The default is `smarter`. * `response_format` takes a JSON Schema (or OpenAI's `{type: "json_schema", json_schema: {schema}}`) when your program needs an object rather than prose. The agent is told the schema, and the settled run carries the parsed value in `json`, validated against it, or the reason it failed in `json_error`. `start_chat` and `send_message` take it too. * Files the agent delivered during the run come back in `artifacts`. Exchange an artifact's `id` for a download link with `get_file_download_url`. * `approval_mode` is `autonomous` by default. `supervised` makes the run pause in `needs_input` before each gated write until you answer its `pending_approval_ids` (a run with nothing to approve finishes with its proposal; reply with `send_message` to act on it); `read_only` forbids writes. ### Long-running jobs: `start_chat` → `wait_for_run` → `send_message` For anything you don't want to block on — a site build, a research task, a bulk migration: 1. **`start_chat`** queues the work and returns the run immediately. 2. **`wait_for_run`** (bounded) or **`get_run`** (instant) until `status` is `completed`, `failed`, or `needs_input`. 3. **`send_message`** continues the conversation — follow-up instructions, corrections, answers to a question the agent asked. The agent keeps its context. On a finished run this starts a new run in the same conversation; on a `needs_input` run it resumes it. Pass `timeout_seconds` to wait for the reply in the same call, and an `idempotency_key` so a retried call returns the run the first one started (`reused: true`) instead of sending the message twice. 4. **`resolve_approvals`** when a run is paused on an integration action (`needs_input` with `pending_approval_ids`) — approve or deny every pending id at once and the run resumes. 5. **`cancel_run`** to stop a run that is pending, running, or waiting. A **chat** is the conversation and a **run** is one turn of work inside it. `list_runs` shows every run on the account (pass `chat_id` for just one conversation's runs) — delegated jobs and your scheduled [Tasks](/docs/developer/guides/tasks) alike — while `list_chats` and `get_chat` browse the conversations themselves, and `list_messages` reads a chat's full transcript, not just the final reply. ### Scripts: `run_script` When the connected agent wants to operate Crevio itself rather than delegate — or needs exact data back — it writes a script. `run_script` runs JavaScript on your account's Crevio computer with [bun](https://bun.sh), with no agent turn. The script can call the Crevio API and every integration your account has connected, chain as many calls as it likes, and transform the data before it comes back. **Discover** `list_integrations` names every namespace a script can call: `crevioApi` (the whole [Crevio API](/docs/developer/guides/api-overview), one function per operation), `platform` (Crevio's own tools), and one per connected integration (`pdGmail`, `mcpLinear`, …). `list_integration_tools` lists one namespace's functions, each with its parameters as a TypeScript type, whether it only reads, whether it needs approval, and a snippet `run_script` accepts once you fill it in. `crevioApi` has hundreds of operations, so narrow it with `search`: ```json theme={null} { "namespace": "crevioApi", "search": "price variant create" } ``` **Run** `tools..(args)` makes a call. Top-level `await` works, every call returns its result and throws on failure, and the script's last expression is its result. ```js theme={null} const product = await tools.crevioApi.createProduct({ body: { name: "My Course", slug: "my-course" } }); await tools.crevioApi.createPriceVariant({ body: { product: product.id, name: "Standard", amount_type: "fixed", amount: 4900, currency: "usd", billing_type: "one_time" }, }); await tools.crevioApi.updateProduct({ id_or_slug: product.id, body: { status: "active" } }); product.id ``` Reads take their parameters directly (`listOrders({ status: "succeeded" })`); writes pass the request body under `body`, with path parameters beside it. Pass values with `args` (up to 16 strings); the script reads them from the global `args`. Files written into the directory named by the global `outputDir` come back as `artifacts` on the run: ```js theme={null} const { data } = await tools.crevioApi.listOrders({ status: "succeeded", limit: Number(args[0]) }); await Bun.write(`${outputDir}/orders.csv`, data.map((o) => o.id).join("\n")); data.length ``` A run returns a **script run** (`srun_…`): its `status` (`queued` → `in_progress` → `completed`, `failed`, `cancelled` or `timed_out`), the `result`, what the script printed in `output`, its `error`, and `calls` — every tool call it made with its HTTP status, so a script that caught an error still shows which call failed. `run_script` waits as long as `ask_crevio` can (300 seconds on a streamed reply, 90 otherwise; pass `wait_seconds` to wait less). A run that takes longer comes back with `wait_timed_out: true` and its id — not an error: keep waiting with `wait_for_script_run`. Calling `run_script` again would run the script twice, unless you pass the same `idempotency_key`. `crevioApi` calls go through the **same controllers** as `api.crevio.co`, so the [API conventions](/docs/developer/guides/conventions) apply unchanged: associations are bare names with prefix ids (`product: "prod_abc"`, not `product_id`), money is in cents, list endpoints return `{object: "list", data: [...]}`, and a product needs a price variant before it can go `active`. Courses and other content are experiences (`listExperiences`), not products. Limits: * **Who:** account admins only. The script runs as you — your personal integrations included — on a computer your whole team shares. * **Timeout:** `timeout_seconds` from 1 to 600 (default 300). The computer may need to wake first, which can add up to about 20 seconds. * **Concurrency:** at most 4 runs in flight per user and 8 per account. * **Approvals:** a script cannot stop and ask for approval. A call that needs it (`requires_approval` in the listing) fails with `approval_required`: set that action to run automatically in **Settings → Integrations**, or delegate the job with `ask_crevio` instead. * **Cancellation:** only a `queued` run can be cancelled. A running script runs to its end or its timeout. * **Output files:** at most 20 per run, each at most 50 MB. Larger files are left out. ## Complete tool reference | Tool | Purpose | Arguments | | - | - | - | | `whoami` | Identify the account, user, credential, plan, credits, limits, and tools | — | | `ask_crevio` | Delegate a job and wait for the result | `message` (required), `timeout_seconds`, `approval_mode`, `speed`, `response_format`, `idempotency_key` | | `start_chat` | Delegate a job without waiting | `message` (required), `approval_mode`, `speed`, `response_format`, `idempotency_key` | | `wait_for_run` | Wait (bounded) for a run to settle | `run_id` (required), `timeout_seconds` | | `get_run` | Fetch a run's status, summary, pending approvals, and final reply | `run_id` (required) | | `list_chats` | List the account's chats, newest first | `search`, `limit`, `starting_after`, `ending_before` | | `get_chat` | Fetch a chat's title, kind, and latest run | `chat_id` (required) | | `send_message` | Continue a chat; optionally wait for the reply | `chat_id`, `message` (required), `timeout_seconds`, `response_format`, `idempotency_key` | | `resolve_approvals` | Approve/deny the integration actions a run is paused on | `run_id`, `approvals: [{id, approved, reason}]` (required) | | `cancel_run` | Stop a pending, running, or waiting run | `run_id` (required) | | `list_runs` | List the account's runs, newest first | `status`, `task_id`, `chat_id`, `limit`, `starting_after`, `ending_before` | | `list_messages` | Read a chat's messages, oldest first | `chat_id` (required), `limit`, `ending_before` | | `list_integrations` | Name every namespace a script can call | — | | `list_integration_tools` | List a namespace's functions with parameters and snippets | `namespace` (required), `search`, `limit`, `offset` | | `run_script` | Run JavaScript on the account's computer and wait for it | `code` (required), `args`, `timeout_seconds`, `wait_seconds`, `idempotency_key` | | `wait_for_script_run` | Wait (bounded) for a script run to finish | `run_id` (required), `wait_seconds` | | `get_script_run` | Read a script run's status and result | `run_id` (required) | | `cancel_script_run` | Cancel a script run that has not started | `run_id` (required) | | `get_file_download_url` | Exchange an artifact id (`art_…`) for a download link valid 15 minutes | `file_id` (required) | | `list_audit_events` | List the account's audit events, newest first. Enterprise plan only. Needs the `audit:read` scope, and an admin when the credential acts as a person | `action`, `actor_type`, `entity_type`, `entity_id`, `after`, `limit`, `starting_after`, `ending_before` | Which tools a connection sees depends on its credential: API keys and OAuth tokens share the same [scopes](/docs/developer/guides/api-overview#scopes), and a connection sees the tools its credential's scopes allow: * `read` for the tools that read, `write` for the rest, unless the tool needs one of the scopes below. * `agent:run` for `ask_crevio`, `start_chat`, `send_message` and `cancel_run`, and `resolve_approvals` with `write` too. Without `write`, delegated work runs read-only. * `scripts:run` for `run_script`, `wait_for_script_run`, `get_script_run` and `cancel_script_run`. A team key never sees these, and without `write` a script cannot change anything. * `files:read` for `get_file_download_url`, and `audit:read` for `list_audit_events`. * `whoami` needs none. An OAuth token granted `read_only` (the default when a client asks for no scope) holds `read`; one granted `read_write` holds every scope and sees every tool. So does an API key made before scopes existed. A tool the token can't use doesn't appear in `tools/list`, and calling it answers "Tool not found". Beyond scopes, limit what an agent can do by giving it a token on an account whose data you're happy for it to touch, and by choosing `approval_mode` on delegated jobs. ### The run object Delegation tools return a **run** (`trun_…`), the same object as [`GET /v1/task_runs/:id`](/docs/developer/guides/tasks) plus `result` and `chat_id`: | Field | Meaning | | - | - | | `status` | `pending` → `running` → `completed` / `failed`, or `needs_input` when the agent is waiting on you | | `result` | The agent's final reply, up to 24,000 characters (present once the run has settled) | | `json`, `json_error` | With a `response_format`: the reply parsed and validated, or why it was not valid JSON for the schema | | `artifacts` | Files the run delivered, each `{id, filename, content_type, size}`; download with `get_file_download_url` | | `summary` | The first 500 characters of the reply — what the dashboard and webhooks show | | `pending_approval_ids` | When `needs_input`: the integration approvals blocking the run, for `resolve_approvals` | | `error_message` | Why a `failed` run failed (`"Cancelled by the caller"` after `cancel_run`) | | `wait_timed_out`, `next_step` | Present when the wait ended before the run settled — it is still running; `next_step` says how to follow it | | `credits_consumed` | What the run cost, in AI credits | | `task_id`, `chat_id` | The underlying Task and conversation, for the REST API and the dashboard | Runs also fire the `task_run.completed`, `task_run.failed`, and `task_run.needs_input` [webhooks](/docs/developer/guides/webhooks), and can be streamed over SSE at `GET /v1/task_runs/:id/stream`. ## MCP Tasks and elicitation These are protocol features of your MCP client, separate from Crevio's own [Tasks](/docs/developer/guides/tasks). With them, a client follows long jobs and answers approvals itself instead of calling `wait_for_run` and `resolve_approvals`. Both need the `2026-07-28` protocol, which your client chooses. Without them, every tool behaves as described above. ### Async tool calls The server implements the [MCP Tasks extension](https://github.com/modelcontextprotocol/ext-tasks) (`io.modelcontextprotocol/tasks`), advertised in `server/discover` on both `/mcp` and `/chatgpt`. When a request declares it in `_meta["io.modelcontextprotocol/clientCapabilities"].extensions`, these tools wait at most 5 seconds and then return a task handle (`"resultType": "task"`) instead of holding the request open: `ask_crevio`, `wait_for_run`, `send_message` with a `timeout_seconds`, `run_script`, and `wait_for_script_run`. A run that finishes inside those 5 seconds is answered in place. * **`tasks/get`** returns the task's `status`. `working` means the run is still going. Once it is `completed`, `result` holds exactly what the tool would have returned without tasks. Poll at `pollIntervalMs`: 3 seconds for agent runs, 1 second for scripts. * **`tasks/update`** answers the task's `inputRequests` (see below). * **`tasks/cancel`** stops the run, like `cancel_run` or `cancel_script_run`. A task is the run itself, so it lasts as long as the run (`ttlMs` is `null`). A run that ends `failed` still completes the task: read its `status` and `error_message` inside `result`. The task's own `failed` status is kept for protocol errors. A task ID is unguessable, and only the account and user who started the run can read it. An unknown or foreign ID answers `-32602`, and a request that does not declare the extension answers `-32021`. ### Approvals and questions When a client declares form elicitation (`_meta["io.modelcontextprotocol/clientCapabilities"].elicitation`), a run paused in `needs_input` asks the user directly: | The run is waiting for | The client is asked | Accept | Decline or dismiss | | - | - | - | - | | Approval of integration actions | One form per action, keyed by its approval ID (`apr_…`), describing what would be sent | Approves it | Denies it | | An answer to the agent's question | One form with a `reply` field | Sends the reply and the run continues | Closes the run as completed | A dismissed approval is a denial, so nothing runs without an explicit yes. You can answer the forms in any order and a few at a time. The run resumes once every one has an answer, and the agent hears all the decisions together. * **With tasks:** the task moves to `input_required` with the forms in `inputRequests`. Answer them with `tasks/update`. * **Without tasks:** the tool returns `"resultType": "input_required"` with the forms and a `requestState`. Call the same tool again with the same arguments, plus `inputResponses` and that exact `requestState`. The state is sealed, bound to the tool and its arguments, and expires after an hour. * **Without form elicitation:** nothing changes. The run comes back `needs_input` with `pending_approval_ids` for `resolve_approvals`, including as a completed task. ## Events The server implements the draft [MCP Events extension](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/3415) (`io.modelcontextprotocol/events`), so a client can subscribe to things that happen in the account, such as `order.paid` or `email_message.received`, and react without polling. It is advertised in `server/discover` on both `/mcp` and `/chatgpt`. The event types are the same ones as [webhooks](/docs/developer/guides/webhooks), and so is the payload: `data.object` is the resource exactly as its API endpoint returns it. `events/list` lists every type with its `payloadSchema`. ### Subscribing ```json theme={null} { "jsonrpc": "2.0", "id": 2, "method": "events/subscribe", "params": { "name": "order.paid", "arguments": {}, "delivery": { "mode": "webhook", "url": "https://hooks.example.com/crevio", "secret": "whsec_" }, "cursor": null, "ttlMs": 86400000 } } ``` The response carries the subscription `id` (`mcpsub_…`), stable for the same credential, URL, event and arguments, and `refreshBefore`. Call `events/subscribe` again with the same values before `refreshBefore` to keep it; `events/unsubscribe` with `name`, `arguments` and `delivery.url` ends it at once. * **Verification.** Before the first delivery to a URL, Crevio POSTs `{"type":"verification","challenge":""}` to it. Answer with a `2xx` and `{"challenge":""}` within 5 seconds. Each credential verifies each URL once. * **Lifetime.** Without `ttlMs` a subscription lasts a day. A suggested `ttlMs` is kept between one minute and one day. `"ttlMs": null` asks for no expiry, and Crevio grants it. * **Rotating the secret.** Send a new `delivery.secret` on a refresh. For 10 minutes, deliveries carry signatures from both secrets. * **Limits.** 100 live subscriptions per account. Subscribing only reads, so a `read_only` token can do it. ### Deliveries Each event is a POST of `{"eventId", "name", "timestamp", "data"}`, signed per [Standard Webhooks](https://www.standardwebhooks.com) with your secret (`webhook-id`, `webhook-timestamp`, `webhook-signature`) and carrying `X-MCP-Subscription-Id`. Verify the signature before you trust the body, and deduplicate on `eventId`. | What your endpoint does | What happens | | - | - | | Answers `2xx` | Delivered | | Answers `410` or `413` | Dropped without retrying | | Fails or times out (5 seconds) | Retried up to 4 more times over about 12 minutes, then dropped | | Keeps failing for an hour | Deliveries stop until your next refresh turns them back on | | Keeps failing for 3 days on a no-expiry subscription | Crevio POSTs `{"type":"terminated",…}` and deletes the subscription | If the credential loses access to the account (key deleted or expired, OAuth access revoked, user removed from the account), the next event ends the subscription with a `terminated` envelope carrying error `-32024`. ### What it cannot do * **Webhook delivery only, by design for now.** `events/poll` and `events/stream` answer `-32026`. Use the [webhooks](/docs/developer/guides/webhooks) API or `list_runs` and the REST endpoints when you cannot receive POSTs. * **No replay.** `cursor` is always `null`: events that happen while a subscription has lapsed are not delivered later. Read current state through the tools after a gap. * **No filters.** Event types take no `arguments`. A subscription gets every event of its type in the account. Errors use the extension's codes: `-32602` invalid parameters (bad URL, secret or arguments), `-32023` unknown event or subscription, `-32024` no authenticated principal or access lost, `-32025` subscription limit, `-32026` delivery mode not offered, and `-32027` the callback failed verification, with `data.reason` one of `connection_refused`, `timeout`, `tls_error`, `http_4xx`, `http_5xx` or `challenge_failed`. ## Errors Authentication failures are HTTP `401`/`403` on the request itself (`WWW-Authenticate` points at the OAuth metadata). Tool failures come back as a tool result with `isError: true` and a JSON body: ```json theme={null} { "error": "run_busy", "message": "Run trun_8d1k… is still in progress; wait for it to settle before sending more.", "http_status": 409 } ``` | `error` | Meaning | What to do | | - | - | - | | `run_busy` | A run in this conversation is still in progress | Wait for it, then `send_message` | | `account_at_capacity` | The account already has 5 runs going (`http_status: 429`) | Retry after `retry_after_seconds` | | `idempotency_error` | An `idempotency_key` reused with a different message | Pass a new key for a new message | | `run_not_active` | `cancel_run` on a run that already finished | Nothing — read its `result` | | `run_not_resumable` | The run has no conversation to continue | Start a new job with `ask_crevio` | | `approvals_pending` | `send_message` on a run blocked by approvals | `resolve_approvals` first | | `stale_resolution` | The approvals you submitted don't match the pending set | `get_run`, then resubmit every `pending_approval_ids` entry | | `insufficient_credits` | The account has no AI credits left | Add credits in Crevio | | `resource_missing` | No run/task with that id on this account | Check the id — runs are account-scoped | | `validation_failed` | A bad argument (e.g. an unknown `approval_mode`) | Fix the argument | | `rate_limit_exceeded` | 600 requests per minute per owner, shared with the REST API — or too many script runs in flight | Back off until `X-RateLimit-Reset` ([rate limits](/docs/developer/guides/rate-limits)), or wait for a script run to finish | | `forbidden` | `run_script` by someone who isn't an account admin | Ask an admin, or delegate with `ask_crevio` | | `run_not_cancellable` | `cancel_script_run` on a run that already started | Wait for it with `wait_for_script_run` | A script that throws still comes back as a script run, with `status: "failed"`, its `error`, and the `calls` it made — `run_script` itself only errors when the run could not start or the wait ended. ## Security Every tool runs inside your account's tenant boundary. Delegated jobs run the Crevio agent with the permissions your account already has. `run_script` runs on your account's Crevio computer as the calling admin; its `tools` calls go through the same approval settings the agent obeys and the same API controllers as `api.crevio.co`, so authorization, validation, and error messages are identical to direct API calls. Tokens are as powerful as your account: only connect agents you trust, and revoke a token from **Settings → Developers** to cut a connection off instantly. ## Next steps > **[Connecting](/docs/developer/mcp/connection)** > > Client-by-client setup, OAuth, and curl examples. > **[Tasks (your AI workforce)](/docs/developer/guides/tasks)** > > The Task / Task Run model every delegated job is built on — and how to schedule recurring work. > **[AI & Agents overview](/docs/developer/guides/agents-overview)** > > How MCP, Tasks, and Events form Crevio's agentic model. > **[API conventions](/docs/developer/guides/conventions)** > > The shapes, prefixes, and gotchas `crevioApi` shares with REST. # Connecting Source: https://crevio.co/docs/developer/mcp/connection Step-by-step setup to connect Claude Code, Claude Desktop, Cursor, ChatGPT, and other MCP clients to the Crevio MCP server, verify the connection with whoami, and start delegating work. The Crevio MCP server uses **Streamable HTTP** transport — a single endpoint that accepts JSON-RPC requests and returns JSON-RPC responses. It is stateless: every request is self-contained, so there is no session to keep alive and any MCP-compatible client that supports Streamable HTTP can connect. ## Base URL ``` https://mcp.crevio.co/mcp ``` A public server card for discovery lives at `https://mcp.crevio.co/mcp/server-card`, listed in the AI catalog at `https://crevio.co/.well-known/ai-catalog.json`. ## Authentication Every request carries a **Bearer token** in the `Authorization` header — the same API tokens from your [Developer settings](/docs/developer/guides/api-overview#authentication). A client that can only send custom headers can pass an API key as `X-Api-Key: YOUR_API_TOKEN` instead. ```bash theme={null} curl -X POST https://mcp.crevio.co/mcp \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' ``` The server is also an OAuth 2.1 protected resource: an unauthenticated request gets a `401` with a `WWW-Authenticate` header pointing at `/.well-known/oauth-protected-resource`, so clients that support MCP's OAuth flow (Claude's connector directory, ChatGPT) can sign in interactively instead of pasting a token. > [!WARNING] > > An MCP connection has the full permissions of the token (or OAuth grant) behind it — everything the account can do. Only connect AI tools and agents you trust, and revoke the token to cut a connection off instantly. ## Claude Code ```bash theme={null} claude mcp add --transport http crevio https://mcp.crevio.co/mcp \ --header "Authorization: Bearer $CREVIO_API_TOKEN" ``` Then, in a session: *"Call whoami on crevio"* — or just *"Ask Crevio which products sold best this week."* ## Claude Desktop Add this to `claude_desktop_config.json` and restart Claude Desktop: ```json theme={null} { "mcpServers": { "crevio": { "url": "https://mcp.crevio.co/mcp", "headers": { "Authorization": "Bearer YOUR_API_TOKEN" } } } } ``` You can then delegate in plain English: > "Ask Crevio to create a 20% discount code called SUMMER20 that expires next month" > > "Have Crevio draft and schedule three posts about my new course, then tell me what it scheduled" > > "Who are my top 5 customers by order count?" *(the agent may answer this directly with `run_script`)* ## Cursor Add to `~/.cursor/mcp.json` (or **Settings → MCP Servers → Add**, type *Streamable HTTP*): ```json theme={null} { "mcpServers": { "crevio": { "url": "https://mcp.crevio.co/mcp", "headers": { "Authorization": "Bearer YOUR_API_TOKEN" } } } } ``` ## Other clients Most MCP clients accept the same JSON shape: a `url` plus an `Authorization` header. For clients that drive OAuth themselves, point them at `https://mcp.crevio.co/mcp` and let the `401` challenge start the sign-in. ## Verify the connection Call `whoami`. It takes no arguments, has no side effects, and returns the account and user behind the credential, the plan and credit balance, rate limits, wait limits, and the full tool list. ```bash theme={null} curl -X POST https://mcp.crevio.co/mcp \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"whoami","arguments":{}}}' ``` If `whoami` comes back, the connection is good. If it doesn't: * **401** — the token is missing, mistyped, expired, or revoked. Mint a new one in **Settings → Developers**. * **Tools missing in the client** — most clients cache `tools/list`; reconnect or restart the client. * **429** — the token is over its 600-requests-per-minute budget (shared with the REST API); back off until `X-RateLimit-Reset`. ## First delegation ```bash theme={null} curl -N -X POST https://mcp.crevio.co/mcp \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "ask_crevio", "arguments": { "message": "Summarize this week'"'"'s orders and flag anything unusual.", "idempotency_key": "weekly-orders-2026-09-29" } } }' ``` Because the request accepts `text/event-stream`, the reply streams: a keep-alive line every 10 seconds while the agent works (a progress notification instead, if you pass `"_meta": {"progressToken": "…"}` in `params`), then the result. The result is a **run** with the agent's reply in `result`. If it comes back with `wait_timed_out: true`, the job is still going — call `wait_for_run` with the run's `id` rather than asking again. > [!NOTE] > > See the [Overview](/docs/developer/mcp) for the full tool reference — delegation (`ask_crevio`, `start_chat`, `wait_for_run`, `send_message`, …) and scripts (`list_integrations`, `list_integration_tools`, `run_script`). # OpenAPI specification Source: https://crevio.co/docs/developer/openapi-spec Download the machine-readable OpenAPI document for the Crevio API. The Crevio API is described by a machine-readable OpenAPI 3 document. It is generated directly from the live API, so it always matches the current contract. > **[Download the OpenAPI spec](/docs/developer/api-reference/openapi.json)** > > The full specification in JSON. Use it to: * generate a typed client or SDK (for example with [openapi-generator](https://openapi-generator.tech/)), * import the API into Postman, Insomnia, or Bruno, * power your own validation and tooling. > [!NOTE] > > Prefer a ready-made client? Use the official [TypeScript SDK](/docs/developer/guides/sdk) instead of generating your own. # Abandoned checkout emails Source: https://crevio.co/docs/features/abandoned-checkout-emails Email buyers who started a checkout but didn't pay, with a link straight back to their items When someone starts buying from you, enters their email, and then leaves without paying, Crevio can send them one reminder email with a button back to their checkout. Orders that come from that email are marked **Recovered**, so you can see what the reminder earned you. The feature is **off by default**. These emails go to people who haven't bought from you yet, so you decide whether to send them. ## Turn it on **1. Open your checkout settings** Go to **Settings** > **Advanced** and find the **Checkout Configuration** section. It appears once your payments are connected. **2. Switch on Abandoned checkout emails** Turn on **Abandoned checkout emails**. **3. Choose when it sends** Under **Send after**, pick how long to wait after the buyer started the checkout. The default is 4 hours. You can choose anything from 1 hour to 72 hours. Turning the setting on or off, or changing the delay, does not interrupt buyers who are checking out at that moment. ## Who gets the email Crevio only emails a buyer it has an email address for: * a buyer who typed their email into your checkout page before leaving, * a buyer who was signed in while checking out, * a buyer whose checkout was created with their email, for example by your website or an integration through the API. A checkout where the buyer never entered an email gets no reminder, because there is no one to send it to. ## When no email is sent Crevio skips the reminder when: * the buyer finished paying, or Stripe already took the payment, * the buyer's card was declined or the payment was blocked as risky (one-time purchases), * everything in the checkout was free, * one of the products can no longer be bought, * your payments aren't set up to take money right now, * the buyer is you or another admin of your business testing the checkout, * the buyer bought anything from you in the last 14 days, * the buyer started a newer checkout with you since, in which case only the newest one can get a reminder, * the buyer already got a reminder for the same products in the last 72 hours, * the buyer unsubscribed from your emails, or earlier emails to them bounced or were marked as spam. Each checkout gets at most one reminder, ever. ## What the buyer sees The email comes from your business name and replies go to your support email. It lists the products and quantities from their checkout and has a **Complete your purchase** button. The button opens a new checkout with the same products and their email already filled in. It always uses today's prices. A discount code they had applied isn't carried over, so they need to enter it again. If the buyer has already paid for that checkout, the button shows their order instead. Every reminder has an **Unsubscribe** link. A buyer who unsubscribes gets no more reminders from you, and is also removed from your email broadcasts. They still receive receipts for anything they buy. ## See recovered sales Orders paid through a reminder carry a **Recovered** badge next to their status in **Orders**. ## Limits * **One reminder per checkout.** There is no sequence of follow-ups. This is by design. * **The wording is fixed.** You can't edit the email's text or design. * **No discount in the email.** The reminder doesn't include a discount code. Add one to a [checkout link](/docs/features/checkout#checkout-links) if you want to offer one. * **Late sends are dropped.** If the reminder can't go out within 6 hours of its scheduled time, it is skipped rather than sent late. * **No list of abandoned checkouts.** You can see recovered orders, but not the checkouts that were left behind. # Run ads Source: https://crevio.co/docs/features/ads Tell Crevio your goal and budget, and it helps set up and manage ad campaigns across Facebook, Instagram, TikTok, LinkedIn, Google, and more. Ads are how you reach people who don't know you yet. But ad platforms are complicated, and it's easy to waste money if you're not sure what you're doing. Crevio makes it simple: you tell it what you want and how much you want to spend, and it helps build and run your campaigns. You can advertise across Facebook, Instagram, TikTok, LinkedIn, Google, and more -- all from one place. ## Connect your ad account first Before you can run ads, you connect the ad account you advertise from (for example your Facebook or Google ads account). This is a one-time step that lets Crevio create and manage campaigns for you. **1. Open Ads** In your dashboard, go to **Ads** and choose to connect an ad account. **2. Sign in and approve** Sign in to the platform and approve Crevio to manage ads on your behalf. **3. You're ready to advertise** Once connected, you can start campaigns on that platform. > [!NOTE] > > Your ad spend is billed by the ad platform directly (for example Facebook charges your card for the ads themselves). Crevio helps you set it all up and keep it on track. ### How many ad accounts you can connect Connecting ad accounts is available on the Business plan: | Your plan | Connected ad accounts | | - | - | | **Free, Starter & Pro** | Not included -- upgrade to Business to connect an ad account | | **Business** | Unlimited | Ad accounts have their own allowance, separate from the [social accounts you post from](/docs/features/social#how-many-accounts-you-can-connect) -- connecting one doesn't use up the other. ## Tell Crevio your goal and budget Instead of fiddling with settings, just describe what you want. Crevio turns that into a campaign and helps manage it day to day. **1. Describe your goal** Tell Crevio what you want -- "get more sign-ups for my course" or "sell more of my new download" -- and who you want to reach. **2. Set your budget** Say how much you want to spend, for example a daily or total amount. Crevio works within it. **3. Review and launch** Crevio drafts the campaign -- the audience, the wording, and the images. Review it, make changes, and launch when you're happy. > [!TIP] > > Keep it conversational. Try "spend \$10 a day promoting my Instagram post to people interested in fitness" and Crevio handles the setup. ## Boost a post Have a social post that's doing well? You can put a budget behind it to reach far more people, without building a campaign from scratch. Just pick the post and tell Crevio how much to spend. ## Capture leads with lead forms Some ads can collect contact details directly -- a "lead form" -- so interested people can sign up without leaving the app they're in. Those leads flow into your [customers](/docs/features/customers) list so you can follow up by [email](/docs/features/email-marketing) or even an [AI phone call](/docs/features/calls). ## See what's working Crevio shows you how your ads are performing and where your money is going, in plain language. Ask "which ad is getting the most sign-ups?" and Crevio helps you put more behind what works and pause what doesn't. ## Get your ad account audited Ask "audit my Facebook ads" or "audit my Google Ads account" and Crevio reviews everything: what's wasting money, which ads have gone stale, whether your sales are being counted correctly, and whether your pages match what people searched for. You get a short list of fixes, biggest savings first, each with a dollar estimate. The advice fits the size of your account. A business spending a few hundred dollars a month gets different recommendations than one spending thousands, so you won't be told to split a small budget into a complicated setup. > [!TIP] > > No ad account connected yet? Download a report from Ads Manager or Google Ads, attach it to the chat, and ask for the audit. Crevio works from the file. ## Stop paying for the wrong Google searches Google sometimes shows your ads for searches that will never buy, like "free templates" or "jobs". With your Google Ads account connected, ask "clean up my search terms" and Crevio: * reads which searches your ads actually showed up for, and what each one cost * picks out the ones that spend money without bringing sales, and blocks them for a whole campaign or for one ad group * suggests the searches that do bring sales as new keywords Crevio never blocks or adds anything on its own. It shows you the list, with what each search cost, and waits for you to approve it. ## Keep a campaign in check while you're away Ask "pause Spring-Promo if it starts burning money" or "scale it if it keeps selling", and Crevio proposes a rule with real numbers, for example "pause it if it spends \$90 in a day with no sales". Nothing is set up until you say yes. Once you agree, Crevio checks the campaign every hour from 10 in the morning to 10 at night in your time zone: * **Pause rules** pause only the campaigns you named, and tell you what was paused and why. Crevio never turns a campaign back on by itself. * **Scale rules** never change your budget on their own. When a campaign keeps beating your target, Crevio proposes the increase and waits for your approval. These rules are Crevio [automations](/docs/features/automation), so they show up under **Scheduled** in the sidebar, not in Facebook Ads Manager or Google Ads. To change or stop one, ask Crevio or switch it off there. ## Name your ads your way If your reports or filters rely on ad names, tell Crevio how you name them, for example *"name my Facebook ads platform, objective, audience, offer, date"*. Crevio remembers that pattern for that ad account and names every new ad from it, such as `META_Sales_Lookalike-Customers_Free-Trial_202610`. * Crevio asks you for any part it doesn't know, like the audience, rather than guessing. * Each ad account can have its own pattern, and campaigns, ad sets and ads can follow different ones. To change a pattern or stop using it, tell Crevio. * It applies to ads Crevio creates from then on. Ads that already exist keep their names. * You can tell Crevio your pattern before you connect an ad account. It's used once the account is connected. ## If something goes wrong > **My ad was rejected by the platform** > > Ad platforms review every ad against their rules. Crevio will tell you if an ad was rejected. Usually a small wording or image change fixes it -- ask Crevio to adjust it and resubmit. > **My ad account won't connect** > > Make sure you're signing in to the right account and that you have permission to manage ads on it. Try connecting again from the **Ads** page. If Crevio says the feature isn't on your plan or that you've reached your limit, see [how many ad accounts you can connect](#how-many-ad-accounts-you-can-connect). > **I'm spending money but not getting results** > > Give a campaign a little time to find the right audience. If results are still low, ask Crevio to review it -- it can suggest a different audience, message, or budget. > **I want to stop a campaign** > > You can pause or stop any campaign at any time. Just ask Crevio or do it from the **Ads** page. ## Related > **[Social media posting](/docs/features/social)** > > Boost your best posts into ads. > **[Forms & lead capture](/docs/features/forms)** > > Collect leads from your ads. > **[Customers](/docs/features/customers)** > > See the leads and buyers your ads bring in. > **[Email your customers](/docs/features/email-marketing)** > > Follow up with the leads you capture. # Analytics Source: https://crevio.co/docs/features/analytics Track revenue, orders, visitor traffic, and customer acquisition with built-in analytics Crevio includes a built-in analytics dashboard that gives you a clear view of how your business is performing. From revenue trends to traffic sources, you can monitor the metrics that matter without leaving your dashboard. ## Analytics dashboard The analytics page is available under **Analytics** in your dashboard. It shows data for a configurable date range (defaulting to the last 30 days) and compares it against the previous period so you can spot trends at a glance. The dashboard auto-refreshes every 60 seconds, so the numbers stay current as new orders and visits come in. ### Switching between sites If your account has more than one site that's been published, a site picker appears next to the page heading — click it to switch which site's traffic and live-visitor data you're looking at. Each option shows the site's name and its domain, since sites under one account can share a hostname. With only one published site, the heading just shows its name. Revenue and order metrics always cover your whole account; the site picker only changes which site's traffic data (sessions, live visitors, and the breakdowns below) you're viewing. ## Key metrics The main chart at the top of the page lets you toggle between four primary metrics: | Metric | What it tracks | | - | - | | **Leads** | New lead customers acquired per day -- people who provided their email through a free checkout or a form. | | **Sessions** | Website visits per day. A session represents a single visitor's browsing activity. | | **Orders** | Orders placed per day across all products. | | **Revenue** | Total revenue collected per day, displayed in your account's default currency. | Each metric shows: * The total for the selected period * A percentage change compared to the previous period of equal length * A day-by-day trend line > [!TIP] > > Use the date range selector to zoom in on a specific promotion, launch, or time window. The previous-period comparison adjusts automatically. ## Traffic analytics Below the main chart, you will find detailed breakdowns of your website traffic: ### Visits by device See how your visitors are accessing your site -- desktop, mobile, or tablet. This helps you prioritize design and testing for the devices your visitors actually use. ### Visits by source Understand where your traffic comes from. Sources include direct visits, search engines, social media platforms, referral links, and any UTM-tagged campaigns you are running. ### Visits by page See which pages on your website get the most views. Use this to identify your best-performing products, landing pages, and content. ### Visits by country View a geographic breakdown of your visitors. This can help you decide whether to add support for additional currencies, languages, or region-specific promotions. ## Sales by discount code Track how your [discount codes](/docs/features/discounts) are performing. This chart shows revenue generated through each active discount code, so you can measure the impact of your promotions and decide which codes to keep, extend, or retire. ## Dashboard overview Your main **Dashboard** page also surfaces key analytics at a glance: * **Monthly page views** -- Total website views in the last 30 days * **Monthly revenue** -- Total revenue from successful orders in the last 30 days * **Monthly orders** -- Number of orders placed in the last 30 days * **Recent orders** -- The five most recent orders with customer details ## PostHog integration For deeper product analytics, Crevio integrates with [PostHog](https://posthog.com). PostHog provides: * **Event tracking** -- Detailed tracking of user interactions across your dashboard and website * **User identification** -- Automatic identification of logged-in users for cohort analysis * **Session recordings** -- Watch how buyers interact with your checkout and product pages * **Feature flags** -- Roll out new features gradually to subsets of your visitors PostHog runs alongside Crevio's built-in analytics, so you get both a high-level overview in your dashboard and granular event-level data when you need to dig deeper. ## Built-in event tracking with Ahoy Under the hood, Crevio uses [Ahoy](https://github.com/ankane/ahoy) to track visits and events on your website. Ahoy records: * **Visits** -- Each unique visitor session, including referrer, device type, browser, OS, and geographic location * **Events** -- Specific actions taken during a visit, scoped to your account This data powers the analytics dashboard and is stored within your Crevio account. It is not shared with third parties. > [!NOTE] > > Analytics data is scoped to your account. If you manage multiple accounts, each has its own independent analytics. ## Site analytics Every published Crevio app gets its own real-time site analytics dashboard, available under **Analytics → Site analytics**. It's modelled on Plausible: a clean, single-page view of how people are using your site, with no setup required. Once you publish your site, data starts flowing immediately. ### What's tracked * **Pageviews and unique visitors** -- in real time, with a live "current visitors" counter * **Top pages** -- which URLs get the most traffic * **Top sources** -- where visitors are coming from. You can switch between: * **Referrers** -- the external sites that linked to yours (e.g. `google.com`, `producthunt.com`) * **UTM source / medium / campaign** -- if you tag your campaign links with `?utm_source=newsletter&utm_medium=email&...`, those break down here * **Locations** -- countries, regions, and cities your visitors come from * **Tech** -- browsers, operating systems, and devices (desktop / mobile / tablet) * **Custom events and revenue** -- when your site fires events like `add_to_cart` or `purchase`, they show up with hit counts and any `value` you pass through (see [Custom events](#custom-events)) * **New vs returning visitors** * **Goal funnel** -- the share of visitors who progress from landing → product page → checkout → purchase * **Revenue by source** -- which traffic source generated which orders (see [Revenue attribution](#revenue-attribution)) * **Outbound link clicks and file downloads** -- automatically captured whenever a visitor clicks a link to another domain or to a file (PDF, ZIP, video, etc.) ### What is **not** collected * No IP addresses are stored * No browser fingerprinting * No third-party tracking scripts * No data is sold or shared with anyone ### Cookies Crevio site analytics sets exactly one first-party cookie: | Cookie | Value | Lifetime | Purpose | | - | - | - | - | | `_crevio_vid` | Random 32-character hex string | 180 days | Identifies a returning visitor across pages and across days, and ties their pageviews to orders for revenue attribution | This cookie contains no personal information -- just a random ID generated by the visitor's own browser. Crevio cannot use it to identify anyone. It's a first-party cookie, scoped to your site only, and isn't shared with any other domain. > [!NOTE] > > **EU businesses**: under the GDPR/ePrivacy Directive, analytics cookies generally require visitor consent. Crevio's analytics cookie counts as a first-party analytics cookie. France, Spain, and Italy explicitly exempt first-party analytics from the consent requirement; the proposed EU Digital Omnibus (Nov 2025) would extend that exemption EU-wide. If you sell to other EU countries, the safest move is to include `_crevio_vid` in your cookie banner under "Analytics" and let visitors opt out. We're tracking the regulation and will update this guidance when the Omnibus is finalized. ### Privacy signals we honor * **Global Privacy Control (`Sec-GPC: 1`)** -- 12 US states require websites to recognize GPC as a binding opt-out signal in 2026. When a visitor's browser sends this signal, the tracker skips everything: no cookie, no pageview, no events. * **Do Not Track** -- DNT is no longer legally enforceable (per 2026 regulatory guidance) and is superseded by GPC. We do not separately check the DNT header. * **Localhost and development domains** -- the tracker skips itself entirely when running on `localhost`, `*.local`, `*.test`, or `*.localhost`. ## Custom events Your site can fire custom events from JavaScript to track meaningful actions like starting a checkout, signing up, booking a call, or purchasing: ```js theme={null} window.crevio("start_checkout", { value: 49.00, plan: "pro" }); window.crevio("signup"); window.crevio("purchase", { value: 199.00, order_id: "ord_abc" }); ``` The first argument is the event name. The optional second argument is a small bag of extra properties: * Use **`snake_case`** event names, with present-tense verbs: `start_checkout`, `book_call`, `submit_form`. Don't use past tense (`booked_call`) or PascalCase (`BookCall`). * Pass numeric **`value`** if the event is associated with money. It powers the revenue column in the Custom events panel and is summed across hits. * Keep prop values short. The server keeps at most 8 keys per event, and each value is capped at 200 characters. Events appear in the **Custom events** panel of the Site analytics dashboard within a minute. ## Revenue attribution Crevio ties every paid order back to the visitor's first-touch traffic source, so you can answer questions like *"How much revenue did my Product Hunt launch actually drive?"* without leaving the dashboard. How it works: 1. A visitor lands on your site (say, `?utm_source=producthunt`) 2. The tracker sets the `_crevio_vid` cookie 3. The visitor browses, eventually completes a checkout 4. The checkout records the same `_crevio_vid` value on the order 5. The **Revenue by source** panel groups completed orders by the visitor's first-touch source (UTM source if present, otherwise the referring website, otherwise "Direct"), so you see total revenue per acquisition channel If a visitor blocks cookies or fires Global Privacy Control, their orders show up in your normal Orders list but aren't attributed in the Revenue by source panel. ## Disabling site analytics Crevio site analytics is enabled by default on every published app. If you'd rather opt out -- for example, because you use Google Analytics or another tool exclusively -- contact support and we'll disable injection on your account. # Apps Source: https://crevio.co/docs/features/apps Crevio doesn't just build websites -- describe a tool your business needs and it builds a real, working web app, then hosts it and changes it whenever you ask. Crevio builds more than marketing websites. Describe a tool your business needs and Crevio's AI builds you a real, working **web app** -- one that does something, not just one that shows something. Same as everywhere else in Crevio: you say what you want in plain words, and Crevio makes it. You never touch code, servers, or hosting. You talk to Crevio like you would a developer who never sleeps, and it builds, publishes, and looks after the app for you. ## Why you'd use this * **You need a tool, not just a page.** Something people can actually *use* -- book a slot, log in to an account, look something up, calculate a result. * **You are not technical.** No code, no databases to wire up, no hosting to buy. Crevio handles all of it. * **You want it to keep up with you.** As your business changes, you just ask Crevio to change the app -- no rebuilding from scratch. > [!NOTE] > > The golden rule of Crevio still applies: when in doubt, just ask. Describe what someone should be able to *do*, and Crevio will tell you what it can build and where it would split the work. ## What you can build Apps are open-ended, but here are common ones to spark ideas: | App | What it does | | - | - | | **Booking tool** | Let customers see your availability and book a time, with confirmations and reminders. | | **Client portal** | A private, logged-in area where your customers view their orders, files, or progress. | | **Members area** | Gated content and a community space for paying members. | | **Directory** | A searchable, filterable list -- of listings, providers, resources, or anything else. | | **Calculator or quote tool** | Visitors enter a few details and get an instant price, estimate, or result. | | **Interactive dashboard** | A live view of the numbers that matter to you or your customers. | | **Simple internal tool** | A small app for you and your team to track or manage something day to day. | > [!TIP] > > Not sure whether something counts as an "app"? Just describe what you want it to *do* -- "let people book a 30-minute call and pay a deposit" -- and Crevio figures out the rest. ## Ask Crevio to build it **1. Describe what it should do** Open Crevio and explain the tool in your own words -- who uses it and what happens when they do. For example: *"Build me a booking app where clients pick a service, choose a time from my calendar, and pay a deposit up front."* **2. Add the look and feel** Mention a style if you have one in mind, or leave it out and Crevio will match it to your business. **3. Let Crevio build it** Crevio assembles the real, working app -- the screens, the logic, and the data it needs to remember. You can watch the progress as it goes. **4. Try it out** When it's ready, Crevio shows you a preview. Click around and use it like a customer would. Nothing is final -- anything can be changed by asking. ## It's a real app, not a mockup The apps Crevio builds are the real thing: * **They remember data.** Bookings, submissions, accounts, and anything else your app collects are saved and stay put. * **They're hosted for you.** Crevio publishes the app and keeps it online -- no separate hosting to set up or pay for. * **They live on your web address.** Use the free `yourname.crevio.app` address or [connect your own custom domain](/docs/features/domains). * **You control who gets in.** Make an app public, limit it to signed-in customers, or keep it to your team while you build. See [choosing who can see your site](/docs/features/sites#choose-who-can-see-your-site). ## Your app's data is looked after Most apps remember things -- bookings, sign-ups, submissions, member profiles. That saved information is the part of your app you can least afford to lose, so Crevio treats it carefully. * **Crevio works on a practice copy, not your real data.** While it builds and tests a change, it works against a separate copy of your app's structure that holds none of your customers' information. Your live data is never the thing it experiments on. * **Changes are applied once, when you publish.** Crevio may reshape the practice copy a dozen times while it works. When you publish, it works out the difference and applies it to your live app in one clean step -- the false starts along the way never reach it. * **You're told what will change, in plain words.** Before it publishes, Crevio explains the change in language you can act on -- "adds a featured field to reviews," "removes the old signups table" -- so you can say no first. * **Anything that would destroy data stops and asks.** If a change would delete saved information, Crevio pauses and asks you to approve it, naming exactly what would go -- for example, the reviews table and all 1,284 entries in it. Nothing is deleted on your behalf without you saying yes. * **Undoing a change can undo the data change too.** If you roll back to an earlier version of your app, Crevio can rewind the saved information to the state that version was working with. > [!TIP] > > You never have to think about any of this. Just ask -- *"What will this change do to my data?"* or *"Undo that last update and put my data back how it was."* > [!NOTE] > > Rolling the data back returns it to how it looked at the earlier version, which means anything saved since then is discarded. Crevio tells you before it does it -- if you're unsure, ask it to roll back only the app itself. ## Change anything by asking Once your app exists, improving it is just a conversation -- the same as with your website: * *"Add a cancellation option to the booking flow."* * *"Send me an email whenever someone signs up."* * *"Show the busiest days at the top of the dashboard."* * *"Let members edit their own profile."* Crevio makes the change and shows you the result. If it's not quite right, ask again. ## What it can't do Worth knowing before you plan around it. **It builds web apps, not phone apps.** What you get runs in a browser, on your own web address, and works on a phone screen. It isn't a native iOS or Android app you'd submit to an app store. **You don't write code in Crevio.** There's no code editor in the dashboard, by design — you change your app by describing the change. If you want to work on the code directly, you can: connect your own GitHub repository and Crevio builds and deploys from that instead, leaving the code somewhere you can read, edit and keep. Set it up in **Settings** → **Integrations**. **One version is live at a time.** Publishing replaces what's live. There's no staging site running alongside it. You do get a preview while a change is being made, and you can put an earlier version back at any time. **Big changes work better in pieces.** One clear change per request lands more reliably than one large one, and it's far easier for you to check. If you ask for something sprawling, expect Crevio to propose splitting it — that's it working properly, not stalling. **Some things need your approval.** A change that would delete saved information stops and asks first. That's deliberate and can't be switched off. ## If something goes wrong > **The app doesn't do quite what I meant** > > Tell Crevio what should happen instead, in plain words -- "when someone books, it should also ask for their phone number." Crevio adjusts the behavior. The clearer you are about what should happen, the closer the next version gets. > **A change broke something** > > Just ask Crevio to undo it or try another approach: *"That's not what I meant -- go back to how it worked and instead add the field to the second step."* > > If a published version is the problem, ask Crevio to go back to the previous one: *"Roll my app back to the version before today's update."* It puts the earlier version live again, and can rewind your saved data alongside it if the change affected that too. > **Crevio is asking me to approve a change to my data** > > That prompt only appears when a change would delete saved information. Read what it names -- it tells you which information would go and how much of it. If that's what you intended, approve it. If it isn't, say no and tell Crevio what you actually wanted; safe changes like adding new fields never ask. > **I'm not sure how to describe the app I want** > > Start with the outcome: what should a person be able to do, and what should happen when they do it? You can also ask Crevio for ideas -- *"What kind of app would help a cleaning business take bookings?"* -- and build from there. ## Related > **[Your AI website](/docs/features/sites)** > > The same describe-it-and-it's-built approach, for your website. > **[Your own web address](/docs/features/domains)** > > Put your app on a custom domain you own. > **[Automations & tasks](/docs/features/automation)** > > Have your AI assistant do recurring work behind the scenes. > **[How Crevio works](/docs/introduction/how-crevio-works)** > > The simple mental model behind everything Crevio builds. # Put your business on autopilot Source: https://crevio.co/docs/features/automation Tell Crevio what to do and when — and it runs the work for you, on a schedule or whenever something happens This is where Crevio really shines. You don't just get an assistant that answers questions — you get one that **does the work**, even while you sleep. You describe a job in plain words. Crevio handles it. "Every Monday morning, draft and schedule my social posts for the week." "When someone buys my course, send them a warm thank-you email." "Each evening, check my new leads and follow up with anyone who hasn't replied." You set it up once, and Crevio keeps doing it. The best part: **you decide how much freedom Crevio has.** It can run completely on its own, ask you before it acts, or simply suggest what it would do. You're always in control. ## Why you'd use it * **Get time back.** The repetitive work that eats your week just happens. * **Never drop the ball.** Thank-you emails, follow-ups, and weekly posts go out on time, every time. * **Run a bigger business than one person should be able to.** Crevio does the busywork so you focus on the work that matters. * **Stay in control.** Choose how much Crevio does on its own — and review anything before it goes out. > [!TIP] > > You don't need to learn a setup screen. The easiest way to start is to **just ask Crevio in chat:** "Every Monday at 9am, write and schedule three social posts about my latest product." Crevio sets up the recurring job for you and confirms what it'll do. ## Not sure what to automate? Ask Crevio: *"What could you automate for my cleaning business?"* It knows the jobs that save the most time for businesses like yours: cleaners and trades, salons, coaches and therapists, consultants and agencies, photographers, online shops, local stores, course creators and newsletter writers. It picks two or three that fit what you sell and the apps you've connected, and for each one tells you what starts it, what it does, and roughly what it costs in credits. Some ideas it might suggest: * **For a cleaning business:** a job sheet for every new booking, a reminder to tomorrow's customers, and a weekly nudge to regular clients who haven't booked their next clean. * **For an online shop:** an alert for big orders, a reminder for checkouts that weren't finished, and a warning before a best seller runs out. * **For a coach:** a short brief before each session, and a heads-up when a client has one session left in their package. Nothing is set up until you pick one. Crevio also looks for jobs like these on its own twice a week and suggests one when it spots work you keep doing by hand. ## Two ways a job can run A job (Crevio calls these **tasks**) can kick off in two ways: | When it runs | Example | | - | - | | **On a schedule** | "Every Monday at 9am, draft my weekly newsletter." "On the 1st of each month, send me a sales summary." | | **When something happens** | "When someone buys, send a thank-you email." "When a new lead comes in, add them to my welcome sequence." "When my nightly export finishes, summarize it for me." | You can mix and match. Some jobs run like clockwork; others wait quietly until a sale, signup, or new lead triggers them. > [!NOTE] > > Things that happen in Crevio, like a sale or a new lead, start a job within seconds. Many connected apps are checked on a timer instead: Gmail, Google Calendar and HubSpot are checked every 15 minutes, so a job can start up to 15 minutes after the email or update arrives. Crevio tells you when a job you set up works this way. ## Start a job from a webhook, Slack or another app When you set up a job in the task form, the trigger list includes more options beside the schedules. **When a webhook arrives.** Save the job and its page shows a private address. Anything that sends data to that address starts a run, and Crevio reads what was sent. Use it to start a job from another tool that can call a web address. If the job requires a signature, senders that can't sign can send the signing secret instead, as a Bearer token in the `Authorization` header or in an `X-Crevio-Webhook-Key` header. **When something happens in Slack.** Pick the event, and optionally a channel: | Slack event | When the job runs | | - | - | | Someone @mentions Crevio | Someone calls Crevio into a channel | | Someone adds a reaction | Someone adds an emoji reaction. Choose one emoji, or leave it blank for any. The job also sees the text of the message that was reacted to | | A new message is posted | A message appears in a channel | Limits: * **Crevio only sees channels it has been added to.** Invite it to a channel before choosing that channel. Leave the channel on **Any channel** to react to every channel it is in. * **Its own messages never start a run.** * **You need Slack connected.** Without it the form shows **Connect Slack to use Slack triggers**. See [Slack](/docs/integrations/slack). * **An @mention job replaces the chat reply.** While a job handles @mentions, Crevio doesn't also answer the same mention in a chat. * **Treat what arrives as untrusted.** Crevio reads webhook and Slack content as information to work from, not as instructions to follow. **When something happens in an app.** Pick one of your connected apps, then the event to wait for, such as **New Labeled Email** in Gmail. Crevio then shows that event's settings and fills the choices in from your own account, so you pick a real Gmail label, calendar or account from a list instead of typing an ID. Save, and Crevio starts watching the app with your connection. Removing the job, or switching it to another trigger, stops the watching. ### Several jobs on one trigger One event can start more than one job. A form's webhook can screen the new lead with one job and send them a thank-you with another, each with its own instructions and settings. On the **Scheduled** page, choose the **By trigger** view. Each webhook, app event, Slack, Discord or Teams event, or Crevio event (like a paid order) that starts a job gets its own box, listing every job that runs when it happens. Click **Add task** on a box to set up another job on that trigger. A new job on a webhook uses the same address, so you don't change anything in the tool that sends it. A webhook or app trigger with no job left on it shows **No task runs on this event yet**. Each job runs on its own: one failing or being skipped doesn't stop the others. A job that was set up by chat, with a different event such as a new order, shows **Keep its current trigger** in the form. Leave it to keep the trigger, or pick another option to replace it. ## Give a job its own email address A job can start whenever an email arrives at an address made just for it. Ask in plain words -- *"Give me an invoices@ address, and whenever a supplier invoice arrives there, add the amount and due date to my bills sheet."* Crevio creates the address and the job together and tells you the exact address to hand out. You don't need your own email domain for this: | Your account | The address looks like | | - | - | | No email domain of your own | `your-business.invoices@ai.crevio.app` -- it starts with the name in your built-in Crevio address | | A verified [email domain](/docs/integrations/email-domain) | `invoices@yourbrand.com` | The address works straight away. Every email that lands there starts the job; email to your other addresses doesn't. While the job is on, Crevio doesn't also answer those emails in a chat -- the job handles them. Limits: * **One word per name.** Letters, numbers, hyphens and underscores, like `invoices` or `job-applications`. * **Up to 20 addresses on Crevio's domain** per account. Delete one you no longer use, or verify your own domain, to add more. * **Testing by emailing it yourself from Crevio doesn't work.** Email your account sends to itself is ignored, so it can't start the job. Ask Crevio to test the job with a made-up email instead, or send one from your own mailbox. * **Replies go out from your built-in Crevio sending address**, with answers routed back to the job's address, until you send from your own domain. ## Ask it to come back to you later Not everything deserves a recurring job. For a one-off -- a reminder, a follow-up, a nudge before a deadline -- just tell Crevio when to pick it back up: * *"Remind me on Thursday morning to chase the supplier."* * *"Check back in two hours and tell me if that campaign got any clicks."* * *"The sale ends Friday at midnight -- come back an hour before and tell me how it did."* Crevio confirms it and carries on with whatever else you asked. A reminder for later becomes a **one-off job on your Scheduled page**, where you can see it, change it or delete it. At the time you named, it reads back through the chat you set it in, so you don't re-explain anything, and its answer lands in that same chat. For something within the hour, like *"look again in 10 minutes"*, Crevio simply picks the same conversation back up. A reminder for a set time goes off at that time. Recurring jobs work a little differently: a job set for 9:00 can start a few minutes after, up to 10 minutes, and always the same few minutes for your account. That keeps every business's 9:00 jobs from starting in the same second. If something has to happen at an exact minute, ask for a one-off reminder instead. When you hand Crevio a bigger one-off job to work on in the background, it also reports back to the chat you asked in once it's done, and checks the result against what you asked for before telling you. Recurring jobs stay quiet when they succeed; you only hear about problems. > [!NOTE] > > Times are read in your own timezone, so "9am Tuesday" means 9am where you are. Say the timezone explicitly if you mean someone else's. > [!TIP] > > Want it to happen every week rather than once? That's a recurring job -- say "every Thursday" instead of "on Thursday" and Crevio sets one up. ## Crevio checks in on your business every day You don't have to set this one up — it's already running. Once a day, Crevio does a sweep of your business: your sales and revenue, new orders, leads and customers, refunds, which products are selling, and how your live site is doing compared with the period before. It runs on your own clock, using the time zone saved on your account (or, if none is set, the time zone your browser reported when you signed in). The exact minute is spread across about an hour, so it won't land at the same moment every day. What it notices turns up as **insights** on your dashboard — short, specific observations worth your attention, like a product that's suddenly selling, a drop in traffic, or leads that never got followed up. Each one is based on your actual numbers, not guesswork. From there, Crevio can act on what it found: * **Raise it with you** as an insight on your dashboard, which you can act on or dismiss. * **Set up a job** to deal with it — for example, following up the leads it noticed going cold. * **Remember it**, so it takes your business's context into account next time you talk. > [!NOTE] > > Anything that sends, spends, or changes what your customers see waits for your approval first — the daily check-in observes and suggests, it doesn't act on your behalf behind your back. > [!TIP] > > You can ask about it directly too: *"What did you notice about my business this week?"* or *"Why did my sales drop on Tuesday?"* ## Your Chief of Staff Another built-in routine, **Workflow Discovery**, looks for repetitive work your team does by hand and offers to take it on. When Slack is connected, it reads what each teammate and channel works on, then sends each person a short DM with one or two automations made for their work, with the details in the thread, and posts ideas in the channel where they would help most. It pitches each person and channel only once, and once the whole team has heard from it, it checks in weekly instead of twice a week. Without Slack, it suggests one automation to you. Crevio also keeps an eye on **you**, not just your numbers. A built-in routine called **Chief of Staff** looks over your day three times a day -- your calendar, your inbox, Slack, and the work you have open -- and speaks up only when something is worth acting on right now. Think of a meeting that needs prep, an email waiting on your reply, or a task that's gone stale. * **It's selective.** At most two suggestions per check, and if nothing deserves your attention it stays quiet and you hear nothing. * **It tells you when something stopped working.** If a connected app needs reconnecting, or one of your scheduled jobs keeps failing, it says which job stopped and gives you a link to reconnect the app. It mentions each problem once, and again only if it gets worse. * **It researches who you're meeting.** When you have a call with someone new and there's little about them in your email, its prep looks the company and the person up on the web: what they do, recent news, and the person's role, with links, plus questions to ask. Ask *"Prep me for my call with Shopify tomorrow"* to get the same brief on demand. * **It can step in between checks.** If you've connected Gmail or Google Calendar, an important new email or a created or changed calendar event can bring a check forward. Crevio first judges whether the event is urgent; routine mail like newsletters and digests is skipped. When it does act, it looks at what depends on the change -- for example a moved meeting -- and leads with whatever breaks first, such as a drafted reply for you to review. Early checks are limited to one every 10 minutes and eight a day, and new emails can take up to about 15 minutes to be noticed. * **It runs on your time zone and for you personally.** Its notes are private to you, not shared with your team. * **It needs something to read.** Connect a calendar, your email, or Slack under [connected apps](/docs/integrations/connected-apps). Until you do, the routine skips its checks. > [!TIP] > > Ask *"How do you keep me on top of things?"* and Crevio will explain which built-in routines are running for you. ## Choose the name results appear under in Slack When a job posts its results to Slack, you can give it its own sender name, for example "Weekly Digest". Set it in the job's delivery options. Leave it empty to use the assistant's usual name. ## Find a job by model or person On the scheduled tasks page, filter the list by the AI model a job uses or by the teammate who created it. ## A monthly report of what Crevio did for you At the start of each month the account owner gets a summary of the last month: requests handled, jobs run, orders and new customers, credits spent and an estimate of the hours saved. Turn it off under **Settings** > **Notifications**. ## Your scheduled tasks page Open **Scheduled** in the sidebar to see all of your jobs in one place. * **Your tasks and Templates.** The **Your tasks** tab lists what you have running. **Templates** is a gallery of ready-made jobs (see [Start from a template](#start-from-a-template)). * **Four views.** See your jobs as **Cards**, a **List**, a **Calendar** of upcoming runs, or **By trigger** (see [Several jobs on one trigger](#several-jobs-on-one-trigger)). A short agenda shows what's due today, tomorrow, and over the next two weeks. * **Find the one you want.** Search by name, filter by status (**Active**, **Paused**, **Failing**, **Needs input**), by type (**Recurring**, **One-time**, **When triggered**), and sort by next run, name, or newest first. * **Pause, resume, or run now.** Each job has **Pause**, **Resume**, and **Run now**. Jobs that start from an event are managed by asking Crevio in chat. * **Run it now with something extra.** Ask in chat, for example "run my weekly sales digest now, and this time also break out refunds". Crevio runs the job you already have once, with that extra request, and reports the result back in the chat. The job itself and its next scheduled run stay exactly as they were. * **Schedule one yourself.** Choose **Once**, **Every few hours**, **Every day**, **Every weekday**, **Every week**, **Every month**, or a **Custom** schedule under **Advanced settings**, then write the instructions. * **Watch a run in progress.** While one of your jobs is running, or waiting on your answer, it appears under **Running** in the sidebar, above your recent chats. A spinner means it is working; a pause icon means it is waiting for you, for example on an approval. Click it to open that run's chat. The group shows your five most recent active runs and disappears when nothing is running. Crevio's built-in routines don't appear there. * **Stop a run in progress.** Open the job and click the stop button next to the running run in its run history. The run shows **Stopping…** while Crevio finishes the step it is on, then **Stopped**. Images, voice and video it was still generating are cancelled, so they aren't charged. A stopped run doesn't count as a failure, and you can ask Crevio in chat to pick it up where it stopped. You can also ask Crevio in chat to stop a run. * **See a job's run history.** Open a job and use the clock icon at the right end of the top bar to show or hide its runs. The icon only appears on a wide screen. Runs by the assistant open their chat. Runs of a [script job](#jobs-that-run-a-script) have no chat, so expand the run to read its output or its error. ## Start from a template Open **Scheduled** and choose the **Templates** tab for about 30 ready-made jobs: a morning brief, a day-before booking reminder, quote and invoice follow-ups, review requests, a welcome for new customers, a weekly social plan and more. Each card says what it does, when it runs, and which apps it works with. An app you've connected shows a check mark. One you haven't is marked **Connect during setup**. * **Find one.** Search by name or app, pick a topic such as **Bookings** or **Orders and payments**, and choose your kind of business (**Service businesses**, **Stores** or **Creators**) to see only the templates that fit. * **Use template.** Crevio opens a chat and sets it up with you. It looks up what it can about your business first, then asks only a few questions, such as your hours, your tone or where results should go. If the template needs an app you haven't connected, you get a connect button in the chat, or you can skip it. Crevio then creates the job around your business and runs a test, so you can see what it would have sent before it goes live. * **Installed.** A template you've set up shows **Installed**, and its button changes to **Rerun setup**. Rerunning it changes the job you already have instead of making a second copy, unless you ask for another one. * **Prefer a form?** Open the menu next to **Use template** and choose **Fill in the form instead** to get the template's settings in the job form, ready to edit. There's no separate uninstall: to stop a template's job, pause or delete it like any other job. You can also browse every template, without signing in, at [crevio.co/automations](https://crevio.co/automations). ## Set up a job **1. Describe the job** Tell Crevio what you want done, in plain words. Be clear about the goal: "Draft and schedule three Instagram posts promoting my new ebook." **2. Say when it should happen** Choose a schedule ("every Monday at 9am," "the 1st of every month") or an event ("whenever someone makes a purchase"). Just describe it — Crevio sets the timing. **3. Choose how much freedom it has** Decide whether Crevio should do the job automatically, ask you first, or just suggest what it would do (more on this below). **4. Pick how it tells you what it did** Choose where Crevio reports back — an in-app notification, an email, or a message on Telegram, Discord, or Slack. A channel you haven't connected yet is shown as **not connected** — picking it takes you straight to connect it, instead of choosing a channel silently, then never getting anything. **5. Turn it on** That's it. Crevio runs the job whenever the time or event arrives, and keeps you posted. ## Choose how much freedom Crevio has This is the dial that keeps you comfortable. For every job, you pick one of three levels: | Level | What it means | Good for | | - | - | - | | **Do it automatically** | Crevio completes the job and tells you afterward. If the job reaches an action that asks first (see below), the run pauses until you answer. | Routine work you trust — reports, research, drafts, keeping your records up to date. | | **Ask me first** | Crevio prepares the work, then waits for your approval before anything goes out. | Anything customer-facing you want eyes on — broadcasts, replies, refunds. | | **Just suggest** | Crevio tells you what it *would* do, but takes no action. | When you're getting comfortable, or for sensitive decisions you want to make yourself. | > [!TIP] > > New to automation? Start with **"ask me first"** or **"just suggest."** Once you see Crevio do a job well a few times, switch it to **"do it automatically"** and let it run. ### What always asks first Whatever freedom a job has, some actions wait for your approval by default: anything that sends something to other people (an email, text, call or message), publishes or makes something public, spends or moves money, deletes something, or changes who can access your business. Reading, researching, drafting and updating your own records run without asking. Scheduling an email to go out later counts as sending it: you approve it when it's scheduled, and the approval shows when it will go out. If the email is changed after that, it goes back to your drafts instead of sending, so what goes out is always what you approved. * **A job on "do it automatically" pauses at one of these.** The approval waits in your notifications, and in the channel the job reports to, and the job picks up again once you answer. * **You can let an action run without asking.** Choose **Always allow** on its approval card, or set it to **Run automatically** in **Customize** > **Connectors**. Jobs on "do it automatically" then run it unattended too. Admins can do this for any action. A teammate can do it for actions on an account they connected themselves (their Gmail, say), unless an admin has locked that connection. Crevio's own actions, like publishing a page, stay with admins. A few built-in actions have no setting and always ask: buying credits, changing these approval settings, and deleting or sharing things in your Slack workspace. In Slack and Discord the card's **Always approve** button follows the same rule; if you can't turn it on, the action is approved once and the card says so. * **Money and access always ask.** Refunds, purchases, ad spend, subscription changes, team members, API keys and connection access can be set to ask or off, never to run automatically. This is by design: a mistake there costs money or hands someone the keys. * **Your choice sticks.** A setting you pick stays as you set it, even if Crevio's default for that action changes later. Use the reset button next to a tool to go back to the default. ## Say what "done" looks like A job can have an optional **Done means** field: a sentence describing what a finished run must have produced. For example, *"The summary reached my inbox and links every story it mentions."* Before Crevio reports back, it checks its own result against that sentence. Each run then finishes with a short record of what it did, what it produced, and whether it confirmed the result was really there. A run whose result Crevio couldn't confirm is marked **unverified** in the run list, so you know to take a closer look instead of assuming it worked. > [!TIP] > > Describe the outcome you'd check for yourself -- "the post is scheduled for Friday," "the customer got a reply" -- rather than the steps to get there. ## Try a job before you trust it You don't have to guess what a job will do the first time it fires. Open the job and choose **Test run** — Crevio runs it once, for real, but with the brakes on: * **It does the actual work.** The research, the writing, the thinking — all real, so what you see is what you'd get. * **Nothing goes out.** Emails aren't sent, posts aren't published, nothing is changed for your customers. * **You see what it *would* have sent.** Anything the job meant to deliver is captured on the run under **Would have been delivered**, so you can read it before it ever reaches anyone. A test run of a job that is switched off stays switched off. Running it by hand doesn't turn it on. A test run is marked with a **Test** badge in the run history and is kept out of the job's record — it doesn't move the schedule forward, doesn't count as a failure if it goes wrong, and doesn't affect whether Crevio earns more freedom over time. For a job that starts when something happens, a test needs something to react to. When Crevio sets up a job like this in chat, it tests it with a made-up example (a sample booking, order or email) and tells you what it used. To choose the example yourself, describe it -- *"Test it with a fake \$250 order from [jane@example.com](mailto:jane@example.com)"* -- and Crevio runs the real job on that sample exactly as it would on a real order. No order is created and nothing is sent. The **Test run** button on the job's page runs it without a sample, so for these jobs ask in chat instead. > [!NOTE] > > A test run still uses credits, because the AI really does the work. It's a rehearsal, not a simulation. > [!TIP] > > Test a job whenever you change what it does — and especially before you move one from **"ask me first"** to **"do it automatically."** ## Pick up a stopped run where it left off If a run stops before finishing — timed out, failed, or you stopped it yourself — you don't have to start over. Look for **Resume** next to it in the run list. Resume continues that exact run's own conversation: Crevio sees what it already did, which files it already wrote, and carries on from there — instead of starting a fresh run that repeats work you already paid credits for. > [!NOTE] > > Resume is only offered when nothing else is currently running for that job. If the job's next scheduled run has already kicked off, resume the stopped one after it finishes. ## Run one job after another Some jobs depend on another one finishing first: a report on the nightly export, a post after the weekly roundup is written. Ask for it that way, for example *"after my nightly export finishes, summarize it for me"*. Crevio starts the second job as soon as the first one completes, and hands it what the first one produced. It doesn't guess a time or keep checking. * You can also have a job run only when another one **fails**, for example to alert you or retry another way. * Trying the first job with **Test** doesn't start the second one. * Crevio won't set up jobs that would start each other in a loop. ## Limit how often a triggered job runs A job that starts when something happens runs once for every sale, signup, or lead, so a busy day can mean a lot of runs and a lot of credits. Tell Crevio the limit when you set the job up: * *"Never more than 20 times a day"* caps the runs per day. The count starts over at midnight in your account's time zone. * *"At most once every 5 minutes"* sets a cooldown after each run. Crevio enforces both on every event. When the cap is reached or the cooldown hasn't passed, the job doesn't run and the event shows up in the run list as **Skipped**, with the reason. Test runs don't count toward the limit. > [!NOTE] > > A skipped event is not saved for later; the job won't run for it on its own. If every lead or order still needs handling, ask Crevio to have each run cover everything that came in since the run before, so the next run catches up on what the limit held back. ## Skipped runs show up too Some jobs check something before doing real work, and skip their turn when there's nothing to do -- a job that only reacts when a specific condition is met, or the daily check-in finding no new activity since last time. That shows up in the run list as **Skipped**, with the reason next to it, instead of looking like the job quietly stopped running. > [!TIP] > > If a job's run list shows a run of skips, that's it working as designed, not broken -- open the reason next to each one to see why. ## A job on "do it automatically" can run and still say nothing For a recurring job set to **do it automatically**, Crevio weighs whether a run is actually worth telling you about before it sends anything -- a genuine anomaly or a pattern with a clear next step, yes; "nothing changed since last time," no. When there's nothing worth surfacing, the run still completes normally, but no notification, email, or chat message goes out for it. > [!NOTE] > > This is different from a **Skipped** run above -- the job still did the work and checked your numbers. It just decided the result wasn't worth interrupting you for, and will tell you as soon as something is. ## A job that keeps finding nothing makes itself cheaper A job that runs more than once a day uses credits every time, even when there is nothing to report. If a recurring job on **do it automatically** has finished its last 12 runs in a row with nothing to tell you, Crevio changes it to cost less on its next run. It does one of two things: * **Adds a check before the run**, so a run with nothing new is skipped instead of paid for. * **Moves the job to a slower schedule**, when a later answer would still be on time. Crevio never pauses or deletes the job for this. It always sends you one short message saying what it changed, how many credits the quiet runs cost, and how to undo it. To undo it, ask Crevio to put the schedule back. > [!NOTE] > > This applies only to recurring jobs that run more than once a day and report on their own. Jobs set to "just suggest", built-in routines, and test runs are left alone. ## When a connected app needs reconnecting If a job's instructions name an app whose connection has broken, Crevio doesn't try to work around it through another app. A workaround would hide the problem from you. Instead the run: * **Skips the work that needs that app** and does any part of the job that doesn't depend on it. * **Ends marked as needing you**, with a message like *Reconnect Google Sheets*. * **Always tells you**, even on a job that normally stays quiet. Reconnect the app under [connected apps](/docs/integrations/connected-apps) and the next run picks up as normal. If a chat asks about a broken app, Crevio shows the **Reconnect** button there too. ## How Crevio tells you what it did You'll never be left wondering. After each run, Crevio reports back through whichever channels you chose: * **In-app notification** — a quick heads-up inside your dashboard * **Email** — a summary in your inbox * **Telegram, Discord, or Slack** — a message wherever you already spend your day The notification carries the job's actual report, titled with the job's name, so you can often read the result without opening anything. A new job defaults to **notification and email** so a run doesn't finish quietly while you're away from your dashboard — pick different channels in step 4 above if you'd rather not get both. The email's subject and wording match what actually happened, so a failed run or one that needs your input doesn't look like a success in your inbox. The update tells you what Crevio did, what it produced, and — if the job is set to "ask me first" — what's waiting for your approval. > [!NOTE] > > If a chosen channel stops working after the fact -- you disconnect Slack, for instance -- a run that tried to report there shows **not delivered** in the run list rather than looking like it went out. Reconnect the channel, or change where the job reports, in the job's settings. ## Jobs that run a script For work that is the same every time, such as pulling numbers into a report, Crevio can write a small script for the job and run that instead of reasoning through it from scratch on every run. The result becomes the run's summary. When you try a job before trusting it, a script job runs without sending or changing anything. ## Review and approve its work When a job is set to **"ask me first,"** Crevio does all the prep and then pauses, holding the work for you. You'll get a notification that something needs your review. **1. Open the notification** Each approval in your notifications shows the app it will act on, with its name and logo, and leads with the action itself. Click through from your notification, email, or chat message to see exactly what Crevio prepared — the draft email, the scheduled posts, whatever the job produced. **2. Review it** Read it over. If it's good, approve it. If it needs a tweak, tell Crevio what to change and it'll redo it. **3. Approve — and Crevio finishes the job** Once you approve, Crevio carries out the action: the email sends, the posts schedule, the follow-up goes out. You don't have to go looking for approvals that are waiting. The bell in the sidebar counts them, and the browser tab shows a red dot on its icon while you have unseen notifications or approvals waiting. When you start a new chat, **N approvals waiting for you** is the first suggestion under **For you**, and it opens the approvals list. That view opens on **For you** by default whenever something is waiting. > [!NOTE] > > An approval belongs to the chat that asked for it. If you delete that chat, its pending approvals are declined, because the action could no longer be carried out. ### Edit before you approve When an approval card is for a single action, open the menu next to the approve button and choose **Edit before approving**. You can change the values the action will run with -- for an email, the recipients, subject and body; for other actions, the text and numbers shown on the card -- then choose **Save and approve**. Crevio runs it exactly as you edited it and is told what you changed, so its report afterwards matches what really went out. Some limits: * **One action at a time.** A card that covers several actions can't be edited; approve or deny it as a whole. * **Only the details, not the action.** You can't change which app or account it runs on, or turn one kind of action into another. To do something different, deny it with a note. * **Checked before it runs.** If a value doesn't fit what the app accepts (a number where text is expected, a missing recipient, an address that isn't an email), the card shows what's wrong and nothing runs until you fix it. * **Editing happens on the web.** Cards in Slack and Discord have an **Edit** link that opens the same card in Crevio. ### Decline with a reason Next to **Deny** on an approval card, choose **Deny with a note** to say why -- for example, *"We never email customers on Sundays."* Crevio reads the note straight away and adjusts the work. If your note sounds like a rule rather than a one-off, Crevio also remembers it as a house rule, so you don't have to say it twice. A plain **Deny** with no note never saves anything. ## Staying in control Autopilot doesn't mean hands-off-and-hope. You're always the one steering: * **Nothing surprising happens.** A job only runs the way you set it up — on the schedule or event you chose, at the freedom level you picked. * **You can pause or change a job anytime.** Turn it off, adjust the timing, or rewrite what it does whenever you like. * **You can see what it did.** Every run is reported back to you, so there's a clear record of what happened. * **You can dial freedom up or down.** Start cautious, then loosen the reins as your trust grows — or tighten them again if you want closer review. > [!NOTE] > > A good habit: leave anything that goes out to customers on **"ask me first"** until you've watched Crevio handle it a few times. There's no rush to hand over the keys. ## What it can't do **It stops when you're out of credits.** A run that can't be paid for is recorded as a failed run, with running out of credits as the reason. Your schedule and settings are kept and it tries again at its next scheduled time once you top up — but the run that was due doesn't happen retroactively. **A job that's switched off doesn't bank its runs.** Turning it back on resumes the schedule from that point. It won't fire everything it missed. **A job set to "ask me first" waits for you.** It holds at that step until you approve or decline. If you're expecting work that never arrives, check whether something is sitting there waiting. **It isn't a guarantee of timing.** Jobs run on their schedule, not to the second. Don't build anything that depends on a run landing at an exact moment. **One job runs at a time, and five across your business.** A job won't start a second run while one is still going, and Crevio runs at most five jobs at once. Anything beyond that waits its turn rather than being dropped — a scheduled job picks itself up on the next tick, and a "run now" tells you to wait for one to finish. A job paused on your approval doesn't hold one of those five slots — it isn't using compute while it waits on you. Approving it puts it back in line for a slot: if your other four are busy, it stays paused a little longer and you may need to approve it again once one frees up. **A job left waiting on your approval for a week closes itself.** If nobody answers within 7 days, Crevio declines the pending approval, ends the run as failed, and lets you know — so an old request doesn't sit there forever. Run the job again when you're ready. **A run that gets stuck is stopped.** If a run is still going after four hours, Crevio ends it and marks it **timed out** rather than letting it spin. That's different from failed: it means the run never finished, not that it broke. **A recurring job that keeps failing turns itself off.** After several runs in a row fail, Crevio stops dispatching it rather than keep trying the same broken thing, and sends you a notification so you know it went quiet. Open the job to see what broke, fix it, and switch it back on — it won't resume on its own. A one-off job doesn't get this notice: running once and stopping is just the schedule working as intended. ## If something goes wrong * **A job didn't run when you expected.** Check that it's turned on and that the schedule or trigger is set the way you intended. Ask Crevio "show me my automated jobs and when they last ran." * **A job's run list is full of "Skipped."** That's not a failure -- the job checked and found nothing to do. See [skipped runs](#skipped-runs-show-up-too) for what the reason next to each one means. * **Crevio did something you didn't want.** Switch that job to "ask me first" or "just suggest" so you review before it acts, then tell Crevio what to do differently next time. * **You're not getting updates.** Make sure you've chosen at least one way to be notified, and that your Telegram, Discord, or Slack is connected if you picked those. A run marked **not delivered** in the run list means it tried to reach a channel that's since been disconnected -- reconnect it or pick a different one in the job's settings. * **A recurring job on "do it automatically" ran but sent nothing.** That's expected -- it only reports back when it finds something worth telling you. See [going quiet on purpose](#a-job-on-do-it-automatically-can-run-and-still-say-nothing). * **A job is waiting on you.** If a job is set to "ask me first," it pauses until you approve. Open the notification and review the work to let it continue. * **Approving a job says the account is already running 5 tasks.** All five of your run slots are in use — wait for one to finish, then approve again. * **A run failed with no answer within 7 days.** Nobody approved or declined it in time, so Crevio closed it for you and denied what it was waiting on. Run the job again when you're ready. * **A run says "timed out."** It ran past the four-hour limit and was stopped, so it never finished. Use **Resume** next to it to carry on instead of starting over, or narrow what the job does in one go and use **Test run** to check the shorter version. * **A job's schedule or checks changed and you didn't change them.** After 12 quiet runs in a row, Crevio can make a frequent job cheaper and tells you what it changed. See [a job that keeps finding nothing](#a-job-that-keeps-finding-nothing-makes-itself-cheaper). * **A job says "Reconnect" and did only part of its work.** An app it uses has a broken connection. Reconnect it under [connected apps](/docs/integrations/connected-apps). See [when a connected app needs reconnecting](#when-a-connected-app-needs-reconnecting). * **A recurring job turned itself off and notified you.** It failed several times in a row, so Crevio stopped dispatching it. Open it, check the run history for what broke, fix the cause, then turn it back on. * **Not sure what a job will do?** Use **Test run** — Crevio does the work and shows you what it would have sent, without sending anything. Or set the job to "just suggest" so it shows you its plan without acting. ## Related > **[Create with AI](/docs/features/creating-with-ai)** > > Have Crevio make the images, videos, and copy your jobs use. > **[Automation tips](/docs/tips/automation)** > > Practical ideas and recipes for automating your business. > **[Customers](/docs/features/customers)** > > Trigger follow-ups when new leads and buyers arrive. > **[Analytics](/docs/features/analytics)** > > Let Crevio summarize your numbers on a schedule. # Blog Source: https://crevio.co/docs/features/blog Publish articles with the built-in blog, build an audience, and drive organic search traffic to the products on your Crevio website. Your Crevio blog lets you publish articles directly on your [website](/docs/features/sites). Use it to share updates, tutorials, behind-the-scenes content, or anything that builds trust with your customers and drives them toward your [products](/docs/features/products). The fastest way to fill your blog is to ask Crevio. Describe a topic and Crevio drafts the whole post for you -- *"Write a blog post about the five mistakes new freelance designers make when pricing their work."* You review, tweak, and publish. > [!TIP] > > Stuck on what to write? Just ask Crevio for ideas: *"Suggest five blog post topics for my fitness coaching business."* Then ask it to write the ones you like. ## Creating a blog post **1. Go to Blog** Open **Blog** in your dashboard and click **New post**. **2. Write your post** Enter a title (3 to 200 characters) and write your content using the rich text editor. The editor supports formatting, headings, lists, links, images, and more. **3. Add a featured image** Upload a featured image that appears at the top of the post and in blog listing pages. This is the primary visual for your article. **4. Assign a category (optional)** Select a category to organize your post. Categories help readers browse related content and keep your blog structured. **5. Publish or schedule** Choose when to make the post live. You can publish immediately, save as a draft, or schedule it for a future date. ## Post statuses Every blog post has one of four statuses: | Status | Meaning | | - | - | | **Draft** | The default status for new posts. Draft posts are not visible on your website. Use this while you are still writing or editing. | | **Published** | The post is live on your website and visible to visitors. A published-at timestamp is set automatically when you publish. | | **Scheduled** | The post will be published automatically at the date and time you specify. Until then, it is not visible on your website. | | **Archived** | The post is hidden from your website. Use this to retire a post without deleting it. | > [!NOTE] > > You can move a post between statuses at any time. Scheduling a post requires setting a future date and time -- Crevio automatically publishes it when that moment arrives. ## Scheduled publishing Set a future date and time to have a post go live automatically. When you set a post's status to **Scheduled**: 1. You choose the exact date and time for publication 2. The post remains hidden from your website until then 3. At the scheduled time, Crevio automatically transitions the post to **Published** > [!TIP] > > Scheduled publishing is great for content calendars. Write a batch of posts in advance and schedule them throughout the week to maintain a consistent publishing cadence. ## Categories Organize your blog posts with categories. Each category has: * A **name** (2 to 50 characters, unique per account) * An optional **description** (up to 500 characters) * An auto-generated **slug** for its URL Categories help readers find related posts and give your blog a structured navigation. Each post can belong to one category. Categories with no posts are hidden from blog navigation by default. ## Featured images and social media images Each blog post supports two types of images: | Image type | Purpose | | - | - | | **Featured image** | Appears at the top of the post and on blog listing pages. This is the main visual for the article. | | **Social media image** | Used as the Open Graph image when the post is shared on social platforms (X, Facebook, LinkedIn, Slack, etc.). If not set, the featured image is used as a fallback. | > [!TIP] > > Upload a dedicated social media image with your post title or key visual baked in. This makes your links stand out in social feeds and messaging apps. ## SEO metadata Each blog post has optional SEO fields that control how it appears in search engines and social previews: * **SEO title** -- Up to 60 characters. Displayed as the page title in search results. * **SEO description** -- Up to 160 characters. Displayed as the snippet beneath the title in search results. If you leave these blank, Crevio uses the post title and excerpt as defaults. For a deeper guide to ranking your content, see [SEO optimization](/docs/tips/seo). ## Excerpts Every post has an excerpt -- a short summary shown in blog listing pages and RSS feeds. You can: * **Write a custom excerpt** -- Enter your own summary text for full control over how the post is previewed * **Let Crevio auto-generate it** -- If you leave the excerpt blank, Crevio strips the HTML from your content and truncates it to 200 characters as a preview > [!TIP] > > Writing a custom excerpt gives you control over the preview text readers see before clicking into the full post. A compelling excerpt can significantly improve click-through rates on your blog index. ## Blog indexability Control whether search engines can index your blog posts using the **indexable** toggle. By default, all published posts are indexable. When indexability is turned off for a post: * Search engines are instructed not to index the page * The post is still accessible via its URL, but it will not appear in search results This is useful for: * Time-sensitive announcements you do not want lingering in search results * Internal-facing content shared via direct link * Posts you want to soft-launch before making discoverable # Brand kit Source: https://crevio.co/docs/features/brand-kit Tell your assistant your logo, colors, fonts and voice once, and it uses them for your site, emails, social posts, ads and documents. Your brand kit is where your business's look and voice live: your logo, your colors, your fonts, your corner and spacing style, and how you sound. Your assistant keeps it as one brand file on its computer, next to your logo and font files, and reads it before it makes anything your customers will see. A sale post, a price list PDF or a new page comes out in your colors with your real logo instead of a palette it made up. ## Set up your brand You don't fill in a form. The first time your assistant needs your brand, it sets it up with you: 1. It starts from what it can already see: your Crevio site, your existing website, and anything you've shared in chat. 2. It asks for what's still missing, a few questions at a time: your colors (as exact codes like `#173b58`), your heading and body fonts, how rounded and roomy things should feel, how you sound, your tagline, and a short description of your business. 3. It asks you to send your logo and font files in the chat. An SVG logo plus a PNG works best, and `.woff2` files for fonts. If you don't have a font file, the font's name on [Google Fonts](https://fonts.google.com) is enough. 4. It shows you the finished brand, including anything still missing. You don't have to answer everything. Say "skip for now" and your assistant notes the gap and keeps going. When Crevio sets up a brand-new business for you, it picks a name, colors and fonts itself and tells you what it chose. Those become your brand until you change them. ## Change your brand Tell your assistant. "Our brand color is #0f766e" or "we use Playfair Display for headings" updates your brand kit. Your assistant changes only what you mention; everything else stays as it was. To see what's in your brand kit, ask your assistant to show it to you. ## How your assistant uses it Before it makes something customer-facing, your assistant reads your brand kit and takes its colors, fonts, logo and wording from it. That covers: * your website's pages and the preview image shown when someone shares a link * email templates * social posts and ad images * videos * PDFs, Word documents and slide decks, including the welcome PDF a new teammate gets when Crevio introduces itself Image generators can't draw a logo or exact text reliably, so for social posts and ads your assistant places your real logo file and the words on top of the generated image. ## Limits * **One brand per account.** Every teammate's work uses the same brand kit. * **There's no Brand page in Settings.** This is by design: you set and change your brand by telling your assistant. * **Your assistant never makes up a brand value.** If your brand has no accent color and a design needs one, it asks you or tells you what it added. The one exception is a brand-new business you asked it to create a brand for. * **Your existing site isn't restyled on its own.** Changing a color affects what your assistant makes next. To update your live site, ask your assistant to apply the new brand to it. * **Emails need your logo online.** An email can't read files on your assistant's computer, so the first time it puts your logo in an email, your assistant uploads the logo to your files and uses that link from then on. ## Common problems * **A post or PDF used the wrong color.** Ask your assistant to show your brand kit. If the value there is wrong, tell it the right one and ask for the item again. If the value is right, tell your assistant which color it got wrong. * **A font looks different from what I chose.** The name has to match a Google Fonts family exactly, or send your assistant the font file. * **Your assistant keeps asking about your brand.** Send the missing logo or values once, or say "skip for now". It only asks about what's missing. # AI phone calls Source: https://crevio.co/docs/features/calls Crevio can make phone calls for you toward a goal you set -- like following up with a lead or confirming an appointment -- and tell you how each call went. Some things are easier on the phone. Following up with a lead, confirming an appointment, or checking in with a customer can take dozens of calls you never have time to make. Crevio can make those calls for you -- just ask, the same way you'd ask it to draft an email. You give each call a clear goal, and Crevio's AI speaks with the person on your behalf, then reports back on what happened. ## What you can use it for * Follow up with a new lead and answer their questions * Confirm or remind someone about an appointment * Check in with a customer after a purchase * Gather a quick answer or piece of information ## Get a phone number Crevio calls from a phone number so people can see who's calling and can call it back. You can ask Crevio to set one up -- for example, "get us a phone number for calls" -- or do it yourself under **Settings** > **AI assistant** > **Phone**. ### Buy a number yourself In **Settings** > **AI assistant** > **Phone**, click **Get a phone number**, pick the country your callers are in, and optionally add an area code. The dialog shows the monthly price in credits before you confirm. Numbers are available in many countries. * **No paid plan yet?** The button becomes **View plans**, since phone numbers come with paid plans. * **Not enough credits?** It becomes **Buy credits**, so you can top up first. You need enough for the first month. * **Some countries need business verification.** Crevio sends you to a short form with the carrier, and the review usually takes 1-3 days. The Phone section shows where it stands, and you can start over or choose another country if it's declined. Once you have a number, a second purchase is refused, so a double click can't charge you twice. ### Ask for an area If you want a number from a particular area, say so -- "get us a number with a 212 area code." When that area code has no numbers left, Crevio tells you which nearby codes are available so you can pick one. If you don't ask for a specific area code and your usual one is sold out, Crevio picks an available one for you. That same number can also answer calls people make to it, if you tell Crevio how you want those handled. A phone number uses credits every month, starting when you get it -- if your balance can't cover the first month, the number isn't set up. Calls use credits for each minute they last, including calls from your browser. If your balance can't cover a new month, the number is released. ### Send calls to a person Some callers want to talk to you, not an assistant. Under **Settings** > **AI assistant** > **Phone**, in **Call forwarding**, enter a phone number at your business (it must be in the same country as your Crevio number) and choose how calls are handled: * **Your assistant answers.** Crevio picks up as usual. When a caller asks for a person, it tells them it's connecting them and passes the call to your number. If nobody picks up there, the call usually goes to that phone's own voicemail. * **Forward every call.** Calls ring your number straight away, and your assistant doesn't answer them -- not even when you call from one of your internal numbers. If nobody picks up within about 25 seconds, or the call can't get through, the caller can leave a voicemail. When a forwarded call is missed, you get a notification and an email. If the caller left a voicemail, the email has the recording attached and a written transcript, and the notification opens the recording. If they hung up without leaving one, you still hear about the missed call so you can call back. Forwarded calls use credits for each minute, like any other call. If your balance can't cover a minute, forwarded calls aren't put through. Pausing the number stops forwarding too. > [!NOTE] > > You can also ask Crevio to set this up -- for example, "forward calls to my cell, +1 628 222 4164." ### Release a number To give up your number, click **Release number** in the Phone section and confirm. A released number can't be recovered, and the month you've paid for isn't refunded. ## Call your own assistant When you call your business's number from one of your **Internal numbers** (below), you're not greeted as a customer. You're talking to your own Crevio assistant, the same one you chat with: ask how sales are going, what's on your plate, or have it take care of something while you drive. Everything you discuss is saved as a chat you can read later in Crevio. ### Talk to it from your browser You don't need a phone to talk to your assistant. Press the **voice button** at the right of an empty chat box to start a voice call right in Crevio. Once you start typing, it turns into the send button. The call shows in the conversation as one **Call** entry with its length. Open it to read back everything you and your assistant said, along with the work it did for you. While the call is going, it stays open, so you can approve anything your assistant asks for on screen. * **It keeps going while you work.** The call stays open as you move around Crevio. Use **Open the chat** in the call bar to jump back to the conversation. * **It tells you what it's doing.** While Crevio works on your request, it mentions each step out loud, so you're not left in silence. * **Approvals can be spoken.** If Crevio needs your go-ahead before doing something, you can say yes or no instead of tapping. * **Say "Hey Crevio" to start a call.** Turn on hands-free under **Settings → AI Assistant → Hey Crevio**, or from the ear button in the call bar during a call (account admins only, set per device). Crevio listens for its name in your browser, and no audio leaves your device until the call starts. On a chat page it calls that chat; anywhere else it opens a new chat. > [!NOTE] > > If you're silent for about 30 seconds, Crevio asks whether you're still there, and ends the call if you don't answer. Time spent waiting on Crevio to finish a task doesn't count. A single call can last up to 60 minutes. ## Make a call toward a goal You don't write a script or fill in a form. Tell Crevio who to call and what the call should accomplish, in plain language, right in the chat. **1. Tell Crevio who to call and why** Give it the phone number (or point to a customer or lead already in your account) and describe the goal -- "call this lead and confirm their appointment for Tuesday at 3pm" or "follow up on their interest in my coaching program and offer a free intro call." You can also tell it what to open with. **2. Let Crevio make the call** Crevio places the call and works toward your goal during the conversation. If the person's local time is outside calling hours (8am to 9pm), Crevio schedules the call for the next window and tells you when. **3. Review what happened** Crevio reports back in the chat with a summary of how it went and what the person said, so you know what to do next. ### Do something after every call Crevio can act each time a call ends, on its own. Ask in the chat -- "after every call, add the caller to my customers and send me a one-line recap" -- and it sets up a job that runs whenever a call finishes, answered or not. If you use another tool, such as a CRM, an account admin can send call starts and ends to it with a webhook from **Settings** > **Developer**. Calls you take with your own assistant in the browser don't count: they don't start these jobs or webhooks. > [!TIP] > > Be specific about the goal. The clearer your objective, the better Crevio handles the conversation -- and the more useful its summary will be. ## Numbers you don't need separate permission for Some numbers are yours to call any time -- your own phone, a team member's, a test line. Add them under **Settings** > **AI assistant** > **Phone**, in **Internal numbers**, and Crevio can call them without checking for consent or a do-not-call match first. Any team member's profile phone number shows there with an **Add as internal** button, so adding your own team is one click. Only add numbers you're actually authorized to call this way -- you're confirming that when you add one, and an opt-out request is always honored even for a number on this list. ## Calling people the right way Phone calls come with responsibility. You must have permission to call the people you're contacting, and you must respect their wishes if they ask not to be called. > [!WARNING] > > Only call people who have agreed to hear from you -- for example, leads who gave you their number and expect a follow-up. Always honor do-not-call requests. If someone asks not to be contacted again, don't call them. Following the rules around phone calls in your area is your responsibility. > [!NOTE] > > Crevio helps you keep track of who has agreed to be called and who has asked to be left alone, so it's easy to do the right thing. ## If something goes wrong > **The call didn't connect** > > The person may not have answered, or the number may be wrong. Double-check the number and try again later. Not everyone picks up the first time. > **The call didn't reach its goal** > > Sometimes a conversation doesn't go as planned. Read Crevio's summary to see what happened, then adjust your objective and try again, or follow up yourself. > **Someone asked not to be called again** > > Mark them as do-not-call so Crevio won't contact them again. Always respect these requests. > **Crevio says it needs permission before calling** > > For anyone who isn't on your internal numbers list, Crevio needs to know the person agreed to be called -- for example, they opted in on a form or at checkout, or they asked you for the callback themselves. Tell Crevio how and when they agreed, and it'll place the call. If nobody agreed, it won't call, to keep your business out of trouble. > **Crevio won't call this number again so soon** > > To avoid being pushy, Crevio limits calls to the same number to a few per day, spaced at least a few hours apart. Wait and try again later. ## Related > **[Customers](/docs/features/customers)** > > See the leads and buyers you can follow up with. > **[Forms & lead capture](/docs/features/forms)** > > Capture leads and their phone numbers to call. > **[Email your customers](/docs/features/email-marketing)** > > Follow up by email as well as by phone. > **[Tags & segments](/docs/features/tags)** > > Group people so you know who to reach out to. # Checkout Source: https://crevio.co/docs/features/checkout Understand how buyers purchase your products through Crevio's checkout flow Crevio provides a streamlined checkout experience powered by Stripe's custom UI mode. Buyers complete their purchase without leaving your website, keeping the experience on-brand and distraction-free. ## How checkout works **1. Buyer adds items** A buyer selects a price variant on your product page, or clicks a checkout link you have shared. This creates a checkout session with the selected items. **2. Payment details** For paid products, Stripe's embedded payment form collects the buyer's card details, billing information, and any applicable tax. The form renders directly within your website -- buyers are never redirected to a third-party page. **3. Discount codes** If you have created [discount codes](/docs/features/discounts), buyers can enter them during checkout to reduce the total. **4. Order completion** Once payment succeeds, Crevio creates an order, grants the buyer access to the purchased experiences, and sends a confirmation. > [!NOTE] > > Crevio determines the checkout mode automatically based on the items in the cart. If any item is a subscription or payment plan, the checkout runs in **subscription** mode. Otherwise, it runs in **one-time payment** mode. You cannot mix subscription/payment plan and one-time items in a single checkout. ## Checkout links Checkout links are shareable URLs that take a buyer directly to a pre-configured checkout. Instead of sending someone to your website and asking them to find the product, you give them a link that starts the purchase flow immediately. Each checkout link: * Contains one or more pre-selected price variants * Generates a **QR code** automatically, which you can download and embed in presentations, print materials, or social posts * Can optionally have a **discount code** pre-applied * Can include a **custom success URL** that the buyer is redirected to after purchase > [!TIP] > > Checkout links are great for promotions, email campaigns, and social media CTAs. Share a single URL and the buyer lands straight on the payment step. ### Checkout link rules * A checkout link must include at least one price variant. * You can only include one price variant per product in a link. * You cannot mix subscription/payment plan and one-time variants in the same link. * Only one subscription or payment plan variant is allowed per link. ## Shopping carts Buyers browsing your website can add multiple products to a shopping cart before checking out. The cart: * Supports multiple items with individual quantities * Shows the total across all items * Tracks the buyer by session (anonymous) or by customer account (logged in) * Merges automatically when a session-based cart is associated with a logged-in customer When a buyer proceeds to checkout from their cart, Crevio creates a checkout session containing all cart items. > [!NOTE] > > All items in a cart must use the same currency. If a buyer tries to add items with different currencies, the checkout will not proceed. ## Free checkout If every item in a checkout has a free price variant, Crevio skips the Stripe payment flow entirely. The buyer completes the checkout without entering any payment information, and you do not need a connected Stripe account for free-only products. This is useful for: * Lead magnets and email list builders * Free community access * Gated content that requires sign-up but no payment ## Buying something twice A signed-in buyer who already owns a product is stopped at checkout and asked to remove it. Only orders that still count as owned stop them: **Succeeded** and **Partially refunded** orders. A buyer whose earlier order was refunded, failed, or disputed can buy again, and so can you after a test purchase. Guests who aren't signed in aren't checked. ## Buyer closes the page after paying If a buyer pays and closes the tab before the confirmation page loads, Crevio still creates their order and gives them access once the payment is confirmed. It can take a little while to appear, so check **Orders** again before you refund. ## Setup fees at checkout If a subscription or payment plan variant includes a [setup fee](/docs/features/pricing#setup-fees), the fee appears as a separate line item during checkout. The buyer sees both the recurring amount and the one-time setup fee before confirming payment. The setup fee is collected together with the first recurring charge. ## Checkout states Every checkout session moves through one of these states: | State | Description | | - | - | | **Open** | The checkout has been created and the buyer is actively completing it. | | **Complete** | Payment succeeded (or the checkout was free) and an order has been created. | | **Abandoned** | The buyer left without completing payment. This happens when a new checkout replaces a previous one from the same cart. | | **Expired** | The Stripe session expired before the buyer completed payment. Stripe sessions have a built-in expiration window. | ## Shipping addresses If you sell anything you post to a buyer, enable **Collect shipping address** under **Settings -> Advanced -> Checkout**. Stripe then shows an address form during payment, restricted to your allowed countries, and the address appears on the order. > [!WARNING] > > This setting applies to your whole account, not to individual products. Turning it on asks every buyer for a shipping address, including buyers of things you never post to anyone. Crevio does not charge for delivery -- there are no shipping rates. See [Physical goods](/docs/features/physical-goods) for how to handle postage costs. ## Pre-filled email When a checkout is created from an [invoice](/docs/features/invoices), the buyer's email address is pre-filled from the invoice record. This saves the buyer a step and reduces friction for invoice-initiated purchases. ## Discount codes at checkout Buyers can enter a discount code during the checkout flow. Crevio checks that the code is active, has started, hasn't expired or reached its redemption limit, covers every item in the checkout, and meets any minimum order amount, once-per-customer, or first-order-only restriction. It checks again before payment, once the buyer's email is known, and tells the buyer why if the code can't be used. A [discount link](/docs/features/discounts#discount-links) opens checkout with a code already applied. See [Discounts](/docs/features/discounts) for details on creating and managing discount codes. ## Cross-sell recommendations During checkout, Crevio can display **cross-sell product recommendations** based on the items already in the buyer's cart. These are configured at the [price variant](/docs/features/pricing) level and encourage buyers to add complementary products before completing their purchase. # Create with AI Source: https://crevio.co/docs/features/creating-with-ai Ask Crevio to make images, videos, voiceovers, music, and do research for you — and reuse the results across your site Crevio is your built-in creative team. Instead of juggling design tools, stock libraries, video editors, and research tabs, you just ask — and Crevio makes it for you. Need a product photo? A banner for a sale? A short promo video? A voiceover for your course intro? A rundown of what your competitors are charging? You describe what you want in plain words, and Crevio delivers it. No software to learn, no briefs to write, no waiting on a freelancer. ## Why you'd use it * **Skip the tools.** No Photoshop, no video editor, no stock-photo subscriptions. * **Move fast.** Get a usable image, clip, or voiceover in moments, not days. * **Stay on-brand.** Ask for the style, mood, and colors you want, and refine until it's right. * **Reuse everything.** Whatever Crevio makes is saved to your library, ready to drop into a product, page, or post. > [!TIP] > > The simplest way to use any of this is to **just ask Crevio in chat.** Try "Make a brand image for my photography service" or "Find three competitors selling online yoga courses and tell me what they charge." You don't need to know which feature to open — Crevio figures that out. ## Generate images Ask Crevio for the images your site needs: * **Product shots** — clean, professional-looking photos of what you sell * **Banners and promo graphics** — for launches, sales, and seasonal campaigns * **Logos and brand marks** — a starting point for your visual identity * **Backgrounds and illustrations** — to dress up pages and posts **1. Open Crevio chat** Go to your dashboard and start a chat with Crevio. **2. Describe the image you want** Be specific about the subject, style, mood, and colors. For example: "A bright, minimal banner that says Summer Sale in soft pastel tones." **3. Review what Crevio made** Crevio shows you the result. If it's not quite right, just say what to change — "make it warmer," "remove the text," "try a darker background." **4. Use it** Once you're happy, the image is saved to your library. You can set it as a product photo, add it to a page, or use it in a post. > [!TIP] > > You can ask Crevio to **edit an image you already have** — "remove the background," "make this brighter," "add my logo in the corner." Upload it in chat and describe the change. ## Generate short videos Ask Crevio for short video clips to bring your site and social posts to life — product teasers, promo clips, animated intros, and more. Describe the scene and the vibe, and Crevio creates a short clip you can use on your website or share on social. > [!NOTE] > > Videos take a little longer to make than images. Crevio will let you know when your clip is ready — you don't need to sit and wait. ## Generate voiceovers and audio Need a narrator for a course lesson, a voiceover for a video, or a spoken intro? Ask Crevio to turn your text into natural-sounding speech. Tell it what to say and the kind of voice you want, and Crevio produces the audio for you. You can describe the voice (*"a calm male voice"*) or pick one by name. There are 20 to choose from: Aria, Roger, Sarah, Laura, Charlie, George, Callum, River, Liam, Charlotte, Alice, Matilda, Will, Jessica, Eric, Chris, Brian, Daniel, Lily and Bill. Crevio tells you which voice it used, so you can ask for the same one next time and keep your videos sounding consistent. This is great for: * Narrating course content without recording yourself * Adding a voiceover to a promo video * Creating audio versions of written material ## Generate music and soundtracks Ask Crevio for an original track: background music for a promo video, a jingle, an intro for your podcast, or a full song. Describe the style the way you would to a musician, and the more specific the better: the genre, the mood, how fast it should be, the instruments you want to hear, and whether it should have vocals. > *"Add a hard-hitting country rock instrumental with banjo to my promo video. It should grab attention in the first second."* When the music is for a video, Crevio cuts the track to the video's length, fades it out at the end, and can time the scene changes to the beat. Things to know: * **A song you name is a style guide, not a copy.** Ask for something that "sounds like" a song you love, and Crevio makes an original track in the same genre and energy. It won't reproduce the melody or the recording. * **You can't upload a song as the example.** Crevio makes music from a written description only. Tell it what you like about your example song instead (the tempo, the instruments, how hard it hits). * **You can use the tracks in your business.** They are original, and the music providers allow commercial use. No one can guarantee a generated track will never resemble an existing song, though, so for TV, radio or a large campaign, check before you publish. * **Each new version uses credits.** If a track isn't right, tell Crevio what to change (*"faster, louder drums, less guitar"*) rather than asking it to try again. ## Talk instead of typing **Speak your message.** Click the microphone in the chat box, say what you want, and click the square to stop. You can also hold the microphone button (or the keyboard shortcut shown when you hover over it) while you talk and let go to finish. Press **Esc** to throw the recording away, or **Enter** to finish it. A waveform shows Crevio is hearing you. Your words appear in the message box as text, so you can fix anything before you send it. Dictation needs some credits left on your account. **Send a recording.** Attach a voice memo or audio file -- an iPhone voice recording works too -- and Crevio listens to it. Ask it to transcribe a meeting, pull the to-dos out of a rambling memo, or turn a spoken idea into a product description. When more than one person is talking, the transcript is split by speaker with timestamps, so you can see who said what. Crevio puts names to the speakers when the recording makes them clear (*"Hi Sam..."*). **Share a video link.** Paste a YouTube link and ask for a summary, the key points with timestamps, or the exact wording of a quote. Crevio watches the video itself rather than guessing from its title, so it can tell you what was actually said and shown. TikTok links work too. Videos that are private, age-restricted or removed can't be watched, and Crevio will say so. **Get a reply you can listen to.** Ask for an answer "as a voice note" -- *"give me this morning's numbers as a voice note"* -- and Crevio replies with an audio message that plays right in the chat, along with a short written summary. Voice notes are saved to your library and use credits like other audio. ## Paste long text When you paste a long block of text into the chat box (more than about 2,000 characters or 50 lines), Crevio attaches it as a text file instead of filling the box. It shows above the box as **Pasted text** with its line count, so you can still see and type your actual question. Crevio reads the whole paste when you send. To take it back, hover over the chip and click the **x**. Shorter pastes go into the box as usual. ## Organize your chats Open the **…** menu next to a chat in the sidebar to: * **Pin** it. Pinned chats stay at the top of the sidebar under **Pinned**, however old they are. Choose **Unpin** to put one back. * **Move to folder**. Pick a folder, or choose **New folder** to make one and move the chat into it. Each folder is its own group in the sidebar. Click a folder's name to collapse or expand it, and use the **…** next to it to rename or delete it. Deleting a folder keeps its chats; they go back to **Recent chats**. * **Archive** it. The chat leaves the sidebar. Find it again on the **Chats** page under the **Archived** tab, and choose **Unarchive** to bring it back. The sidebar also marks chats that need you: * A **dot** means Crevio replied since you last looked at that chat. It clears when you open the chat. * A red **!** means Crevio's last run in that chat failed. It goes away once Crevio replies successfully. Pins, folders, archived chats and unread dots are yours alone. A teammate who shares a chat sees their own. In the mobile app you can pin and archive chats (press and hold a chat), but folders show only on the web. On a phone-sized screen in the browser, the sidebar slides in as a drawer, and any chat that already has messages shows a **new chat** (pencil) button in the top-right of the header. It doesn't appear on an empty new chat. ## Send a message while Crevio is working You can keep typing while Crevio is replying. What **Enter** does with that message is up to you: * **Steer** (the default): your message goes in now, and Crevio reads it at its next step, so you can correct course without waiting. * **Queue**: your message waits, and is sent as a new message once Crevio finishes its reply. While Crevio is working, use the button next to **Send** to choose between the two. Crevio remembers your choice on every device. Press **⌘⇧↵** (**Ctrl+Shift+Enter** on Windows) to send one message the other way. A queued message shows **Queued** under it until its turn comes. A message with a file attached is always steered. To stop Crevio instead, press **Esc** or the stop button. ## Research the web for you Crevio can go out and find things on the internet so you don't have to. Just ask, and it reads across the web and brings back a clear, useful summary. Ask Crevio to: * **Find your competitors** — "Who else sells online photography courses, and what do they charge?" * **Gather facts** — "What are the most popular pricing models for membership communities right now?" * **Summarize a market** — "Give me an overview of the digital planner market and who the big players are." * **Check a specific page** — "Read this competitor's pricing page and tell me what's included in each tier." Crevio does the digging and hands you the takeaways in plain language. You can then ask it to act on what it found — for example, "Based on that, suggest pricing for my course." Crevio can also look at what people are searching for on Google. Ask how interest in a topic has changed over time, which regions search for it most, or which related searches are rising -- for up to five keywords at once, across Google Web, News, YouTube, Images and Shopping. Or ask what's trending right now in a country, with an approximate search volume and the news behind each search. Trend lookups show relative interest, not exact search counts, and the trending-now list covers one country at a time. > [!TIP] > > Research pairs perfectly with everything else. Ask Crevio to "research what's trending in my niche, then make me three social graphics and draft captions for each." ## Crevio can work on its own computer For jobs that mean actually using a website — not just reading it — Crevio can drive a real computer of its own: opening pages, clicking around, and filling in forms, the same way you would. You can watch it happen live. Click the monitor icon near your chat to open the computer panel and see Crevio's screen in real time — it stays tucked away until you open it, so it doesn't crowd the conversation, and it'll remember your choice next time. While you're just watching, the screen is **view only**, so a stray click can't interfere with Crevio's work. Click **Take control** to click or type yourself, and **Stop controlling** to go back to watching. When Crevio hands you the screen for a step, it opens ready for you to use. Crevio never asks you to paste a password or a code into the chat. For sites you've saved a login for, it signs in on its own: it fills the password straight into the page without ever seeing it, enters two-factor codes, and fills in saved cards (after you approve) and addresses. See [Vault](/docs/features/vault). Some steps still need to stay yours: signing in to a site with no saved login, a code sent to your phone, or solving a CAPTCHA. For those, it hands the screen over to you right there in the conversation, tells you in one line what it needs ("Sign in to Findstack"), and waits. **1. Crevio hands you the screen** A card appears in the chat with the live computer screen and a short instruction. **2. Take over and finish the step** Click **Take over** to open the screen full-size, then sign in, enter the code, or do whatever was asked — directly on Crevio's computer. **3. Tell Crevio you're done** Click **I'm done** and Crevio checks the screen and picks up right where it left off. If you can't complete the step, click **Skip** instead and Crevio continues without it. > [!TIP] > > Once you've signed in somewhere on Crevio's computer, it stays signed in there — you shouldn't need to hand off for that same site again. ### Long chats When a conversation gets very long, Crevio tidies it up so it can keep going. If your reply has to wait for that, the chat shows "Tidying up our conversation so I can keep going" instead of sitting on a blank thinking indicator. It passes on its own, and your answer follows. ### Long jobs don't tie up the chat If Crevio starts something that takes a while -- a long export, a big download, a site that needs time to finish loading -- it doesn't sit there holding the conversation. It waits in the background, and the chat picks itself back up when the job finishes or the wait runs out. You can close the tab in the meantime. ## Work on a page right next to the chat Open a dashboard page, such as Analytics, Customers, Orders, or Products, in a panel beside your chat, so you can look at the numbers while you talk to Crevio. Use **New tab** in the panel to pick a page, and keep several open at once. Crevio can open and close pages there too: ask "show me my latest orders" and it appears next to the chat. Pages in the panel refresh by themselves when your data changes, for example when a new order comes in. Your site preview opens in the same panel as its own tab, with back and forward controls. Close it whenever you like. ## Drafting messages for you When you ask Crevio to write an email, a text, or a message for another app, it shows the draft as a card. For tricky situations it offers a few different approaches, each labeled by what it aims for, such as a gentle nudge versus creating urgency. On the card you can: * **Copy** the message. * **Send it** as it is, or edit it first and send it with your edits. * Open it in your email app, **Send via Gmail**, or **Open in Messages** for a text. ## Start new things from chat The **Create** buttons on pages like Products, Customers, Discounts, Forms, Invoices, Blog, and Experiences now start a chat with Crevio, so you can describe what you want and let it build it. Open the arrow next to the button to fill in the form yourself instead. ## Everything lands in your library Whatever Crevio creates — images, videos, audio — is automatically saved to your media library. That means you can reuse it anytime without making it again: * Set a generated image as a product cover photo * Drop a clip or graphic into a website page or blog post * Reuse a voiceover across multiple lessons You stay in control of what gets used where, and nothing goes live until you choose to use it. ## A note on credits Creating with AI uses **credits** — a simple, built-in balance that covers the work Crevio does for you. Generating an image, making a video, producing a voiceover or a music track, or running web research each uses a small amount. In general: * **Images** are the lightest, so feel free to experiment. * **Videos and longer voiceovers** use more, since there's more work involved. * **Quick research** costs less than a deep, exhaustive deep-dive. You can always check your remaining balance and see what's been used in **Settings** → **Billing**. Three things worth knowing: * **Premium models only when you ask.** Crevio makes images and videos with its standard models, which keep a typical clip to a few dozen credits. A premium video model can take hundreds of credits per clip, so Crevio uses one only when you ask for it by name. If it thinks one would help, it makes the clip anyway and tells you what the premium version would cost. * **Other work isn't priced up front.** For chats, research and building, the assistant can't predict the cost, so the dashboard is the source of truth. See [credits](/docs/features/credits). * **You're only charged for generations that work.** If an image, video, or voiceover fails to produce anything, the credits it would have used aren't taken. ## If something goes wrong * **The result isn't what you pictured.** Tell Crevio what to change in plain words and let it try again. Being specific about style, colors, and mood helps a lot. * **A video or audio clip is taking a while.** That's normal — these take longer than images. Crevio will notify you when it's done; you can carry on with other work in the meantime. * **You can't find something Crevio made.** Check your media library — everything generated is saved there automatically. * **Research came back thin or off-topic.** Try rephrasing your question with more detail, or ask Crevio to "look deeper" for a more thorough answer. * **The panel says your computer is asleep.** It powers down after a period with nothing to do. Starting to type a message usually wakes it up in the background before you even hit send, but if it's still asleep when you need it, open a chat or click **Wake up** in the panel — just having the panel open doesn't wake it on its own. * **The computer screen won't load.** Give it a moment and try again — it's spinning up. If it still won't load, ask Crevio to continue without it. * **You've run low on credits.** Top up in your dashboard, then ask again. ## Related > **[Put your business on autopilot](/docs/features/automation)** > > Have Crevio create and post content for you on a schedule. > **[Products](/docs/features/products)** > > Use generated images as product photos. > **[Your website](/docs/features/sites)** > > Bring AI-made visuals onto your site pages. > **[Analytics](/docs/features/analytics)** > > See what's resonating, then make more of it. # Credits & what things cost Source: https://crevio.co/docs/features/credits What a credit is worth, what spends one, what doesn't, and how to top up — with the actual numbers. **Credits are what the AI spends to do work for you.** Writing copy, designing an image, building a page, answering a customer, running a task — each one uses credits. This page gives you the real numbers, so you can plan instead of guess. ## What a credit is worth > [!NOTE] > > **1 credit = \$0.02** on a monthly plan, so \$1 of plan buys 50 credits. A yearly plan works out cheaper per credit. Credits you buy on top of your plan, as a top-up or automatically, cost **\$0.025** each, so \$5 buys 200. If you top up every month, a bigger plan is the cheaper way to get the same credits. ## What AI work costs Most of what Crevio does for you is **priced by the actual work done**, not a flat fee per request. A one-line tweak to a headline costs a fraction of what building a full website costs, because it genuinely is less work. Two things drive the cost: * **How much work the job takes.** Longer, more complex jobs cost more. * **Which AI model runs it.** Heavier jobs use more capable, more expensive models. Because of that, **the exact cost of a piece of AI work is only known once it has run.** Crevio doesn't quote a price up front for open-ended work, and the assistant can't tell you what it will cost before doing it. The exception is a premium image or video model: when Crevio suggests one, it tells you the credits it would take. > [!TIP] > > If a job might be big, ask Crevio to do it in steps. You see the result — and the cost — after each one, instead of committing to the whole thing at once. ### Every message to the assistant costs credits Talking to Crevio isn't free. **Every turn the assistant takes spends credits** — including when it retries something, and including when it's fixing its own mistake. This is worth knowing because it changes how you get value: * A clear, specific request costs less than three rounds of clarification. * Saying what you *don't* want up front is cheaper than asking for a redo. * Asking Crevio to remember a preference means you stop paying to repeat it. ### Images, video, and audio Media is priced by exactly what you get back: per image, per second of video, per character of speech. A 10-second clip costs about twice a 5-second one, and a high-resolution upscale costs more than a small one. You can steer the price with how you ask: * **"A quick draft"** uses a faster, cheaper model. Good for trying out ideas. * **No preference** uses a balanced model that's right for most work. * **"Best quality"** uses the strongest model for the job, at a higher price. Save it for the final version. Crevio won't start an image, video, or audio job your balance can't cover. In your usage breakdown, images, video, speech, and transcription each have their own line, so you can see which one your credits went to. ## What has a fixed price Email lookups, phone calls and actions in your connected apps have set prices, because they're paid per call to an outside service: | What you're doing | Cost | | - | - | | Finding a person's work email | 7 credits | | Listing the email addresses at a company | 7 credits per 10 addresses asked for | | Verifying an email address | 2 credits | | Looking up a company from its website | 7 credits | | Looking up a person from their email | 2 credits | | Finding leads matching a search | 2 credits | | A phone call the AI makes or answers | From 10 credits per minute | | Running an action in a connected app, like sending an email from Gmail | From 1 credit | | A connected app telling a task that something happened, like a new email arriving | 1 credit | Phone calls are charged on the real length of the call, rounded up to the next minute. A call with a more expensive voice or AI model can cost more per minute. Crevio caps a call's length to the minutes your balance covers. An action in a connected app costs 1 credit for every 30 seconds it runs, so most cost 1 credit. When a task starts from something that happens in a connected app, such as a new email or calendar event, each one costs 1 credit as it arrives, on top of the task's own run. To keep that low, have the task watch only the emails it needs, for example only those from one sender. ### Your AI's computer Your AI has its own computer for running code, building and previewing sites, and browsing the web. It wakes up when the AI needs it and goes back to sleep when it's idle, and you pay for the time it's awake at what it costs us, about **8 credits an hour**. An hour of heavy work, like building a site, can cost a little more. It's charged through the month as the time adds up, and shows up as **Computer time** in your usage breakdown. Most accounts use only a few minutes a day. Everything else the AI does for you carries no separate per-action fee. It's covered by the cost of the AI work itself. ## What doesn't cost credits * Browsing your own dashboard, orders, customers, and analytics. * Publishing, editing, or deleting things yourself by clicking around. * Receiving payments from your buyers. * Connecting or disconnecting an app, social account, or domain. ## Where to see your balance Go to **Settings** → **Billing**. You'll see your current balance and a list of every credit added or spent. ## Seeing where your credits go Go to **Settings** → **Usage** (admins only). Pick the period at the top right: this billing cycle, today, the last 7 or 30 days, this month, or last month. The top card shows the credits used in that period, what you used today, your average per day, your balance, a bar chart of daily spend, and a forecast of roughly when your credits run out at this week's pace. Below it, the same credits are broken down four ways. Switch between them with the tabs: * **Chats and tasks**: the conversations and scheduled tasks that cost the most. A task's runs are added up under the task. Credits that didn't come from a chat, like the API, are on one line. Connected-app calls, phone calls and chat titles count under the chat that caused them; charges made before this change stay on the unassigned line. * **Teammates**: what each person's chats and the scheduled tasks they created used. Spend that isn't tied to one person, like a shared Slack channel or the API, is on its own line. * **Sites**: what the work on each of your sites used. * **Kind of work**: chat replies, images, research and so on. Click any row to filter the whole page to it, and click a bar in the chart to filter to that day. Filters stack, so you can see, for example, what one teammate spent on one site on one day. Each filter shows at the top of the card; click its **×** to remove it. Sort by most credits or most recent on the right. **Failed runs**, at the bottom, lists task runs and chat replies that failed on Crevio's side, with a button to give their credits back. It only shows up when something has failed. Credits added to your account, like plan refills, top-ups, bonuses and refunds, are under **Credit history** in **Settings** → **Billing**. ### Credit limits per teammate An admin can cap how many credits each teammate can use per billing cycle. In **Settings** → **Usage**, open the **Teammates** tab, find the person and click **Set limit**. Leave the box empty, or click **Remove limit**, for no limit. You can also ask Crevio, for example *"Cap Sam at 2,000 credits a month"*. It asks you to approve the change first. When a teammate reaches their limit: * Their messages to the assistant get a reply saying they've reached their limit and when it resets. This works the same in the web app, the mobile app, Slack, Discord, Telegram, and email. * Scheduled tasks they created are skipped until the next billing cycle. A skipped run shows the reason in the task's history. * Everyone else keeps working as normal. The limit resets when your plan's credits refill. The account owner can't be given a limit, and an admin can't change their own. ### Credits back for a failed run If a scheduled task run or a reply from the assistant fails because of a problem on Crevio's side, you can get the credits it used back. Click **Give credits back** next to it under **Failed runs**, or ask the assistant. * Only failures on Crevio's side count: the assistant crashed, the AI model returned an error, or the run never started or stopped responding. * A run that stopped because nobody answered its question, or a task that runs your own script, doesn't qualify. * Each run or reply can be refunded once, within 14 days, and up to 3 times a day per account. * The credits land on your balance right away and never expire. > [!NOTE] > > A private chat only shows up in the list for the person who can open it. ## Topping up If you run low before your plan renews, you can buy more without waiting. **1. Open your plan settings** Go to **Settings** → **Billing**. **2. Choose an amount** Top-ups start at **\$5** (200 credits) and you pick any amount above that. There's no fixed pack size. **3. Confirm** It charges the card already on your account, and the credits land right away. > [!NOTE] > > **Top-ups need an active paid plan.** On the free plan you can instead buy a one-time **starter pack of 300 credits for \$10**, once every 30 days, or choose a plan. > [!NOTE] > > **Owners and admins can buy credits and turn on auto top-up.** Teammates without admin access don't see the purchase form; when credits run out, Crevio asks the admins for them. Only the owner can cancel or pause the plan. ### Buying credits in a chat Ask Crevio to top up, for example *"Buy \$20 of credits"*. It shows an approval card with the amount and the credits it buys. Once an admin approves, it charges your card on file straight away. With no card on file, the card shows a **Pay** button that opens a secure checkout. Every purchase asks for its own approval, even if you have allowed other actions to run automatically. ### Usage alerts Admins get a notification and an email when credits are running low, at three points in each billing cycle: * when the cycle has used 70% of its credits; * when, at the last week's pace, your credits would run out before the next refill. This one names the date and the task that spent the most; * when the cycle has used 90% of its credits. Each one is sent at most once per cycle, and only in that order, so you never get the same warning twice. There are no alerts while automatic top-ups are on, since your balance refills itself. If you used well over your plan's monthly credits in the last 30 days, the alert also names the bigger credit tier that would cover it, and **Settings** → **Billing** shows the same suggestion with a link to switch. ### Automatic top-ups Turn on **auto top-up** and Crevio refills your balance for you, so a long job doesn't stop halfway. Once it's on, you choose: * **Top-up amount**: how much each top-up charges, from **\$5**. It starts at **\$20** (800 credits). * **When credits drop below**: the balance that triggers a top-up. It starts at **100 credits**. * **Monthly limit**: the most auto top-ups can charge in a calendar month. Leave it empty for no limit. It uses the card already on your account. If a top-up can't go through, because the card was declined, there's no card on file, or the monthly limit is reached, the owner and admins get an email and a notification, and **Settings** → **Billing** shows what went wrong with a **Retry now** button. Changing any auto top-up setting clears the warning. ## When credits run out Nothing you ask for is lost. Crevio holds it and picks it up as soon as credits are added again, whether that's a top-up, an auto top-up, a plan upgrade, or your plan's monthly refill. The owner and admins get a notification and an email when the balance runs out, with the fastest way back: **Add credits** on a paid plan, or the plans on the free plan. It's sent at most once a week, and not at all while auto top-up is on. * **Messages to the assistant**: you can keep typing. The assistant replies that you're out of credits and your message is saved, then answers it once credits land. This works the same in the web app, the mobile app, Slack, Discord, Telegram, and email. * **Scheduled and automatic tasks**: a run that was due is held. After the top-up, each task runs once, using the latest thing that triggered it. If several runs were missed, that one run covers them. * **Held work expires after 7 days.** A message or task run held longer than that isn't picked up, so you don't get a reply to something you asked about last week. ### Asking an admin for credits Only the owner and admins can buy credits. On a paid plan they see a **Buy credits** link in the out-of-credits notice; on the free plan, **Upgrade your plan**. Teammates without admin access reach Crevio from Slack, Discord or Telegram. If one of them messages Crevio while the account is out of credits, Crevio asks the owner and the admins for them: each gets a notification and an email naming who asked, with the message they were trying to send attached. The teammate is told their admins have been asked. Crevio asks at most once an hour for each person. ### When a job costs more than you had left Crevio checks your balance before it starts something, but some work only reveals its full cost at the end -- a long reply, a big research job. If a job finishes costing more than your balance, the difference is owed, not written off. It's taken out of the next credits that reach your account, whether that's a top-up or your plan's monthly credits, so a top-up after a big job can show up smaller than you expected. A refunded top-up works the same way. Its credits come off your balance in proportion to the refund, so half the money back removes half the credits. If you already spent them, the difference is owed and taken out of the next credits that reach your account. ## When credits expire | Where they came from | Do they expire? | | - | - | | **Credits you bought** (top-up or auto top-up) | No — they stay on your balance until you spend them. | | **Monthly credits included with your plan** | After one extra cycle. Unused plan credits roll over to the next billing cycle, then expire at the end of it. | | **Free plan credits** | Topped up to your monthly allowance, not stacked. See below. | Credits are used in this order: plan credits rolled over from last cycle, then this cycle's plan credits, then credits you bought, then bonus credits like referral rewards. ## On the free plan * You start with **100 credits** when you sign up. * Each month, your balance is **topped up to 20 credits** if it's below that. That's a top-up, not a bonus: if you're already above 20 credits, nothing is added, and if you're at 5, you get 15. Bought credits are never taken away by this — if you've topped up and are sitting above the allowance, the monthly refresh simply skips you. On the free plan, account admins see a bar above every page with your remaining credits and a **Subscribe** link to the plans. It disappears once you subscribe or are on a trial. ## Earning credits by referring friends The **Refer and earn credits** dialog in the sidebar has three tabs: * **Earn cash** explains the affiliate program (see below). * **Invite friends** gives you a personal invite link, and lets you invite people by email. * **Rewards** shows how many friends have joined, the credits you've earned, and a progress bar to your next milestone at 1, 3, 5, 10 and 25 friends. When a friend you invited subscribes to a paid plan, you get **500 credits** and they get **250 credits** on top of their plan. Referral credits are for bringing in genuinely new businesses, so inviting yourself or a second account of your own doesn't earn them, and there's a limit on how many referrals earn credits each month. Email invitations have a few limits: * Up to **10 addresses** in one go, and **20 people a day** per person. Past that, share your link instead. * Anyone who already has a Crevio account, or who was invited in the last **90 days**, is skipped. Crevio doesn't tell you which addresses were skipped or why. * Every invitation has an unsubscribe link. Someone who uses it never receives another invitation from anyone, and their address will also be skipped. ## Earning cash as an affiliate Referring friends earns credits. If you recommend Crevio to an audience, the affiliate program pays cash instead: **20% commission, for life**, on every paying customer you refer. It covers their plan payments and their credit top-ups, there is no cap on how much you can earn, and you can follow your referrals in a live stats dashboard. The **Earn cash** tab has a calculator. Pick how many customers you refer and which plan they're on to see what you could earn each month and each year. The figures are an estimate based on those choices, not a promise of earnings. Click **Join the affiliate program** to sign up. The program is also listed as **Become an affiliate** on the Rewards page. ## Limits that aren't about credits Some things are capped per day by your plan, separately from your credit balance. Having credits doesn't raise these, and hitting one doesn't spend credits. | Per day | Free | Starter | Pro | Business | | - | - | - | - | - | | Marketing emails sent | 1 | 10 | 100 | 1,000 | | Social posts published | 0 | 2 | 5 | 10 | | Phone calls | 1 | 10 | 50 | 250 | Phone calls also have anti-spam caps that apply on every plan: at most **3 call attempts to the same number in 24 hours**, with a **3-hour gap** between attempts. ## Things to know * **Crevio's assistant can check your balance and where your credits went, but it can't quote a price before doing the work.** If it tells you something is free or promises a refund, that's a mistake; check **Settings** → **Billing**. * **Cost follows the work, not the outcome.** If a job runs and you don't like the result, the work still happened and the credits were still spent. Asking for a change is a new, usually much smaller job. * **Your own app's AI usage is billed separately and at cost.** If Crevio built you an app that calls AI itself, that traffic goes through Crevio at the AI provider's list price with no markup, capped at 25,000 credits per day per key by default. ## Related > **[Your settings](/docs/features/settings)** > > Where your plan, credits, and usage breakdown live. > **[Create with AI](/docs/features/creating-with-ai)** > > What the AI can make for you, and how to brief it well. # Customers Source: https://crevio.co/docs/features/customers Track your buyers, segment your customers, and understand customer lifetime value Customers represent the people who interact with your business -- whether they browse, sign up, or make a purchase. Crevio automatically creates and manages customer records so you always have a clear picture of your audience. ## Customer types Every customer is classified into one of three types. Crevio assigns and updates the type automatically based on the customer's activity. | Type | Who they are | | - | - | | **Lead** | A guest visitor who provided their email (e.g., through a free checkout) but has not created an account. Leads have no registered user account. | | **Free** | A registered user who has signed up but has not made any paid purchases. | | **Paid** | A registered user who has completed at least one paid order. | > [!NOTE] > > Customer types update automatically. When a lead creates an account, they become a **free** customer. When a free customer makes their first paid purchase, they become a **paid** customer. ## How customers are created Customers are added to your account through several channels: * **Checkout** -- When someone completes a purchase (paid or free), Crevio creates a customer record using the buyer's name and email address. * **Waitlist requests** -- Someone who [applies](/docs/features/waitlists) for a product that needs your approval is added as a customer, even before you approve them. * **Forms** -- Everyone who fills in one of your [forms](/docs/features/forms) is added as a lead. * **Bookings** -- Someone who books a call or session with you is added as a lead. * **Import** -- Upload a CSV file from the **Customers** page to add many at once. * **API** -- You can create customers programmatically through the [Crevio API](/docs/developer/api-reference/introduction). Each customer is uniquely identified by their email address within your account. If someone checks out with an email that already exists in your customer list, Crevio links the order to the existing record rather than creating a duplicate. ## Searching and filtering customers The **Customers** page in your dashboard lists all customers in your account. You can search by name or email to quickly find a specific person. Each customer in the list shows: * Name and email address * Customer type (lead, free, or paid) * Number of orders * Total spend * Tags * Date added ## Customer details Click on any customer to view their full profile. The detail page shows: * **Order history** -- Every order the customer has placed, including line items and status * **Total spend** -- The sum of all successful order amounts * **Average order value** -- Total spend divided by total order count * **Contact information** -- Name, email, and phone number (if provided) ## Customer tags Tags let you organize and segment your customers. You can assign one or more tags to any customer to group them by interest, purchase behavior, campaign source, or any other criteria you choose. Tags are unique within your account -- creating a tag with the same name as an existing one reuses the existing tag rather than creating a duplicate. > [!TIP] > > Use tags to build segments for targeted outreach. For example, tag customers who purchased a specific product so you can notify them about related launches. ## Self-service billing Every customer gets a hosted billing page for their account with you -- no setup required. From the **Billing** link in their account on your site, a customer can: * Cancel or renew an active subscription * Update the card on file * Edit their billing address * Download a PDF of any past invoice They sign in with a one-time link sent to their email, so there's no password to manage or reset. This means customers can handle most billing requests themselves instead of emailing you. > [!TIP] > > If a customer emails you asking to update their card or cancel, just point them to the **Billing** link in their account on your site -- they can sign in and take care of it themselves. ## Exporting customers You can export your entire customer list as a CSV file from the **Customers** page. The export includes all customer fields -- name, email, customer type, order count, total spend, and tags. This is useful for importing into email marketing tools, CRMs, or spreadsheets for further analysis. ## Deleting customers Open a customer and choose **Delete** from the menu. The customer disappears from your lists right away. After 30 days, Crevio permanently erases them together with: * Their notes and contact details * Their form submissions and answers * Their bookings, call history and call transcripts * Their support chats with your assistant * Every email they sent you or received from you, including attachments. In a conversation with other people, only their messages are removed. * The record of which email campaigns were sent to them During those 30 days you can change your mind: ask Crevio in chat to restore the customer. After that, nothing can be recovered. A customer can't be restored if someone with the same email address has been added in the meantime. > [!WARNING] > > Customers with orders can't be deleted, because orders are records you need to keep. Anonymize them instead (see below). What is kept on purpose: * **Invoices.** They stay as accounting records, without the link to the customer. * **Opt-outs.** If the person unsubscribed from your emails, their address stays on your do-not-email list so they aren't emailed again by mistake. If they withdrew permission to be called, the record of that is kept as proof. What deletion does not reach: * **Your assistant's memory.** If Crevio wrote something about the person into its notes or files, ask it to remove that too. * **Backups.** Crevio doesn't edit its backups; old copies expire on their own over time. If the person contacts you again later, for example by filling in a form, they come back as a new customer with no history. If that happens within the 30 days, their emails with you are kept, because they now belong to the new customer. ## Anonymizing customers with orders When someone who bought from you asks to have their data removed, open them and choose **Anonymize** from the menu. It happens right away and can't be undone: * Their name, email address, phone number and notes are removed. The customer shows as **Anonymized**. * Their form submissions, bookings, calls, support chats and emails with you are erased, the same as when you delete a customer. * Their orders and invoices stay for your records, without their name, email or address. Anonymizing removes their login link to your store, so they can no longer sign in to what they bought. ## Deleting inactive leads automatically You can have Crevio delete leads you haven't been in touch with for a while. This only applies to **leads**: people without an account, such as people who filled in a form. Free and paid customers have an account and may have access to your products, so they are never deleted automatically. Privacy laws such as the GDPR in Europe expect you to keep personal data only as long as you need it, and this setting helps you do that. It isn't legal advice: check the right period for your business. 1. Go to **Settings** and open **Legal**. 2. Under **Data retention**, turn on **Delete inactive leads**. 3. Enter the number of days without contact, at least 30. Before you save, Crevio shows how many leads would be deleted today. 4. Click **Save**. Once a day, Crevio deletes every lead who has had no contact for that long. They are permanently erased 30 days later, exactly like a customer you delete by hand, so you can still restore someone in between. **What counts as contact:** a form submission, a booking, a call, a checkout, or an email between you and that person, in either direction. Email campaigns don't count, so a subscriber who only receives your newsletter is deleted once the period runs out. Leads with orders (for example from a guest checkout) are never deleted automatically. You can also ask Crevio in chat to set this up, or to tell you who would be deleted at a given period. ## Clean up your list with Crevio Ask "clean up the duplicate contacts in my CRM" and Crevio looks for the same person saved twice: the same Gmail address with and without a `+tag` or dots, a typo like `gmial.com`, or the same name with the same phone number. It shows each pair, which record it would keep and why, and changes nothing until you approve. When you approve, Crevio copies the duplicate's notes and tags onto the record it keeps, then deletes the duplicate. Like any deleted customer, it can be restored for 30 days. A duplicate that has orders, bookings, calls or emails is never deleted; Crevio tags it `duplicate` instead, so its history stays where it is. Crevio can't merge two records into one, because a customer's orders always stay on the record they were placed on. You can also ask Crevio which leads nobody has followed up, which quotes have gone quiet, or for a rough forecast of next month's sales from your open quotes. If you use HubSpot, Pipedrive or another CRM, connect it and Crevio works there instead, using that CRM's own merge. ## Find new leads Ask "find 10 local businesses that might need my service" and Crevio searches Google Maps and public business data, checks each business's own website, verifies the email addresses it finds, and leaves out anyone who is already your customer. You get a short list with why each business is on it and where each detail came from. Looking up and verifying emails uses credits, so Crevio says before it runs a large batch. The leads are added to your customers only when you ask. They are people you found, not people who signed up, so don't add them to newsletters. ## Rank target companies for an account-based push If you sell to a short list of named companies, ask "score these five companies for my booking software and tier them". You can also attach your own list, for example a spreadsheet from your CRM. Crevio scores each company on how well it fits who you sell to and whether there is a recent reason to talk to them now (hiring, funding, a launch), out of 80. Notes from your own list count, and count fully once Crevio has checked them. Companies score in three tiers: Tier 1 (64 and up) get a researched, personal approach, Tier 2 (44 to 63) a lighter personalised sequence, and Tier 3 is left for later. Next to each tier Crevio shows whether it found real people to contact there, and finding them is the next step for your Tier 1 companies. Anything Crevio can't find counts as zero and is shown that way, and a company that is already your customer or out of your area is skipped whatever it scores. Ask again each month, or when something changes, and Crevio re-scores and tells you who moved tier. Crevio only reads public business information and sends nothing without your approval. ## Prepare for a sales call Ask "prep me for my call with Harbor Bakery" and Crevio matches the right company by its website, then gives you a one-page brief: what they sell, the words they use about themselves, recent signs of where they are investing, and three questions to ask. Every point is marked as sourced or as Crevio's own read, so you know what you can say as fact. Ask "build a battlecard for BookNow" for a short, dated page on a competitor: where they win, where they lose (with the source), the objections you will hear and how to answer them, and when you beat them. Crevio saves it so the next call starts from it. After a call, paste the transcript and ask Crevio to score it: you get a score for each behaviour, the moment that earned it, and one thing to practise. # Discounts Source: https://crevio.co/docs/features/discounts Create discount codes to run promotions, reward loyal customers, and boost conversions Discounts let you offer percentage or fixed-amount reductions on your products. Create codes that your buyers enter at [checkout](/docs/features/checkout), share a [discount link](#discount-links) that opens checkout with the code already applied, or pre-apply them to [checkout links](#using-discounts-with-checkout-links). ## Creating a discount code **1. Go to Discounts** Open **Discounts** in your dashboard and click **New discount**. **2. Set the code** Enter a unique code that buyers will type at checkout (e.g., `WELCOME20`, `LAUNCH50`). Codes are unique within your account and case-insensitive at checkout. **3. Choose the discount type** Select whether the discount is a **percentage off** or a **fixed amount off** the price. **4. Configure duration and limits** Set how long the discount lasts, how many times it can be redeemed, who can use it, and when it starts and expires. See the sections below for details on each option. **5. Optionally target specific price variants** If you want the discount to apply only to certain products or tiers, select the specific price variants it targets. ## Discount types | Type | How it works | Example | | - | - | - | | **Percentage off** | Reduces the price by a percentage (1% -- 100%) | `HALF` gives 50% off | | **Fixed amount off** | Reduces the price by a flat amount in a specific currency | `SAVE10` takes \$10 off | > [!NOTE] > > A discount can be either percentage-based or fixed-amount, not both. Fixed-amount discounts are tied to a specific currency. ## Duration Duration controls how the discount applies over time, which matters most for subscription products. | Duration | Behavior | | - | - | | **Once** | The discount applies to the first payment only. For subscriptions, the buyer pays the discounted price on their first billing cycle, then full price afterward. | | **Repeating** | The discount applies for a set number of months. You specify **duration in months** -- the discount is active for that many billing cycles, then the subscription reverts to full price. | | **Forever** | The discount applies to every payment for the lifetime of the subscription (or the single payment for one-time products). | > [!TIP] > > For one-time products, all three duration options behave the same since there is only one payment. Duration matters most when running promotions on subscription products. ## Max redemptions Set a **max redemptions** limit to cap how many orders can use a code, across all buyers. Once the limit is reached, buyers who enter the code are told it has reached its usage limit. Leave this blank for unlimited redemptions. You can't change the limit after you create the code. A code counts as redeemed when an order paid with it is placed. Test purchases you make on your own store don't count. The **Usage** column on the Discounts page shows how much of the limit has been used. > [!WARNING] > > A discount that has been redeemed at least once cannot be deleted. You can deactivate it instead by changing its status to **Inactive**. ## Who can use a code Under **Restrictions** you can limit a code further. You can change these at any time. | Restriction | What it does | What the buyer sees when it blocks them | | - | - | - | | **Minimum order amount** | The price of the items in the order, before the discount, must reach this amount. Orders in a different currency can't use the code. | "That code needs an order of at least \$50.00." | | **Once per customer** | Each customer can use the code on one order. | "You've already used that discount code." | | **First order only** | Only customers who have never paid you for an order can use the code. Free orders don't count as an earlier order. | "That code is only for your first order." | Crevio recognizes a customer by the account they're signed in with, or else by the email they enter at checkout. If a buyer isn't signed in, Crevio checks the code again with their email when they click to pay, before any payment is taken, and shows the message there. They can remove the code and pay full price. > [!NOTE] > > These restrictions follow the email address, so someone who checks out with a second email counts as a new customer. In the rare case a buyer completes payment despite the checks, they still get their order, and the use counts toward the code's limit. ## Start and expiration dates Set a **starts at** date to schedule a code ahead of time, for example a Black Friday code you set up today. The code exists right away, but buyers who enter it before that time are told it isn't active yet. A checkout link with the discount pre-applied charges full price until then. Leave it empty to make the code usable immediately. You can change the start date at any time. Set a **redeem by** date to make a code expire automatically at a specific time. After the expiration date passes, the code can no longer be applied at checkout. The expiration date must be in the future when you create or update the discount, and it must come after the start date. ## Targeting specific price variants By default, a discount applies to any product at checkout. To narrow it down, you can target **specific price variants**. When a discount is targeted, it only works if **every** item in the buyer's checkout is one of the targeted variants. If the buyer adds anything else, the code is refused with "That code only applies to specific products, which aren't in your cart." This is useful when you want to run a promotion on a specific tier (e.g., 20% off the annual plan) without discounting your other offerings. ## Discount links A discount link opens checkout with a code already applied, so buyers don't have to type it. To get one: 1. Open **Discounts** and click the menu on an active discount 2. Click **Share link** 3. Pick the product, then copy the link Add `?discount=YOURCODE` to any product buy link (`/buy/...`) or [checkout link](/docs/features/checkout#checkout-links) yourself and it works the same way. If the code can't be used, for example because it expired or the buyer already used it, checkout still opens without it and a message tells the buyer why. They never land on an error page. A discount link works even when **Allow coupon codes** is turned off under **Settings -> Advanced -> Checkout**, because you chose to share it. All the code's other limits still apply. > [!NOTE] > > Adding `?discount=` to a page of your website doesn't apply anything. It only works on buy links and checkout links, which open Crevio's checkout. ## Using discounts with checkout links You can pre-apply a discount to a [checkout link](/docs/features/checkout#checkout-links). When a buyer opens the link, the discount is already applied -- they do not need to enter a code manually. This is especially effective for: * **Email campaigns** -- Include a checkout link with the discount baked in * **Social media promotions** -- Share a single URL that gives followers an instant deal * **Partner referrals** -- Create unique discount + checkout link combos for each partner > [!NOTE] > > A checkout link can only have one discount applied. The discount must be in an **Active** status when the link is created or updated. ## Applying a discount to an existing subscription Discount codes are normally entered at checkout, but you can also give a discount to a customer who is already subscribed -- for example to reward a loyal customer, honor a deal you agreed on later, or lower the price on your own test subscriptions. 1. Open **Orders** and select any order that belongs to the subscription 2. In the **Subscription** card, click **Apply discount** 3. Choose one of your active discounts and confirm The discount applies from the customer's **next invoice**. Nothing is charged or refunded right away, and everything else about the subscription stays the same -- the customer keeps their access, billing date, and payment method. You do not need to cancel and re-create the subscription. From the same card you can **Change discount** to swap it for another one, or **Remove** it so the customer is billed the full price again from their next invoice. > [!NOTE] > > A subscription can have one discount at a time. Payment plans cannot be discounted because their total is fixed, and a discount limited to specific price variants can only be applied to subscriptions for those variants. ## Discount statuses | Status | Meaning | | - | - | | **Active** | The code is live and can be used at checkout (subject to its start date, redemption limits and expiration). | | **Inactive** | The code is disabled and cannot be used at checkout. Existing subscriptions already using the discount are unaffected. | # Your own web address (domain) Source: https://crevio.co/docs/features/domains Buy a brand-new web address inside Crevio, or connect one you already own -- and let Crevio get it live for you. A web address (also called a domain) is the name people type to reach your site -- like `yourbrand.com`. Every Crevio site starts with a free web address so it works right away, but using your own makes your business look polished and easy to remember. There are two ways to get there, and Crevio makes both simple. You can buy a brand-new web address in a few clicks, or connect one you already own. Either way, Crevio handles the technical side and tells you when everything is live. > [!NOTE] > > Prefer to skip the steps entirely? You can just ask Crevio: *"Find me a web address for my coaching business"* or *"Connect my domain yourbrand.com to my site."* Crevio walks you through the rest. ## Why you'd use this * **You look more professional.** `yourbrand.com` builds far more trust than a generic address. * **People remember you.** A clean name is easier to share, type, and recommend. * **It is all in one place.** Buy, connect, and manage your web address right inside Crevio -- no separate company to deal with. ## Option 1: Buy a brand-new web address This is the easiest path. You search for a name, buy it, and Crevio connects it to your site automatically -- no setup on your end. **1. Search for a name** Type the name you want and Crevio shows you what is available, along with the price. If your first choice is taken, Crevio suggests close alternatives. **2. Buy the one you like** Pick an available web address and complete the purchase inside Crevio. That is the only step that costs money. **3. Crevio connects it for you** Once you have bought it, Crevio automatically links the web address to your site. There is nothing for you to set up -- it just starts working. > [!TIP] > > Short, simple names work best. Aim for something easy to say out loud and spell without confusion. ### It renews itself A web address you buy through Crevio is registered for a year and set to renew automatically, so it can't quietly lapse and leave your site unreachable. Crevio keeps track of the renewal date and reminds you before it comes around, so there's nothing to diary. To stop renewing, ask Crevio to turn off auto-renew for that web address. It then stays yours until its renewal date and lapses after that, taking your site and any email on it offline. You can ask Crevio to turn auto-renew back on any time before then. Not sure when that date is? Ask Crevio when your web address renews. ## Option 2: Connect a web address you already own If you already bought a web address somewhere else, you can point it at your Crevio site. Crevio shows you the exact settings to copy, and confirms the moment it goes live. **1. Tell Crevio your web address** Enter the web address you already own. Crevio then prepares everything on its side. **2. Copy the settings Crevio gives you** Crevio shows you a short list of settings to add at the company where you bought your web address (this is usually called your DNS settings). Just copy them across exactly as shown. > [!TIP] > > Not sure where to put them? Tell Crevio where you bought your web address and ask for help -- it can guide you for most popular providers. **3. Wait for Crevio to confirm** Crevio checks in the background and lets you know when your web address is connected and live. You do not need to keep refreshing -- it updates on its own. ## Turn on email at your web address Once you have a web address, you can also use it for email -- so you send and receive messages from an address like `hello@yourbrand.com` instead of a personal one. It is a small touch that makes your business feel far more established. Just turn it on when you set up your web address, or ask Crevio to enable it. > [!TIP] > > You can ask Crevio to handle this for you: *"Set up email on my domain so I can use [hello@yourbrand.com](mailto:hello@yourbrand.com)."* ## If something goes wrong > **It's not live yet** > > When you connect a web address you already own, it can take a little time to become active -- anywhere from a few minutes to a few hours, and occasionally up to a day. This is normal and out of anyone's control; it is just how the internet spreads the change around. Crevio keeps checking and will confirm as soon as it is live, so you can move on and come back later. > **Crevio says the settings don't match yet** > > Double-check that you copied the settings exactly as Crevio showed them, with no extra spaces or typos. After you save them at your provider, it can still take a little while to take effect. If you are stuck, tell Crevio who you bought your web address from and ask for step-by-step help. > **I paid, but it still looks unpaid** > > Right after checkout, Crevio is registering the name with the registry -- that normally takes a few minutes. Until it finishes, your web address can look the same as one nobody has bought. You do not need to pay again, and trying to will just tell you that you already own it. Give it a few minutes and check back; Crevio confirms as soon as it's registered. > **My purchase didn't go through** > > Occasionally a registration fails after you've paid — the name may have been taken moments earlier, or the registry may have rejected it. If that happens, Crevio refunds you automatically and emails you to explain. The name stays unclaimed, so if you still want it, try again promptly or pick one of the alternatives Crevio suggests. > **The name I want is taken** > > If you are buying a new web address and your first choice is unavailable, try one of Crevio's suggested alternatives, or a slightly different ending (for example, a different word after the dot). Crevio will show you what is free. > **A specific ending (like .ca, .uk, or .travel) isn't offered** > > A handful of endings -- currently `.ca`, `.uk`, `.us`, `.ngo`, `.ong`, and `.travel` -- aren't available to buy through Crevio. Their registries require proof of local residency or organizational eligibility that Crevio can't attest to on your behalf. Pick a different ending, such as `.com` or `.co`, or connect one of these if you already own it from a registrar that verified your eligibility directly. > **I'm not sure which option is right for me** > > If you do not already own a web address, buy a new one inside Crevio -- it is the simplest path and Crevio connects it automatically. If you already own one, use the connect option so you keep the name you have. ## Related > **[Your AI website](/docs/features/sites)** > > The site your web address points to -- built by describing what you want. > **[Terms, privacy & refund policies](/docs/features/legal-pages)** > > Round out your site with the legal pages it needs. > **[Custom domains setup](/docs/integrations/custom-domain)** > > Step-by-step connection details for your website. # Email your customers Source: https://crevio.co/docs/features/email-marketing Send newsletters and broadcasts to your customers, and read and reply to messages right inside Crevio -- with Crevio writing the words for you. Email is still one of the best ways to stay close to the people who buy from you. Crevio gives you two things in one place: a way to send messages out to your customers and leads, and an inbox to read and reply to the messages that come back. The best part? You don't have to be a writer. Just tell Crevio what you want to say and it drafts the email for you. ## Send a broadcast or newsletter A broadcast is one message sent to many people at once -- a product launch, a weekly newsletter, a sale announcement, or a heads-up about something new. You can send to everyone, or to just one group of people. For example, send a thank-you offer to only your paying customers, or a gentle nudge to people who signed up but haven't bought yet. **1. Open Broadcasts** In your dashboard, go to **Email** and switch to the **Broadcasts** tab, then click **New broadcast**. **2. Write the subject and message** Add a subject line, and a preview line -- the short bit of text people see next to the subject in their inbox. Then write your message. **3. Choose who gets it** Send to everyone, or pick a group -- only your paying customers, your free members, or your leads. You can also narrow it down using [tags](/docs/features/tags), or search for specific people by name or email. Crevio shows you how many people the broadcast will reach as you go. **4. Ask Crevio to write it** Prefer not to write it yourself? Tell Crevio what the email is about -- "write a friendly newsletter announcing my new course" -- and it drafts a subject line and message for you. Read it over and tweak anything you like. **5. Send, schedule, or save** Send it right away, pick a date and time for it to go out later, or save it as a draft and come back to it. ### See how it performed Every broadcast keeps a record of how it did. Open one from the Broadcasts list to see how many people received it, how many opened it, how many clicked, and which links they clicked most. You can also see the result for each individual person -- useful for spotting an address that keeps bouncing. A scheduled broadcast can be canceled before it goes out, and one that is mid-send can be stopped -- though anyone it already reached will still receive it. > [!NOTE] > > **Click tracking needs your own domain.** Until you connect one, Crevio doesn't measure clicks, and the click numbers stay empty. That's on purpose -- measuring clicks means routing every link in your email through a tracking address, and doing that on a shared address is one of the fastest ways to end up in spam folders. Connect your domain and Crevio sets up a tracking address on it for you, so your links stay on your own domain and tracking turns on by itself. > [!TIP] > > Take open rates with a pinch of salt. Apple Mail automatically loads images for its users, which counts as an "open" whether or not anyone actually read your email. Clicks are the honest measure of whether your email worked. ### Unsubscribes Every broadcast includes an unsubscribe link, and most email apps also show their own "Unsubscribe" button. This is required by law for marketing email, so it can't be turned off. When someone unsubscribes, Crevio remembers -- they are automatically left out of every future broadcast, so you never have to keep a list yourself. The same goes for addresses that bounce or mark your email as spam. Respecting this is what keeps your emails landing in the inbox rather than the spam folder. > [!TIP] > > Not sure what to send? Ask Crevio. Try "draft a monthly newsletter with a tip and a link to my latest product" and it will give you a starting point you can edit. ## Who you can't email Some addresses are permanently skipped, and the **Suppressions** tab under **Email** is where you see them and why. An address lands there in one of four ways: | Reason | What happened | | - | - | | **Bounced** | Their mail server permanently rejected the message -- usually the address no longer exists. | | **Spam report** | They marked one of your emails as spam. | | **Unsubscribed** | They used the unsubscribe link. | | **Added by you** | You put them on the list yourself. | Crevio adds the first three automatically. Every email you send skips these addresses, broadcasts and one-to-one replies alike -- you don't have to remember who to leave out. You can add an address yourself with **Add address**, which is handy when someone asks to stop hearing from you by replying rather than clicking unsubscribe. > [!NOTE] > > The table shows the 500 most recently added addresses, newest first, and filtering by reason shows the 500 most recent of that reason. The count on each tab covers your whole list, however long it is. There is no search box, so if your list is longer than that and you need to find one specific older address, [get in touch](/docs/troubleshooting/contact-support). > [!WARNING] > > You can remove an address from the list, but think twice before removing a bounce or a spam report. Sending to an address that permanently rejected you, or to someone who reported you as spam, damages your reputation with email providers -- and that affects whether *everyone else* on your list sees your emails. Only remove one when the person has actually asked you to email them again. ## See how your email is doing overall The **Analytics** tab under **Email** shows everything together -- broadcasts and one-to-one replies -- over the last 7 days, 30 days, 90 days, or 12 months. You get how many emails you sent, how many were delivered, how many were opened and clicked, how many bounced, and how many recipients were skipped because they were on your suppression list. There's a chart of your sending volume, and a breakdown splitting broadcasts from one-to-one email. > [!NOTE] > > Opens and clicks are only measured for broadcasts. One-to-one email -- your replies to customers -- carries no tracking, on purpose: a personal reply shouldn't quietly report back when someone reads it. That's why those columns show a dash for one-to-one email. > [!TIP] > > A bounce rate creeping above a few percent usually means your list has gone stale. A rising spam-report count is more urgent -- pause your sending and look at who you're emailing and how often. ## Your inbox inside Crevio Crevio also gives you an inbox, so the replies and questions from your customers land in one place -- no need to jump between your email app and your dashboard. You can read every conversation, reply by hand, or let Crevio draft a reply for you to review before it goes out. **1. Open your inbox** In your dashboard, go to **Email**. The **Email** tab is your inbox, with all of your conversations. **2. Read a message** Click any conversation to see the full back-and-forth. **3. Reply, or let Crevio draft it** Type your reply, or ask Crevio to draft one. Crevio reads the conversation and suggests a response. You stay in control -- nothing is sent until you say so. > [!TIP] > > Ask Crevio to "draft a polite reply offering a refund" or "answer their question about access" and it will write a response based on the conversation. You can edit it before sending. When Crevio emails anyone from your inbox, it asks for your approval first. Emails sent only to you, the account owner -- like the summaries and lead alerts your tasks send -- go out without asking. To let Crevio send to others without asking, choose **Always allow** on an approval card or in **Customize** > **Connectors**. Crevio can attach files to the emails it sends from your inbox, such as a guide you uploaded or one it made for you. All the attachments on one email can add up to 25 MB. For anything bigger, Crevio puts a download link in the email instead. To hand out a freebie to everyone who signs up, use a [form with a lead magnet](/docs/features/forms#give-people-a-freebie) rather than sending it by hand. ### Drafts Use the folder switcher at the top of your inbox to move between your conversations and **Drafts**. Drafts holds every message that hasn't gone out yet, including the ones Crevio wrote for you to review. Each one shows a status: | Status | What it means | | - | - | | **Draft** | Written but not sent. Select it to read it. | | **Scheduled** | Set to go out later, with the date and time shown. | | **Sending** | On its way right now. | | **Failed to send** | It didn't go out. Open it to see who it was for and try again. | Drafts shows your 100 most recent. Use search to find older ones. ## Send from your own domain By default, your emails go out from a Crevio address. If you have your own domain (like `hello@yourbusiness.com`), you can send from that instead, so your messages look like they come straight from you. This builds trust and helps your emails land in the inbox rather than the spam folder. > [!NOTE] > > Setting up your own domain takes a few minutes and a small one-time setup with your domain provider. Crevio walks you through it step by step -- and if you bought your domain through Crevio, it does the whole thing for you. Connecting your domain also switches on click tracking, using a tracking address on your own domain (`click.yourbusiness.com`). If you already use that address for something else, Crevio leaves it untouched and tells you instead of breaking it. ## Cold outreach Crevio can write a cold email sequence (usually four short emails over two weeks) and check that it is safe to send before anything goes out. The check looks at the address you send from, your domain's SPF, DKIM and DMARC records, whether the email addresses are real, and the bounces and spam complaints on your recent mail. * Cold emails go out from your inbox on your own domain. Crevio won't use the shared Crevio address for cold outreach, because every Crevio business sends from it. * A new sending address starts at about 5 to 10 cold emails a day and works up over four weeks. Sending hundreds on day one is the quickest way to land in spam. * Each email waits for your approval before it's sent, and the sequence stops for anyone who replies, asks to be removed, or bounces. Out-of-office replies don't count as replies: their next email is moved to after they're back. ## If something goes wrong > **My broadcast didn't reach everyone** > > Double-check which group you sent to. If you picked "paying customers" only, people who haven't bought won't receive it. Send a follow-up to the wider group if needed. > > People who unsubscribed, whose address bounced, or who marked an earlier email as spam are always left out. The recipient count on the broadcast reflects who it actually went to. To see exactly who is being skipped and why, open the **Suppressions** tab under **Email**. > **I hit a sending limit** > > Each plan includes a set number of emails per day. If you reach it, wait until the next day or upgrade your plan. A broadcast you scheduled will simply go out once the limit resets -- you don't need to set it up again. > **My emails are landing in spam** > > Sending from your own domain greatly improves where your emails land. If you haven't set up your domain yet, do that first. Also avoid spammy words and too many links in a single email. > **Click numbers are empty but people definitely clicked** > > Click tracking only runs once you've connected your own domain and its tracking address is live. Check **Settings → Domains**: if the tracking record is still pending, add it at your domain provider (or ask Crevio to) and clicks will start recording on your next broadcast. > **A reply isn't showing in my inbox** > > Give it a moment -- new replies can take a short while to appear. If a customer replied to an old message from a different address, it may start a new conversation rather than continue the old one. > **Crevio's draft isn't quite right** > > Just tell it what to change -- "make it shorter", "warmer", or "mention the discount". You can also edit the text yourself before sending. ## Related > **[Customers](/docs/features/customers)** > > See who's on your list and how they're grouped. > **[Tags & segments](/docs/features/tags)** > > Organize customers so you can email the right group. > **[Forms & lead capture](/docs/features/forms)** > > Collect new email addresses to grow your list. > **[Social media posting](/docs/features/social)** > > Reach people on social, too. # Experiences Source: https://crevio.co/docs/features/experiences Deliver content and access to your buyers -- courses, downloads, communities, events, and more Experiences are what your buyers receive after purchasing a product. They represent the actual value you deliver -- a course to complete, files to download, a Discord server to join, or any combination of content types bundled together. Every experience is attached to one or more [price variants](/docs/features/pricing), not directly to a product. This lets you offer different levels of access at different price points from a single product page. ## Access types Each experience has an access type that controls who can view its content. | Access type | Who can access | | - | - | | **Secret** | Only customers who have purchased a price variant that includes this experience. Each customer's access is tracked individually through experience grants. This is the default. | | **Open** | Any team member on your account can access the experience without purchasing. Useful for internal content, team resources, or content you want your collaborators to see. | > [!NOTE] > > Admins can always access all experiences regardless of access type. ## Experience types Crevio supports nine experience types. You can attach multiple types to a single price variant to create rich, bundled offerings. ### Courses Structured learning content organized into chapters and lessons. * **Chapters and lessons** -- Build a curriculum with ordered chapters, each containing one or more lessons * **Progress tracking** -- Crevio tracks which lessons a customer has viewed and completed * **Completion tracking** -- Mark a course as complete when a customer finishes all lessons * **Require lessons in order** -- Turn on **Require students to complete lessons in order** in a course's settings so a lesson only unlocks once the one before it is marked complete, not just opened * **Instructors** -- Assign an instructor to each course * **Cover image** -- Upload a dedicated cover image for the course landing page > [!TIP] > > Courses work well as the anchor experience in a product bundle. Pair a course with a Discord server or forum to give students a place to ask questions and discuss lessons. ### Digital downloads Distribute files directly to your buyers. * Upload multiple files per experience (up to **2 GB** total) * Supports any file format -- PDFs, ZIPs, images, audio, video, and more * Buyers access their downloads from their purchase dashboard ### Written content Rich HTML articles delivered as part of a purchase. * Create long-form written content using the rich text editor * Supports up to 50,000 characters per article * Optional cover image and title * Ideal for exclusive guides, reports, playbooks, or supplementary material ### Discord server Automatically manage Discord access based on purchases. **1. Connect your Discord server** Link your Discord server to Crevio through the Discord integration. Crevio's bot joins your server and can manage roles. **2. Configure role assignment** Choose which Discord roles to assign when a customer purchases. Buyers are automatically invited and given the selected roles. **3. Set cancellation behavior** Decide what happens when a customer's access is revoked (e.g., subscription cancellation or refund). Cancellation actions: | Action | What happens | | - | - | | **No action** | The customer keeps their roles and server access. | | **Remove role** | The assigned purchase role is removed, but the customer stays in the server. | | **Kick user** | The customer is removed from the server entirely. | | **Remove all roles** | All roles are stripped from the customer, but they remain in the server. | > [!NOTE] > > You need to set up the [Discord integration](/docs/integrations/discord#sell-access-to-your-server) before creating a Discord server experience. ### Telegram group Automatically manage Telegram group or channel access. * Customers are auto-invited to your Telegram group when they purchase * Access is revoked automatically when a subscription is cancelled or access expires * Supports multiple connected chats per experience > [!NOTE] > > You need to set up the [Telegram integration](/docs/integrations/telegram) before creating a Telegram experience. ### Events Host live or scheduled sessions for your customers. * Create multiple **event sessions** with specific dates and times * Track attendees per session * Use events for webinars, workshops, office hours, live Q\&As, or any time-based experience ### Forums Community discussion spaces for your customers. * Customers can create posts, comment, and like content * Organize discussions with **topics** (up to 5 per post) * Pin important posts to the top * Upload file attachments (up to 50 MB per post) * Optional cover image and description Three layout options to match your community style: | Layout | Description | | - | - | | **Feed** | Social media-style vertical feed. Best for active, fast-moving discussions. | | **List** | Compact list view. Best for structured, topic-driven forums. | | **Card** | Card grid layout. Best for visual or curated discussions. | ### Links Curated collections of external URLs. * Add multiple link items to a single experience * Each link item has its own URL * Useful for resource lists, tool recommendations, reading lists, or curated content hubs ### Website embeds Embed an external website or web app directly within the customer's experience dashboard. * Enter any URL to embed it in an iframe * Crevio validates the URL's `X-Frame-Options` header to ensure the site allows embedding * URLs that return `DENY` or `SAMEORIGIN` headers cannot be embedded > [!WARNING] > > Not all websites allow embedding. If a site blocks iframe embedding through its headers, you will see a validation error. Consider using a **Link** experience as an alternative for sites that cannot be embedded. ## Experience grants When a customer completes a purchase, Crevio creates **experience grants** -- individual records that link a customer to each experience included in their purchased price variant. Grants can be created in three ways: | Grant type | How it works | | - | - | | **Order** | Automatically created when a customer completes a purchase. This is the most common type. | | **Lead magnet** | Automatically created when a customer submits a lead magnet form on your [website](/docs/features/sites). | | **Manual** | Created by you or a team member directly from the dashboard. Useful for gifting access or resolving support requests. | Each grant tracks: * When access was granted * When access was revoked (if applicable) * An optional expiration date * The source of the grant (order, lead magnet, or manual with a reason) > [!TIP] > > A customer can only have one active grant per experience. If they purchase the same experience through a different price variant, the existing grant remains active rather than creating a duplicate. ## Auto-revoke after X days If you configure **revoke after days** on a [price variant](/docs/features/pricing#auto-revoke-access), the experience grants created from that variant will automatically expire after the specified number of days. Crevio sets the expiration date at the time of purchase and revokes access once the period elapses. This is useful for: * Time-limited access to courses or downloads * Trial periods on one-time purchases * Rental-style digital content > [!NOTE] > > Auto-revoke is set at the price variant level, not the experience level. Different price variants on the same product can have different revoke periods, letting you offer both time-limited and permanent access tiers. ## Revoking access Access is revoked automatically when: * A **subscription** is cancelled or lapses * An **auto-revoke** period expires * A **refund** is processed on the associated order You can also revoke access manually from the customer's detail page in your dashboard. # Start your business (LLC) Source: https://crevio.co/docs/features/formations Have Crevio help you form a US LLC — pick your business type, add your members, submit, and get your documents Turning your work into a real, registered business can feel intimidating. Crevio makes it simpler. It can help you form a **US LLC** — a Limited Liability Company, the most common way small businesses set themselves up officially. You answer a few plain questions about your business, add anyone else who's part of it, and Crevio helps prepare and submit the paperwork. When it's done, you get your official documents to keep. > [!NOTE] > > An LLC is a US business structure that keeps your personal finances separate from your business. Many business owners form one once they start earning, to look more professional and protect their personal assets. If you're unsure whether an LLC is right for you, it's worth a quick chat with an accountant or attorney — Crevio handles the filing, not legal or tax advice. ## Why you'd use it * **Look official.** A registered business name and structure builds trust with customers and partners. * **Keep things separate.** An LLC helps separate your business money and liability from your personal life. * **Skip the confusing paperwork.** Crevio walks you through it in plain language instead of legal forms. * **Keep your documents in one place.** Your formation paperwork is saved and easy to find later. ## What to expect first Forming an LLC is a real, official process — so a few things are worth knowing up front: * **There are filing fees.** US states charge a fee to register a business, and these vary by state. You'll see the cost before anything is submitted. * **It takes some time.** Once submitted, the state processes your filing. This can take anywhere from a few days to a few weeks depending on the state. * **You'll need a few details.** Your business name, what your business does, and who the owners (members) are. * **It's a one-time setup.** You form the LLC once. After that, you mainly just keep your documents on file. > [!TIP] > > Not sure where to begin? **Just ask Crevio** — "Help me start an LLC for my online course business." It'll walk you through each step and ask for what it needs along the way. ## Form your LLC **1. Pick your business type and activity** Tell Crevio what your business does — for example, "selling online courses" or "freelance design services." This describes your business's main activity on the paperwork. **2. Add your members** Add the owners of the business. An LLC can have one member (just you) or several. For each person, you'll provide their legal first and last name, exactly as on their ID, and the basic details the filing needs. The responsible party's legal name is also used to set up your filing, and it can differ from the name on your Crevio profile. If a legal name is missing, you'll see an error on the form and nothing is submitted. **3. Review the details and fees** Crevio shows you a summary of everything — your business name, activity, members, and the state filing fee. Check it over carefully before moving on. **4. Submit** Once you're happy, submit the filing. Crevio sends it off to be registered. **5. Get your documents** After the state processes your filing, your official formation documents are made available to you. You can view and keep them for your records. ## Your documents When your LLC is formed, Crevio keeps your formation documents together and accessible. These are the official records of your business — keep them somewhere safe, as you may need them to open a business bank account, sign contracts, or file taxes. > [!TIP] > > You can ask Crevio to show you your formation documents anytime — "Show me my LLC paperwork." ## If something goes wrong * **Your filing is taking a while.** Processing times depend on the state and can take days to weeks. Crevio will update you as your filing progresses — there's nothing you need to do while you wait. * **You entered something incorrectly.** If you spot a mistake before submitting, just fix it in the summary. If it's already submitted, ask Crevio for help — some changes can be corrected, others may need a follow-up filing. * **You're not sure which details to enter.** Ask Crevio to explain any step in plain words. For decisions with legal or tax consequences, check with an accountant or attorney. * **You're unsure about the fee.** The state filing fee is shown before you submit. Nothing is filed — and no fee is charged — until you confirm. ## Related > **[Put your business on autopilot](/docs/features/automation)** > > Once you're official, let Crevio run the day-to-day. > **[Create with AI](/docs/features/creating-with-ai)** > > Build your brand with AI-made logos and visuals. > **[Your website](/docs/features/sites)** > > Get your registered business selling online. > **[Invoices](/docs/features/invoices)** > > Bill customers under your new business name. # Forms & lead capture Source: https://crevio.co/docs/features/forms Build a form to collect emails and leads, give people a freebie when they sign up, and tag people automatically -- or ask Crevio to set it all up. A form is a simple way to collect information from people -- their email, their name, a question they have. It's how you turn a curious visitor into a lead you can follow up with. Everyone who fills out a Crevio form is added to your customer list. A form can also send them something in return, like a checklist, a guide or access to a course. That is called a lead magnet. ## Why you'd use a form * Grow your email list with a sign-up form * Give away a free guide, checklist or template in exchange for an email * Collect leads from a giveaway or waitlist * Let people ask a question or request a quote ## Build a form **1. Open Forms** In your dashboard, go to **Forms** and create a new form. **2. Add your fields** Choose what to ask for -- email, name, phone number, a short message, multiple-choice options, or a consent checkbox. Keep it short; people are more likely to finish a quick form. **3. Choose what people get** Under **Lead magnet**, pick what everyone who submits receives: a file you upload, a link, or access to your content. Leave it on **Nothing** for a plain sign-up or contact form. **4. Put it on your website** Ask Crevio to add the form to your website, for example "add my worksheet form to the blog page." > [!TIP] > > Let Crevio do it for you. Try "make a lead magnet form for my startup website checklist and put it on my homepage." Crevio writes the file, builds the form and adds it to your website. ## Give people a freebie When a form has a lead magnet, everyone who submits gets an email with it: | You choose | What they get | | - | - | | **A file** | A download button for the file. | | **A link** | A button to the page, video or download you linked. | | **Access to your content** | Access to one of your [experiences](/docs/features/experiences), with a sign-in link in the email. | You can write your own subject and message for that email. If you don't, Crevio sends a short default one with your business name. People get the freebie every time they submit. Someone already on your list who signs up for a second freebie gets it too. ## Ask people to confirm their email Turn on **Require confirmation** and people first get an email asking them to confirm. With a lead magnet, that email tells them to confirm to get it, and the freebie arrives once they click. People who already confirmed on an earlier form get it straight away. Use this when you want to be sure the addresses on your list are real. It adds a step, so a few people won't finish. To send people to a page of your own once they confirm, add it under **After they confirm, send them to**. ## Tag people automatically Tags you pick under **Tag everyone who submits** are added when someone submits, or once they confirm if confirmation is on. They are added to the person's existing tags, never replacing them. Use a tag per freebie so you can see who asked for what, and email that exact group later. ## Ask for permission to email Everyone who signs up for a freebie can receive your emails, and anyone can unsubscribe at any time. To make the permission explicit, add a **Consent checkbox** field, for example "I agree to receive emails from QNE," and make it required. People can't submit the form without ticking it, and Crevio keeps each submission, with when it was made, as your record. Turning on **Require confirmation** as well proves the address belongs to the person who signed up. ## Where submissions go Every time someone fills out your form, they're added to your [customers](/docs/features/customers) list as a lead. You can follow up however you like -- send them an [email](/docs/features/email-marketing), include them in an [ad](/docs/features/ads) audience, or reach out with an [AI phone call](/docs/features/calls). > [!NOTE] > > If someone fills out a form using an email that's already in your list, Crevio links it to their existing record instead of creating a duplicate. Leads you never hear from again can be deleted automatically after a period you choose. See [deleting inactive leads automatically](/docs/features/customers#deleting-inactive-leads-automatically). ## Ask questions at checkout A form can also be asked when someone buys a product. Pick it as the **Checkout form** on a price variant, and buyers fill it in at checkout. Their answers arrive here as a submission, and on the order. See [checkout forms](/docs/features/pricing#checkout-forms). ## What forms can't do * **Only on your Crevio website.** A form works on your Crevio website. You can't paste it into a website hosted somewhere else. This is by design. If your main site is elsewhere, link to the page on your Crevio website that has the form. * **One freebie per form.** To offer two freebies, make two forms. * **No automatic email series.** A form sends the freebie, not a sequence of emails over the following days. Ask Crevio to set up a job that follows up with new sign-ups instead. See [automation](/docs/features/automation). * **Files up to 500 MB.** For anything larger, upload it elsewhere and use **A link**. ## If something goes wrong > **Someone says they never got the freebie** > > If confirmation is on, they need to click the link in the confirmation email first. Ask them to check their spam folder for both emails. Submitting the form again sends a fresh email. > **Submissions aren't showing up** > > Check your [customers](/docs/features/customers) list -- new submissions appear there as leads. Make sure you're looking at the right form, and that it isn't archived: an archived form stops taking submissions. > **People aren't filling out my form** > > Long forms scare people off. Ask only for what you truly need -- often just an email is enough. A useful freebie also helps more than a "subscribe" button. > **My tags aren't being applied** > > Open the form's settings and confirm the tags are selected. Tags only apply to submissions made after you add them, and with confirmation on, only after the person confirms. ## Related > **[Customers](/docs/features/customers)** > > See every lead your forms bring in. > **[Tags & segments](/docs/features/tags)** > > Organize the people who sign up. > **[Email your customers](/docs/features/email-marketing)** > > Follow up with new leads. > **[Run ads](/docs/features/ads)** > > Capture leads from ads, too. # Invoices Source: https://crevio.co/docs/features/invoices Create and send professional invoices to buyers, accept online payment, and get paid on your terms — all from your Crevio dashboard. Invoices let you bill a specific person for a product without requiring them to browse your website. Create an invoice, choose whether to send it as a payment link or charge the buyer automatically, and track its status through to payment. ## Creating an invoice **1. Go to Invoices** Open **Invoices** in your dashboard and click **New invoice**. **2. Select a price variant** Choose the product and price variant you are invoicing for. The invoice amount and currency are determined by the selected variant. **3. Add buyer details** Enter the buyer's **name** and **email address**, or select an existing customer from your records. **4. Set the due date** Choose when payment is due. The due date must be in the future. **5. Add a description (optional)** Include a custom description (up to 500 characters) with any relevant details -- what the invoice covers, payment instructions, reference numbers, etc. **6. Choose the collection method** Select how you want to collect payment: **Send invoice** or **Charge automatically**. ## Collection methods ### Send invoice Crevio generates a unique payment link and sends it to the buyer's email. The buyer clicks the link, completes [checkout](/docs/features/checkout), and the invoice is marked as paid. This method is best when: * The buyer does not have a payment method on file * You want the buyer to explicitly approve the charge * You are billing a new contact for the first time ### Charge automatically Crevio charges the buyer's payment method on file without requiring them to take action. The invoice is marked as paid once the charge succeeds. This method is best when: * The buyer is an existing customer with a saved payment method * You want to collect payment with minimal friction ## Invoice statuses Every invoice moves through one of these states: | Status | Description | | - | - | | **Open** | The invoice has been created and is awaiting payment. If a due date has been set, the buyer has until that date to pay. | | **Paid** | Payment has been received. The associated order and experience grants are created automatically. | | **Past due** | The invoice's due date has passed without payment. Crevio marks open invoices as past due automatically. | | **Void** | The invoice has been cancelled. A voided invoice cannot be paid or reopened. Use this when an invoice was created in error or is no longer needed. | > [!NOTE] > > You can void an invoice at any time, regardless of its current status. Voiding an invoice does not affect any orders or experience grants that may have already been created from it. ## Auto-incrementing invoice numbers Crevio assigns a sequential invoice number to each new invoice within your account, formatted as `#00000001`, `#00000002`, and so on. Numbers are unique per account and auto-increment -- you do not need to manage numbering manually. This makes it straightforward to reference invoices in your records, correspondence, and accounting. ## Custom descriptions The description field on an invoice is freeform text (up to 500 characters). Use it to provide context to the buyer, such as: * A summary of the work or product being billed * A reference or PO number * Special payment terms or notes The description appears on the invoice and in the payment email sent to the buyer. ## Due date management Every invoice requires a due date. This date determines when Crevio considers the invoice overdue: * **Before the due date** -- The invoice remains in the **Open** status. * **After the due date** -- If still unpaid, Crevio automatically transitions the invoice to **Past due**. > [!TIP] > > Set due dates that give your buyers reasonable time to pay. For most situations, 7 to 30 days from the invoice date works well. ## Invoice PDFs Crevio generates a downloadable PDF for each invoice. Both you and the buyer can access the PDF via the invoice detail page. PDFs include the invoice number, buyer details, line items, amounts, and status -- useful for bookkeeping and tax records. ## Invoices and checkout When a buyer pays an invoice via the payment link, Crevio creates a [checkout session](/docs/features/checkout) pre-filled with the buyer's email address from the invoice. This reduces friction and ensures the payment is linked back to the correct invoice record. Once the checkout completes, the invoice is automatically marked as **Paid** and the buyer receives access to the purchased experiences. # Terms, privacy & refund policies Source: https://crevio.co/docs/features/legal-pages Let Crevio write your Terms of Service, Privacy Policy, and Refund Policy -- then review, edit, and show them on your site. Every business needs a few standard pages: a Terms of Service, a Privacy Policy, and a Refund Policy. They tell your customers the rules, build trust, and are often expected (or required) when you sell online. Writing them from scratch is tedious -- so you do not have to. Just ask Crevio. Crevio drafts these pages for you based on your business, in clear language. You stay in control: review them, tweak anything you like, and they appear on your site automatically. ## Why you'd use this * **You skip the blank page.** Crevio writes a solid first draft so you are not staring at legal jargon wondering where to start. * **You build trust.** Customers feel safer buying when they can see clear terms and a refund policy. * **You look established.** Having these pages signals that you run a real, considered business. > [!WARNING] > > Crevio gives you a strong starting point, but it is not legal advice. If your business has special requirements -- or you operate in a regulated area -- have a professional review your pages before you rely on them. ## Let Crevio write your pages **1. Ask Crevio to create them** Tell Crevio what you need -- for example: *"Write my Terms of Service, Privacy Policy, and Refund Policy."* Share anything specific about your business, like whether you offer refunds and within how many days. **2. Crevio drafts each page** Crevio writes the pages tailored to what you sell, in plain, readable language your customers can actually understand. **3. Review what Crevio wrote** Read through each page. Check that anything specific to you is right -- your refund window, how you handle customer information, and your business name. **4. Make any edits you want** Change any wording directly, or just ask Crevio: *"Update my refund policy to allow 30 days instead of 14."* Crevio rewrites it for you. > [!TIP] > > You can ask for one page or all three at once. And you can always come back later -- *"Add a section about digital downloads to my terms"* is all it takes. ## Where they appear on your site Once your pages are ready, Crevio shows them on your site -- typically linked in the footer, where visitors expect to find them. That means they are easy to reach from any page. Your checkout shows them too. Under the pay button, buyers can open **Terms and policies** to read your Terms of Service, Refund Policy, and Privacy Policy without leaving the checkout. A page only shows up once it has content, so an empty policy never appears. You can edit them anytime under **Settings > Legal**, where each page also has a template to start from. You do not need to place them manually. As soon as a page exists, Crevio makes sure it is reachable on your site. > [!NOTE] > > Keep your pages up to date as your business changes. If you start offering subscriptions, selling to new countries, or changing your refund terms, just ask Crevio to refresh the relevant page. ## If something goes wrong > **The policy doesn't match how I actually work** > > Tell Crevio what is different. For example: *"I don't offer refunds on digital products -- update my refund policy to say that."* Crevio rewrites the page to match your real terms. > **I can't find the pages on my site** > > They are usually linked in your site's footer. If you do not see them, make sure each page has been created, then ask Crevio: *"Show my legal pages on my site."* > **I need a page Crevio didn't create** > > Ask for it by name -- *"Write me a cancellation policy"* or *"Add a cookie notice."* Crevio can draft additional pages beyond the standard three. > **I'm worried the wording isn't enough for my situation** > > Crevio's drafts cover the common cases well, but they are not a substitute for professional advice. If your business is unusual or regulated, have a lawyer review the pages before publishing. ## Related > **[Your AI website](/docs/features/sites)** > > Build your whole site by describing what you want. > **[Products](/docs/features/products)** > > Set up the things you sell. > **[Your own web address](/docs/features/domains)** > > Put your site on your own custom web address. # Orders Source: https://crevio.co/docs/features/orders View, manage, refund, and track every order placed through your Crevio website, with full customer and payment details in one place. An order is created every time a buyer completes [checkout](/docs/features/checkout), and again every time a subscription or payment plan is paid after that (see [Renewal orders](#renewal-orders)). Orders track what was purchased, how much was paid, and whether the buyer has been granted access to their purchased experiences. ## Order statuses Every order has a status that reflects the current state of payment. | Status | Meaning | | - | - | | **Succeeded** | Payment was captured successfully. The buyer has been granted access to their purchased experiences. | | **Pending** | The order has been created but payment has not yet been confirmed. | | **Failed** | The payment attempt failed (e.g., insufficient funds, declined card). | | **Refunded** | The full order amount has been refunded to the buyer. | | **Partially refunded** | A portion of the order amount has been refunded while the remainder stands. | | **Disputed** | The buyer's bank has questioned or reversed the payment (a dispute or chargeback). See [Disputes](#disputes). | > [!NOTE] > > Free orders (where every item has a free price variant) skip payment processing entirely and are marked as **Succeeded** immediately. ## Order line items Each order contains one or more line items. A line item represents a specific [price variant](/docs/features/pricing) that the buyer selected during checkout, along with the quantity purchased. Line items link back to both the product and the price variant, so you can see exactly what tier the buyer chose and what experiences they are entitled to. ## Access tokens When an order succeeds, Crevio generates an **access token** -- a unique, secure link that the buyer uses to claim their purchased experiences. Access tokens serve several purposes: * **Content delivery** -- Buyers follow the access link to view or download their purchased content. * **Seat-based orders** -- For products with seat-based pricing, each seat gets its own access token. The buyer claims one token, and additional tokens can be shared with team members via email invites. * **View tracking** -- Access tokens track how many times content has been viewed and from which IP addresses, enabling optional authentication gating after a set number of free views. > [!TIP] > > Access tokens are included in the order confirmation sent to the buyer. You can also find them in the order detail view in your dashboard. ## Refunds You can issue refunds for any succeeded or partially refunded order directly from your dashboard or through Stripe. A **Disputed** order has no refund button. See [Disputes](#disputes). ### Full refunds A full refund returns the entire order amount to the buyer. The order status changes to **Refunded** and any inventory limits on the purchased price variants are automatically restored. ### Partial refunds A partial refund returns a portion of the order amount. The order status changes to **Partially refunded**. This is useful when a buyer is unsatisfied with part of a bundle or when you want to offer a goodwill credit without reversing the entire purchase. > [!NOTE] > > When an order is fully refunded or fails, Crevio automatically restores inventory for all line items. This means the refunded units become available for purchase again without manual intervention. Renewal orders are the exception: they never used up stock, so refunding one restores none. ## Disputes A dispute (also called a chargeback) is when a buyer asks their bank to reverse a payment instead of asking you for a refund. Your payments run through your own Stripe account, so Stripe handles the dispute with you directly. **What you see:** * Stripe emails you and shows the dispute in your Stripe dashboard. * In Crevio, the order changes to **Disputed** as soon as Stripe tells us. Early bank inquiries, which come before a full chargeback, show as **Disputed** too. * For a chargeback, Stripe takes the disputed amount, plus its dispute fee, out of your Stripe balance until the dispute is decided. **What to do:** open the dispute in your Stripe dashboard and submit your evidence there, before the deadline Stripe shows. Crevio can't submit evidence for you. While an order is **Disputed**, you can't refund it from Crevio, because Stripe refuses refunds on a disputed payment. **How it ends:** | Outcome | What happens in Crevio | | - | - | | You win | The order goes back to **Succeeded** (or **Partially refunded** if you had refunded part of it). The buyer keeps access. | | You lose | The order stays **Disputed**, and the buyer loses access to what they bought, the same as after a full refund. The money stays with the buyer. | | The inquiry closes without a chargeback | The order goes back to its earlier status. | > [!NOTE] > > The buyer keeps access while a dispute is open. Access is only removed if you lose. ## Viewing and filtering orders The **Orders** page in your dashboard shows all orders across your account, sorted by most recent. Each row displays: * Order ID * Status * Customer name and email * Amount and currency * Date placed * Whether a discount was applied You can expand any order to see its full details, including: * **Line items** -- The products and price variants purchased * **Customer** -- The buyer's profile and contact information * **Discount** -- The discount code applied, if any * **Access tokens** -- The tokens generated for content delivery * **Charge** -- The Stripe charge details including fees ## Renewal orders Every paid [subscription](/docs/features/subscriptions) renewal becomes its own order, marked **Renewal** next to its status. So does every payment plan installment after the first, marked **Installment**. The first order is the purchase; each renewal order after it is one payment. A renewal order's page links back to the purchase it renews, and for a payment plan says which installment it is, such as **Installment 2 of 6**. Once a subscription or payment plan has renewed at least once, the purchase and each of its renewal orders list every payment in a **Payments** section, oldest first, with each order's date, amount and status. Below the list, **Total paid** is what the buyer has paid so far, less refunds and leaving out disputed payments. A renewal order: * **Has the same customer and items as the purchase.** Extra details your integrations attached to the purchase order, such as your own order numbers, are not copied. * **Counts in your revenue** on the day the renewal was paid, so your analytics and customer totals include every renewal, not just the first payment. * **Sends the buyer a receipt** with the amount and date. To stop these, go to **Settings** > **Notifications** and switch off **Recurring Payments** under **Customer**. * **Does not send you a new order notification.** You already know about the subscription, so only first purchases notify you. * **Does not grant access again or use up stock.** Access comes from the subscription and stays until the subscription ends. > [!NOTE] > > Refunding a renewal order, or losing a dispute on one, returns that payment only. The buyer keeps access, because the subscription is still running. To end their access, cancel the subscription. A renewal that costs nothing, for example under a 100% discount, does not create an order. Renewals of a test purchase create test orders, so you can see the whole flow without charging anyone. ## Payment plan orders When a buyer purchases a [payment plan](/docs/features/pricing#payment-plan) variant, Crevio collects the agreed number of installments and then stops charging automatically. The buyer is never billed beyond what was agreed at checkout. The first payment is the purchase order, and each later installment shows up as a [renewal order](#renewal-orders). The order detail page shows the payment plan schedule, including the installment amount, interval, and total number of payments. If the variant includes a [setup fee](/docs/features/pricing#setup-fees), it appears as a separate line item on the order. > [!NOTE] > > If you need to modify or cancel a payment plan early, you can do so from the **Subscriptions** section of your Stripe dashboard. ## Order details page Click on an order to open its detail page. Here you see the complete picture: * Full line item breakdown with product names, price variant names, and quantities * Customer profile with a link to their [customer detail page](/docs/features/customers) * Payment details including the amount, currency, and Stripe charge reference * Subscription information (if the order is tied to a recurring subscription or payment plan) * Access token status showing whether tokens have been claimed ## Free orders Orders where all items have free price variants are handled without any payment processing. These orders are marked as **Succeeded** immediately upon checkout completion, and the buyer receives access to the associated experiences just like a paid order. Free orders do not have a Stripe charge attached. # Pages Source: https://crevio.co/docs/features/pages Ask Crevio for a report, plan, or dashboard and get back a real web page at its own link -- shareable with your team, or with anyone. **Some answers are too big for a chat message.** A quarterly breakdown, a launch plan, a competitor comparison, a dashboard you want to check again next week -- you don't want to scroll back through a conversation to find it. Ask Crevio for it as a page instead. It builds a proper web page, puts it at its own link, and hands you the link. You open it, bookmark it, and share it. ## Why you'd use it * **You want to keep the answer.** A page has a stable link. The chat moves on; the page stays where you left it. * **You want to share it.** Send the link to a teammate, or make it public and send it to anyone. * **You want it to look like something.** Charts you can hover, tables you can sort, a layout you'd be happy to put in front of someone. ## Ask for one Just say what you want and that you want it as a page: * *"Put last quarter's revenue by product into a page I can share with my accountant."* * *"Make me a page comparing the three email tools you just researched."* * *"Build a dashboard page of this month's orders, refunds, and top customers."* Crevio builds it, publishes it, and replies with the link and a preview image so you can see what you're getting before you click. Every page opens on your business's own page address, like `yourbusiness.crevio.page/q3-revenue`; live pages stay on crevio.co. Links to pages shared before that still work: they forward to the new address. > [!TIP] > > If you want the page to live at a memorable address, say so: *"call it q3-revenue"*. That becomes the last part of the link. ## Choose who can open it Every page has one of three access settings. Crevio asks if it isn't obvious, and you can change it later by asking, or on the **Pages** screen. | Access | Who gets in | | - | - | | **Your team** (default) | Anyone signed in as a member of your Crevio account | | **Specific people** | Only the teammates and [groups](/docs/features/team) you name, plus account admins and the page's access manager | | **Public** | Anyone with the link, no sign-in | With **Specific people**, turn on **Only these people** to keep account admins out too. Then only the people you named and the page's access manager can open it. Admins still see the page on the Pages screen and can change who has access. Every page has an **access manager**: the person who asked for it. They can always open the page, even when it's limited to named people, for as long as they're on your team. Pages from before this existed are managed by the account owner. > [!NOTE] > > A page is only made public when you actually ask for a public link. If you don't say, Crevio keeps it to your team. A public page can also turn up in search results. Team-only and restricted pages are never indexed by search engines -- they can't be read without signing in. If someone without access opens the link, they're asked to sign in. If they sign in and still don't have access, the page simply looks like it doesn't exist -- the link itself never confirms there's something there. To share a page with a teammate who isn't on your account yet, [invite them to your team](/docs/features/settings#your-team) first, then ask Crevio to give them access. ## Change or remove a page * **Update it** -- *"add September to the revenue page"*. Crevio republishes it at the same link, so anything you've already shared keeps working, the preview image included. * **Remove it** -- *"delete the q3-revenue page"*. The link stops working immediately. Publishing again under the same name brings it back. * **See what you have** -- *"what pages have I published?"*, or open **Pages** in the sidebar. ## Manage your pages The **Pages** screen lists every page on your account with who can open it and who manages it. Search by name, or filter by access or by access manager. Account admins can use it. From a page's menu you can: * **Change access** -- pick who can open it. Select several pages with their checkboxes to change them all at once. * **Rename link** -- change the last part of the link. The page moves to the new link and the old one stops working, so share the new link again. * **Duplicate** -- make a copy at a new link, with the same access. You manage the copy. A copy of a live dashboard needs an admin's approval again before it reads data. * **Version history** -- see earlier versions and restore one. See below. * **Transfer access manager** -- hand the page to another teammate. * **Custom domain and badge** -- put a public page on your own web address, and show or hide its badge. See below. * **Delete page** -- the link stops working right away. ### Put your pages on your own web address There are two ways to use your own address. **All your pages on one address.** Ask Crevio in chat, for example "put my reports on reports.yourbrand.com". It connects the address and tells you the DNS record to add at your domain provider. Once the domain is verified, usually within minutes, every page you publish opens at `reports.yourbrand.com/page-name`. Each page keeps its own access: public pages open for anyone, and team-only or named-people pages ask the visitor to sign in first, then open only for the people allowed to see them. Changing who can see a page takes effect right away. Each business has one address like this. Live pages keep their crevio.co link. **One public page on an address.** Open the page's menu, choose **Custom domain and badge**, and pick one of your domains or type a new one. The page then opens at the address itself, like `launch.yourbrand.com`. Only public pages can be used this way, and each address shows one page. Either way, the page's link becomes your address, and its crevio.page link keeps working too. A domain already showing a site can't also show pages. See [Domains](/docs/features/domains) for how domains work. ### The "Powered by Crevio" badge Public pages show a small **Powered by Crevio** link in the corner. Team-only pages never do. On the Business plan you can hide it from the same **Custom domain and badge** menu. ### Version history Each time a page is republished or a version is restored, Crevio keeps the version it replaced. The last 10 are kept. Open one to see it as it was, or **Restore** it to put it back at the same link. Restoring keeps the version it replaced, so you can always undo it. You can also ask Crevio: *"put the revenue page back the way it was yesterday."* ## Live dashboards A page can also be **live**: instead of a snapshot, it asks your connected tools for fresh numbers each time someone opens it. Ask for it that way -- *"build me a live dashboard of PostHog traffic and today's orders."* * **Read-only.** A live page can only read. It can never send, change, or spend anything. * **Team connections only.** It uses the connections your whole team shares, not anyone's personal account. * **An admin approves it once.** The first time, an account admin approves what the page is allowed to read, and that covers everyone who opens it. If an admin published it from their own chat, that counts as approval. Otherwise the page shows an approval bar to admins until someone approves. * **Never public.** Live pages are for your team or named people only, so your data never goes out to anyone with the link. * **Fallback when it can't load.** The preview image and any place that can't run the page show its fallback content instead of an error. ## Images in the chat Sometimes you just want to see something, not keep a link: *"show me this pricing table as an image."* Crevio lays it out the same way it builds a page, turns it into a sharp image, and posts it right in the chat, ready to drop into a slide, a post, or a message. ## What a page is (and isn't) A page is one self-contained document. It's the right answer for a report, a brief, a plan, a comparison, an interactive chart, or a dashboard built from a snapshot of your data, or a live dashboard that reads your connected tools each time it's opened. It is **not** the right answer for a storefront, a signup flow, a members area, or anything that needs to save what visitors type or show live data from your own customers. That's a [site or app](/docs/features/sites) -- ask for one of those instead and Crevio will build it properly. > [!NOTE] > > Pages are capped at 2 MB, which is far more than a text-and-charts report needs. If Crevio is building something big enough to hit that, it's probably a site. ## If something goes wrong > **A teammate says the link doesn't work** > > Check the page's access. If it's set to specific people, they need to be named on it; if it's set to your team, they need to be a member of your account. Ask Crevio: *"who can open the q3-revenue page?"* > **I shared the link in Slack and it didn't show a preview** > > A public page unfurls with its title and a preview image wherever you paste the link. > > Team-only and restricted pages don't, because the preview would have to be readable by everyone in the channel. Crevio includes a preview image alongside the link when it publishes -- share that with it. > **The page looks broken or is missing images** > > Tell Crevio what's wrong and ask it to republish. Pages have to carry everything with them, so an image that lives somewhere else can occasionally fail to load -- Crevio can rebuild it with the image included. > **I want the page to update itself** > > A normal page is a snapshot. For numbers that stay current, ask for a [live dashboard](#live-dashboards) instead. Or set up a [recurring job](/docs/features/automation): *"every Monday, rebuild my orders dashboard page."* Crevio republishes it at the same link each time. > **My live dashboard says it's waiting for approval** > > A live page can't read your data until an account admin approves it. Admins see an **Approve** bar at the top of the page. If a team member or a scheduled job published it, ask an admin to open the page and approve it. ## Related > **[Your AI website & apps](/docs/features/sites)** > > For anything that needs visitors, sign-ups, or live data. > **[Put your business on autopilot](/docs/features/automation)** > > Have Crevio rebuild a page on a schedule. > **[Your team](/docs/features/settings)** > > Invite the people you want to share pages with. > **[Analytics](/docs/features/analytics)** > > The numbers behind the reports you ask for. # Getting your money (payouts) Source: https://crevio.co/docs/features/payouts Understand how the money from your sales reaches your bank account, when payouts arrive, and where to see everything you've earned. When someone buys from you, that money doesn't sit inside Crevio -- it goes straight to your connected payment account, and from there into your bank. A **payout** is simply the moment your earnings move from your payment account to your bank balance. This page explains, in plain terms, how you actually get paid and where to keep an eye on your earnings. ## How getting paid works There are three simple stages: 1. **A customer pays.** They check out and their card is charged. 2. **The money lands in your payment account.** Crevio connects to a secure payment provider (Stripe) that holds your sales safely. Crevio never holds your money itself. 3. **A payout reaches your bank.** Your payment provider sends the money on to your own bank account on a regular schedule. > [!NOTE] > > Because your money flows through your own connected payment account, you're always in control of it -- and you can see every payout and bank transfer in your payment provider's dashboard too. ## Connect your payment account first You can only receive money once you've connected a payment account. If you sell only free products you don't need this, but the moment you want to charge for anything, connect it. **1. Go to Settings** Open **Settings** and find the **Payments** area in your dashboard. **2. Connect your account** Follow the guided steps to connect (or create) your payment account. You'll add basic business and bank details so your money has somewhere to go. **3. Start selling** Once connected, every paid sale flows automatically toward your bank. ## When you get paid Your payouts follow the schedule set by your payment provider -- often a few business days after each sale, then on a rolling basis (for example, daily or weekly). The very first payout after you connect can take a little longer while your account is verified. After that, money arrives steadily. The exact timing and schedule live in your payment provider's dashboard, where you can also change how often you'd like to be paid out. > [!TIP] > > Curious how you're doing? Just ask Crevio -- "How much did I make this month?" -- and it'll pull together your sales so you don't have to dig. ## Where to see what you've earned You have a clear view of your income inside Crevio: * **Orders** shows every individual sale, what it was for, and who bought it. * **Analytics** shows the bigger picture -- your revenue over time and your best-selling products. For the money itself -- your available balance, upcoming payouts, and completed bank transfers -- check your connected payment provider's dashboard, which you can reach from your payment settings. ## What affects your balance A few things change the amount that gets paid out: * **Refunds** you issue come out of your balance. See [Refunds](/docs/features/refunds). * **Payment processing fees** are taken by your payment provider on each sale. * **Platform fee.** On one-time purchases, Crevio's fee is a percentage of what the buyer pays after any discount code, not of the full price. * **Platform fee exemptions.** Crevio does not currently collect its platform fee on sales for businesses based in Brazil, India, Mexico, Malaysia, or Thailand, because the payment provider doesn't support it there. * **Pending payments** that haven't fully cleared yet aren't paid out until they settle. ## If something goes wrong * **You haven't received a payout yet.** Check that your payment account is fully verified and your bank details are correct. The first payout always takes longest. * **A payout looks smaller than expected.** Remember that refunds and processing fees reduce the total. Your payment provider's dashboard shows the exact breakdown. * **You can't accept payments at all.** You probably haven't connected a payment account yet -- head to **Settings → Payments**. ## Related > **[Getting started](/docs/introduction/getting-started)** > > Connect your payment account and make your first sale. > **[Orders](/docs/features/orders)** > > See every sale that makes up your earnings. > **[Analytics](/docs/features/analytics)** > > Track your revenue and spot your best products. > **[Refunds](/docs/features/refunds)** > > Understand how refunds affect your balance. # Physical goods Source: https://crevio.co/docs/features/physical-goods Sell and ship physical products with Crevio -- what works today, what you handle yourself, and how to work around the gaps Crevio sells just about anything. Courses and downloads, yes -- but equally a lawn care round, an agency retainer, consulting hours, a booked-in job, a membership. Anything where you and the buyer agree on a price and you go and do the work. Where it gets thinner is **shipping a physical object to someone**. Not the selling part -- Crevio takes the money, collects the address, and tracks your stock perfectly well. It is everything after that: postage costs, labels, tracking numbers, and knowing which parcels have actually gone out. Crevio does none of it, so **you pack the box, pay the postage, and tell the buyer it shipped.** This page is deliberately blunt about where that line falls, so you can decide before you list anything. ## What works today | Capability | How it works | | - | - | | **Product pages** | Full [product](/docs/features/products) pages with an image gallery, description, SEO fields, and reviews -- exactly the same as anything else you sell. | | **Pricing** | One-time prices, [discounts](/docs/features/discounts), and multiple price variants per product. | | **Inventory** | Set a **quantity available** on any [price variant](/docs/features/pricing#inventory-limits). Crevio decrements it with database-level locking, so you cannot oversell, and restores it automatically on a refund. | | **Quantity selection** | Buyers can order more than one unit, and the cart holds several products at once. | | **Shipping address** | Checkout can collect a full shipping address, validated by Stripe's address form. | | **Country restrictions** | Limit checkout to the countries you actually ship to. | | **Sales tax** | Pick the **General - Tangible Goods** tax code on the product so Stripe calculates the tax a physical item actually attracts. | | **Order record** | Every order shows the shipping and billing address on its detail page, with a copy button. | ## Setting up a physical product **1. Turn on shipping address collection** Go to **Settings → Advanced → Checkout** and enable **Collect shipping address**. > [!WARNING] > > This setting is account-wide, not per product. Once it is on, **every** checkout asks for a shipping address -- including the products you never post to anyone. If the parcel is the exception rather than the rule, this puts a form field in front of buyers who do not need it. **2. Restrict the countries you ship to** In the same screen, set **Allowed countries** to the places you are willing to post to. Leaving it empty means anyone, anywhere, can buy -- including someone whose parcel would cost more to send than the item is worth. **3. Set the tax code** On the product, open the tax section and choose **General - Tangible Goods**. The account default is the digital-products code, which will calculate the wrong tax on a physical item in most jurisdictions. **4. Add a price variant with a quantity** Create the price variant and set **quantity available** to how many units you physically have. This is what stops you selling stock you cannot ship. For sizes or colours, create one price variant per option -- "T-shirt — Medium", "T-shirt — Large" -- each with its own quantity. They appear to the buyer as a flat list of options. **5. Attach an experience** Every product needs at least one [experience](/docs/features/experiences) on a price variant before it can go active. There is no "physical item" experience type, so attach something that makes sense to the buyer after they pay. > [!TIP] > > The best workaround is a **Written content** experience titled something like *"Your order — what happens next"*, containing your dispatch times, care instructions, and how to reach you. It turns a required technical step into a genuinely useful post-purchase page. **6. Activate and fulfil by hand** Set the product to **Active**. When an order comes in, open it, copy the shipping address, and post the item. ## What Crevio does not do Crevio has no fulfilment system. These are the real gaps, and the best workaround for each. ### There are no shipping rates Checkout collects an address but never charges for delivery. There is no shipping-cost line, no flat rate, no weight-based or carrier-calculated rate, and no free-shipping-over-a-threshold rule. **Workarounds:** * **Build postage into the price.** Simplest, and works if you ship to one region. * **Create a price variant per region** -- "Ships to UK — £29", "Ships to Europe — £39", "Ships worldwide — £49" -- and rely on the country restriction to keep buyers honest. Nothing enforces that the variant matches the address they type, so check each order before posting. ### There is no fulfilment status Order status tracks payment only: succeeded, pending, failed, refunded, partially refunded, disputed. There is no *packed*, *shipped*, or *delivered* state, and nowhere to store a tracking number. **Workarounds:** * Keep a spreadsheet keyed on the order number for anything beyond a handful of orders a week. * Use [customer tags](/docs/features/tags) as a rough state marker -- tag a buyer `shipped` once their parcel goes out, and filter on it. * Ask Crevio in chat: *"Which orders from this week contain the Medium t-shirt?"* It can pull the list for you, but it cannot mark them as shipped. ### The shipping address is dashboard-only This is the biggest limitation if you ship any volume. The shipping address is visible on the order detail page in your dashboard -- and nowhere else. It is **not** in the [API](/docs/developer/guides/commerce-overview) order object and **not** in the `order.paid` webhook payload. You cannot pipe addresses automatically into a 3PL, a label printer, or a shipping app. You copy them one at a time. **Workarounds:** * Use the copy button on the order page and paste into your carrier's site. * Pull the address from your Stripe dashboard, which has it on the underlying payment. ### There are no carrier integrations No label printing, no rate shopping, no tracking numbers, and no automatic "your order has shipped" email. Crevio will never tell your buyer where their parcel is. **Workaround:** send it yourself. Set up an [automation](/docs/features/automation) that emails the buyer when an order is paid -- *"Thanks! Your order ships within two working days."* -- and then send the tracking number manually from the [customer](/docs/features/customers) record once you have it. ### Returns are money-only A [refund](/docs/features/refunds) reverses the payment and restores inventory. It does nothing about getting the item back. There is no returns request, no RMA number, no return label. **Workaround:** publish your returns policy on a [legal page](/docs/features/legal-pages), handle requests over email, and issue the refund once the item is back in your hands. ### No backorders Crevio can't take orders for stock you don't have yet. [Waitlists](/docs/features/waitlists) are for approving buyers, not for backorders, and they don't collect a shipping address. **Workaround:** when you sell out, set **quantity available** to `0`. That cleanly blocks purchase. Capture interest with a [form](/docs/features/forms) -- "Tell me when this is back" -- and email that list when you restock. ### Other things to know * **No address validation.** Stripe formats the address; nobody checks the parcel can actually get there. Typos reach you as typos. * **No dimensions or weight** anywhere on a product, so nothing downstream can estimate postage. * **The buyer's purchase page shows experiences, not objects.** It lists what they can open or access. A physical item shows nothing there unless you attached the written-content page described above. * **Orders cannot be exported to CSV** from the dashboard. For bulk fulfilment you would read them through the API, which -- as above -- omits the address. ## Is Crevio the right place to sell this? Be honest with yourself about volume. **Crevio works well when:** * The parcel is a side of the business rather than the business -- merch for a course, a printed companion to a service, a product you hand over on a job. * You ship a low, hand-packable number of orders: a few a day, not a few hundred. * You run limited drops with a fixed quantity and one flat price. * You ship to one country, or a small group of countries, at a postage price you can bake in. **Use a dedicated store platform when:** * You have dozens of SKUs with a size × colour matrix. * You need live carrier rates or international duties calculated at checkout. * You use a warehouse or 3PL that expects orders pushed to it automatically. * Shipping cost varies enough that guessing it would eat your margin. > [!NOTE] > > Nothing stops you doing both -- run the rest of your business on Crevio and keep a separate store for the stock you post. You can link to it from your [website](/docs/features/sites) like any other page. > [!TIP] > > If what you sell is a **service** -- lawn care, an agency retainer, consulting, a repair visit -- none of this applies to you. Nothing is being posted, so there is nothing to fulfil. Price it, take the money, and go and do the work. If the job needs a time slot, attach an [event experience](/docs/features/experiences) to the price variant so the buyer books one when they pay. > [!TIP] > > Ask Crevio to do the setup for you: *"I want to sell a printed workbook for £25, I have 40 copies, and I only ship to the UK."* It will turn on shipping address collection, restrict the country, set the tangible-goods tax code, and create the product with the right stock count. # Pricing & price variants Source: https://crevio.co/docs/features/pricing Set up flexible pricing with multiple tiers, subscriptions, pay-what-you-want, and more Price variants are how you define what a product costs and how buyers pay for it. Every product has at least one price variant, and you can add as many as you need to offer different pricing tiers from a single product page. ## What are price variants? A price variant is a specific pricing option on a product. For example, a single course product might have: * A **free** tier that gives access to the first chapter * A **\$49 one-time** tier for full course access * A **\$9/month subscription** tier that includes the course plus ongoing community access Each variant can grant access to different [experiences](/docs/features/experiences), so you can build tiered offerings without creating separate products. ## Billing types Every price variant has a billing type that determines how and when the buyer is charged. ### Free No payment is collected. The buyer completes checkout without entering payment details. Free variants are useful for lead magnets, free tiers, or gated content that you want people to sign up for. ### One-time The buyer pays a single fixed amount and receives permanent access (unless you configure [auto-revoke](#auto-revoke-access)). ### Subscription The buyer is charged on a recurring schedule. You choose the interval: | Interval | Billing cycle | | - | - | | Daily | Every day | | Weekly | Every 7 days | | Bi-weekly | Every 14 days | | Monthly | Every month | | Quarterly | Every 3 months | | Semi-annual | Every 6 months | | Annual | Every year | > [!NOTE] > > When a subscription is cancelled or lapses, the buyer's access to the associated experiences is revoked automatically. ### Payment plan A payment plan splits a fixed total into a set number of recurring installments. The buyer pays on a schedule you define until all installments are collected, then the subscription ends automatically. You configure three things: * **Recurring interval** -- How often the buyer is charged (weekly, monthly, etc.). The same intervals available for subscriptions apply here. * **Installment count** -- The total number of payments the buyer will make (minimum 2). For example, a \$300 product with a monthly interval and 3 installments charges \$100/month for 3 months. > [!NOTE] > > After the final installment is collected, the payment plan ends automatically and the buyer is not charged again. ## Pay-what-you-want pricing For variants with the **custom** amount type, buyers choose how much they pay. You control the boundaries: * **Minimum amount** -- The lowest amount a buyer can enter. Set it to 0 to let buyers take the product for free if they choose. * **Maximum amount** -- The highest amount a buyer can enter * **Preset amount** -- The amount filled in for the buyer when checkout opens > [!TIP] > > Setting a thoughtful preset amount can significantly increase your average order value. Most buyers anchor on the suggested price rather than entering the minimum. The preset amount must fall within the minimum and maximum range you define. If you set both a minimum and maximum, the minimum must be less than the maximum. ### What your buyer sees The checkout page shows a price field next to the product, filled in with your preset amount (or your minimum when there is no preset). The buyer types the amount they want to pay, and the order total, taxes and payment form update to match before they pay. * An amount below your minimum or above your maximum is refused at checkout with a message telling the buyer the allowed range. * Any amount above zero must be at least the smallest price Crevio can charge in your currency (for US dollars, \$0.99). When you leave the minimum empty, that is the lowest a buyer can pay. * With a minimum of 0, a buyer can enter 0 and still complete checkout. You get an order and a new customer, but no payment. * Discount codes apply to the amount the buyer chose. A discount with a minimum spend counts the chosen amount. * Order confirmation emails and your order list show the amount the buyer actually paid. ### Limits * **One-time prices only, by design.** A subscription or payment plan cannot be pay-what-you-want, because the buyer would be choosing an amount for every future payment. * **Not in the price editor.** The product editor offers free and fixed prices. To create a pay-what-you-want price, ask Crevio's agent (for example, "add a pay-what-you-want price from \$5, suggested \$20") or use the API. ## Strikethrough pricing You can set a **discounted from** amount on any fixed-price variant. This displays the original price with a strikethrough next to the current price, creating a visual discount indicator on your website. The discounted-from amount must be higher than the actual price. ## Free trials Subscription and payment plan variants can include a free trial period. Set the **trial period** in days -- the buyer signs up, gets immediate access, and is not charged until the trial expires. > [!NOTE] > > Free trials are only available on subscription and payment plan variants. They cannot be applied to one-time or free variants. ## Setup fees Subscription and payment plan variants can include an optional **setup fee** -- a one-time charge collected alongside the first recurring payment. Setup fees are useful for: * Onboarding or account creation costs * Initial access fees for premium content * One-time materials or resource fees bundled with a recurring plan The setup fee appears as a separate line item during checkout so the buyer can see exactly what they are paying. It is charged only once, on the first payment. > [!TIP] > > Setup fees pair well with payment plans. For example, you could offer a 3-month payment plan at \$50/month with a \$25 setup fee, totaling \$175. ## Inventory limits Set a **quantity available** on any price variant to limit how many times it can be purchased. Crevio tracks inventory with database-level locking to prevent overselling. Once the quantity reaches zero, the variant can no longer be purchased. Inventory is automatically restored if an order is refunded or cancelled. > [!TIP] > > Inventory limits are what make [physical goods](/docs/features/physical-goods) workable on Crevio -- they stop you selling stock you cannot ship. ## Seat-based pricing For variants that grant access to a team or group, you can set a **seat quantity**. This defines how many seats (user slots) are included in a single purchase. Seat-based pricing is available on fixed-price and free variants. ## Auto-revoke access Set **revoke after days** on a price variant to automatically remove the buyer's access after a certain number of days. This is useful for: * Time-limited content (e.g., a 30-day challenge) * Rental-style access to digital downloads * Trial periods on one-time purchases ## Checkout forms Pick a **Checkout form** under a price variant's **Advanced options** to ask buyers questions every time they buy it, for example their company name or what they want to get out of a course. Build the questions as a [form](/docs/features/forms) first. * Buyers fill in the form above the payment details. Its required fields must be answered before they can pay. * The form's email field isn't shown. Crevio fills it with the email the buyer uses at checkout. * The answers appear on the order and as a submission in **Forms**, so the form's tags, confirmation email and freebie apply as they do for any submission. * A cart with several products shows each product's form once. ## Waitlists and approvals Tick **Require approval (waitlist)** under a price variant's **Advanced options** to review every buyer before they get access. Buyers apply and fill in its checkout form, and a paid buyer's card is charged only when you approve them. See [Waitlists and approvals](/docs/features/waitlists). ## Cross-sell recommendations You can link price variants to other variants as cross-sells. When a buyer adds a product to their cart or reaches checkout, Crevio displays the cross-sold products as recommendations, encouraging additional purchases. > [!TIP] > > Cross-sells work best when the recommended product complements what the buyer is already purchasing -- for example, suggesting a templates pack alongside a course. ## Benefits list Each price variant has a **benefits** list -- a set of bullet points that describe what the buyer gets. Benefits are displayed on your website's product page alongside the variant's price, helping buyers compare tiers at a glance. > **Example: course product with three tiers** > > | | Free | Pro (\$49) | VIP (\$99) | > | - | - | - | - | > | Access to Chapter 1 | Yes | Yes | Yes | > | Full course access | -- | Yes | Yes | > | Downloadable resources | -- | Yes | Yes | > | Private Discord community | -- | -- | Yes | > | 1-on-1 coaching call | -- | -- | Yes | > > Each column is a separate price variant with its own benefits list and attached experiences. ## Managing price variants * A product must have at least one active (non-archived) price variant at all times. * You can **archive** a variant to hide it from your website without deleting it. Archived variants cannot be the last active variant on a product. * Variants that have been synced to Stripe or have existing purchases cannot be deleted, but they can be archived. * Drag variants to reorder them. The first active variant is treated as the default on your website. # Products Source: https://crevio.co/docs/features/products Create, manage, and publish everything you sell on your Crevio website Products are the core of your Crevio business. A product represents anything you sell -- a course, a download, a membership, an event, a service, a retainer, or a combination of several experiences bundled together. > [!NOTE] > > You can sell physical items too, but Crevio handles the sale, not the shipping -- there are no postage rates, labels, or tracking. Read [Physical goods](/docs/features/physical-goods) before you list something you have to post. ## Creating a product **1. Name your product** Go to **Products** in your dashboard and click **New product**. Give it a name (up to 100 characters). Crevio auto-generates a URL slug from the name, which you can customize later. **2. Add media** Upload images, videos, or other media to your product's gallery. Media appears on your website's product page and helps buyers understand what they are getting. **3. Add at least one price variant** Every product needs at least one [price variant](/docs/features/pricing) before it can go live. Price variants define how much the product costs and how buyers are billed. **4. Attach experiences** Experiences are what buyers receive after purchase. Attach one or more experiences to each price variant -- for example, a course, a digital download, a Discord server invite, or a link to external content. > [!TIP] > > Different price variants on the same product can grant access to different experiences, letting you create tiered offerings from a single product page. **5. Set the product to active** When you are ready, change the product status to **Active**. Crevio automatically publishes it on your website. ## Product statuses Every product has one of three statuses: | Status | Meaning | | - | - | | **Draft** | The default status for new products. Draft products are not visible on your website and cannot be purchased. Use this while you are still setting things up. | | **Active** | The product is live. It appears on your website and can be purchased by buyers. A product must have at least one price variant before you can activate it. | | **Archived** | The product is hidden from your website and can no longer be purchased. Existing orders and access grants are unaffected. Use this to retire a product without deleting it. | > [!NOTE] > > You can move a product between statuses at any time. Activating a product automatically publishes it; archiving or returning to draft automatically unpublishes it. ## Product media Product media is managed through Crevio's media library. You can attach multiple images to a product's gallery, and they display in the order you set. Supported media: * **Images** -- JPEG, PNG, WebP, and other common formats * **Open Graph image** -- A dedicated image used for social sharing previews (link cards on X, Facebook, Slack, etc.) > [!TIP] > > Upload a high-quality Open Graph image to make your product links stand out when shared on social media. ## SEO settings Each product has optional SEO fields that control how it appears in search engines and social previews: * **SEO title** -- Up to 60 characters. Shown as the page title in search results. * **SEO description** -- Up to 160 characters. Shown as the snippet beneath the title in search results. If you leave these blank, Crevio uses the product name and any available description as defaults. ## Product URL and slugs Every product gets a public URL based on your website subdomain and the product's slug: ``` https://yoursite.crevio.app/products/your-product-slug ``` Crevio auto-generates the slug from your product name using kebab-case (lowercase letters, numbers, and hyphens). You can edit the slug at any time. Slugs are unique within your account -- if a duplicate is detected, Crevio appends a number automatically (e.g., `my-product-1`). > [!WARNING] > > Changing a product's slug updates its URL immediately. Any previously shared links using the old slug will stop working. ## Attaching experiences to products Experiences are attached at the **price variant** level, not directly on the product. This gives you fine-grained control over what each pricing tier includes. Available experience types: | Type | What the buyer gets | | - | - | | **Digital download** | Downloadable files (PDFs, ZIPs, etc.) | | **Course** | Structured course with chapters and lessons | | **Written content** | Rich-text content pages | | **Website embed** | An embedded external website or app | | **Link** | A redirect to an external URL | | **Discord server** | Auto-invite to a Discord server | | **Telegram** | Access to a Telegram group or channel | | **Event** | Access to a live or scheduled event | | **Forum** | Access to a community discussion forum | A single price variant can include multiple experiences (e.g., a course *and* a Discord invite), letting you create bundles without additional configuration. > [!TIP] > > A product also generates a QR code automatically when created. You can download the QR code and use it on printed materials, slides, or anywhere else to link directly to the product page. # Refunds Source: https://crevio.co/docs/features/refunds Give a customer their money back in full or in part, understand what they'll see, and know how long it takes to land. A refund returns money to a customer after they've paid. You might do this because someone changed their mind, ran into a problem, or you simply want to keep them happy. Crevio makes it a couple of clicks, and the money goes back to the same card the customer paid with. You can refund the **full** amount or just **part** of it -- handy when you want to keep a portion (say, for work already delivered) or offer a goodwill discount after the fact. ## Why issue a refund * **Keep customers happy.** A quick, no-fuss refund turns a frustrated buyer into someone who trusts you. * **Stay on the right side of the rules.** Honouring your refund policy protects your reputation and your payment account. * **Avoid disputes.** Refunding directly is far better than a customer disputing the charge with their bank. ## Issue a refund **1. Find the order** Go to **Orders** in your dashboard and open the order you want to refund. **2. Choose Refund** Select **Refund** on the order. **3. Pick full or partial** * For a **full refund**, leave the amount as is -- the entire payment goes back. * For a **partial refund**, enter the smaller amount you want to return. **4. Add a reason (optional)** Note why you're refunding. This is just for your own records and helps you spot patterns later. **5. Confirm** Confirm the refund. Crevio sends the money back to the customer's original card right away. > [!TIP] > > Want to understand why refunds happen? Ask Crevio to look at your recent refunds and tell you if there's a common reason -- a confusing product page, a delivery hiccup, or a pricing mismatch -- so you can fix the root cause. ## What the customer sees The customer gets a confirmation that their refund is on the way. The money returns to the **same card** they used to pay -- you cannot send it somewhere else. The amount shows up on their statement as a refund against the original charge. ## How long it takes You issue the refund instantly, but it takes a little time to appear in the customer's account -- usually **5 to 10 business days**, depending on their bank. This wait is set by the banks, not by Crevio, so it's worth letting the customer know up front to save them worrying. ## Refunds and access If the customer bought something that gives them access -- like a course or a community -- think about whether you also want to remove that access after refunding. A refund returns the money but doesn't automatically revoke what they can see. You can manage their access from the customer's record. > [!NOTE] > > Refunding a single payment of a [subscription](/docs/features/subscriptions) does not cancel the subscription itself. If you want to stop future charges too, cancel the subscription as well. ## If something goes wrong * **The customer says the refund hasn't arrived.** Reassure them it can take up to 10 business days. If it's been longer, ask them to check with their bank, as the money has already left your account. * **You refunded too much or too little.** You can't undo a refund, but you can charge the customer again or issue another partial refund to balance it out. * **You can't find the order.** Make sure you're looking under the right customer. You can search **Orders** by the customer's email. ## Related > **[Orders](/docs/features/orders)** > > See every sale, its status, and the customer behind it. > **[Subscriptions & recurring payments](/docs/features/subscriptions)** > > Pause, resume, or cancel a customer's recurring billing. > **[Get help with an order (for customers)](/docs/customers/get-help-with-an-order)** > > A guide you can forward to a buyer who wants a refund. > **[Getting your money (payouts)](/docs/features/payouts)** > > Understand how refunds affect your balance and payouts. # Product reviews Source: https://crevio.co/docs/features/reviews Collect reviews from happy customers, show them on your product pages, and arrange them to build trust and sell more. Reviews are what other people say about your products -- a star rating and a few words about their experience. Showing them on your product pages is one of the simplest, most powerful ways to win the trust of someone who's on the fence. People believe other buyers far more than they believe your marketing. With Crevio you can collect reviews, choose which ones appear, and put your best ones front and centre. ## Why reviews matter * **They build instant trust.** A handful of genuine, positive reviews can turn a curious visitor into a buyer. * **They answer questions for you.** Customers often explain in their reviews exactly what they loved, which reassures the next person. * **They lift sales.** A product page with strong reviews simply converts better than one without. ## Collect reviews The best reviews come from real customers shortly after they've enjoyed what they bought. **1. Wait for the right moment** Ask once a customer has had time to use your product -- finished a course, downloaded a file, settled into your community. **2. Invite them to review** Send a friendly note asking how they're getting on and inviting them to leave a review. **3. Approve and publish** New reviews appear in your dashboard. Choose which ones to show on your product pages. > [!TIP] > > Don't want to write the request yourself? Ask Crevio to draft a warm review-request email and even send it to recent buyers for you. The easier you make it, the more reviews you'll get. ## Show reviews on your products Once you've published a review, it appears on the relevant product page for visitors to see. The star ratings and comments sit alongside your product so visitors get social proof exactly when they're deciding whether to buy. ## Reorder your reviews You decide the order reviews appear in. Put your strongest, most specific, most relatable reviews near the top so they're the first thing a visitor reads. **1. Open your reviews** Go to the **Reviews** area of your dashboard. **2. Drag to reorder** Move your best reviews to the top and arrange the rest however you like. **3. Save** Your new order goes live on your product pages. > [!TIP] > > The most persuasive reviews are specific -- "I landed two new clients in a month" beats "Great course!" Feature those first. ## If something goes wrong * **A review is unfair or spammy.** You're in control of which reviews show. Simply leave it unpublished or remove it. * **You're not getting many reviews.** Ask more often, ask sooner, and make it effortless -- a single link in a short, kind email works wonders. Ask Crevio to handle the outreach. * **A negative review came in.** Respond graciously where you can. One thoughtful reply to a critical review often impresses future buyers more than a wall of five-star praise. ## Related > **[Products](/docs/features/products)** > > Set up and polish the product pages your reviews appear on. > **[Boost your sales](/docs/tips/boost-sales)** > > More ways to turn visitors into buyers. > **[Email marketing](/docs/features/email-marketing)** > > Send the review requests that bring the reviews in. > **[Your guide to success](/docs/tips/playbook)** > > See where reviews fit in your build-market-sell journey. # Security Source: https://crevio.co/docs/features/security What the audit log records, how long it keeps events, and how to read them Security is part of the Enterprise plan. On it, admins find these settings under **Settings** → **Security**. To set up Enterprise, contact us. ## Audit log The audit log records what happens on your account: people joining and leaving, role and permission changes, API keys, connected apps, approvals, and more. You see recent events under [Activity](#activity) on the same page. Developers can read the full log through the API. * **Capture level**: **Full** (the default) also records every app and tool your assistant uses. **Governance only** records access and configuration changes, and stops recording tool use. Tool use from while it was off can't be recovered. * **Keep events for**: 30, 90, 180, 400 (the default) or 730 days. Older events are deleted once a day. Changing these settings is itself recorded. ### Activity **Activity** lists the most recent 500 events on the account, newest first. It shows changes people and your assistant make, and scheduled jobs that fail or need your input. With the capture level set to **Full**, it also lists each app and tool your assistant uses. Search the list, or filter it by resource, event, who did it, and date. Select an event with details to expand it. An approved, rejected or finished approval shows the action, the tool's approval setting at that moment, and the chat it came from. It doesn't list routine job runs that finished normally, so a quiet log doesn't mean a job didn't run. Open the job's run list to see every run. For events older than the most recent 500, use the API. # Your account & settings Source: https://crevio.co/docs/features/settings Set up your business profile, currency, support email, team, and plan — and learn what credits are and where to see your usage. **Your settings are where you set up the basics of your business — and where you keep an eye on your plan and credits.** You can change almost all of this by clicking through your dashboard, or you can just ask Crevio: "Update my support email" or "Change my currency to euros." Either way works. You'll find everything below under **Settings** in your dashboard, grouped into three sections: * **Administration** -- the business itself: your profile, team, billing, payments, invoices, notifications, and legal details. * **Features** -- the things you switch on and configure: web addresses, connected apps, skills, your AI assistant, developer access, and the [vault](/docs/features/vault) of logins, cards, and contact info Crevio uses on websites. * **Personal** -- your own account: profile, password, sign-in methods, payment methods, and address. These follow you across every business you belong to. Your account menu and notifications live in the sidebar. The account button shows your name and plan, and the menu includes **More ways to reach Crevio**, a list of the channels you can use to talk to your AI, such as Slack, Telegram, email, and phone. It also has a **Mac app** card with a download link; once you're inside the app, it shows as installed. Type in the search box at the top of the settings sidebar to filter the pages by name. Typing a section name, such as **Features**, keeps every page in that section. ## Your chats Every conversation with your assistant is saved. Open **All chats** in the sidebar to see them as a simple list, newest first, with the title on the left and when you last used it on the right. Use the search at the top to find one by title. * **Rename** -- open a chat's menu in the list and choose **Rename thread**, then type a new title right in place. * **Delete** -- choose **Delete thread** from the same menu. This permanently deletes the conversation and its history, and can't be undone. ## The Mac app Crevio has a Mac app that gives it its own window instead of a browser tab. Download it from **More ways to reach Crevio** in the account menu. * **Sign in through your browser.** The app opens your browser to sign in the normal way. Once you're signed in there, the app signs itself in, even if you close the "Open Crevio?" prompt. If it says the sign-in expired, sign in again from the app. * **Desktop notifications.** Notifications show up as native Mac notifications, and the Dock badge follows your unread count. Clicking one opens the right page, switching to the right business first if it belongs to another one. You won't get a banner for the page you're already looking at, and you won't be asked to turn on browser push notifications inside the app. If notifications for Crevio are turned off on your Mac, the app tells you and links to the setting. * **Your phone stays quiet while you work.** While you're using the Mac app, the Crevio phone app doesn't buzz for the same notifications. It starts again about a minute after you step away from your Mac or switch to another app. * **Open a page in the app.** Once you've signed in to the Mac app, the **Mac app** card in your browser shows **Open in app**, which opens the page you're on in the app. * **Updates.** The app updates itself. Choose **Crevio → Check for Updates…** to check now, and **Restart to Update** once a new version is ready. If you open the app from your Downloads folder, it offers to move itself to Applications, since it can only update from there. * **Find on a page.** Press **⌘F**. * **If the window flickers or stays blank.** Turn off **Help → Troubleshooting → Use Hardware Acceleration** and restart the app. ## Light and dark mode Open the account menu and choose **Appearance** to switch between **Light**, **Dark**, or **System**. System follows your device, so Crevio goes dark at night if your phone or computer does. The choice is remembered on that device. Each page title in your browser tab also shows the page you're on, followed by "Crevio", which makes it easier to find the right tab. ## Your business profile This is the public face of your business — what customers see on your website and in their receipts. * **Business name** — The name customers see. Pick something that represents your brand. * **Logo and photo** — Add a profile image so your site feels like yours. * **Bio** — A short description of what you do and who you help. * **Social links** — Connect your social accounts so customers can find you elsewhere. > [!TIP] > > Want a polished bio fast? Ask Crevio: "Write me a friendly two-sentence bio for my baking course business." It'll draft one you can use as-is or tweak. ## Your currency Set the currency your prices and sales show in — for example, US dollars, euros, or pounds. This is the currency customers see at checkout and the one your earnings are reported in. Choose the one that fits your business and audience. ## Your support email This is the email address customers reach you at for help — it appears on receipts and in customer messages. Use an address you actually check, or one your team monitors, so nothing slips through. Crevio can also help draft replies to the questions that land there. ## Emailing your assistant Your assistant has its own email address, shown under **Settings** > **AI Assistant** > **Email**. Email it a task and it reads the message and works on it. It only answers people you approve. Your own address always works. Everyone else needs to be on the list: * **Email Addresses** approves one person by their exact address. * **Domains** approves everyone at a domain, such as your whole team at `yourbrand.com`. You can also ask in chat: "allow emails from [partner@example.org](mailto:partner@example.org)". Your assistant shows an approval card first, and the address is only added once you approve it. This always asks. You can't set it to run without asking, because it changes who can reach your business. To approve a whole domain or remove someone, use the settings page. ### When someone who isn't approved writes in Their email is not answered. Instead they get a short reply saying this inbox only accepts approved senders and that they should ask you to add them. They get that notice at most once a day, however many times they write. The notice isn't sent when: * the email can't be confirmed as really coming from the address it claims, so people whose address was faked don't get mail they never asked for * it's automatic mail, such as a newsletter, an out-of-office reply, a bounce, or a no-reply address Once you approve someone, their next email gets an answer. Anything they sent before stays unanswered, so ask them to send it again. ## Your team You don't have to run everything alone. You can invite people to help manage your business and choose what each person can access. **1. Open your team settings** Go to **Settings** and find the team or members area. **2. Invite someone** Enter their email and send the invite. They'll get a link to join your business. **3. Choose their access** Decide what they can do — full access to help run everything, or a more limited role. You can change this anytime. > [!NOTE] > > You can remove someone or change their access whenever you need to. Your business always stays under your control. ## Custom instructions for your AI Some things you'd rather say once than repeat in every chat: how you like things written, what needs your sign-off, what you never want done. **Settings** > **AI Assistant** has a **Custom instructions** box for exactly that -- up to 4,000 characters of plain text. Your AI follows these in every chat and in every [job](/docs/features/automation). For example: * *Write in British English and never use emojis.* * *Always ask me before offering a discount over 20%.* * *Push back if an idea looks like it will hurt sales.* * *If a payment or integration stops working, tell me right away.* You don't have to open the page to add one. If you tell your assistant in chat something that sounds like a standing rule -- "from now on, never email customers on Sundays" -- it saves it here for you. Open the box any time to read, reword, or delete what's there. > [!TIP] > > Keep instructions short and specific. "Ask me before discounts over 20%" works better than "be careful with pricing." ## What your AI remembers Your AI keeps notes as it works with you, so you don't have to explain your business again in every chat. It saves something when you ask it to ("remember that our returns window is 30 days"), when you correct it, or when you mention a lasting fact about how your business runs -- a policy, a supplier, a price, a name. It keeps two kinds of notes: * **Notes about the business** are shared. Everyone on your team benefits from them, in every chat and every [job](/docs/features/automation). * **Notes about you** -- how you like to work, what you're responsible for -- are private to you. Your teammates' chats don't see them. It doesn't take notes on things Crevio already keeps track of, like your products, orders, and customers, and it never saves passwords. To have Crevio sign in to websites for you, save a login in your [vault](/docs/features/vault) instead. ### Correct something it got wrong Just tell it in chat: *"We stopped selling the starter kit in August -- forget it,"* or *"What do you remember about my shipping rates?"* It updates or deletes the note right away, and you can ask it to show you what it has. ### What your assistant remembers Open **Settings** > **Memory** to see everything your AI remembers, on one page: * **About you** is what it has noted about you personally, like how you like your answers. Only you can see it -- not your teammates, and not the admins of the business. * **Your business** is what it remembers about the business, shared with your whole team. Only admins see this part. Click a memory to read it: when it last changed, a one-line summary, and the details. To change a memory, type what should be different in the box under it -- for example *"we moved to free shipping over \$50"* -- and send. Your AI opens a chat and makes the change there, so you can see exactly what it changed. To add something new, use the box at the top of the page. You don't edit memories by hand; your AI keeps them tidy and in the right place. To bring over what another AI assistant (such as ChatGPT or Claude) knows about you, click **Start import** under **Import memory from other AI providers**. Copy the prompt into a chat with that assistant, paste its answer back, and click **Add to memory**. Your AI opens a chat and sorts each entry into your memory, skipping what it already knows and anything it shouldn't keep, such as passwords. To remove a memory, open it and click **Delete**. Your AI forgets it, along with its line in the short notes it reads at the start of every chat. A chat that's already open keeps the notes it started with, so start a new chat to be sure it works from your change. Your brand isn't a memory. It lives in your [brand kit](/docs/features/brand-kit), which you change by telling your assistant. Once a day, on days you've been busy, Crevio also tidies its notes: it merges duplicates, and where two notes disagree it keeps the newer one. It also keeps one page per topic your team keeps coming back to -- a supplier, a product line, your opening hours -- so a question about that topic has one place to be answered from. ### Start over If your AI has learned a lot that's wrong and you'd rather start fresh, an admin can go to **Settings** > **Advanced** and click **Reset** next to **AI knowledge**. This deletes everything it has noted about your business. Your site, products, and account data aren't touched. **It cannot be undone.** > [!NOTE] > > Notes and [custom instructions](#custom-instructions-for-your-ai) are different. Custom instructions are rules you write and edit yourself. Notes are what your AI picked up along the way, and it manages them for you. ## Apps connected to your account Some outside tools -- an AI assistant like Claude or Cursor, a script someone on your team wrote -- sign in to Crevio on your behalf rather than using a password. **Settings** > **Applications** lists every one of them that currently has access to your business. For each app you can see what it's allowed to do, who on your team authorized it, when they first did, and when the connection was last refreshed. Open one for the full picture, including each member's access individually. **Revoke** cuts an app off immediately -- for everyone on your team at once, and across every sign-in it holds, so it can't quietly keep working through a second connection. The app can ask for access again later; someone just has to approve it again. > [!TIP] > > Worth a glance every few months. If you don't recognize something on this list, revoke it -- nothing breaks that you can't reconnect. > [!NOTE] > > This is different from [connected apps](/docs/integrations/connected-apps), which is Crevio reaching *out* to your Gmail or Slack. This page is about tools reaching *in* to Crevio. Both are managed by account admins. ## API keys An API key lets a tool or a script you run reach your business in Crevio -- for example a Zapier step that asks your AI to write a report, or a developer's app. Keys live in **Settings** > **Developer**. Only account admins can manage them, and only on the Business plan. When you create a key you choose two things: * **Who it acts as.** A **Personal** key acts as you: it sees what you see, including your private chats. A **Team** key is for shared automations: it sees only what the whole team sees, and anything it starts is visible to the whole team. A team key cannot run scripts on your computer. * **What it can do.** Tick only what the tool needs: reading data, changing data, giving your AI work, running scripts, downloading files your AI made, reading the activity log, or using AI models in your own apps. A key that can only read cannot change anything, however it is used. Open a key's menu to **Edit** its name or what it can do (the change applies to its very next request), **Rotate** it, or **Delete** it. Rotating gives you a new key and stops the old one at the same moment, so paste the new key into every tool that used the old one straight away. You see team keys and your own personal keys. Other admins' personal keys stay private to them. Keys made before you could choose what they can do keep full access until you edit them. ## Your plan & credits This is where you see your subscription, your credit balance, and how your credits are being used. ### What are credits? **Credits are what the AI uses to do work for you.** Every time Crevio writes copy, designs an image, builds a page, answers a customer, or runs a task, it spends a small amount of credits — think of them as fuel for your AI teammate. * Bigger jobs (like building a whole website) use more credits. * Small jobs (like a quick edit) use very few. * You can always see your remaining balance, so there are no surprises. ### Where to see your usage In your plan and billing settings, you'll find: * **Your current plan** — what you're subscribed to and when it renews. * **Your credit balance** — how many credits you have left. * **Your credit history** — plan refills, top-ups, bonuses, refunds and expired credits. **Settings** → **Usage** (admins only) shows where the credits went: a daily spend chart, the chats and tasks that cost the most, and roughly when your balance runs out at the current pace. See [Credits](/docs/features/credits#seeing-where-your-credits-go). > [!TIP] > > Curious what something will take? Just ask Crevio before you commit — for example, "About how many credits would it take to redesign my website?" — and it can give you a sense of the work involved. ### Topping up your credits If you run low before your plan renews, you can buy more credits without waiting. You can also turn on **automatic top-ups**: set an amount, and Crevio refills your balance whenever it runs low, so your assistant never stops halfway through a job. > [!NOTE] > > Top-ups and automatic top-ups are available on a paid plan. On the free plan you can buy a one-time starter pack of 300 credits for \$10 once every 30 days, or choose a plan. ### Changing your plan Open **Settings** → **Billing** and choose **Change plan**. What happens depends on the direction: | You choose | What happens | | - | - | | **A higher plan** | The change applies as soon as the payment goes through. | | **A lower plan** | It waits for your next renewal. You keep your current plan and its credits until then, and nothing is refunded. | | **A lower plan during a free trial** | It applies straight away. | Until a downgrade takes effect, your billing row shows a line such as "Moves to Starter on 3 Nov", with a **Keep** link. Click it to stay on your current plan and cancel the change. Plan features switch off when the lower plan actually starts, not when you click. If your card is declined during an upgrade, your plan doesn't change and you aren't charged. Update your payment method under **More actions** on the billing row, then try again. ## Your storage Everything you upload and everything Crevio creates for you — product files, images, videos, audio — is kept in your account's storage. How much you get depends on your plan: | Your plan | Storage included | | - | - | | **Free & Starter** | 1 GB | | **Pro** | 51 GB | | **Business** | Unlimited | If an upload is refused because you're out of room, delete files you no longer need from your media library, or upgrade your plan for more space. ## Deleting a business If you're done with a business entirely, an admin can remove it under **Settings** > **Advanced**. This deletes the business and everything in it — its sites, products, orders, customers, files, and AI workspace. Your live sites go offline immediately, and the databases and storage behind them are destroyed. **It cannot be undone.** * **You have to type the business name to confirm**, so it can't happen by accident. * **If the business has a subscription or is on a trial, deleting cancels it.** You'll see this spelled out on the button before you commit. * **Other businesses you own aren't touched** — neither they nor their subscriptions are affected. > [!NOTE] > > Every business keeps at least one site, so you can't delete your last one on its own. Deleting the business is the way to remove it. > [!TIP] > > Only want to take a site offline for a while? Unpublish it instead — that keeps your data and lets you bring it back later. ## Deleting your own account Deleting your account is different from [deleting a business](#deleting-a-business). It removes you, your sign-in, and every business you own. Go to **Settings** > **Profile** (under **Personal**), find the danger zone, and click **Delete**. You have to type `DELETE` to confirm. * **You're signed out and locked out right away.** You can't sign in while the request is pending. * **Nothing is deleted for 7 days.** Crevio emails you the date it will happen. * **You can change your mind in that window.** Use the **Cancel Deletion** link in that email and your account is restored. After 7 days it can't be undone. * **Businesses you own go with it.** Businesses where you're only a team member aren't deleted. If you delete your account within an hour of signing up, you may get a short personal email from the founder about an hour later asking what you hoped Crevio would do. Reply if you like. It goes to a real inbox. If you cancel the deletion before it sends, you won't get it. ## Next steps > **[Getting started](/docs/introduction/getting-started)** > > Launch your site and first product in minutes. > **[How Crevio works](/docs/introduction/how-crevio-works)** > > The simple pieces of your business, explained. > **[Connect Stripe](/docs/integrations/stripe)** > > Set up payments so you can get paid. > **[Common questions](/docs/introduction/faq)** > > Answers about the AI, payments, and credits. # Your AI website & apps Source: https://crevio.co/docs/features/sites Describe your business in plain words and Crevio builds you a complete website -- or a fully working web app -- then changes it whenever you ask. This is the heart of Crevio. You describe what you want, and Crevio's AI builds it for you -- the design, the pages, the words, the layout, all of it. You do not write a single line of anything technical. You just talk to Crevio like you would a designer who never sleeps. And it is not only marketing websites. Crevio can build you a fully functional **web app** too -- a booking tool, a client portal, a members area, a directory, a calculator, an interactive dashboard, whatever your business needs. Same approach: describe it, and Crevio builds the real, working thing. If you have ever felt stuck staring at a blank page or a complicated website builder, this is for you. There are no templates to wrestle with and no settings to figure out. You say what you want, and Crevio makes it. ## Why you'd use this * **You want a real website or app fast.** Describe it once and it is built, usually within minutes. * **You are not technical.** You never have to touch design tools, code, or hosting. Crevio handles every part. * **You want it to keep up with you.** As your business changes, you just ask Crevio to update the site -- no redoing it from scratch. > [!NOTE] > > The golden rule of Crevio: when in doubt, just ask. If you can describe it in a sentence, Crevio can usually build it. ## Start your website by describing it **1. Tell Crevio what you're selling** Open Crevio and describe your business in your own words. The more you share, the better the result -- but a single sentence is enough to begin. For example: *"I'm a personal trainer. I want a warm, friendly site with my coaching packages, an about page, and a place for people to join my mailing list."* **2. Add the look and feel you want** Mention your style if you have one in mind -- "bold and modern", "calm and minimal", "playful with bright colors". If you are not sure, leave it out and Crevio will choose something that fits your business. **3. Let Crevio build it** Crevio gets to work and assembles your full website or app -- pages, design, and sample content. You can watch the progress as it goes. **4. Look it over** When it is ready, Crevio shows you a preview of your new site. Click around and see how it feels. Nothing is final -- everything can be changed. Your preview has its own link that stays the same, so you can open it on your phone or send it to a teammate. Preview links are only for your own team: whoever opens one is asked to sign in, and only people who belong to your business can see it. Unfinished work stays private, whatever access you've set for your live site. If your site has been idle for a few minutes, the first visit shows a short "Starting preview" page while it wakes up, then loads your site. Links you've already shared keep working. > [!TIP] > > Not happy with the first version? That is completely normal and totally fine. Just tell Crevio what you would like different. The first build is a starting point, not the finish line. ## Ask Crevio to change anything Once your site exists, improving it is just a conversation. You do not hunt through menus -- you describe what you want and Crevio makes the change. Things you can simply ask for: * *"Make it bolder and more colorful."* * *"Add a pricing section with three plans."* * *"Move the sign-up form higher up the page."* * *"Write a friendlier welcome message at the top."* * *"Add a frequently asked questions section."* * *"Use a softer, more elegant style throughout."* Crevio makes the change and shows you the result. If it is not quite right, ask again. You can go back and forth as many times as you like. > [!TIP] > > Be as specific or as loose as you want. "Make it feel more premium" works just as well as "change the buttons to dark green." Crevio fills in the details. ## Choose who can see your site You decide who is allowed to view your website. This is handy whether you are still polishing it or want to keep certain pages for paying members only. | Who can see it | When to use it | | - | - | | **Public — anyone** | Your site is open to the world. This is the normal choice for a live business. | | **Customers** | Your customers sign in with the email they bought with, and your team can view it too. Good for a members-only area or a private community. | | **Account members** | Anyone on your team, whatever their role. Everyone else is asked to sign in. | | **Specific people** | Only the teammates and [groups](/docs/features/team) you pick, plus your admins and the person who created the site. Good for an internal tool only some of your team should use. | | **Admins only** | Just you and your admins. Perfect while you are still building and not ready to share. | | **Only me** | A completely private preview that no one else can reach. | You can change this at any time. A common path is to keep it admins-only while you set things up, then open it to everyone when you are ready to launch. > [!NOTE] > > **Customers** and **Account members** are not the same thing. Customers are the people who bought from you; account members are the people who help you run the business. Pick **Customers** for a members area your buyers log into. ### Keep a site out of search engines Under **Visibility**, turn off **Show in search engines** to ask Google and other search engines not to list your site. Visitors can still open it from a link. This only matters for a public site: sites that need a sign-in are never listed anyway. Someone signed in to a members area can sign out again from the site itself — the sign-out link ends the session on that site only, and never signs them out of anything else. ### How Crevio checks your members area When Crevio builds or changes pages only signed-in customers can see, it tests them as a customer would. Each site gets its own **test member** for this: a customer named "Test member" with an address ending in `@test-member.invalid`. You'll see it in your customer list. No email ever reaches it, and it never pays for anything. Sites limited to your team don't use one, since customers can't sign in to them. ## Find a site in your list On the **Sites** screen you can search by name or address, filter by who created a site and by whether it's live, sleeping or not published yet, and sort by most recently published, name, or age. To keep a site at the top for your whole team, open its menu and choose **Pin to top**. ## See your site's data The **Database** tab in your site's settings shows the tables your site stores its data in, like sign-ups, bookings or orders, and the rows inside each one. Switch between the live site and the development copy Crevio builds against. Nothing here changes your data; to change it, ask Crevio. When something on your site breaks, ask Crevio to check your site's logs. ## Use your connected apps on your site Your site can show live data from the apps you connected to Crevio, like a list of your latest HubSpot deals, upcoming calendar events or rows from your own API. Ask for it: *"show our five newest Notion projects on the homepage."* * **Only team connections.** A site can use the connections your whole team shares. Someone's personal connection, or one you limited to specific people, stays off limits. To use one, connect it again as a team connection under **Customize → Connectors**. * **The same rules as chats.** Reading data happens right away. An action you set to ask for approval first, like sending an email, waits until someone on your team approves it in Crevio. ## Bring an older site up to the latest version Sites built a while ago keep running the design foundation they started with, so they miss newer built-in features (like the members area and sign-in). Ask Crevio: *"update my site to the latest version."* Crevio first saves a backup of your site, then moves your pages, words and design onto the newest foundation and checks everything on the preview. Your live site is not touched until you say to publish. If anything doesn't work, Crevio puts your site back exactly as it was and tells you. ## Connect your own web address Every Crevio site comes with its own free web address right away, so it works the moment it is built. When you are ready to look more professional, you can connect your own custom web address -- like `yourbrand.com` -- instead. You can buy a brand-new web address inside Crevio or connect one you already own. Crevio walks you through it and confirms when everything is live. > **[Set up your own web address](/docs/features/domains)** > > See the full, plain-language guide to buying or connecting a custom web address. ## See how your site is doing Crevio shows you visitor stats so you can tell what is working. At a glance you can see how many people are visiting, which pages they look at most, and where they are coming from. You do not need to set anything up -- the stats are simply there. > [!TIP] > > You can ask Crevio about your numbers too: *"How many people visited my site this week?"* or *"Which page is most popular?"* ## How many websites you can have Every plan includes one website. Running several side by side -- a second brand, a separate project, a client site -- is part of the Business plan: | Your plan | Websites | | - | - | | **Free, Starter & Pro** | 1 | | **Business** | Unlimited | Once you're at your limit, the **Create site** button is grayed out with a note explaining you've reached your plan's limit and pointing you to Business for unlimited sites. Upgrading lifts the limit immediately -- no need to delete your existing site first. ## Crevio publishes it for you When you are happy with your site, Crevio publishes it and keeps it online for you. There is no separate hosting to buy, no buttons to wire up, and nothing technical to manage. Your site stays up and running, and every time you ask for a change, Crevio updates the live version for you. A site only goes live when you or Crevio publishes it on purpose. If you tell Crevio "don't publish yet" -- in a chat or in a scheduled job -- it stays a draft until you say otherwise. ### Free sites go offline after 30 quiet days On the free plan, Crevio takes your site offline when all of these have been true for 30 days: * Nobody on your account has messaged Crevio or opened Crevio. * Your site has not been published. * Your site does not use your own web address. Visitors then see a "Coming soon" page instead. Nothing is deleted: your site's design, content, products and orders all stay in your account. Your site comes back on its own as soon as you send Crevio a message or subscribe to a plan. Crevio publishes the same version that was live before, which takes a few minutes. If you only open Crevio without sending a message, your site comes back within a day. Sites on a paid plan, and sites using your own web address, are never taken offline this way. > [!NOTE] > > You are never locked into a final version. Your website grows and changes alongside your business -- just keep asking Crevio. ## If something goes wrong > **The site doesn't look the way I imagined** > > Tell Crevio what feels off in plain words -- "this section is too crowded" or "I wanted warmer colors." Crevio will adjust it. The more detail you give about what you do and do not like, the closer the next version gets. > **A change didn't come out right** > > Just ask Crevio to undo it or try a different approach. For example: *"That is not what I meant -- go back to how it was and instead make the heading larger."* > **Something I published broke my live site** > > You can go back to an earlier version. Ask Crevio: *"Roll my site back to the version before this morning's update."* It puts the previous published version live again, and you can then work out the change properly without visitors seeing a broken site in the meantime. > **My site isn't showing up at my own web address yet** > > When you connect a custom web address, it can take a little while to become active across the internet. This is normal. See the [web address guide](/docs/features/domains) for what to expect, and Crevio will confirm once it is live. > **I'm not sure how to describe what I want** > > Start with the basics: what you sell, who it is for, and the feeling you want visitors to have. You can also ask Crevio for ideas -- *"What kind of homepage would suit a yoga studio?"* -- and build from there. > **I can't create a second website** > > Your plan includes one website. To run more than one -- a second brand, a separate project, a client site -- upgrade to the Business plan, which allows unlimited websites. See [how many websites you can have](#how-many-websites-you-can-have). ## Related > **[Your own web address](/docs/features/domains)** > > Buy a new web address or connect one you already own. > **[Products](/docs/features/products)** > > Add the things you sell so they appear on your site. > **[Terms, privacy & refund policies](/docs/features/legal-pages)** > > Let Crevio write the legal pages your site needs. # Teach Crevio new skills Source: https://crevio.co/docs/features/skills Install ready-made skills, record yourself doing a task so Crevio can repeat it, and see everything your assistant has learned about your business. **Crevio can learn.** Out of the box it knows how to run a business. What it doesn't know is how *your* business does things -- the way you word a refund, the checklist you run before a launch, the report your accountant wants on the first of the month. You teach it once, and it knows from then on. Those are **skills**, and you'll find them under **Customize** > **Skills** in the sidebar. ## Why you'd use it * **You repeat the same task.** Teach it once instead of explaining it every time. * **You have a way you like things done.** A skill captures the steps *and* your preferences, not just the outcome. * **You want to stop supervising.** A task Crevio knows how to do is a task you can hand over completely. ## Three ways Crevio picks up a skill ### Install a ready-made one The **Discover** view under **Customize** > **Skills** has a library of skills you can install with one click -- researching competitors, writing SEO copy, auditing ads, and more. Browse by category, search, or click **Install**, and your assistant can use it immediately. Switch to **Installed** to see what you already have, and uninstall any time; nothing else changes. Email and content skills sit under the **Marketing** category, so there's one place to look for anything that helps you reach customers. When the library has a newer version of a skill you installed, an **Update** button appears on its card under **Installed** and on its page. Click it to move to the latest version. ### Show it, don't tell it This is the fastest way to teach something fiddly. Crevio has its own computer with a screen, and you can record yourself using it. **1. Open the menu in the chat box** In any chat, open the menu next to the message box and choose **Teach a task**. **2. Start recording** Click **Start recording**. Crevio's screen appears and it starts watching. Now do the task the way you'd normally do it. **3. Stop when you're done** Stop the recording. Crevio watches it back, works out the steps, and writes them up as a skill -- narrating what it's learning as it goes. **4. Check what it learned** It'll tell you what it took away. If a step is wrong or you left something out, just say so in the chat and it'll correct the skill. > [!NOTE] > > A recording can run up to 30 minutes. If a task is longer than that, teach it in pieces -- one skill per stage works better anyway. ### Just tell it You don't always need a recording. Say *"from now on, when someone asks for a refund, check the order date first and reply with the template I use"* and Crevio writes itself a skill from that. Anything it works out on its own while doing a job can become one too. Skills your assistant wrote for itself show up on the **Skills** tab under **Learned by your AI**, so you can always see what it thinks it knows. Remove any you don't want it using. Once a night, the built-in **Skill Refining** task tidies skills that are new or have grown a lot: a clearer description so Crevio picks the right one, and a tighter write-up, without dropping anything they know. It only runs when a skill needs it. ## Upload your own If you already have a process written down, you can upload it from the **Add** button on the **Skills** tab rather than retyping it into chat. Upload a `.zip`, a folder, or a single `SKILL.md` file. The **Add** menu also has an **Add with AI** option that starts a chat where Crevio asks what the skill should do and writes it for you. ## Call a skill by name To have Crevio use a particular skill right now, type `/` in the chat box. A list of your skills appears: your installed ones, the ones Crevio learned, and some of the skills that come with it. Pick one and it goes into your message, and Crevio follows that skill for this message. It works in Slack, Discord and Teams too: write the skill's name with a slash in front, like `/seo-audit check my homepage`. In Slack, put something before the slash (for example, mention Crevio first), because Slack treats a message that starts with `/` as one of its own commands. ## Manage skills from the chat You don't have to open the **Skills** tab. Ask Crevio in any chat: * *"Is there a skill for tracking my competitors? Install the best one."* It searches the library, installs the best match, and tells you if it needs an app connected. If the library has nothing fitting, it says so before writing a skill of its own. * *"Remove the SEO audit skill."* It uninstalls the skill you installed. The skills that come with Crevio can't be removed, and it will tell you when you've asked for one of those. * *"Are my skills up to date?"* It checks each installed skill against the library's latest version and updates the ones that are behind. * *"Add this as a skill:"* followed by a skill you wrote. It saves your skill exactly as you wrote it, and suggests any improvements separately. Skills you upload are private to your business. You can't publish your own skill to the library for other businesses; to share one, send the skill file and they can upload it themselves. ## Use your skills from other AI apps If you've connected Crevio to another AI app such as Claude, the skills you've installed or uploaded come along. That app can read them, so your way of doing things follows you outside Crevio. ## See what your assistant is working with Crevio keeps its skills, notes, and working files on its own computer, and you can look through them. It's read-only -- you're seeing what your assistant sees, with files opened and formatted so they're actually readable. > [!TIP] > > Not sure whether it picked something up? Just ask: *"what do you know about how I handle refunds?"* It'll tell you, and you can correct it on the spot. ## If something goes wrong > **Crevio isn't using a skill I taught it** > > Check it's still listed under **Customize** > **Skills** > **Installed**. If it's there, the skill may not describe clearly enough *when* to use it -- tell Crevio the situation it should fire in: *"use the launch checklist skill whenever I say I'm launching something."* > **It learned the task slightly wrong** > > Say what's off in the chat -- *"you skipped the part where I check stock first"* -- and it updates the skill. You don't have to record it again. > **The recording wouldn't start** > > Crevio's computer needs to be awake before it can be recorded. Send it a message first, wait for a reply, and try again. > **I can't see the Skills tab** > > Skills are managed by account admins. If you've been invited to someone's business with limited access, ask an admin to make the change. ## Related > **[Put your business on autopilot](/docs/features/automation)** > > Turn a skill into a job that runs on a schedule. > **[Connect your apps](/docs/integrations/connected-apps)** > > Give your assistant the tools a skill needs. > **[Create with AI](/docs/features/creating-with-ai)** > > Images, video, audio, and research. > **[Your account & settings](/docs/features/settings)** > > Who can manage skills and everything else. # Social media posting Source: https://crevio.co/docs/features/social Connect your social accounts, post to all of them at once, reply to comments, and let Crevio write and schedule a whole week of posts for you. Showing up consistently on social media grows your audience and your sales -- but doing it by hand, every day, across every platform, is exhausting. Crevio takes that off your plate. Connect your accounts once, then write, schedule, and publish to several platforms at the same time. Or simply ask Crevio to plan and write your posts for you. ## Connect your accounts Crevio works with the platforms you already use: * Instagram * TikTok * X (Twitter) * LinkedIn * Facebook * YouTube * Pinterest * Threads * Reddit * Bluesky **1. Open Social** In your dashboard, go to **Social** and choose to connect an account. **2. Sign in to each platform** Pick a platform and sign in. You'll approve Crevio to post on your behalf. Repeat for each account you want to connect. **3. You're ready to post** Once connected, your accounts appear whenever you create a post. > [!TIP] > > Instagram's own sign-in screen doesn't work for every professional account. If it shows an error, choose **Connect through Facebook instead** on the Instagram tile -- it connects the Facebook Page linked to your Instagram account, which works even when Instagram's own screen won't. ### How many accounts you can connect Social posting is part of a paid plan, and each plan includes a number of connected accounts: | Your plan | Connected social accounts | | - | - | | **Free** | Not included -- upgrade to connect your accounts | | **Starter** | 2 | | **Pro** | 5 | | **Business** | Unlimited | If you reach your limit, Crevio tells you when you try to connect another one. You can either disconnect an account you no longer post to, or upgrade your plan for more. > [!NOTE] > > This counts the accounts you have **connected**, not how much you post. You can disconnect an account at any time to free up a slot. ## Post to several platforms at once Write your post once, choose which accounts it goes to, and Crevio publishes it everywhere you picked -- no copying and pasting between apps. **1. Start a new post** In **Social**, create a new post. Add your words and any photos or videos. **2. Pick your platforms** Choose which connected accounts should receive it. You can tweak the wording per platform if you like. **3. Publish now or schedule** Post it straight away, or set a date and time for it to go out later. > [!TIP] > > Ask Crevio to write your posts. Try "write a week of posts about my new course and schedule one each morning." Crevio drafts every post and lines them up on your calendar -- you just review and approve. Crevio can draft posts on its own, but it asks for your approval before it publishes or schedules one. To let it post without asking, choose **Always allow** on an approval card or in **Customize** > **Connectors**. ## See everything on your calendar **Socials** in the sidebar shows every post you've scheduled or published on a calendar. Switch between **Month**, **Week**, **Day**, and **List** views, step forward and back with the arrows, and jump to **Today** at any time. Click a post to see its status -- **Scheduled**, **Publishing**, **Posted**, **Failed**, or **Disconnected** (the account it was meant for has been disconnected) -- and choose **Change with AI** to tell Crevio what to adjust. The **List** view shows what's coming up, in the order it goes out. Drafts aren't on the calendar until they're scheduled. > [!TIP] > > Nothing scheduled yet? Click **Schedule with AI** and tell Crevio what to share. It writes the post, picks a good time, and schedules it to your channels. **New post** does the same any time. ## Reply to and manage comments Crevio brings your comments into one place so you can keep the conversation going without living in every app. Reply yourself, or let Crevio handle the replies for you. **1. Open your comments** In **Social**, view the comments coming in on your posts. **2. Reply, or let Crevio handle it** Type a reply, or ask Crevio to respond on your behalf -- great for answering common questions and keeping fans engaged. > [!TIP] > > Tell Crevio "reply warmly to comments asking where to buy and send them the link" and it can keep up with replies while you focus on your business. ## Extra tools for X (Twitter) Beyond posting and replies, Crevio can search, look up, and engage on X directly on your connected account. > [!TIP] > > Ask Crevio things like "search X for people asking about pricing," "follow @handle," "bookmark this post," or "retweet this" -- Crevio handles the rest on your connected X account. When a search turns up a post with a photo or video, Crevio can look at it directly -- ask it to describe the chart in a post or check what's in an image before you reply. ### Ask Crevio from X Once your X account is connected, you can give Crevio a job without opening Crevio at all. Post from your connected account and **start the post with @crevioapp**: > @crevioapp turn this thread into a landing page for my course Crevio picks it up within a minute or so and works on it in a new chat in your account. If your post replies to or quotes someone else's post, Crevio reads that post too, so "@crevioapp is this true?" under a claim works the way you'd expect. When it's finished, @crevioapp replies under your post: * **When the answer is fine to say in public** -- an explanation, an idea, a fact check -- the reply is the answer itself. * **When it isn't** -- anything about your customers, orders, sales, or plans -- the reply only says it's done ("done! Everything's waiting for you in Crevio") and the details stay in the chat. * **When something needs your OK**, the reply says so. Anything that would change your business waits for you to approve it in Crevio. > [!NOTE] > > Only posts that **begin** with @crevioapp count. Mentioning @crevioapp in the middle of a post, or replying in a thread @crevioapp is already in, doesn't start a job. You can send up to 10 requests an hour, and they use credits like any other chat. The chat these requests start in is yours alone -- teammates don't see it in their chat list. Each X conversation keeps its own chat, so a follow-up in the same thread carries on where the last request left off. ### Let Crevio answer your own mentions Crevio can also keep an eye on posts that mention **your** X account and reply where a reply helps -- a product question, a "where can I buy this?", a fact someone got wrong about you. Praise, jokes, and noise usually get no reply, and that's on purpose: a public reply is permanent, so silence is always an acceptable answer. To set it up, open **Scheduled** in the sidebar, click the arrow next to **Create**, choose **Start from a template**, and pick **X brand presence**. Or just tell Crevio in chat: "watch my X mentions and reply where it helps." How it behaves: * **Replies wait for your OK at first.** The job starts on **ask me first**, so you approve each reply before it goes out. Switch it to **do it automatically** once you trust it. See [how much freedom Crevio has](/docs/features/automation#choose-how-much-freedom-crevio-has). * **New posts stay drafts.** If Crevio thinks something deserves its own post rather than a reply, it saves a draft for you to review -- even when the job runs automatically. * **Some things come to you instead.** Refunds, questions about one person's order or account, complaints that need a decision, and legal, security, or press questions are never answered in public. Crevio lists them in its report so you can handle them. * **You set the rules.** Crevio follows a reply policy it keeps in its memory: what to answer, what to skip, and how you sound. Tell it "never reply to competitors" or "keep replies under one sentence" and it updates the policy for next time. > [!NOTE] > > Crevio checks for new mentions every few minutes. Each check that finds new mentions uses a few credits, because X charges for reading them. Checks that find nothing are free. ## Work with creators and influencers Ask "find 10 micro influencers for my candle brand and what to pay them". Crevio looks at public profiles and posts, works out each creator's engagement from their recent posts, and gives you a short list with how to contact them. Rates are a range based on typical market prices, not a quote, so treat them as a starting point to negotiate from. A creator with no public contact is marked "DM only" rather than guessed. Crevio can also write the one-page brief (including the paid-partnership label) and a short first message, and keep one list of who you have contacted so nobody is approached twice. It never sends anything to a creator without your approval. If you ask for a spreadsheet, it makes a new sheet and never edits one you already have. ## LinkedIn outreach Crevio can post to LinkedIn, but it can't send LinkedIn messages, connection requests or InMail. If you ask it to message people there, it tells you so and writes everything for you to send yourself: a few days of warm-up, the connection note, the first message and two follow-ups for each person, with a link to their profile. For an automatic first message, Crevio writes the outreach as an email instead. ## See how your posts perform Crevio shows you how your posts are doing -- views, likes, comments, and more -- so you can see what your audience loves and do more of it. You can even ask Crevio "what worked best last month?" for a plain-language summary. ## If something goes wrong > **A post didn't publish to one platform** > > Each platform has its own rules (for example, some need a video instead of a photo, or have length limits). Crevio will tell you if a post couldn't go out and why. Adjust it and try again. > **A post has said 'Publishing' for a while** > > Posts with several photos or a video -- like an Instagram carousel -- can take up to a couple of minutes to fully go live once you hit publish. That's normal; give it a moment rather than assuming it's stuck or resending it. Crevio only marks a post **Failed** if the platform actually rejects it. > **Crevio says I've reached my account limit** > > Each plan includes a set number of connected social accounts. Disconnect one you're no longer posting to, or upgrade your plan to connect more. See [how many accounts you can connect](#how-many-accounts-you-can-connect). > **My account got disconnected** > > Social platforms sometimes log you out for security, usually because the login expired. Crevio keeps the account in your list and marks it as needing attention instead of removing it. Open the platform in **Social**, then click **Reconnect** and sign in again (for an ad account, re-enter its API key). Posting starts working again as soon as you've reconnected, and reconnecting doesn't use up an extra slot on your plan. > **Instagram's connect screen shows an error** > > Some professional accounts can't get past Instagram's own sign-in screen. On the Instagram tile, choose **Connect through Facebook instead** -- it authorizes the Facebook Page linked to your Instagram account, which works even when Instagram's own dialog won't. > **I can't see comments on my TikTok posts** > > If you connected your TikTok account a while ago, it may be on an older connection type that TikTok no longer allows Crevio to read comments through. Go to **Social**, reconnect your TikTok account, and comments will start coming in again. > **My scheduled post didn't go out** > > Check that the account is still connected and that the post wasn't saved as a draft. Reconnect if needed and reschedule. > **I posted to @crevioapp and nothing happened** > > Check that the post **starts** with @crevioapp and that you posted it from the X account connected to Crevio -- posts from any other account are ignored. If you've sent more than 10 requests in the last hour, wait a little and post again. > **I want Crevio to stop replying to comments** > > You're always in control. Turn off automatic replies and handle comments yourself whenever you prefer. ## Related > **[Run ads](/docs/features/ads)** > > Turn a great post into a paid campaign. > **[Email your customers](/docs/features/email-marketing)** > > Reach your customers in their inbox. > **[Customers](/docs/features/customers)** > > See who's following and buying from you. > **[Tags & segments](/docs/features/tags)** > > Group your customers for better targeting. # Subscriptions & recurring payments Source: https://crevio.co/docs/features/subscriptions Charge customers on a repeating schedule, offer free trials and payment plans, and pause, resume, or cancel a subscription whenever you need to. Subscriptions let you charge a customer on a repeating schedule -- weekly, monthly, or yearly -- instead of just once. They are perfect for memberships, ongoing access to a course or community, software, or anything you want to bill again and again without chasing each payment. Once a customer subscribes, Crevio handles the rest. It charges their card automatically on each renewal date, keeps their access active, and sends them a receipt every time. Each paid renewal also shows up in **Orders** as its own order, marked **Renewal**, so it counts in your revenue. See [Renewal orders](/docs/features/orders#renewal-orders). ## Why use subscriptions * **Predictable income.** You know roughly what's coming in each month instead of starting from zero. * **Less manual work.** Crevio bills every renewal for you, on time, every time. * **Sticky customers.** People who subscribe stay longer and are worth more over time. > [!TIP] > > Not sure what to charge or how often? Just ask Crevio. Describe what you're selling -- "a monthly membership to my fitness community" -- and it will help you set up the right recurring price. ## Set up a recurring price You turn any product into a subscription by giving it a recurring price. **1. Open your product** Go to **Products** in your dashboard and open the product you want to sell as a subscription (or create a new one). **2. Add a recurring price** Add a price and choose **Subscription** as the billing type. Then pick how often the customer is charged -- for example, every month or every year. **3. Offer more than one option (optional)** You can add a few prices to the same product -- say, a monthly plan and a cheaper yearly plan -- and let customers pick the one that suits them. **4. Publish** Set your product to **Active**. It's now live and ready for customers to subscribe. ## Free trials A free trial lets someone try what you offer before any money changes hands. You choose how many days the trial lasts. When the trial ends, Crevio automatically charges the customer and keeps their access going -- unless they cancel first. Trials are a great way to lower the barrier to signing up. People are far more likely to start when there's no immediate charge. > [!TIP] > > Ask Crevio to write a friendly reminder email that goes out a day or two before a trial ends. It softens the first charge and reduces cancellations. ## Payment plans A payment plan lets a customer pay for something in a fixed number of instalments instead of all at once -- for example, a $300 course split into three monthly payments of $100. Unlike a subscription, a payment plan ends on its own once the full amount is paid. This is a great way to make a higher-priced offer feel more affordable without lowering your total price. ## Managing a customer's subscription You can step in and adjust any customer's subscription at any time. **1. Find the customer** Go to **Customers** (or **Orders**) and open the person whose subscription you want to manage. **2. Open their subscription** Select the active subscription to see its status, renewal date, and price. **3. Pause, resume, or cancel** * **Pause** holds the subscription so the customer is not charged for now. You can resume it later. * **Resume** restarts a paused subscription and billing continues as normal. * **Cancel** ends the subscription. The customer keeps access until the end of the period they've already paid for, then it stops. > [!NOTE] > > Cancelling a subscription does not automatically refund past payments. If you also want to give money back, see [Refunds](/docs/features/refunds). ### Give an existing subscriber a discount Want to keep a subscriber who's about to cancel, or thank a loyal one? You can add a discount to a subscription that's already running -- the customer doesn't have to check out again. **1. Open the order** In **Orders**, open the order for the subscription. The **Subscription** card shows its current discount, if any. **2. Apply a discount** Click **Apply discount** and pick one of your active [discounts](/docs/features/discounts). If you don't have one yet, create it first under **Products** > **Discounts**. The discount starts with the **next invoice**. Nothing is charged or refunded right away, and the rest of the subscription stays the same. A subscription can have one discount at a time: **Change discount** swaps it for another, and **Remove** goes back to the full price from the next invoice. > [!NOTE] > > Payment plans have a fixed total, so they can't be discounted this way. ## Keep subscribers who want to cancel When a subscriber clicks **Cancel subscription** on their billing page, you can show them a few things before the cancellation goes through: a personal message, the option to pause instead, a discount to stay, and a short question about why they're leaving. You choose which of these they see. **1. Open the cancellation settings** Go to **Settings** > **Advanced** and find **Cancellation flow**. It shows once you've connected your payment account. **2. Turn on the steps you want** * **Personal message.** Shown first, exactly as you write it. Leave it empty to skip it. * **Offer a pause.** Lets the subscriber pause billing instead of leaving. Pick the longest pause you allow, from 1 to 12 billing periods. On a monthly plan, 3 billing periods is 3 months; on a yearly plan it's 3 years. * **Offer a discount.** Pick one of your active [discounts](/docs/features/discounts). Each customer is offered it only once, ever. * **Ask for a reason.** On by default. Tick the reasons you want to offer. Subscribers pick one and can add a note. The steps always come in this order: message, pause, discount, reason, then a final **Cancel subscription** button. Steps you turn off are skipped. With everything off, the subscriber just confirms. ### What each offer does * **Pause.** The subscriber picks how long, up to your limit. The pause starts when their current paid period ends. They aren't charged while it lasts, their subscription stays active so they keep access, and billing starts again on its own when the pause ends. They can also restart billing early from their billing page with **Resume billing**. * **Discount.** If they claim it, the discount applies from their next payment, the same as when you [give a subscriber a discount](#give-an-existing-subscriber-a-discount) yourself. Nothing is charged or refunded right away. A subscriber who sees the discount and carries on to cancel has used up their offer too, so they won't see it again if they come back and cancel later. If they pause first, they never reached the discount, so it can still be offered next time. The discount isn't offered when: * the subscription already has a discount (so a better one is never replaced), * the discount is inactive, hasn't started, or has expired, * the discount is limited to products that don't include this subscription, or it's a fixed amount in a different currency. ### See why people cancel * **On the order.** Open the subscription's order in **Orders**. The **Subscription** card shows the reason and any note the customer left the last time they cancelled. * **The cancellation report.** Under **Settings** > **Advanced**, **Cancellation report** counts how many subscribers paused instead, took the discount, or cancelled, ranks the reasons they gave, and lists the 10 most recent notes. > [!NOTE] > > Only cancellations from the billing page are counted. Subscriptions you cancel yourself, or that end on their own, don't appear in the report. Test purchases go through the same steps without charging anyone, so you can try the flow yourself. ## What the customer sees Subscribers get an email receipt after every successful charge. They can also manage their own subscription from a hosted billing page -- cancel or renew, update their card, edit their billing address, and download past invoices -- without needing to email you. They get there through the **Billing** link in their account on your site, and sign in with a one-time emailed link, no password required. > [!NOTE] > > Payment plans don't show a cancel option on the billing page -- they end on their own after the final instalment. You can share our plain-language guides with them: * [How to manage or cancel your subscription](/docs/customers/manage-subscription) * [How to update your payment method](/docs/customers/update-payment-method) ## When a renewal payment fails If a subscription or payment plan renewal can't be charged, Crevio emails the customer once with the amount due and an **Update payment method** button. The button opens their billing page, where they can put in a new card. The email comes from your business name, and replies go to your support email. The link in the email works for 3 days. After that, the same email has a link where the customer can ask for a fresh one. The email is not sent: * for test purchases, * while your Crevio account is not active, * to an address that bounced or marked one of your emails as spam (you can see these in the **Suppressions** tab under **Email**), * if you turned it off. One email goes out per failed payment. When Stripe retries that same payment and it fails again, the customer doesn't get another email. If a later renewal fails, that's a new email, even while the subscription is still behind on an earlier one. A customer who unsubscribed from your marketing emails, or whom you added to the suppression list yourself, still gets this one, because it is about a payment they owe, not marketing. To turn it off, go to **Settings** > **Notifications** and switch off **Failed Renewal Payments** under **Customer**. ### Access when the customer pays up While a renewal is behind, the customer's access to what they subscribed to is paused. When a later attempt goes through and the subscription is active again, their access comes back on its own. You don't need to re-grant anything. > [!NOTE] > > Stripe can also email your customers about failed payments if that's turned on in your Stripe account's settings. Crevio can't see that setting, so if both are on, your customer gets two emails for the same failed payment. Turn off one of them. ## If something goes wrong * **A renewal payment failed.** This usually means the customer's card expired or had insufficient funds. Stripe retries the charge on the schedule set in your Stripe account, and Crevio emails the customer a link to [update their payment method](/docs/customers/update-payment-method) (see [When a renewal payment fails](#when-a-renewal-payment-fails)). * **A customer says they were charged after cancelling.** Check the subscription's status and renewal date. A cancelled subscription stops at the end of the paid period -- the last charge may have happened just before they cancelled. If it looks wrong, you can issue a [refund](/docs/features/refunds). * **You don't see a recurring option.** Make sure you connected your payment account first. See [Getting started](/docs/introduction/getting-started). ## Related > **[Pricing](/docs/features/pricing)** > > Explore every pricing option, including trials, instalments, and pay-what-you-want. > **[Refunds](/docs/features/refunds)** > > Give a customer their money back, in full or in part. > **[Getting your money (payouts)](/docs/features/payouts)** > > See how and when subscription income reaches your bank. > **[Manage a subscription (for customers)](/docs/customers/manage-subscription)** > > A guide you can forward straight to your subscribers. # Tags & segments Source: https://crevio.co/docs/features/tags Organize your customers into groups -- paying, free, leads, and your own labels -- so you can target the right people with emails and ads. As your customer list grows, "everyone" stops being a useful group. The people who already bought from you need different messages than the people who just signed up. Tags and segments let you sort your customere so you can reach the right people with the right thing. Think of a tag as a sticky label you put on a customer. A segment is simply a group of people who share something -- a tag, or how far along they are with you. ## The groups Crevio creates for you Crevio automatically sorts everyone on your customer list into one of three groups, and keeps them up to date as people take action: | Group | Who they are | | - | - | | **Leads** | People who gave you their email (through a form or a free sign-up) but haven't created an account or bought anything yet. | | **Free** | People who signed up but haven't made a paid purchase. | | **Paying** | People who have bought at least one paid product. | > [!NOTE] > > These update on their own. When a lead signs up they become free, and when a free member makes their first paid purchase they become paying. You never have to move people around by hand. ## Your own tags On top of the automatic groups, you can create your own tags for anything that matters to you -- the product someone bought, a giveaway they entered, an interest they have, or where they came from. **1. Open Customers** In your dashboard, go to **Customers**. **2. Add a tag to someone** Open a customer and add one or more tags. Type a new tag name to create it, or pick an existing one. **3. Tag people automatically** Set up a [form](/docs/features/forms) to tag everyone who signs up through it -- so your customer list stays organized without any extra work. > [!TIP] > > Ask Crevio to help. Try "tag everyone who bought my photography course as 'photo students'" and it can group them for you. > [!NOTE] > > Tag names are unique. If you create a tag with a name that already exists, Crevio reuses the existing one instead of making a duplicate. ## Use groups to target your emails and ads This is where tags and segments pay off. Instead of sending everything to everyone, you can speak to exactly the right group: * **Email** -- Send a thank-you offer to only your paying customers, or a welcome nudge to your leads. Learn more in [Email your customers](/docs/features/email-marketing). * **Ads** -- Build an ad audience from a group of customers to reach more people like them. Learn more in [Run ads](/docs/features/ads). * **Phone calls** -- Follow up with a specific group, like leads from a recent giveaway. See [AI phone calls](/docs/features/calls). > [!TIP] > > The more thoughtfully you tag people, the more personal your messages can be -- and personal messages get far better results. ## If something goes wrong > **Someone is in the wrong group** > > The automatic groups (lead, free, paying) update based on what people do, so they correct themselves over time. If a paying customer still shows as free, check that their purchase completed successfully. > **I have duplicate-looking tags** > > Tags are matched by name, so "VIP" and "vip" may look similar but count as different tags. Keep your naming consistent to avoid confusion. > **My tag isn't applying to new sign-ups** > > Check the form's settings to confirm the tag is selected. Tags only apply to people who sign up after you add the tag to the form. ## Related > **[Customers](/docs/features/customers)** > > See and manage everyone on your customer list. > **[Forms & lead capture](/docs/features/forms)** > > Tag people automatically when they sign up. > **[Email your customers](/docs/features/email-marketing)** > > Send the right message to the right group. > **[Run ads](/docs/features/ads)** > > Target your ads using your groups. # Team management Source: https://crevio.co/docs/features/team Invite team members, assign roles, and collaborate on your Crevio account Crevio accounts support multiple users, so you can bring on collaborators, assistants, or business partners without sharing your login credentials. Each team member gets their own login and a role that controls what they can access. ## Roles Every team member has one of three roles: | Role | Access level | | - | - | | **Owner** | Full access to everything, including billing, account deletion, and team management. Every account has exactly one owner: the person who created it, until they hand ownership to someone else. | | **Admin** | Full access to products, orders, customers, analytics, settings, and team management. Admins can change the plan and manage billing (payment details, buying credits, invoices), but only the owner can cancel or pause the plan or delete the account. | | **Member** | Works with your assistant from Slack, Discord or Telegram. Members can't open the dashboard, account settings, billing, or team management. What they can ask the assistant to do is set under [Member permissions](#member-permissions). | > [!NOTE] > > The account owner is always treated as an admin and cannot have their admin role removed. This ensures there is always at least one person with full access to the account. > [!TIP] > > To keep one teammate from using up the account's credits, an admin can give them a credit limit per billing cycle under **Settings** → **Usage**. See [Credit limits per teammate](/docs/features/credits#credit-limits-per-teammate). ## Inviting team members **1. Go to Team settings** Open **Settings** in your dashboard and navigate to the **Team** section. **2. Send an invitation** Enter the email address of the person you want to invite and select the role you want to assign them (admin or member). **3. They accept the invitation** The invitee receives an email with a link to accept the invitation. If they already have a Crevio account, they are added to your team immediately. If not, they create an account first and are then added. > [!WARNING] > > You cannot invite someone who is already a member of your account. If you need to change their role, update it from the team settings page instead. ## Which plans can invite Inviting teammates needs the **Pro** plan or above. On the Starter plan, inviting asks you to upgrade first. There is no limit on how many admins or members you invite. ## Managing team permissions From the team settings page, you can: * **View all team members** -- See everyone on your team, their role, and when they joined * **Change roles** -- Promote a member to admin or change an admin to a member * **Remove team members** -- Remove someone from your account entirely * **Cancel pending invitations** -- Revoke invitations that have not yet been accepted ## Member permissions Member permissions, **Who can use the agent** and **Groups** appear on the Team page once someone else has joined your account. Under **Settings** → **Team** → **Member permissions**, admins choose what members can ask the assistant to do. Each switch starts off, so until an admin turns one on, only admins can do it. Admins can always do all of it. | Switch | When it's on, members can | | - | - | | **Members can connect integrations** | Connect new apps. In a direct message with the assistant the app is connected just for them; in a shared channel it's connected for the team. | | **Members can edit shared integrations** | Change who can use the team's connections, or disconnect them. A connection someone set up just for themselves can only be changed by that person. | | **Members can create tasks** | Have the assistant set up scheduled and event tasks. | | **Members can publish pages and sites** | Have the assistant publish pages and deploy sites. | When a switch is off and a member asks for one of these, the assistant tells them it needs an admin and points them to this setting. In a shared Slack or Discord thread, the assistant goes by whoever wrote the latest message. ## Who can use the assistant Under **Settings** → **Team** → **Who can use the agent**, admins decide who can talk to the assistant, on the web, in the apps, and in Slack, Discord and Telegram. As the owner, you can always use it. * **Access**: **Everyone except blocked people** (the default) or **Only people you allow**. With **Only people you allow**, add the people under **Allowed people**; nobody else on the team gets an answer. * **Blocked people**: these people can't use the assistant, whichever access you pick. Someone you block sees a notice on the chat page, and gets a short reply instead of an answer in Slack, Discord and Telegram. * **Slack guests can use the agent**: on by default. Turn it off to refuse single- and multi-channel guests, and people from other companies in shared channels, even if they have a Crevio login. * **Whom the agent may message directly**: **Anyone in the workspace** (the default) or **Only teammates who can use the agent**. With the second, the assistant won't start a Slack DM with anyone who isn't on your Crevio team and allowed to use it, so it can't, for example, message a new Slack joiner who hasn't joined Crevio yet. The lists show admins, and members who have linked Slack, Discord or Telegram to their Crevio login. ## Groups A group is a named set of teammates, so you can share with several people in one step. Admins manage groups under **Settings** → **Team** → **Groups**: 1. Select **New group**, enter a **Group name**, and tick the teammates in it. 2. Select **Create group**. To rename a group or change who is in it, select the pencil next to it. To remove it, select the bin. Deleting a group takes away anything that was shared with the group; access shared with someone by name stays. You can use a group wherever you pick people: * **Connected apps**: on an app's **Access** tab, choose **Specific people** and tick the group. Everyone in the group can use the app; when someone leaves the group, they lose it. * **Pages**: ask the assistant to share a page with a group by name, for example *"publish this report for the Leadership group"*. * **Who can use the assistant**: groups appear in the **Allowed people** and **Blocked people** lists. Someone in a blocked group is blocked, even if they are also allowed another way. Only teammates can be in a group. Your customers never appear in the list. ## Ask why the assistant can't see something The assistant works with the access of the person it's talking to. A connected app that a teammate connected for themselves, or shared only with certain people, isn't available in your chats, and each person's saved preferences stay private to them. A scheduled job works with the access of the person who set it up, and a built-in routine only uses apps shared with the whole team. Ask the assistant directly, for example *"Why can't you see my teammate's Gmail?"* or *"Why couldn't Kacper create a task?"*. It checks the app's sharing setting, the member permissions and who may use the assistant, then tells you what's blocking it and who can change it. ## Activity log On the Enterprise plan, recent activity on the account is listed under **Settings** → **Security**. See [Activity](/docs/features/security#activity). ## Account ownership The account owner starts as the person who created the account. The owner always has the admin role, and they are the only user who can manage billing and delete the account. The owner can hand ownership to another member: go to **Settings** → **Team**, open the menu on that person's row, and choose **Transfer ownership**. The new owner is made an admin if they weren't already, and you keep your current role. Only the owner can do this, and the account needs at least two members. > [!TIP] > > If you need multiple people with broad access, invite them as admins. Admin users have nearly the same capabilities as the owner, except the billing page and deleting the account. ## Multi-account membership A single Crevio user can belong to multiple accounts. This is useful for freelancers, agencies, or business owners who manage several brands. Each account has its own team, products, customers, and settings -- there is no data shared between accounts unless explicitly configured through the [API](/docs/developer/guides/api-overview). When a user belongs to multiple accounts, they can switch between them from their account selector in the dashboard. # Vault Source: https://crevio.co/docs/features/vault Save the logins, cards, and contact info Crevio uses on websites. It fills them straight into the website, so the password or card number never appears in the chat. **Crevio can sign in to websites for you without the password ever appearing in the chat.** You save a login once. When Crevio needs to sign in, it fills the password straight into the sign-in page -- never into the chat or its memory. The same works for payment cards and contact info like your name, address, and phone number. You'll find everything in your vault, under **Settings** > **Vault**. ## Why you'd use it * **A tool you use has no connection to Crevio.** If a person can sign in to it, Crevio can too. * **You don't want to hand over the screen every time.** Without a saved login, Crevio has to stop and ask you to sign in yourself. With one, it carries on. * **You want Crevio to have its own accounts.** Crevio can sign up for a site with a password nobody ever sees, and keep using that account later. ## Save a login **1. Open your vault** Go to **Settings** > **Vault**, click **New item**, and choose **Login**. **2. Fill in the login** Enter a name, the email or username, and the password. **3. Add the website** Enter the web address of the site, like `https://findstack.com`. Crevio only ever fills this login into that exact address. **4. Save** Click **Save**. Next time Crevio meets that site's sign-in page, it uses the login on its own. You can also save a login from the chat. When Crevio reaches a sign-in page it has no login for, it shows a small form right in the conversation. Type the email and password there and click **Save** -- the form sends them straight to your vault, not into the chat. A login saved this way is yours alone (see below). Click **Not now** and Crevio carries on without signing in. This form only appears in the chat inside your dashboard, not in Slack, Telegram, or Discord. ## Import logins from a CSV file Already keep your passwords in your browser or a password manager? Bring them over in one go. **1. Export your passwords** Export them as a CSV file from Chrome, Edge, Safari, Firefox, 1Password, Bitwarden, LastPass, or Dashlane. **2. Import the file** In **Settings** > **Vault**, click **New item** > **Import from CSV...**, choose the file, pick who can use the logins, and click **Import**. **3. Delete the file** The CSV file holds your passwords in plain text. Delete it once the import is done. Rows without a password or a website are skipped, and so is any login already in your vault for the same username and website. Authenticator keys in the file come along too. The import takes logins only -- add cards and contact info by hand. You can also connect 1Password directly, so Crevio uses the logins you keep there without copying them: click **New item** > **Connect 1Password...** and follow the steps. Crevio lists your 1Password logins when you connect and again each time you click **Sync** on the connection. The password and two-factor code are read from 1Password at the moment a login is used, so a changed password works right away, and removing a website from a login in 1Password stops it being used there straight away. > [!NOTE] > > Saved passwords are write-only. Once saved, nobody can see a password again -- not you, not your team, not Crevio. To change one, type the new password when you edit the login; leaving the field blank keeps the current one. ## Two-factor codes If a site asks for a code after the password, Crevio can enter it in two ways: * **An authenticator key.** When you turn on two-factor sign-in on a site, it shows a setup key or QR code for your authenticator app. Paste that key (or the `otpauth://` link) into the login's **Authenticator key** field, and Crevio generates the code itself, the same way your authenticator app does. * **A code sent by email.** If the site emails the code to one of your Crevio inboxes, Crevio reads it from the newest message that arrived in the last 15 minutes. Codes sent by text message to your phone, passkeys, and "approve this sign-in" prompts in an app can't be handled this way. For those, Crevio hands you the screen so you can finish that step yourself. ## Let Crevio create its own accounts When you ask Crevio to sign up for something -- a review site, a directory, a free tool -- it can create the account with a strong password it makes up on the spot. The password is saved straight to your vault, bound to that website, before the sign-up form ever sees it. Nobody sees it, and Crevio signs back in with it whenever it needs to. ## Cards and contact info Save a payment card or contact info the same way: click **New item** and choose **Card** or **Contact info**. Crevio fills them into checkout and shipping forms the way your browser's own autofill does, including card forms from payment providers that sit inside the page. **Crevio always asks before it fills in a card.** Each time, you get an approval card in the chat naming the card and the website. Your yes covers that one card on that one website, once. Contact info fills without asking. Logins fill without asking, and only on the websites they are saved for. Crevio also refuses to fill a password into a form that would put it in the page address, or into a page where it ran its own code, so nothing else on the page can pick the password up. After Crevio fills a login, the conversation shows a card with the website, the email or username it used, and dots in place of the password or code. The password itself is never shown. A login Crevio just saved is marked **Saved to vault**. You can leave the website blank on a card or contact info, so it can be used on any site. Logins always need a website. ## Find something in your vault The tabs at the top filter by type -- **All**, **Logins**, **Cards**, or **Contact info** -- and show how many of each you have. Type in **Search vault** to find an item by name, username, or website. ## Keep a login to yourself Every saved item is either for the **Whole team** or **Just me** -- the same choice you make when you connect an app. * **Whole team** -- the default when you add something in **Settings**. Crevio can use it in anyone's chats and in scheduled tasks. * **Just me** -- only your own chats can use it. Nobody else on the account sees it, other admins included. Scheduled tasks don't run as you, so they can't use it either -- save a login for the whole team if a task needs it. A login you type into the save form in a chat is saved as **Just me**. To share it, open it in **Settings** > **Vault** and switch it to **Whole team**. Logins Crevio creates for its own sign-ups are saved for the whole team. ## Choose which AI teammates can use it If you have more than one AI teammate, you can also decide which of them gets each saved item: * **All agents** -- the default when you add something in **Settings**. Every teammate can use it. * **Only certain teammates** -- pick them in the item's settings. Other teammates don't see it at all. A login saved from a teammate's chat, or one a teammate created for itself, belongs to that teammate only. Change it in **Settings** > **Vault** if you want to share it. ## What it can't do * **It only fills the exact website you saved.** `https://github.com` doesn't cover `https://gist.github.com`, and a site with and without `www.` counts as two. This is by design: a password can never be filled into a look-alike page. Add each address the sign-in happens on -- a login can have up to 10. * **It only works on websites.** Crevio fills saved items into pages in its own browser. It can't type a password into a desktop program. * **It can't show you a saved password.** There is no "reveal" -- keep your own copy in your usual password manager. * **Once filled, the website has it.** Filling a password into a site is the same as typing it there yourself. Only save logins for sites you trust. * **You can save up to 500 items per account.** ## If something goes wrong * **Crevio says the page isn't one of the saved sites.** The sign-in page lives on a different address than the one you saved -- for example `login.example.com` instead of `example.com`. Open the login in **Settings** > **Vault** and add that address. * **The sign-in fails.** The saved password is out of date. Edit the login, type the current password, and ask Crevio to try again. * **Crevio can't find a verification code.** If the site just sent it, give it half a minute and ask Crevio to try again. If the code went to your phone, Crevio hands you the screen instead. * **The save form in the chat stopped working.** It stays open for 30 minutes. After that, ask Crevio to sign in again and it shows a fresh one, or add the login in **Settings** > **Vault**. ## Related > **[Create with AI](/docs/features/creating-with-ai)** > > How Crevio works on its own computer, and when it hands you the screen. > **[Your account & settings](/docs/features/settings)** > > Everything else under Settings. # Waitlists and approvals Source: https://crevio.co/docs/features/waitlists Review every buyer before they get access, and charge them only when you approve Turn on **Require approval** on a price variant and buyers apply instead of buying. You see who applied and their answers to your questions, then approve or deny each request. A paid buyer's card is saved when they apply and charged only if you approve them. Use it for anything where you choose who gets in: a cohort with limited seats, a coaching program, a community, or a high-ticket service. ## Turn on approvals 1. Go to **Products** and open the product. 2. Edit the price variant and open **Advanced options**. 3. Tick **Require approval (waitlist)**. 4. Optionally pick a **Checkout form** to ask buyers questions when they apply. See [checkout forms](/docs/features/pricing#checkout-forms). 5. Save. You can also tick the option under **Advanced options** when you create a product. ## What buyers see * The product page button says **Join waitlist**, and there is no **Add to cart** button for that price variant. * At checkout they fill in your checkout form, if you picked one. For a paid price variant they enter their card, which is saved but not charged. For a free one they enter their name and email. * After applying they see "You're on the waitlist" and get an email saying the same. For a paid price variant, both tell them they haven't been charged. ## Get notified When someone applies, you get an email with their name and answers, and a notification in Crevio. Their answers also show up as a submission in **Forms**. Turn this off under **Settings** > **Notifications** > **Waitlist Requests**. ## Review requests Open **Waitlist** in the sidebar. It opens on **Pending**, newest first. * Filter by status (**Pending**, **Approved**, **Denied**, **All**) or by product. * Click **View answers** to read what someone wrote. * Click **Approve** or **Deny** on a row, or tick several rows and use **Approve selected** or **Deny selected**. * **Approve all** approves every pending request in the current view. Approvals run in the background, so refresh after a minute to see them finish. * **Export CSV** downloads the current view, with one column per question. You can also ask Crevio to list, approve or deny requests for you. It asks before it approves or denies anyone. ## What approving does Approving works like the buyer completing a normal purchase at that moment: | Price variant | What happens on approval | | - | - | | Free | The buyer gets access. | | One-time payment | Their saved card is charged the price, including tax if you collect tax and any discount from the checkout link they used. | | Subscription or payment plan | Their subscription starts on the saved card, including any free trial and setup fee. | The buyer gets the usual purchase confirmation email, and the purchase shows up under **Orders**. ## When a card is declined If the saved card is declined when you approve, nobody is charged and the request is denied automatically. It shows as **Card declined**. The buyer gets an email explaining that the payment didn't go through, with a link to apply again with another card. ## Denying a request Denying emails the buyer that their request wasn't accepted. Nothing is charged. A denied buyer can apply again. ## Limits * **Approval products are checked out on their own.** A buyer can't put a price variant that needs approval in a cart with other products. This is by design: each approval charges one saved card for one request. * **Card only.** PayPal isn't offered for price variants that need approval, because a PayPal payment can't be saved and charged later. * **No discount code box.** Buyers can't type a discount code when they apply. A discount attached to a [checkout link](/docs/features/checkout) still applies. * **No shipping address.** Crevio doesn't ask for a shipping address when someone applies, so approvals don't suit physical products you need to post. Collect the address yourself after approving, or sell those products without approval. * **One pending request per buyer.** Someone who already has a pending request for a price variant can't apply for it again until you decide. * **Requests don't expire.** A request stays pending until you approve or deny it. The longer you wait, the more likely a saved card has expired or been replaced and gets declined. * **Sold out still lets people apply.** When **quantity available** is `0`, buyers can still apply, but you can't approve anyone until you raise the quantity. * **No approving existing owners.** You can't approve someone who already owns the product. ## Test it yourself Sign in as an admin of your account and apply from your own product page. It's a test request: no card is taken, it's labelled **Test** in **Waitlist**, and approving it gives test access without charging anyone. # Welcome to Crevio Source: https://crevio.co/docs/index Crevio is an AI that runs your business — you can just ask it. Describe your business, and Crevio builds, launches, and grows it for you. **Crevio is an AI that runs your business — so you can focus on what you do best.** You describe your business, and Crevio builds it, launches it, and helps it grow. Think of it less like software you have to learn and more like a teammate you can talk to. The biggest thing to know: **you can just ask.** Want a website? Ask Crevio to build one. Want a full web app — a booking tool, a client portal, a members area? Ask for that too. Want a sale this weekend? Ask it to set one up. Want help writing your launch email? Ask. Anything you'd hire a small team to do, you can describe in plain words and let Crevio handle. > [!NOTE] > > You don't need any technical skills. If you can describe what you want, Crevio can do the work. ## New here? Start with these > **[Getting started](/docs/introduction/getting-started)** > > Go from zero to a live website with your first product — in about five minutes. > **[How Crevio works](/docs/introduction/how-crevio-works)** > > The simple mental model: your account, your website, your products, your customers — and an AI that does the work. ## What do you want to do? > **[Sell something](/docs/features/products)** > > Create products — courses, downloads, memberships, services — and bundle exactly what your customers get. > **[Get paid](/docs/features/checkout)** > > Take one-time payments and subscriptions with a smooth, built-in checkout. > **[Build your website](/docs/introduction/how-crevio-works)** > > Get a website online instantly — or ask Crevio to design a full website for you. > **[Grow your business](/docs/integrations/connected-apps)** > > Get help with marketing, social posts, and promotions to bring in more customers. > **[Create with AI](/docs/features/experiences)** > > Ask Crevio to write copy, design images, and produce content for your business. > **[Automate your work](/docs/integrations/connected-apps)** > > Hand off repeat tasks — replies, follow-ups, scheduling — and let Crevio run them for you. > **[Manage customers](/docs/introduction/how-crevio-works)** > > Keep track of leads, buyers, and members, and deliver what they paid for automatically. > **[Your settings](/docs/features/settings)** > > Set up your business profile, currency, support email, team, plan, and credits. > **[Common questions](/docs/introduction/faq)** > > Quick answers about the AI, payments, getting started, and getting help. > **[Something's not working](/docs/troubleshooting/changes-not-live)** > > Changes not showing, a site that won't load, a domain that isn't live yet. ## Connect the tools you already use Crevio connects to thousands of apps, so the AI can get things done across the tools you already rely on — your email, your social accounts, your spreadsheets, and more. > **[Connected apps](/docs/integrations/connected-apps)** > > Browse and connect 3,000+ apps so Crevio can work across them on your behalf. > **[Stripe](/docs/integrations/stripe)** > > Connect Stripe to accept payments and manage subscriptions. > **[Discord](/docs/integrations/discord)** > > Give buyers access to your Discord server automatically. > **[Telegram](/docs/integrations/telegram)** > > Run paid Telegram group memberships hands-free. > [!TIP] > > Stuck at any point? Just ask Crevio inside the app. It knows your business and can fix most things for you on the spot. # Connected apps Source: https://crevio.co/docs/integrations/connected-apps Connect Crevio to 3,000+ apps with Zapier and webhooks to automate your business workflows — sync orders, customers, and more without code. Crevio integrates with over 3,000 apps so your AI assistant can take action across the tools you already use. Connect your accounts once and let Crevio automate tasks like sending emails, updating spreadsheets, posting to social media, syncing CRM records, and more. ## How it works Connected apps let your AI assistant interact with third-party services on your behalf. When you ask the assistant to do something that involves an external tool -- like "send a welcome email via Mailchimp" or "add this customer to my HubSpot CRM" -- it can connect to that service and take action directly. You don't have to know which app does the job. Describe the outcome -- "text me when an order comes in", "put new leads in a spreadsheet" -- and the assistant works out which of your connected apps can do it, or suggests one to connect if none can yet. **1. Browse or search for an app** Open **Customize** in the sidebar and choose the **Connectors** tab. On **Discover**, browse popular apps by category or search for a specific tool. **2. Connect your account** Click **Connect** on any app that supports OAuth. A secure authorization window opens where you sign in to the third-party service and grant Crevio access. **3. Use it through your AI assistant** Once connected, your AI assistant can use the app when relevant. Just describe what you need in the chat -- the assistant handles the rest. The Connectors tab has three views: **Discover** to find and connect apps, **Connected** to manage what you've already set up, and **Included** for the data that comes with Crevio. Your choice is remembered in the page address, so you can bookmark a view. > [!NOTE] > > This used to live under **Settings** > **Integrations**. Old links and bookmarks still take you to the right place. ## Data that comes with Crevio Some kinds of information don't need an app at all. Under **Customize** > **Connectors**, the **Included** view lists research data your AI assistant can look up for you out of the box. There is nothing to connect and no extra subscription -- each lookup just uses a few credits from your balance. | Data | What you can ask for | | - | - | | **Web search** | Search the web, read any page, and run deep research across many sources | | **Website data** | A site's authority, backlinks, search traffic, ranking keywords, competitors, and how often ChatGPT and Google's AI answers mention it | | **People data** | Find professionals, enrich a person from an email or LinkedIn link, and find and verify work emails | | **Company data** | Industry, size, location, funding, tech stack, and social profiles for a company | | **Local business data** | Ratings, reviews, opening hours, and contact details from Google Maps | | **Social data** | Public profiles, posts, comments, followers, hashtags, and trends across TikTok, Instagram, YouTube, X, LinkedIn, Reddit, and more | | **E-commerce data** | Products, prices, sellers, and reviews on Amazon and Google Shopping | | **Finance data** | Stock quotes, earnings, company financials, SEC filings, crypto, and prediction-market odds | | **Jobs data** | Job listings on LinkedIn, Indeed, Glassdoor, and Upwork, plus Fiverr gigs and pricing | | **Reviews data** | Customer reviews from Trustpilot, Google, the App Store, Google Play, and Tripadvisor | | **Ads data** | Other companies' ads in the Meta Ad Library, Google Ads Transparency Center, LinkedIn, and TikTok | | **Real estate data** | US property listings and details from Zillow, Realtor.com, and Redfin | | **News data** | Recent news about any topic, company, or person | | **App store data** | App rankings and top charts on the App Store and Google Play | | **Travel data** | Hotels and rentals with ratings and nightly prices | | **Legal data** | US federal regulations and statutes, such as FTC rules | Each card shows where the data comes from and an example question. Click **Try it in chat** to start a conversation with that question already filled in. > [!TIP] > > You don't need to pick a data source. Just ask -- "research my top 5 competitors and summarize their pricing" -- and Crevio uses the right one automatically. Weather forecasts are also available to the assistant, even though they aren't listed. ## Categories Apps are organized into categories to make browsing easier: | Category | Examples | | - | - | | **Communication** | Slack, Gmail, Microsoft Teams, Twilio | | **CRM** | HubSpot, Salesforce, Pipedrive | | **Marketing** | Mailchimp, ConvertKit, ActiveCampaign | | **Productivity** | Notion, Google Sheets, Airtable, Trello | | **Data & Analytics** | Google Analytics, Mixpanel, Segment | | **File Storage** | Google Drive, Dropbox, OneDrive | | **Help Desk & Support** | Zendesk, Intercom, Freshdesk | | **Social Media** | X (Twitter), LinkedIn, Instagram, Facebook | > [!TIP] > > Can't find what you're looking for? Use the search bar to search across all 3,000+ available integrations. ### Requesting an app that isn't listed If you search for an app and nothing matches, click **Request "App name"** on the empty results screen. You'll also see a **Not the one you need?** prompt under partial matches, with the same button. Crevio gets your request and looks into adding the app. Once you've sent it, the button changes to a short confirmation. If sending fails, you'll see an error and can try again. Requests for the same app from different people are grouped together, so there's no harm in asking even if someone else already has. ## What your assistant can do with an app Most apps come with a set of ready-made actions -- send an email, create a row, post a message. Your assistant uses those first. When what you're asking for isn't one of the ready-made actions -- a narrower search, an unusual setting, a corner of the app most people never touch -- the assistant can go to the app directly instead of telling you it's not possible. You don't have to do anything differently; just ask for what you want. > [!NOTE] > > Either way, the same rules apply: anything that sends something to other people, publishes, spends money, deletes, or changes who has access waits for your approval first, and your sign-in details are never shared with the assistant. Reading and private changes, like creating a draft or a document, run without asking. See [what always asks first](/docs/features/automation#what-always-asks-first) for how approvals work. ## Tools Crevio writes for you When your assistant does the same job on an app again and again, like a weekly report or a lookup you keep asking for, it can save that job as a tool of its own. You can also ask for one: "make me a tool that lists my top products." Your assistant can use a new tool right away, but it asks for your approval every time it runs one until you set it to run automatically. It sends you a link to the tool: 1. Open the app's connection and go to its **Tools** tab. Tools your assistant wrote are under **Created by Crevio**. 2. Select **Show code** to read what it does. **Read-only** means your assistant says it only reads. 3. Leave it on **Ask for confirmation**, or choose **Run automatically** so it runs without asking. Choose **Off** to stop your assistant using it. A tool Crevio writes can only use the app it was made for. Anything it sends, publishes or deletes still asks you first, the same as the app's own actions. If your assistant changes a tool's code, the tool goes back to asking for approval every time. Select **Delete tool** to remove one. ## Add your own tool server If you or your team run a tool server of your own (an MCP server), your assistant can use it too. Add it with the **Add** button on the **Connectors** tab (choose **Add MCP server**, or **Add with AI** to have Crevio walk you through it). Choose how it signs in: | Option | When to use it | | - | - | | **Sign in or none** | The server uses a normal sign-in window, or needs no sign-in. | | **API key** | The server wants a key. Crevio sends it as a bearer token. | | **Custom header** | The server wants the key under a specific header name, such as `X-Api-Key`. | | **Your own OAuth app** | The server only accepts an app you registered with it yourself (Microsoft Ads is one). Enter the app's **Client ID** and, if it has one, its **Client secret**, plus any **Scopes** the server's docs ask for. Add the **Redirect URI** shown in the form to your app's settings, then sign in once. | | **Your own OAuth app, no sign-in** | The same, for servers that give an app its own access without anyone signing in. The client secret is required. Crevio connects right away and renews the access by itself. | Crevio checks a key with the server before saving it, and stores it encrypted. If a key stops working, choose **Replace key** on the server: the new key is checked first, and the old one keeps working until the new one passes. ### When a tool server asks you something Some tool servers stop partway through a job to ask you a question, such as which project an issue belongs in. Crevio shows the question as a card in your chat, with the server's name on it: * **A form.** Fill in the fields and choose **Send**. Fields marked with an asterisk are required. Crevio then finishes the job with your answers, and is told what you entered. * **A link.** The card shows the full address before you open it. Check it, choose **Open**, finish there, then choose **Send** so Crevio carries on. * **Decline** sends nothing. Crevio is told you declined and does not ask again. In Slack, Discord and Teams the card has an **Answer in Crevio** button that opens it in Crevio, because those apps can't show a form. The Crevio app on your phone shows the form itself. A question can only be asked in a chat. A scheduled job or script with no chat behind it stops and says the server needed an answer. ### Long jobs on a tool server Some tool servers take minutes to finish a job. Crevio waits a short while, then lets the job run in the background and posts the result in the same chat when it's done. You can keep working in the meantime. Crevio checks on a job for up to a day. ## Connect PostHog PostHog is a one-click connection. Choose it on **Discover**, sign in to PostHog, and your assistant can look at your product analytics. One connection works for both PostHog's US and EU regions -- PostHog's sign-in picks the right one for your account. You can also just ask your assistant to connect it, and it shows a connect button in the chat. ## Apps that connect in one click Some apps connect to Crevio directly, with no extra setup. Choose the app on **Discover**, sign in with your usual login for that app, and you're done. You can also ask your assistant to connect one, and it shows a **Connect** button in the chat. **Work and projects** | App | What you can ask your assistant to do | | - | - | | Linear | Find, create and update issues and projects, and add comments | | Notion | Find, read and write pages and databases | | Jira & Confluence | Find and update Jira issues and Confluence pages | | Monday.com | Find, create and update items and boards | | JobTread | Manage jobs, customers, estimates and schedules | | BidBuild | Manage construction bids, estimates and projects | | BookLive | Manage your bookings, services and calendar | | Rent A Human | Hire people for errands, local tasks and website testing | **Meetings, notes and email** | App | What you can ask your assistant to do | | - | - | | Granola | Pull notes, summaries and to-dos from your meetings | | Otter.ai | Search your meeting transcripts and summaries | | Wispr Flow | Pull notes and action items from your recorded meetings | | Plaud | Pull recordings, transcripts and summaries from your note-taker | | Superhuman Mail | Search, read, draft and send email | | Supermemory | Save and search your notes, links and documents | **Money and sales** | App | What you can ask your assistant to do | | - | - | | PayPal | Look after invoices, orders, subscriptions, refunds and disputes | | Square | Work with your items, orders, customers, stock and payments | | Baremetrics | Read your subscription revenue, churn and customer numbers | | Triple Whale | Read your store's sales, ad spend and which ads bring in sales | | DataDoe | Ask questions about your Amazon and online store sales | **Marketing, ads and SEO** | App | What you can ask your assistant to do | | - | - | | Customer.io | Look up customers and campaign results, and manage messages | | Customer.io (EU) | The same, for Customer.io accounts hosted in Europe | | SocialPilot | Plan, schedule and review social posts | | Modash | Find influencers and creators, and see who follows them | | Euka | Find TikTok Shop creators and run your outreach | | Foreplay | Search ad libraries and your saved ads for ideas | | Cortana AI | See which ads bring in sales, and manage campaigns | | Bright Data Social | Pull public profiles and posts from social networks | | Moz SEO | Look up a site's authority, backlinks and keyword rankings | | SE Ranking | Read keyword rankings, site checks and competitor data | | OpenArt | Make and edit images and videos | **Websites** | App | What you can ask your assistant to do | | - | - | | Webflow | Edit your site's pages and content, and publish changes | | Wix | Manage your site, store, bookings and contacts | | Duda | Manage the sites and pages you build on Duda | **Technical tools** | App | What you can ask your assistant to do | | - | - | | Sentry | Look up errors on your website or app | | Supabase | Look up and change data in your Supabase projects | | Neon | Look up and change data in your Neon databases | | Consensus | Search published research and get answers backed by studies | | DeepWiki | Ask questions about public code projects on GitHub | | AWS Knowledge | Search Amazon Web Services' guides | You need an account with each app, and some apps only offer this connection on their paid plans. DeepWiki and AWS Knowledge are public, so they connect without a sign-in. Jira & Confluence works with sites hosted by Atlassian. A Jira or Confluence server your company runs itself (Data Center) connects through the regular **Connect** button instead. ### Money stays in your hands Your assistant always asks before it does anything that moves money in PayPal, such as a refund, a payment or a subscription change. The same goes for posting a paid task, adding money to your wallet or paying someone in Rent A Human. You can turn these actions off, but you can't let them run without asking. Square works a little differently: everything your assistant does in Square, even just looking something up, goes through one shared action. So it asks before every Square action, not only payments. ### Already connected one of these apps? If you connected one of these apps before it became a one-click app, that connection keeps working and you don't need to do anything. ## Managing connections ### Telling connections apart Tool-server connections are titled by the server's own name, with the account you signed in with underneath -- for example, the PostHog connection shows the email you used. That makes it easy to see which account each connection acts as. ### Naming a connection When you connect an app, Crevio asks for a **Nickname** and suggests one: "Team's Account", or "*Your name*'s Account" for a connection only you use. Each account of the same app needs its own nickname, so connecting a second one suggests "Team's Account 2" -- change it to something you'd recognize at a glance, like *support gmail*. You can connect the same app more than once -- a work Gmail and a support Gmail, say. Your assistant tells the accounts apart by their nicknames, and asks which one you mean when it isn't clear. To rename a connection later, just ask your assistant: "call that one *support gmail*". ### Choosing who can use a connection A connection is shared with your whole team by default. When you connect an app, **Who can use it?** offers three choices: **Whole team**, **Just me**, or **Specific people**, where you tick the teammates who should have it. To change it later, open the connection's settings from **Customize** > **Connectors** (the sliders button next to the account) and go to the **Access** tab. Pick **Whole team**, **Only me** or **Specific people**, then **Save access**. You can also ask your assistant -- "make Notion private to me", "only Sam and I should use Linear", "share Notion with the team again" -- and it asks for your approval before it makes the change. Either way the connection isn't disconnected, so nothing needs reconnecting, and its nickname and approval settings stay as they were. Once a connection is limited, only the people on its list can use it in their chats and in the tasks they set up. Everyone else's assistant no longer sees it. Only an account admin can change who can use a team connection, unless an admin has turned on **Members can edit shared integrations** in [team settings](/docs/features/team#member-permissions). A connection you set up as **just for you** always stays usable by you. You can add teammates to it, but to open it to the whole team, connect the app again as a team connection. ### Turning a connection off Each connection has an **On** switch on the **Access** tab of its settings page (**Customize** > **Connectors**, then the sliders button next to the account). Turn it off and your assistant and your tasks stop using that connection until you turn it back on. Triggers that watch the app through it, like "when a new email arrives", pause too and pick up again when you turn it back on. It isn't disconnected: its nickname, approval settings and who can use it are all kept, and nothing needs reconnecting. A connection that is off shows **Off** next to it in the list, and its app card shows a grey dot instead of a green one. ### Locking a connection Turn on **Locked** on the same page to keep a connection the way it is. While it's locked, only an account admin can change it, switch it off, change who can use it, rename it or disconnect it -- even members who are otherwise allowed to edit shared integrations, and even the person who connected it. Only admins can lock or unlock a connection. A locked connection shows a lock next to the app's name on its card and **Locked** next to it in the list. ### What your assistant learns when you connect something Right after you connect an app, a tool server or a custom API, Crevio takes a quick, read-only look around it in the background: the accounts, labels, projects or other names it will need later. It saves what it found as notes your assistant reads in future chats, so it doesn't have to ask or rediscover them. This look-around never creates, changes or deletes anything in the app, it uses a few credits, and Crevio does it for at most five new connections a day. ### When a connection stops working Apps sometimes cut off access on their own -- you changed your password, an admin revoked the app, or the permission simply expired. When that happens the connection isn't thrown away: it's marked as needing attention, so your naming and approval settings stay put. A colored dot next to each connected app in **Customize** > **Connectors** shows this at a glance -- green means it's connected, amber means it needs a reconnect. Hover the dot to see which. Click **Reconnect** next to the account in **Customize** > **Connectors** and sign in again with the same account. Crevio picks the old connection back up instead of adding a new one, so its nickname and approval settings stay as they were. Until you do, anything that depends on that app won't run -- your assistant will tell you which one to reconnect. You don't have to leave the chat to fix it, either. When your assistant hits an app that needs reconnecting, it shows a **Reconnect** button right in the conversation. Click it, sign in again, and the assistant carries on with what you asked. ### Disconnecting an app To revoke access, go to **Customize** > **Connectors** > **Connected**, find the app, and click **Disconnect**. Crevio will immediately stop accessing that service. Your other accounts of the same app aren't affected. Your assistant can disconnect an app too, but only after you approve it, because disconnecting a team connection cuts everyone off it. Changed your mind? Connect the same account again within 24 hours and its nickname and approval settings come back. After 24 hours it's a new connection with default settings. ### Connecting through the AI chat Your AI assistant can also prompt you to connect an app on the fly. If you ask the assistant to perform a task that requires an app you haven't connected yet, it will show you a connect button right in the chat. This works outside the dashboard too. If you're chatting with your assistant on [Slack](/docs/integrations/slack), [Discord](/docs/integrations/discord), or [Telegram](/docs/integrations/telegram), it sends you a link that opens Crevio with that connection ready to set up. Follow it, approve the app, and your assistant can use it as soon as you're done. > [!NOTE] > > All credentials are encrypted and stored securely. You can revoke access to any connected app at any time. > [!TIP] > > Looking for deeper, purpose-built integrations? Crevio also offers native [Stripe](/docs/integrations/stripe), [Discord](/docs/integrations/discord), [Telegram](/docs/integrations/telegram), and [Slack](/docs/integrations/slack) integrations. # Custom APIs Source: https://crevio.co/docs/integrations/custom-apis Connect any REST API that isn't in the app catalog, with your own key, and choose what Crevio may do with it. If an app you use isn't in the catalog but has a REST API, you can still connect it as a **custom API**. You describe the API once (its address, how it signs in, and which kinds of requests are allowed), and Crevio can call it for you. Your key is stored encrypted. It is never shown again, and Crevio's AI never sees it: Crevio adds it to each request itself. ## Add a custom API yourself **1. Open the form** Open **Customize** in the sidebar and choose the **Connectors** tab. Next to **Add**, open the menu and choose **Add custom API**. **2. Describe the API** * **Name**: what you call it, for example "Acme CRM". * **Base URL**: the address every request starts from, for example `https://api.acme.com/v1`. It must start with `https://` and can't include a `?query`, a `#fragment`, or a username and password. * **Allowed methods**: tick GET, POST, PUT, PATCH or DELETE. Pick at least one. GET only reads; the others can change data in that app. * **Authentication**: **Bearer token** (paste the API token), **API key in a header** (enter the header name the API expects, such as `X-Api-Key`, and the key), **API key in the URL** (enter the query parameter the API expects, such as `api_key`, and the key), or **No authentication**. * **Documentation URL** (optional): a link to the API's docs, which helps Crevio's AI use it correctly. **3. Choose what Crevio may do** Select **Add API**. You land on its tools page, with one tool per method you allowed. ## Decide what runs on its own Each method is a tool with its own setting: * **Run automatically**: Crevio sends these requests without asking. * **Ask for confirmation**: Crevio shows you the request and waits for your approval each time. * **Off**: Crevio can't send these requests. GET starts on **Run automatically** and every other method starts on **Ask for confirmation**. Change any of them on the tools page, or later from the API's tile on **Connectors** with **Choose what Crevio may do**. ## Have Crevio set it up in chat Ask in chat, for example "connect the Acme API, here are its docs". Crevio reads the docs, sets the API up, and sends you a secure link titled **Connect **. Open it, sign in if asked, enter the key and select **Save** (for an API with no key, select **Connect**). The chat then carries on with what you asked for. Never paste a key into the chat: the link is the safe way, because what you type there goes straight to the connection and never into the conversation. The link works once and expires 24 hours after Crevio sends it. If it expired, ask Crevio for a new one. ## Edit or remove it Open the API's tile on **Connectors**: * **Edit API** changes the name, base URL, methods or key. Leave the key empty to keep the stored one. If you change how it signs in, enter the new key too. * **Choose what Crevio may do** opens its settings page. The **Access** tab chooses who can use it: **Whole team**, **Only me** or **Specific people**, as for any other [connection](/docs/integrations/connected-apps#choosing-who-can-use-a-connection). The same page has the **On** switch and **Locked**. * **Disconnect** removes the API, its key and its tools. It can't be undone. ## Limits * Only APIs on the public internet over `https://`. Addresses on a private or internal network are refused. * Requests stay under the base URL: Crevio won't send your key to any other address. * Sign-in methods are a bearer token, a key in a header, a key in the URL, or none. APIs that need OAuth sign-in or signed requests can't be added this way. Check the catalog or ask Crevio for another route. * Members can add a custom API through chat only if an admin turned on **Members can connect integrations** in **Settings → Team**. The **Connectors** page itself is for admins. ## Common problems * **"Base URL must start with https\://…"**: copy the API's base address, not a page of its website, and leave off anything after `?`. * **Requests come back with 401 or 403**: the API rejected the key. Open **Edit API** and paste it again, or ask Crevio for a new link. * **The link says it expired or was already used**: ask Crevio for a new link. # Custom domain Source: https://crevio.co/docs/integrations/custom-domain Serve your Crevio website from your own domain and send emails from your own email domain. Every Crevio account gets a free subdomain at `yourname.crevio.app` and a default outbound email address at `yourname@outbound.crevio.co`. On the Pro and Business plans, you can customize both by connecting your own website domain and [email domain](/docs/integrations/email-domain). > [!NOTE] > > Custom domains and email domains are available on the Pro and Business plans. This includes domains you buy through Crevio. On the Starter plan, your site stays on `yourname.crevio.app` and emails send from `yourname@outbound.crevio.co`. ## Website custom domain A website custom domain lets your site live on your own URL (e.g., `shop.yourbrand.com`) instead of `yourname.crevio.app`. ### Why use a custom domain * **Branding** -- Your website URL matches your brand instead of showing `crevio.app`. * **SEO** -- Search engines treat your domain as part of your own web presence, building domain authority for your brand rather than Crevio's. * **Trust** -- Customers are more likely to purchase from a URL they recognize as yours. * **Consistency** -- If you already have a website, your website feels like a natural extension of it. ## Default subdomain When you create your Crevio account, you choose a subdomain. Your website is immediately available at: ``` https://yourname.crevio.app ``` This subdomain is always active, even after you connect a custom domain. Your subdomain must be: * Between 2 and 42 characters * Lowercase letters, numbers, and hyphens only * Unique across all Crevio accounts > [!NOTE] > > Certain subdomains are reserved (e.g., `admin`, `api`, `app`, `dashboard`, `www`) and cannot be used. ## Setting up a custom domain **1. Go to Custom Domain settings** In your dashboard, navigate to **Settings** > **Custom Domain**. **2. Enter your domain** Type the subdomain you want to use (e.g., `shop.yourbrand.com`). Click **Save**. **3. Configure DNS** Add a CNAME record at your domain registrar or DNS provider pointing to Crevio's target hostname. See the [DNS configuration](#dns-configuration) section below. **4. Wait for verification** Crevio checks your DNS configuration automatically, rechecking every few minutes until it verifies -- you don't need to keep clicking **Verify**. Once verified, your domain goes through SSL provisioning and becomes active. ## DNS configuration Add the following CNAME record to your domain's DNS settings: | Type | Name | Target | | - | - | - | | `CNAME` | Your domain (e.g., `shop`) | `customers.crevio.app` | > [!TIP] > > If you are using a subdomain like `shop.yourbrand.com`, the **Name** field is `shop`. Root domains like `yourbrand.com` work differently -- see [Root domain](#example-dns-configurations) below. ### Example DNS configurations **Subdomain (recommended)** | Type | Name | Target | | - | - | - | | `CNAME` | `shop` | `customers.crevio.app` | Your website will be available at `https://shop.yourbrand.com`. **Root domain** Root domains (`yourbrand.com` without a subdomain prefix) are not supported. A root domain can't hold a real CNAME record -- that's a DNS specification, not a Crevio limitation -- so DNS providers substitute address records instead, even when they call the feature ALIAS, ANAME, or CNAME flattening. Those address records can look correct in your registrar's dashboard, but Crevio's verification needs the CNAME itself, so a root domain never verifies. Use a subdomain instead, e.g. `www.yourbrand.com` or `shop.yourbrand.com`. Most registrars can then forward or redirect the root domain to that subdomain. ## Domain verification process After you add the DNS record, Crevio verifies your domain in stages: | Status | What it means | | - | - | | **Pending** | Crevio is waiting for your DNS record to propagate. This typically takes a few minutes but can take up to 48 hours depending on your DNS provider. | | **SSL pending** | DNS has been verified. Crevio is provisioning an SSL certificate for your domain. | | **Active** | Your domain is verified, SSL is active, and your website is live on the custom domain. | | **Error** | Something went wrong. Check that your DNS record is correct and try again. | > [!NOTE] > > Crevio rechecks your DNS every few minutes while a domain is **Pending**. DNS propagation times still vary by provider -- if your domain stays **Pending** for more than a few hours, double-check your CNAME record and ensure there are no conflicting records (like an existing A record on the same name). Crevio shows the specific problem it found (for example, no record yet, or the record pointing somewhere else) so you know what to fix. ## SSL / HTTPS SSL certificates are provisioned **automatically** for your custom domain. You do not need to purchase, upload, or manage certificates yourself. * Crevio uses Cloudflare for SSL provisioning. * Certificates are issued and renewed automatically. * All traffic is served over HTTPS. HTTP requests are redirected to HTTPS. * Your customers always see the padlock icon in their browser. ## Troubleshooting > **My domain is stuck in 'Pending'** > > Crevio rechecks your DNS every few minutes and shows the specific issue it finds. Use a tool like [dnschecker.org](https://dnschecker.org) to confirm your CNAME record has propagated, and remove any conflicting A records on the same hostname. > **Crevio says my DNS provider doesn't publish a real CNAME** > > This means you're using a root domain (`yourbrand.com` instead of `www.yourbrand.com`). Root domains can't hold a real CNAME record, so many DNS providers silently substitute address records for it -- even when the record in your registrar's dashboard looks like a CNAME. Verification needs the actual CNAME, so it will never succeed for a root domain. Connect a subdomain like `www.yourbrand.com` instead -- see [Root domain](#example-dns-configurations) above. > **SSL certificate is not being issued** > > SSL provisioning happens after DNS verification. If your domain is in **SSL pending** for more than an hour, try removing and re-adding the domain in your Crevio settings. Ensure your DNS provider is not proxying the CNAME record (if using Cloudflare for DNS, set the proxy status to **DNS only** / grey cloud). > **I want to change my custom domain** > > Go to **Settings** > **Custom Domain**, remove the current domain, and add the new one. Update your DNS records accordingly. The old domain will stop serving your website once removed. ## Email domain You can also send outbound emails from your own domain instead of `@outbound.crevio.co`. See the [Email domain](/docs/integrations/email-domain) guide for setup instructions. # Discord Source: https://crevio.co/docs/integrations/discord Talk to your Crevio AI from your Discord server, and sell access to your server with automatic roles for paying customers. Crevio does two things in Discord. You can use either one, or both in the same server: * **[Chat with your AI](#chat-with-your-ai-in-discord)** — your team @mentions Crevio, DMs it, or types `/crevio`, and the AI works on the request right there in Discord. * **[Sell access to your server](#sell-access-to-your-server)** — customers who buy a product get added to your server with the roles you choose, and lose them when they cancel or get a refund. Each one is connected separately, from its own place in your dashboard. ## Chat with your AI in Discord Add Crevio to your Discord server and your team can ask the AI for help without leaving Discord. Each request gets its own thread, so conversations stay tidy. ### What you can do * **@mention Crevio** in any channel it can see to start a request * **DM Crevio** for a private conversation * **Type `/crevio` and your request** to start without a mention * **Reply in the thread** Crevio opens, and it keeps the context — no need to mention it again * **Stop a reply** by reacting with the stop sign emoji on a message in the thread, or by sending `!stop` in it * **Mute Crevio in a thread** with `!mute`, or by reacting with 🏁 to one of its messages: it stops answering replies there until someone mentions it again * **Choose how hard it thinks** with `!fast` (quick answer) or `!deep` (more thinking) anywhere in your message. It applies to that one reply * **Approve or deny actions** with the **Approve** and **Deny** buttons when the AI asks before doing something. For a single tool, **Always approve** also stops it asking next time (admins, or the teammate who connected the account the action runs on). **Edit** opens the card in Crevio, where you can change the details before approving. The card then shows who answered * **Share files, images, and voice messages** — the AI can read what you drop in * **Get task results in Discord** — tasks can start when someone posts, mentions Crevio, adds or removes a reaction, or joins the server, and post their results back to Discord ### What Crevio can do across your server Beyond the conversation you're in, you can ask Crevio to work anywhere in the servers you connected: * **Post, reply, edit and pin** messages in any channel it can see, or start a thread on a message * **Read what was said** in a channel or thread, and catch you up on what you missed * **Look up members** and their roles, and see whether someone is online or has set an away status * **Send a DM** to a member of your server. Who it may message is set by **Whom the agent may message directly** in your team's agent access settings * **Invite a member to your Crevio team**. Discord doesn't share email addresses, so Crevio asks for theirs first * **Share and fetch files**: post a file it made, or save a file someone shared so it can work with it * **Delete a message**, its own or someone else's in a server. It always asks first. In a DM it can only delete its own messages * **Reach out first** when you ask it to: introduce itself to a member by DM, or offer help in a channel by replying to a recent message where someone mentioned a problem. It does this at most once per person or channel, and does no work until someone says yes Discord has no shared documents, lists or channel bookmarks like Slack's canvases. Pinned messages are the closest thing, so Crevio pins a message when you ask it to bookmark something. ### Who can talk to Crevio Crevio only answers people it can identify as part of your business. To use it in Discord, a person needs to: 1. Be a member of your Crevio account (see [Team](/docs/features/team)). 2. Link their Discord account to Crevio, either by signing in with Discord or by connecting Discord under **Settings → Connected accounts** in their user settings. Anyone else in the server can see Crevio's replies in channels they have access to, but Crevio does not act on their messages. This is by design: everything the AI does runs with your account's access, so it only takes requests from your team. Changing or disconnecting the Discord connection is limited to account admins. Other teammates can still talk to Crevio in Discord. ### Connect your server to the AI **1. Open AI assistant settings** In your Crevio dashboard, go to **Settings → AI assistant** and click **Configure** next to **Discord**. **2. Add to a Discord server** Click **Add to a Discord server**. Discord opens and asks which server to add Crevio to. You need the **Manage Server** permission in that server. **3. Approve the permissions** Review the permissions Crevio requests and click **Authorize**. Discord sends you back to Crevio and the server appears in your list. **4. Link your Discord account** If you haven't already, link your own Discord account so Crevio knows who you are. The settings page shows a reminder with a link when your account isn't linked yet. **5. Say hi** Crevio posts a short hello in the server's system messages channel so everyone knows it's there. If it can't post there, or the server has none, it sends the hello to you by DM instead. Then type `@Crevio` in a channel, or `/crevio` followed by your request. Crevio opens a thread and replies there. ### Tips * **Keep going in the thread** — every reply in a thread Crevio started continues the same conversation * **Multiple servers are supported** — connect as many Discord servers as you want to the same account * **DMs when you're in more than one business** — if you belong to several Crevio businesses that each connected Discord, the first time you DM Crevio it asks which business to help with, then answers your message there. It remembers your choice for later DMs. Send `!server` in the DM to pick again * **The same AI everywhere** — Crevio in Discord has the same memory and connected apps as in the web app, Slack, and email ### Rules for one channel Tell the AI how to behave in a single channel and it keeps to it there, and only there. For example, "in #support, keep answers to two sentences". Every later conversation in that channel, including threads under it, follows the rule, while your other channels stay as they were. To change or remove a rule, just tell the AI. ### Approving actions When Crevio needs your OK, it posts a card with **Approve** and **Deny**. The card says in plain words what it wants to do, with the channel and a link to the message it's about. Only teammates who have linked Discord to their Crevio account can answer a card. If anyone else clicks a button, Crevio tells them privately that they need to link their account first, and the action stays waiting. After someone answers, the card shows who did, for example "Approved by @Sam". ### Covering for members who are out Crevio can answer questions for a teammate who is away, so they don't sit unanswered until that person is back. 1. Go to **Settings → AI assistant** and open **Discord**. 2. Under your server, turn on **Cover for members who are out**. From then on, when someone @mentions a member in a channel and that member's Discord custom status says they're out (for example "On vacation", "OOO" or a 🌴), Crevio opens a thread on the question and answers there. It answers only from what your server can already see, says it is covering while they're out, links its sources, and adds a note that the answer may be incomplete. Approvals, HR questions and anything that needs the person's own decision are left for them. Crevio goes by the custom status people set in Discord. Being idle or offline alone doesn't count as away. **Backups.** Tell Crevio who covers for whom, for example *"Dana is Axel's backup while he's away"*. Then, instead of answering, Crevio points the question to the backup and mentions them in the thread. To keep Crevio out of one channel, ask it: *"Don't cover for people in #leadership."* Turn the setting off to stop covering everywhere. ### Bots post under their own name If you've set up named bots in Crevio, such as a Marketer or a Support rep, messages a bot posts to a channel for you show up under the bot's own name and avatar instead of plain **Crevio**. Replies to a specific message and DMs still come from **Crevio**, because Discord only lets the Crevio bot itself send those. ### When Crevio asks you to re-add the bot Your settings page shows a notice in two cases: * **Crevio needs updated permissions.** When Crevio gains a feature that needs a permission your server didn't grant, click **Re-add bot** and add it to the same server again. Your settings for that server stay as they were. * **Crevio is no longer in your server.** Someone removed the bot in Discord, so Crevio can't read or post there and tasks can't deliver to it. Click **Re-add bot** to bring it back. ### Disconnect the AI from a server Go to **Settings → AI assistant**, open **Discord**, find the server, and click **Disconnect**. Crevio stops answering there for your business, and tasks set to deliver to Discord stop posting to that server. You can add it again any time. Crevio leaves the server only when no other Crevio business still uses it there. If you also sell access to the same server, leaving removes the bot for that too. ## Sell access to your server Sell access to your Discord server as a product [experience](/docs/features/experiences). When a customer buys a product that includes a Discord experience, Crevio adds them to your server and assigns the roles you configure. When a subscription is cancelled or an order is refunded, Crevio removes access or changes roles based on your settings. Before you begin, make sure you have: * A Discord server where you have **Manage Server** permissions * A Crevio product with at least one [price variant](/docs/features/pricing) ### Connect your server for paid access **1. Create a Discord experience** In your dashboard, go to **Products**, select a product, and add or edit a price variant. Under **Experiences**, create a new experience and choose **Discord server** as the type. **2. Connect your server** Click **Connect Discord server**. You will be redirected to Discord's authorization page. **3. Select your server** From the dropdown, choose the Discord server you want to connect. Review the permissions Crevio requests (manage roles, kick members, view channels, send messages, and more), then click **Authorize**. **4. Configure roles** Once connected, you will see your server listed. Select the **assignable roles** that should be given to customers when they purchase this product. > [!NOTE] > > Crevio's bot role must be positioned **above** any roles you want it to assign in your Discord server's role hierarchy. If the bot role is below a target role, Discord will prevent the assignment. ### Experience settings After connecting your server, configure the experience: * **Assignable roles** — The roles to give buyers on purchase. You can select multiple roles. * **Event log channel** — Optionally select a text channel where Crevio posts access events (member added, member removed, roles changed). * **Cancellation action** — What happens when a subscription is cancelled or an order is refunded (see below). * **Past due role** — A role to assign when a subscriber's payment is past due, giving you the option to restrict access without fully removing them. ### How roles are assigned on purchase When a customer completes a checkout that includes a Discord experience: 1. Crevio checks if the customer has connected their Discord account. 2. If connected, the customer is automatically added to your Discord server. 3. All **assignable roles** configured on the experience are applied to the customer. 4. An event is logged to your configured event log channel (if set). If the customer has not connected their Discord account yet, they are prompted to do so from their experience access page. Once they connect, access is granted automatically. ### Cancellation actions You choose what Crevio does when a subscription is cancelled or an order is refunded. This is configured per Discord experience. | Action | What happens | | - | - | | **No action** | The customer keeps their server membership and roles. Useful if you want to handle removal manually. | | **Remove role** | Only the assignable roles configured on this experience are removed. The customer stays in the server with any other roles intact. | | **Kick user** | The customer is removed from the server entirely. They can rejoin if they have another invite. | | **Remove all roles** | All roles (except `@everyone`) are stripped from the customer. They remain in the server but lose all role-based access. | > [!TIP] > > The **Remove role** option is best when you sell access to multiple tiers within the same server. It removes only the specific roles tied to the cancelled purchase without affecting access granted by other purchases. ### Your customers' Discord connection For paid access to work, your customers need to connect their Discord account to Crevio: 1. After purchasing a product with a Discord experience, the customer sees a prompt to **Connect Discord**. 2. They authorize Crevio to identify their Discord account and add them to servers on their behalf. 3. Once authorized, Crevio adds them to your server and assigns the configured roles. This is a one-time connection. Once a customer has linked their Discord account, all future Discord-based purchases use the same connection automatically. ## Troubleshooting ### Chatting with your AI > **Crevio doesn't reply when I mention it** > > Check that the server is listed under **Settings → AI assistant → Discord**. Then make sure Crevio can see and post in that channel — check the channel's permissions in Discord. > **Crevio replies that the server isn't connected** > > The server was removed from your account, or was never added. An admin can add it again from **Settings → AI assistant**. > **Crevio ignores my messages but replies to a teammate** > > Your Discord account probably isn't linked, or you aren't a member of the Crevio account the server is connected to. Link Discord in your user settings and ask an admin to check your access under [Team](/docs/features/team). ### Selling access > **The bot cannot assign roles** > > Check your Discord server's role hierarchy. Crevio's bot role must be positioned **above** the roles you want it to assign. Go to your Discord server's **Settings** > **Roles** and drag the bot role higher in the list. > **A customer was not added to the server** > > Verify that the customer has connected their Discord account. If they have not, they will see a connection prompt on their experience page. Also ensure that the Discord experience has a connected server — check the experience settings in your dashboard. > **Cancellation action did not work** > > The cancellation action only fires when Crevio processes a subscription cancellation or refund from [Stripe](/docs/integrations/stripe). If you cancelled the subscription directly in Stripe's dashboard, there may be a short delay. Check that the customer has a connected Discord account — without it, Crevio cannot identify which Discord user to act on. > **I want to connect a different Discord server** > > Disconnect the current server from the experience settings, then click **Connect Discord server** again and select the new server. Existing members from the old server are not automatically removed or migrated. > **Event log messages are not posting** > > Make sure the event log channel is a **text channel** and that the Crevio bot has permission to send messages in that channel. If the channel was deleted or the bot's permissions were changed, update the event log channel setting in Crevio. # Email domain Source: https://crevio.co/docs/integrations/email-domain Send outbound emails from your own domain instead of the default Crevio address. By default, Crevio sends outbound emails (order confirmations, receipts, etc.) from `yoursubdomain@outbound.crevio.co`. You can verify your own domain to send from a professional address like `hello@yourbrand.com`. > [!NOTE] > > Email domains are available on the Pro and Business plans, including domains you buy through Crevio. ## Why use a custom email domain * **Branding** -- Emails come from your domain, not `outbound.crevio.co`. * **Deliverability** -- Emails from a verified domain with proper DNS records are less likely to land in spam. * **Trust** -- Customers recognize your brand in their inbox. ## Default outbound email Every account automatically gets a default outbound email address based on your subdomain: ``` yoursubdomain@outbound.crevio.co ``` This address is used for all outbound emails until you verify a custom email domain. Email domain settings live alongside your [custom domain](/docs/integrations/custom-domain) configuration. ## Emailing new people Your built-in Crevio address is shared with every other business on Crevio that hasn't connected its own domain, so it is meant for people who already know your business: customers, people who signed up or filled in one of your forms, and anyone who has emailed you. To protect everyone's deliverability, the built-in address emails at most **10 new people a day**, meaning people who have never written to you, bought from you or signed up with you. Replies to people who emailed you, and emails to your customers, aren't limited. Once the 10 are used up, further emails to new people aren't sent, and Crevio tells you why. For outreach to new people, such as cold emails or prospecting, connect your own email domain below. Emails from your own domain aren't limited this way. ## Setting up an email domain **1. Go to Custom Domain settings** In your dashboard, navigate to **Settings** > **Custom Domain**. Scroll down to the **Email domain** section. **2. Enter your domain** Type the domain you want to send emails from (e.g., `yourbrand.com`). Click **Verify domain**. **3. Configure DNS records** Crevio displays a set of DNS records that you need to add at your domain registrar or DNS provider. These typically include SPF, DKIM, and DMARC records. **4. Wait for verification** Crevio polls your DNS records automatically. Once all records are verified, your email domain becomes active. **5. Set your from address** After verification, a **From address** field appears. Enter the email address you want to send from (e.g., `hello@yourbrand.com`). The address must use the verified domain. ## DNS records After adding your domain, Crevio shows the required DNS records. You need to add all of them at your DNS provider: | Record type | Purpose | | - | - | | **SPF** | Authorizes Crevio to send emails on behalf of your domain. | | **DKIM** | Adds a cryptographic signature so recipients can verify emails are authentic. | | **DMARC** | Tells receiving mail servers how to handle emails that fail SPF or DKIM checks. | > [!TIP] > > Add all DNS records at once. Your domain moves to **Verified** once both the DKIM and SPF records have propagated. DMARC can still be finishing in the background and doesn't block verification, but add it anyway: it improves deliverability. ## Verification status | Status | What it means | | - | - | | **Pending** | Crevio is waiting for your DNS records to propagate. This can take a few minutes to several hours. A DKIM record on its own isn't enough: the domain stays pending until SPF is confirmed too. | | **Verified** | Your DKIM and SPF records are confirmed and you can send emails from your domain. DMARC may still be finishing in the background -- it doesn't block verification, but keep it in place for the best deliverability. | | **Error** | One or more DNS records are missing or incorrect. Check your DNS configuration and try again. | > [!NOTE] > > A domain that was **Verified** moves to **Error** if its DKIM or SPF record later fails, for example after a DNS change at your provider. While it's in **Error**, emails go out from your default outbound address (`yoursubdomain@outbound.crevio.co`) instead of failing, including mail from [task inboxes](/docs/features/automation#give-a-job-its-own-email-address). Fix the record and the domain returns to **Verified**. ## From address Once your domain is verified, you can configure which email address to send from. The address must use the verified domain: * `hello@yourbrand.com` * `support@yourbrand.com` * `noreply@yourbrand.com` If you do not set a from address, Crevio continues using the default `yoursubdomain@outbound.crevio.co`. ## Removing an email domain To remove your email domain, click **Remove domain** in the email domain settings. This: * Reverts outbound emails to the default `yoursubdomain@outbound.crevio.co` address * Clears the from address setting * Removes the domain from Crevio's email provider > [!NOTE] > > Removing the email domain does not delete the DNS records from your domain registrar. You can clean those up manually if you no longer need them. ## Troubleshooting > **My email domain is stuck in 'Pending'** > > Verification unlocks once both your DKIM and SPF records propagate, so check those first. Use a tool like [MXToolbox](https://mxtoolbox.com) to check if they (and your DMARC record) have propagated. Some DNS providers can take up to 48 hours to propagate changes. > **I only see one TXT record to add** > > Your domain is already set up for email with another service that uses the same email provider as Crevio, for example a Resend account of your own. Before Crevio can send from it, you prove you own the domain: add the single TXT record shown, and Crevio checks it automatically. Once it's confirmed, the domain moves over to Crevio and the usual SPF, DKIM and DMARC records appear. Add those too. Email sent through the other service from that domain stops once the domain moves. The TXT record must be added within 7 days, or you'll need to remove the email domain and add it again. > **Emails are still coming from outbound.crevio.co** > > Make sure your email domain status is **Verified** and you have set a **From address** in the email domain settings. Both are required for emails to send from your domain. > **I get a 'domain mismatch' error when setting the from address** > > The from address must use the exact domain you verified. For example, if you verified `yourbrand.com`, the from address must end with `@yourbrand.com`. Subdomains like `@mail.yourbrand.com` will not work unless you verify `mail.yourbrand.com` as the email domain. # PayPal Source: https://crevio.co/docs/integrations/paypal Connect your PayPal business account so buyers can pay with PayPal at checkout. Connect PayPal and a **PayPal** button appears on your checkout. Buyers pay from their PayPal balance or the card saved in their PayPal account, and the money goes straight into your PayPal business account. Crevio never holds it. You can use PayPal next to [Stripe](/docs/integrations/stripe), or on its own. Using it on its own is the way to get paid if Stripe doesn't support your country. ## Connecting PayPal **1. Go to Settings** In your dashboard, go to **Settings** > **Payments**. **2. Click Connect PayPal** Click **PayPal** to open it, then click **Connect PayPal**. You are sent to PayPal. **3. Sign in or create a business account** Sign in to your PayPal business account, or create one. When PayPal asks, allow Crevio to take payments on your behalf. **4. Return to Crevio** PayPal sends you back to **Settings** > **Payments**. PayPal shows as connected once three things are true: your PayPal email is confirmed, you granted the permissions, and your account can receive payments. Each one has a tick next to it. ## Emails about your PayPal connection Crevio emails the owner of your business when your PayPal connection changes: | Email | When it's sent | | - | - | | **PayPal is connected** | Your PayPal account can take payments through Crevio, and buyers see the PayPal button. | | **Your PayPal account needs one more step** | Your PayPal account is linked but can't take payments yet. The email names the step that's missing: confirming your PayPal email, granting Crevio permission, or a notice in your PayPal account that stops it receiving payments. | | **PayPal was disconnected** | Crevio's access was removed from inside your PayPal account. | You get each email once per change, not every time Crevio checks your account. Clicking **Disconnect** in Crevio doesn't send an email. ## What buyers see | Your setup | Checkout shows | | - | - | | Stripe and PayPal | The PayPal button, then the card form below it | | PayPal only | An email field and the PayPal button | | Stripe only | The card form, as before | Buyers enter their email in your checkout first, so their order, receipt and access go to the address they chose, not necessarily the one on their PayPal account. After they approve the payment in PayPal, they land on your normal order confirmation page. If you have **Collect shipping address** turned on under **Settings** > **Advanced** > **Checkout**, buyers paying with PayPal choose or enter their shipping address inside PayPal, before they approve the payment. The address appears on the order, the same as for card payments. PayPal does not limit it to your allowed countries, so check the country before you post the item. ## Fees PayPal charges its own fees on each sale. They come out of your PayPal account, the same way Stripe's fees come out of your Stripe balance. If your plan includes a Crevio platform fee, it is taken from PayPal sales as well as card sales. ## Refunds and disputes * **Refund from Crevio:** open the order and refund it as you would a card payment. The money goes back to the buyer through PayPal. A full refund removes their access. * **Refund in PayPal:** a refund you make in your PayPal account also shows up on the order in Crevio. * **Disputes:** when a buyer opens a dispute in PayPal, the order shows as **Disputed**. You answer it in PayPal. If the buyer wins, their access is removed. ## Limits * **One-time purchases only.** Subscriptions and payment plans need Stripe. If you only have PayPal connected, buyers can't check out a subscription or payment plan. * **No automatic sales tax on PayPal payments.** Tax is calculated only on card payments through Stripe. Buyers paying with PayPal pay the listed price. * **PayPal's currencies only.** The button appears only when your product is priced in a currency PayPal supports: USD, EUR, GBP, AUD, CAD, CHF, CZK, DKK, HKD, HUF, ILS, JPY, MXN, MYR, NOK, NZD, PHP, PLN, BRL, SEK, SGD, THB and TWD. A product priced in another currency shows no PayPal button. * **PayPal charges your listed price.** The card form can show the price converted into the buyer's currency. PayPal always charges the price and currency you set, and shows that amount to the buyer before they approve. * **Not available in every country.** PayPal doesn't let platforms like Crevio take payments for PayPal business accounts registered in Brazil, India, Israel, Japan, Micronesia or Turkey. This is PayPal's rule, so there's no setting to change it. If your PayPal account is registered in one of these countries, connect [Stripe](/docs/integrations/stripe) instead, where Stripe is available in your country. ## Disconnecting Go to **Settings** > **Payments** and click **Disconnect** in the PayPal section. The PayPal button disappears from your checkout straight away. Past orders and their refunds stay in Crevio. Revoking Crevio's access from inside your PayPal account disconnects it in the same way, and Crevio emails you to say PayPal was disconnected. ## Troubleshooting **"Almost there: finish setting up your PayPal account, then connect it again."** PayPal sent you back, but your account can't take payments through Crevio yet. Check your settings page: a missing tick next to **Email confirmed** means you need to click the link PayPal emailed you. A missing tick next to **Permissions granted** means you closed PayPal before allowing Crevio. Fix it, then click **Continue setup**. **"PayPal doesn't let businesses in your country take payments through Crevio, so your PayPal account wasn't connected."** Your PayPal business account is registered in a country where PayPal doesn't let platforms take payments for you. See the country list under **Limits**. Connect [Stripe](/docs/integrations/stripe) to take card payments instead, where Stripe is available in your country. **"This PayPal account is already connected to another business."** One PayPal account can only be connected to one Crevio business. Disconnect it from the other business first, or use a different PayPal account. **The PayPal button doesn't show on checkout.** Check, in order: PayPal shows as connected in **Settings** > **Payments**; the cart has no subscription or payment plan; the product is priced in one of the currencies listed above. # Slack Source: https://crevio.co/docs/integrations/slack Talk to your Crevio AI directly from Slack — like having an AI coworker in your workspace. The Slack integration lets you chat with your Crevio AI from inside Slack. DM the bot for a private conversation, @mention it in a channel to bring it into a discussion, or reply to its messages in a thread to keep working together. ## What you can do * **DM the bot** for a private back-and-forth — anything you can ask the AI inside Crevio, you can ask it in Slack. A DM is your own conversation: Crevio ties it to you, so it can look back at your private chats when you ask. Threads in a channel belong to the team instead. * **@mention the bot** in any channel to pull it into the conversation * **Reply in threads** the bot is in, and it'll keep the context. When people reply in a thread without mentioning Crevio, it waits until the thread has been quiet for about 30 seconds and then reads all the new replies together, so a quick back-and-forth gets one answer instead of one per message. Mention Crevio to get an answer straight away. * **Edit or delete a message** in a thread Crevio is in, and it works from the corrected version from then on * **Other apps' bots can ask Crevio too.** A bot that @mentions Crevio in a channel gets an answer in the thread. Crevio answers bots without anyone's access, and asks for approval before acting on what a bot asked. If two bots keep mentioning each other, Crevio stops after a few replies an hour. Bots are only answered when everyone, guests included, may use the AI under **Settings → AI assistant**. * **Share files and screenshots** — the bot can read images and documents you drop in ## Connecting your workspace **1. Open integrations** In your Crevio dashboard, go to **Settings → Integrations**. **2. Add to Slack** Click **Add to Slack**. You'll be sent to Slack to choose which workspace to install Crevio into. **3. Approve the install** Review the permissions Crevio requests and click **Allow**. Slack sends you back to your dashboard and the workspace appears in your connected list. **4. Choose channels** Crevio asks which channels it should join. Choose **Invite Crevio to all public channels**, or choose **Select channels**, search, tick the ones you want and click **Invite Crevio**. You can skip this and pick channels later with the **Channels** button next to the workspace in **Settings → AI assistant**. If you leave before picking any, Crevio DMs you a little later with **Join #channel** buttons for your busiest channels. Crevio can't add itself to a private channel: type `/invite @Crevio` in that channel instead. **5. Say hi** In Slack, open a DM with **Crevio** or type `@Crevio` in any channel it's been invited to. Send your first message and the AI will reply. Each teammate who opens Crevio's **Messages** tab for the first time finds a short welcome waiting there. > [!TIP] > > You can also start from Slack's side, before you have a Crevio account. Click **Add to Slack** on [crevio.co/integrations/slack](https://crevio.co/integrations/slack), approve the install, and sign up. Crevio connects the workspace to your new account when you finish signing up, and the bot sends you a welcome DM. ## Signing in with Slack You can also use Slack to sign in to Crevio. Pick **Slack** next to Google, Apple, ChatGPT, and Discord on the sign-in and sign-up pages. If you already signed in with Slack, **Add to Slack** skips Slack's sign-in screen and goes straight to installing the bot in your workspace. During onboarding you can connect Slack before setup finishes, and Crevio brings you back to where you left off. ## Rules for one channel Tell the AI how to behave in a single channel and it keeps to it there, and only there. For example, DM the bot "in #support, keep answers to two sentences" or "whenever you answer in #dev, reply in Polish". Every later conversation in that channel follows the rule, while your other channels and DMs stay as they were. To change or remove a rule, just tell the AI. Rules for your whole business, like a sign-off or words to avoid, still go in your custom instructions under **Settings → AI assistant**. ## Chat commands Type a command as its own word anywhere in a message to Crevio. Commands inside `code` or a > quote are treated as text. | Command | What it does | | - | - | | `!stop` | Stops what Crevio is working on in the thread. Crevio adds a 🛑 and says it stopped. | | `!mute` | Crevio stops answering replies in this channel thread. Mention it again to bring it back. You can also react with 🏁 to one of Crevio's messages. DMs are never muted. | | `!fast` | Answers this one message with less thinking, for quick questions. | | `!deep` | Thinks harder about this one message, for complex work. | `!fast` and `!deep` apply to one reply only. If you use both in one message, neither applies. Anyone on your team who can use Crevio can send these commands. ## Approving actions When Crevio needs your OK, it posts a card with **Approve** and **Deny**. When the card is for a single tool, it also shows **Always approve**: this approves the action and changes that tool's setting, so Crevio stops asking for it next time. Admins can change any tool's setting, and a teammate can change it for an account they connected themselves (unless an admin locked that connection). If someone else clicks **Always approve**, the action is approved once and the setting stays as it was. Some tools, like those that move money or change who has access, always ask, so their card shows a link to your approval settings instead. To change an action's details first (an email's subject or recipients, say), follow **Edit before approving** on the card: it opens the same approval in Crevio, where you edit and approve it. Only teammates who have linked Slack to their Crevio account can answer a card. If anyone else clicks **Approve**, **Deny** or **Always approve**, Crevio replies to them privately that they need to link their account first, and the action stays waiting. After someone answers, the card shows who did, for example "Approved by @Sam". ## Covering for teammates who are out Crevio can answer questions for a teammate who is away, so they don't sit unanswered until that person is back. 1. Go to **Settings → AI assistant** and open **Slack**. 2. Under your workspace, turn on **Cover for teammates who are out**. From then on, when someone @mentions a teammate in a channel and that teammate's Slack status says they're out (for example "On vacation", "OOO" or a palm tree), Crevio replies in the thread. It answers only from what your team can already see, says it is covering while they're out, links its sources, and adds a note that the answer may be incomplete. Approvals, HR questions and anything that needs the person's own decision are left for them. **Backups.** Tell Crevio who covers for whom, for example *"Dana is Axel's backup while he's away"*. Then, instead of answering, Crevio points the question to the backup and mentions them in the thread. A backup named in someone's Slack status works too. To keep Crevio out of one channel, ask it: *"Don't cover for people in #leadership."* Turn the setting off to stop covering everywhere. ## Channels shared with other companies In a Slack Connect channel, people from another company read everything posted there. So the AI doesn't post in one straight away. Its reply first shows up only for the person who asked, as a private preview. 1. Read the preview. 2. Click **Post here** to post it in the channel, or **Reject** to throw it away. Nobody else sees the reply until you click **Post here**. If you're not in the channel, the preview comes to you as a DM instead. Files and edits to earlier messages aren't posted in shared channels at all. Approval cards also go only to the person who asked, and results of tasks set up in a shared channel wait for your **Post here** too. ## Bots post under their own name If you've set up named bots in Crevio -- a Marketer, a Support rep -- their work shows up in Slack under the bot's own name and avatar instead of plain **Crevio**. That covers job results, approval requests, and messages the bot sends for you, so your team can tell at a glance which bot is talking. Everyday chats with the AI still post as **Crevio**. ## Tips * **Invite the bot to channels** you want it in — `/invite @Crevio` from inside the channel * **Introduce Crevio to a teammate** — ask "introduce yourself to Dana" and Crevio DMs them a few ways it can help, each based on something they posted in a channel Crevio is in. The offers usually come as a short welcome PDF in your [brand kit](/docs/features/brand-kit)'s colors, fonts and logo, and nothing starts until they reply with the one they want. Nobody is pitched twice, whether by an introduction or by Crevio's own suggestions for the team. * **The same Crevio account works across platforms** — a chat you start in Slack continues from where you left off in the web app * **Multiple workspaces are supported** — connect as many Slack workspaces as you want, each acts independently * **Give the AI more to work with** — link your other tools through [connected apps](/docs/integrations/connected-apps) so it can take action across your stack from Slack ## Disconnecting Go to **Settings → Integrations**, find the workspace under **Slack**, and click **Disconnect**. The bot will no longer respond in that workspace. You can reinstall any time. ## Troubleshooting **The bot doesn't reply when I DM it.** Make sure the workspace is still connected in your integrations settings. If it is, try removing and re-adding the integration — Slack occasionally invalidates app tokens after workspace changes. **The bot doesn't reply when I @mention it in a channel.** Invite it to the channel first with `/invite @Crevio`. Slack apps can only read messages in channels they've been added to. **Crevio stopped replying in a thread.** Someone may have muted it with `!mute` or 🏁. Mention Crevio in the thread to bring it back. **I clicked Always approve but Crevio still asks.** Only admins, or the teammate who connected the account the action runs on, can change a tool's setting. Ask an admin, or change it in your approval settings. **Clicking Approve says only linked teammates can answer.** Your Slack account isn't linked to a Crevio account yet. Sign in to Crevio with that Slack account, then click the button again. **The AI's reply in a shared channel is only visible to me.** That's the preview for channels shared with other companies. Click **Post here** to post it for everyone. **I get "account isn't linked" when I message the bot.** Sign in to Crevio with the same Slack account you're messaging from — that's how the bot knows who you are. # Stripe Source: https://crevio.co/docs/integrations/stripe Connect your Stripe account to accept payments, manage subscriptions, and handle payouts through Crevio. Crevio uses [Stripe](https://stripe.com) as its payment processor. All paid transactions -- one-time purchases, subscriptions, and invoices -- flow through your Stripe account. You keep full ownership of your Stripe account and customer relationships. ## Connecting your Stripe account **1. Go to Settings** In your dashboard, navigate to **Settings** > **Payments**. **2. Start Stripe onboarding** Click **Connect with Stripe**. You will be redirected to Stripe's onboarding flow. **3. Complete onboarding** If you already have a Stripe account, sign in and select it. Otherwise, Stripe walks you through creating a new account. You will need to provide your business details, bank account information, and identity verification. Stripe asks for your email address itself. Crevio does not fill it in from your Crevio sign-in, so enter the address you want to use to log in to Stripe. It can differ from your Crevio email. **4. Return to Crevio** Once onboarding is complete, you are redirected back to Crevio. Your Stripe account is now connected and you can start accepting payments. > [!NOTE] > > You only need Stripe for paid products. Free products work without a Stripe connection. ## How payments work Crevio uses Stripe's **custom UI checkout mode** to keep the entire payment experience on your website. Buyers never leave your page to complete a purchase. When a buyer checks out: 1. Crevio creates a Stripe Checkout Session in custom UI mode. 2. Stripe's embedded payment form collects card details, billing info, and tax directly within your website. 3. On successful payment, Stripe sends a webhook to Crevio. 4. Crevio creates the order, grants experience access, and sends the buyer a confirmation. Crevio automatically determines the checkout mode based on the items in the cart: | Cart contents | Checkout mode | | - | - | | One-time items only | `payment` mode | | Any subscription or payment plan item | `subscription` mode | > [!WARNING] > > You cannot mix subscription/payment plan and one-time items in a single checkout. Your products are managed in Crevio, and Crevio keeps their copies in Stripe up to date. If you rename a product or change its tax code in your Stripe dashboard, Crevio picks that change up too. Other changes made in Stripe, like a product's description or images, don't show up in Crevio, so make those in Crevio. ## Subscription management Stripe handles all recurring billing for subscription and payment plan products. When a buyer subscribes: * Stripe charges the buyer automatically on each billing cycle (daily, weekly, monthly, quarterly, semi-annual, or annual). * If a payment fails, Stripe retries according to its [smart retry](https://docs.stripe.com/billing/revenue-recovery/smart-retries) schedule. * When a subscription is cancelled or lapses, Crevio automatically revokes the buyer's access to the associated experiences. You can view and manage active subscriptions from the Stripe dashboard. Crevio stays in sync through Stripe webhooks. ### Payment plans [Payment plans](/docs/features/pricing#payment-plan) appear as subscriptions in your Stripe dashboard. Crevio automatically schedules them to end after all installments have been collected, so no action is needed on your part. ### Setup fees When a subscription or payment plan includes a [setup fee](/docs/features/pricing#setup-fees), the fee appears as a separate line item in your Stripe dashboard alongside the recurring charge. The setup fee is collected once, with the first payment. ## Refund handling Refunds are processed through Stripe and reflected in Crevio automatically: * **Full refunds** -- The order status changes to **Refunded** and the buyer's experience access is revoked. * **Partial refunds** -- The order status changes to **Partially refunded**. Experience access is preserved unless you manually revoke it. You can issue refunds from your Stripe dashboard or through Crevio's embedded payment management panel in **Settings** > **Payments**. > [!NOTE] > > If a price variant has limited inventory, refunding an order automatically restores the inventory count. ## Payout configuration Payouts transfer your Stripe balance to your bank account. You can configure your payout schedule from **Settings** > **Payments** in Crevio. Available payout options: | Schedule | How it works | | - | - | | **Daily** | Automatic daily transfers to your bank account | | **Weekly** | Transfers on a specific day of the week | | **Monthly** | Transfers on a specific day of the month | | **Manual** | You trigger payouts manually when you want | You can also request an **instant payout** for immediate access to your funds (subject to Stripe's instant payout eligibility and fees). ## Testing your checkout To see exactly what your customers experience, make a test purchase of your own product: **1. Sign in to Crevio** Use an account that owns or administers the store. **2. Open your product's checkout** A **Test purchase** notice replaces the card form. You won't be charged. **3. Click Complete test purchase** You get access to what you bought and the confirmation email, just like a customer. Your new order email and any automations that run on new orders fire too, marked as a test. This works for free products too. Test orders appear under **Orders** with a **Test** badge. They don't count toward your sales or revenue, and they use up no stock. A test purchase of a subscription or payment plan starts a test subscription that is never billed. You can cancel and resume it from your **Payment history** the same way a customer would, and it renews and ends on schedule. You can refund a test order from **Orders** the same way you refund a real one, in full or in part. No money moves. The order changes to **Refunded** or **Partially refunded**, and a full refund removes the access the test purchase gave you. Refunding a test order doesn't put stock back, because the test purchase didn't use any. There's no separate test mode for your Stripe connection, so test card numbers like `4242 4242 4242 4242` don't work. A test purchase checks everything except the card charge itself, which Stripe handles. Don't test by charging your own card: Stripe's terms don't allow testing with real cards. This works the same on a custom ordering page your site built: open its checkout while signed in to Crevio and you get the test purchase there too. You can also ask Crevio to place a test order on your site for you. It asks for your OK first, then checks what your site did with it. If your site does something of its own when an order comes in, like emailing a kitchen ticket, it hears about test orders as well, marked as tests, so it can send those only to you. > [!NOTE] > > Automations that run on a test order run as test runs: they can read your data but can't send messages or make changes. This applies to Crevio's automations only. Your own site still gets the test order. ## Troubleshooting > **I see 'Charges not enabled' when a buyer tries to check out** > > Your Stripe account onboarding may be incomplete. Go to **Settings** > **Payments** and check for any pending requirements. Stripe may need additional identity verification or banking details before you can accept charges. > **Stripe says 'Welcome back' and asks me to sign in to an account I don't recognize** > > That email already belongs to a different Stripe account. Use the email you want to log in to Stripe with, not necessarily your Crevio email. If you meant to use an existing Stripe account, sign in to it and select it. If you want a new one, start onboarding again and enter a different email. > **Payments are not showing up in Crevio** > > Crevio relies on Stripe webhooks to process payments. If webhooks are misconfigured or Stripe is experiencing delays, there may be a lag. Check your Stripe dashboard's webhook logs for delivery failures. > **I want to switch to a different Stripe account** > > Contact [support@crevio.co](mailto:support@crevio.co) for assistance with reconnecting a different Stripe account. Existing orders and subscriptions are tied to your current Stripe account. # Telegram Source: https://crevio.co/docs/integrations/telegram Connect your Telegram groups and channels to sell paid access with automatic member management. The Telegram integration lets you sell access to Telegram groups and channels as a product [experience](/docs/features/experiences). When a customer purchases, Crevio generates a unique invite link and sends it directly to the customer via Telegram DM. When access is revoked, Crevio can remove or ban the user automatically. ## Setting up the Telegram integration Only account admins can connect, change, or remove Telegram groups and channels. Before you begin, make sure you have: * A Telegram group or channel where you are an admin * The Crevio bot added to your group or channel as an admin * A Crevio product with at least one [price variant](/docs/features/pricing) ## Connecting your Telegram group or channel **1. Create a Telegram experience** In your dashboard, go to **Products**, select a product, and add or edit a price variant. Under **Experiences**, create a new experience and choose **Telegram** as the type. **2. Start verification** Click **Connect Telegram channel**. Crevio generates a unique verification code. **3. Add the bot to your group** Add the Crevio Telegram bot to your group or channel as an **admin**. Then send the verification code as a message in the chat. The bot needs admin privileges to manage members and create invite links. **4. Wait for verification** Crevio automatically detects the verification message and links the chat to your experience. The verification completes within a few seconds. > [!NOTE] > > The verification code expires after 5 minutes. If it expires, click **Connect Telegram channel** again to generate a new one. ## Creating a Telegram experience Once connected, your Telegram experience is ready. You can connect multiple chats (groups and channels) to a single experience -- when a customer purchases, they receive invite links for all connected chats. Configure these settings for each Telegram experience: * **Connected chats** -- The Telegram groups and channels linked to this experience. * **Cancellation action** -- What happens when a subscription is cancelled or an order is refunded. ## How auto invite and remove works ### Granting access When a customer completes a checkout that includes a Telegram experience: 1. Crevio checks if the customer has connected their Telegram account via OAuth. 2. For each connected chat, Crevio creates a **single-use invite link** personalized for the customer. 3. The invite links are sent to the customer via a Telegram DM from the Crevio bot. 4. The customer clicks the link to join the group or channel. ### Revoking access When a subscription is cancelled, an order is refunded, or access is revoked manually, Crevio takes action based on the configured cancellation setting: | Action | What happens | | - | - | | **No action** | The customer stays in the group or channel. Handle removal manually if needed. | | **Remove user** | The customer is removed from the chat but can rejoin if they obtain a new invite link. | | **Ban user** | The customer is kicked and banned from the chat, preventing them from rejoining. | ## Customer OAuth connection For the Telegram integration to work, your customers need to connect their Telegram account to Crevio. This happens through Telegram's OAuth flow: 1. After purchasing a product with a Telegram experience, the customer is prompted to **Connect Telegram**. 2. They authorize Crevio to identify their Telegram account. 3. Once authorized, Crevio sends invite links via DM and manages their access going forward. This is a one-time connection -- once linked, all future Telegram-based purchases use the same connection. ## Managing members You can manage Telegram access for individual customers from your dashboard: * **Add member** -- Manually generate and send invite links to a specific customer. * **Remove member** -- Remove a customer from all connected chats. * **Remove a connected chat** -- Disconnect a specific group or channel from the experience. This does not remove existing members from the chat. > [!TIP] > > If you need to move to a different Telegram group, remove the old chat and connect the new one. Existing members are not automatically migrated -- they will need new invite links. ## Troubleshooting > **The verification code is not being detected** > > Make sure the Crevio bot is in the group or channel **as an admin** before you send the verification code. The bot needs admin privileges to read messages. Also verify that you are sending the exact code (including the `VERIFY_` prefix) as a message in the chat, not as a reply or edit. > **Customers are not receiving invite links** > > The customer must have their Telegram account connected to Crevio. If they have not connected it, they will see a prompt on their experience page. Also confirm that the customer has not blocked the Crevio bot on Telegram -- blocked bots cannot send DMs. > **The bot cannot create invite links** > > Ensure the Crevio bot has the **Create Invite Links** admin permission in your Telegram group or channel. Without this permission, the bot cannot generate access links for customers. > **I removed a connected chat by mistake** > > Reconnect it by clicking **Connect Telegram channel** and sending a new verification code in the chat. Existing members are not affected. # FAQ Source: https://crevio.co/docs/introduction/faq Plain answers to the questions business owners ask most — about the AI, payments, credits, getting started, and getting help. This page covers the questions people ask most. New to Crevio? Start with [Getting started](/docs/introduction/getting-started). Want the big picture? See [How Crevio works](/docs/introduction/how-crevio-works). ## Getting started > **Do I need any technical skills?** > > Not at all. If you can describe what you want in plain words, Crevio can do the work. There's no code, no setup wizards to wrestle with, and no design tools to learn. You talk, it builds. > **How long does it take to get going?** > > A few minutes. You can have a live website and your first product ready in about five minutes — faster if you let Crevio build the first version for you and then tweak it. > **What can I sell on Crevio?** > > Services, bookings, physical goods, and anything digital — online courses, downloadable files, memberships, communities, events, and more. You can bundle several of these into a single product if you like. > **Does Crevio work for my kind of business?** > > Yes. Crevio is built for small businesses, and you don't need to sell anything online. It can get you found, take inquiries, book appointments, send invoices, and follow up with customers. If you already have a website, share its link when you sign up and Crevio starts from what you have. > **What should I do as the business owner each day?** > > Check in on what the AI has done, give feedback on anything you'd change, and point it at the next priority. The clearer you guide it early on, the more it can run on its own. You don't need to log in every day for things to keep moving. ## About the AI > **Can Crevio really build my website?** > > Yes. Describe your business — what you sell, who it's for, the vibe you want — and Crevio builds your website, drafts your first product, suggests a price, and writes the description. You review everything and adjust anything before it goes live. The more detail you give it, the closer it gets on the first try. > **Can it build a full app, not just a website?** > > Yes. Beyond marketing websites, Crevio builds fully functional web apps — a booking tool, a client portal, a members area, a directory, a calculator, an interactive dashboard, and more. You describe what it should do, and Crevio builds the real, working thing and hosts it for you. No code, no separate hosting to set up. > **Will the AI do things without asking me?** > > Not the important stuff. The AI happily handles everyday work on its own, but anything that really matters — refunds, deletions, payouts, sending money — needs your sign-off. You're always the decision-maker. And everything it produces is editable and reversible, so you can change your mind. > **What does the AI cost?** > > The AI works using **credits**. A credit is simply what the AI spends to get things done for you — writing copy, generating images, building pages, answering customers, and so on. Bigger tasks use more credits; small ones use very few. You can see your credit balance and exactly what's been used in your account settings, so there are never surprises. Think of credits as fuel for your AI teammate. > **What can the AI do?** > > Build and edit your products, write descriptions and emails, design and style your website, set pricing, run promotions, deliver content to customers, answer support questions, create images, and help drive traffic — all on your behalf. > **What can the AI not do?** > > Make legal commitments, hire people, or take irreversible actions on your behalf without your explicit approval. It can draft contracts, job posts, and outreach for you, but you stay in charge of the final call. > **What if the AI makes a mistake?** > > Everything the AI produces is editable and changes are reversible. You can roll back content, edit anything directly, or just ask the AI to redo a task with new instructions. Nothing important happens without your approval. > **How do I get the best results from the AI?** > > Be specific. Tell it what you liked, what you didn't, and *why*. Share examples of brands or products you admire. The more it knows about your taste, your customers, and your goals, the faster it lands on work you'd actually ship. > **Can the AI run ads and marketing for me?** > > It can write ad copy, plan campaigns, generate creative, and recommend budgets. You connect your ad accounts and approve the spend — the AI does the work inside them. ## Payments & money > **How do I get paid?** > > You connect a Stripe account, the trusted service that securely handles payments. When customers buy, the money goes straight to your Stripe account. See [Getting started](/docs/introduction/getting-started#connect-stripe-to-get-paid) for the quick setup. > **Do I need Stripe to start?** > > Only if you want to charge. Free products work without it, so you can set everything up and connect Stripe whenever you're ready to take payments. > **What can I charge for?** > > One-time payments, subscriptions, pay-what-you-want, or free. You can even offer several pricing options on the same product — like a monthly and a yearly plan. > **Is my payment info safe?** > > Yes. Payments are handled directly by Stripe and never stored on Crevio's servers. Stripe is used by millions of businesses worldwide. ## Your plan & account > **Where do I manage my plan and credits?** > > In your [account settings](https://crevio.co/app/dashboard). You'll find your plan, your credit balance, and a breakdown of how credits have been used. See [Your account & settings](/docs/features/settings) for a tour. > **What happens if I cancel my subscription?** > > Your site pauses and your data is preserved. You can resubscribe anytime and pick up right where you left off — nothing is deleted automatically. > **Can I add my team?** > > Yes. You can invite teammates and choose what they can access, so others can help run your business. See [Your account & settings](/docs/features/settings#your-team). ## Results & expectations > **How long until I see my first sale?** > > Your website can be live within minutes. First-sale timing depends on how many people already know you and how much you promote — businesses with existing customers or a following often see sales the same day, while newer ones usually see early traction within a couple of weeks once content and marketing are flowing. > **Should I micromanage the AI?** > > No. Give it high-level direction and let it execute. Step in when something is clearly off-brand or wrong, but otherwise trust it. Feedback like "this missed the mark because X" teaches it faster than rewriting things yourself. ## Safety & support > **Is my data safe?** > > Yes. Your data is encrypted, payment details are handled by Stripe and never stored on Crevio, and we don't share your data with third parties. You can delete your account and all its data at any time. > **How do I get help if I'm stuck?** > > Start with the AI assistant inside the app — it knows your business and can fix most things on the spot. For anything it can't resolve, email [support@crevio.co](mailto:support@crevio.co) and a human will help. > **How do I report a bug or request a feature?** > > Tell the AI inside the app — it can capture the details for you. Or email [support@crevio.co](mailto:support@crevio.co) with what happened. Many Crevio features came straight from customer requests. # Getting started Source: https://crevio.co/docs/introduction/getting-started Two ways to launch: ask Crevio to build it for you, or set it up step by step. Either way, you can be selling in minutes. There are two ways to get going with Crevio, and you can mix and match them freely: 1. **Just ask.** Tell Crevio what your business does and let it build your website (or a full web app), your first product, and your pricing for you. 2. **Do it yourself.** Click through the steps below at your own pace. Most people start by asking, then fine-tune the details by hand. The whole thing takes about five minutes either way. > [!NOTE] > > You don't need to know any of this upfront. If you ever feel stuck, type what you want into the chat with Crevio and it will take it from there. ## The fastest way: just ask Crevio This is the shortcut. Once your account is created, open the chat and describe your business in plain words. For example: > "I teach watercolor painting. Build me a website and create a \$49 beginner course." Crevio will set up your website, draft the product, suggest a price, and write the description — all for you. Then you review it, tweak anything you like, and publish. You stay in control: nothing goes live until you're happy with it. > [!TIP] > > The more you tell Crevio — who your customers are, the vibe you want, examples you admire — the closer it gets on the first try. Talk to it like you'd brief a helpful assistant. ## Before you begin To get started you'll need: * An email address to create your Crevio account. * A [Stripe account](https://stripe.com) if you plan to charge for things. You can start with free products and connect Stripe later — there's no rush. ## Set up your account **1. Sign up** Go to [crevio.co](https://crevio.co) and create your account. You can use your email, or sign in with Google, Apple, ChatGPT, Discord, or Slack. Once you're signed in, visiting [crevio.co](https://crevio.co) takes you straight to your dashboard. **2. Name your business** Pick a name for your business — this is what customers will see. You'll also get a free web address at `yourname.crevio.app` that becomes your website. **3. Tell Crevio about your business** During setup, describe what your business does and who your customers are. Already have a website? Choose **Grow my business** and paste its link instead. This is where the AI gets to work: it uses what you share to start building your website and setting up what you offer. The clearer you are, the better the starting point. ## Set up your website Your website is your home base, where customers browse and buy. Crevio builds it for you from what you shared during setup: the pages, the design, the words and your products. To change anything, ask Crevio in the chat: "Add an FAQ section", "Make the homepage feel warm and minimal", or "Match the style of my Instagram." See [Your AI website & apps](/docs/features/sites) for how building, previewing and publishing work. Your site goes live at `yourname.crevio.app` when you or Crevio publishes it. You can [connect your own custom domain](/docs/integrations/custom-domain) later. ## Create your first product A product is anything you sell. Each one has a name, a description, some images, and at least one price. You can ask Crevio to create it for you, or build it manually. **1. Go to Products** In your dashboard, open **Products** and click **New product**. (Or just ask Crevio: "Create a product for my coaching package.") **2. Add the details** Give it a name and description, and add cover images. Crevio can write the description and even generate images for you if you ask. **3. Set a price** Every product needs at least one price. Choose what fits: * **Free** — No charge. Great for freebies and lead magnets. * **One-time payment** — A single charge, like \$29. * **Subscription** — Recurring billing (weekly, monthly, yearly, and more). * **Pay what you want** — Let customers choose, within a range you set. You can offer more than one price for the same product — for example, a monthly and a yearly option. **4. Choose what customers get** Connect what buyers receive after paying — a course, downloadable files, a Discord invite, an event, and more. See [How Crevio works](/docs/introduction/how-crevio-works) for the full list. **5. Publish** When it looks right, set the product to **Active**. It goes live on your website, ready to buy. ## Connect Stripe to get paid To accept payments, connect a Stripe account. Stripe is the trusted service that securely handles the money side — your earnings go straight to your Stripe account. **1. Open your payment settings** Go to **Settings** then **Payments** in your dashboard. **2. Connect with Stripe** Click **Connect with Stripe** and follow the prompts. Already have a Stripe account? Connect it directly. New to Stripe? It walks you through creating one. **3. Start selling** Once connected, you're ready. Crevio sets up everything behind the scenes, and payments flow into your Stripe account. > [!NOTE] > > Free products work without Stripe. You only need it when you want to charge. ## Share your link and start selling Every product comes with links you can share anywhere: * **Your website** — `yourname.crevio.app`, the page that shows everything you sell. * **A product page** — a direct link to one product. * **A checkout link** — sends people straight to payment, skipping the browsing. * **A QR code** — automatically created for each product, great for print and presentations. > [!TIP] > > Pop your website link on social, in your email signature, and anywhere you reach customers. And remember — you can always ask Crevio to write your launch posts and announcement emails for you. ## Next steps > **[How Crevio works](/docs/introduction/how-crevio-works)** > > Understand the simple pieces — your account, products, customers, and the AI that runs it all. > **[Common questions](/docs/introduction/faq)** > > Answers about the AI, payments, credits, and getting help. > **[Your account & settings](/docs/features/settings)** > > Set your business profile, currency, support email, team, and plan. > **[Connect Stripe](/docs/integrations/stripe)** > > Get set up to accept payments. # How Crevio works Source: https://crevio.co/docs/introduction/how-crevio-works The simple mental model: your account, your website, your products, your customers — and an AI that does the work. You can just ask it. **Crevio is an AI that runs your business — and you talk to it in plain words.** Underneath, your business is made of a few simple pieces. You don't have to manage them all by hand. Most of the time, you describe what you want and Crevio does it. Here's the whole picture in one breath: you have an **account** (your business), which has a **website or app** (where customers find you), filled with **products** (what you sell or offer — digital goods, courses, memberships, services, bookings), for your **customers** (the people you serve) — and an **AI assistant** that can build, change, and run any of it for you. ## The assistant is the heart of it The most important thing to understand isn't a feature — it's how you work. Instead of clicking through menus, you can just ask. * "Build me a website for my photography presets." * "Create a \$19 monthly membership and write the description." * "Run a 20% off sale this weekend and announce it." * "Reply to this customer and offer them a refund." * "Make me three social posts for my new course." The AI has full context on your business, so it knows what you sell and who your customers are. It does the work, shows you the result, and waits for your go-ahead on anything important. You stay the decision-maker; it does the heavy lifting. > [!NOTE] > > Anything you can do by clicking around the dashboard yourself, you can also just ask Crevio to do. Use whichever feels easier in the moment. ## The pieces of your business > **Your account** > > Your **account** is your business on Crevio. Everything — your products, customers, orders, and website — lives inside it. > > It comes with a free web address (like `yourname.crevio.app`) for your website, and you can connect your own custom domain. You can also invite teammates to help run things. > **Your website or app** > > Your **website** is the page where people browse and buy. It's live the moment you sign up. > > You can keep it as a simple one-page site, ask Crevio to design a full website, or have it build a fully functional **web app** — a booking tool, a client portal, a members area, whatever your business needs. Your description in, a real, working product out. Either way, it's your home on the web. > **Your products** > > A **product** is what you sell or offer — a digital download, a course, a membership, an event, or a service. It has a name, description, images, and at least one price. Products can be a work in progress (**Draft**), live for sale (**Active**), or hidden away (**Archived**). > > A single product can have more than one price — for example, a monthly and a yearly option — and each price can unlock different things. > **What customers get** > > When someone buys, they get access to something — that's what you actually deliver. It might be a course, files to download, a Discord invite, an event, and more. You connect these to your product, and Crevio hands them over automatically the moment a payment goes through. > > A handy way to think about it: the **product** is what you sell, and the access is what you **deliver**. See the [full list below](#what-you-can-deliver). > **Your customers** > > A **customer** is anyone who interacts with your business. They come in three flavors: > > * **Lead** — someone who gave you their email (say, for a freebie) but hasn't bought yet. > * **Free** — a signed-up user who hasn't paid. > * **Paid** — someone who has bought at least one thing. > > You can tag them, see their history, and manage what they have access to. Or just ask Crevio to do it. > **Orders** > > An **order** is created whenever a customer completes a purchase. It records what they bought and grants their access automatically — no manual delivery needed. > > Orders can be successful, pending, failed, refunded, or disputed, and you can see every one in your dashboard. ## How it all connects Here's the journey from idea to a happy customer: **1. You describe what you want** Tell Crevio what you sell. It can build your website and draft your first product for you — or you can set them up yourself. **2. You set a price (or a few)** Decide what to charge — a one-time price, a subscription, pay-what-you-want, or free. Each price can unlock different things for the buyer. **3. You choose what they get** Connect what customers receive after paying — a course, downloads, a community, an event, and so on. **4. A customer buys** Someone visits your website or a checkout link, picks an option, and pays through the secure checkout. **5. Access is granted automatically** Crevio records the order and instantly gives the customer everything they paid for. You don't lift a finger. ## What you can deliver These are the things you can give customers when they buy. You can combine several into one product — for example, a course plus a Discord community plus a downloadable workbook. | You can deliver | What it is | | - | - | | **Course** | A structured lesson experience with chapters and lessons. Supports video, text, and files, plus progress tracking and completion certificates. | | **Digital download** | Any files customers download after buying — PDFs, templates, presets, archives, and more. | | **Written content** | Articles or guides delivered inside Crevio. Great for tutorials, playbooks, and exclusive writing. | | **Discord server** | Automatically add and remove buyers from your Discord server or roles. Perfect for paid communities. | | **Telegram group** | Manage paid access to a Telegram group. Members are added on purchase and removed if they cancel or refund. | | **Event** | Sell access to live or scheduled events — webinars, workshops, or virtual meetups. | | **Forum** | A community space hosted on Crevio where customers post, comment, and connect. | | **Link** | A simple redirect to somewhere else — handy for granting access to an outside tool or page. | | **Website embed** | Show an external website or app right inside Crevio. | > [!TIP] > > Not sure how to package something? Ask Crevio: "What's the best way to sell my workshop plus a workbook?" It'll suggest a setup and build it if you like. ## Your website Every account gets a website at `yourname.crevio.app`, built by Crevio from your description and changed whenever you ask. It's the hub of your business on the web. See [Your AI website & apps](/docs/features/sites). Share the link on social, in your emails, and anywhere you connect with customers to send people to your products. And when you're ready, [connect a custom domain](/docs/integrations/custom-domain) to use your own web address. ## Next steps > **[Getting started](/docs/introduction/getting-started)** > > Launch your website and first product in about five minutes. > **[Products](/docs/features/products)** > > Learn how to create and manage what you sell. > **[Your account & settings](/docs/features/settings)** > > Set up your profile, currency, support email, team, and plan. > **[Common questions](/docs/introduction/faq)** > > Answers about the AI, payments, and credits. # What every status means Source: https://crevio.co/docs/reference/statuses The exact meaning of every status label in Crevio — orders, products, customers, site versions, domains, posts, emails and more, plus the pairs people mix up. Crevio uses the same status words in a lot of places, and a few of them look alike. This page is the full list, so you never have to guess whether **archived** means the same thing as **deleted**. (It doesn't.) ## The four that get mixed up Get these right and the rest follow. | These look similar | But | | - | - | | **Draft** vs **archived** | A draft has never been live. An archived thing was live and has been taken down. Both are hidden from customers; only one has history. | | **Failed** vs **refunded** | A failed payment never took any money. A refunded payment took money and gave it back. Nothing to return on a failure. | | **Paused** vs **cancelled** | Pausing stops the work. Cancelling stops the billing. They are separate actions — see [account states](#your-account). | | **Superseded** vs **failed** | A superseded site version was live and got replaced by a newer one. A failed version never went live at all. | ## Orders | Status | What it means | | - | - | | **Pending** | Payment started but hasn't confirmed yet. | | **Succeeded** | Paid. Access has been granted automatically. | | **Failed** | The payment didn't go through. No money was taken, so there's nothing to refund. | | **Refunded** | You returned the full amount to the customer. | | **Partially refunded** | You returned part of the amount. | | **Disputed** | The customer's bank has raised a chargeback against the payment. | See [orders](/docs/features/orders) and [refunds](/docs/features/refunds). ## Products | Status | What it means | | - | - | | **Draft** | A work in progress. Not visible to customers and not buyable. | | **Active** | Live and for sale. | | **Archived** | Taken off sale. Existing customers keep the access they already bought. | ## Customers | Type | What it means | | - | - | | **Lead** | Gave you an email address but never created an account. | | **Free** | Signed up, hasn't paid for anything. | | **Paid** | Has bought at least one thing. | These update on their own as people move through. See [customers](/docs/features/customers). ## Your website's versions Every time your site is published, it's recorded as a version. | Status | What it means | | - | - | | **Pending** | Queued, about to start. | | **Building** | Being built right now. Your current live version is still serving. | | **Live** | This is what visitors see. Exactly one version per site is live at a time. | | **Failed** | It didn't build. Nothing changed — your previous version is still live. | | **Superseded** | It was live, and a newer version replaced it. | | **Unpublished** | It was live, and the site has since been taken down. | The important one: **a failed version cannot replace a live one.** If a publish fails, your site keeps serving the last version that worked. See [my changes aren't showing](/docs/troubleshooting/changes-not-live). ## Domains A custom domain has a status for the web and, if you use it for email, separate ones for sending and receiving. | Status | What it means | | - | - | | **Pending** | Waiting for your DNS records to be visible to us. | | **SSL pending** | DNS checks out. The security certificate is being issued. | | **Active** | Working. Your site serves on it over HTTPS. | | **Error** | Something's wrong with the records. Check the exact record list in your dashboard. | If you bought the domain through Crevio, it also has a purchase status: **pending payment**, **registering**, **registered**, or **failed**. See [my domain isn't live yet](/docs/troubleshooting/custom-domain-not-live). ## Invoices | Status | What it means | | - | - | | **Open** | Sent, not yet paid. | | **Paid** | Settled. | | **Past due** | Sent, unpaid, and past its due date. | | **Void** | Cancelled. It can't be paid. | ## Checkouts A checkout is a cart in progress. Most of these you'll only see in analytics. | Status | What it means | | - | - | | **Open** | In progress right now. | | **Complete** | Finished and paid. It produced an order. | | **Abandoned** | The customer left without paying. | | **Expired** | It timed out before payment. | ## Marketing emails A broadcast is one email sent to many people. | Status | What it means | | - | - | | **Draft** | Being written. Nothing has been sent. | | **Scheduled** | Queued to go out at a set time. | | **Sending** | Going out right now. | | **Sent** | Finished sending. | | **Canceled** | Stopped before it went out. | | **Failed** | The send couldn't complete. | Each individual message then has its own status: **received**, **queued**, **sent**, **delivered**, **bounced**, **complained**, or **failed**. **Bounced** means the address doesn't accept mail. **Complained** means the recipient marked it as spam. Both suppress that address automatically so you don't keep mailing it — along with anyone who **unsubscribed**. See [email marketing](/docs/features/email-marketing). ## Social posts | Status | What it means | | - | - | | **Draft** | Written, not scheduled or sent. | | **Scheduled** | Queued for a set time. | | **Publishing** | Being posted right now. A post with several photos or a video can take up to a couple of minutes. | | **Posted** | Live on the platform. | | **Failed** | The platform rejected it. | | **Disconnected** | Couldn't post because the account is no longer connected. Reconnect it and try again. | Connected social accounts are **active**, **inactive**, or **error**. An account in **error** has usually had its permission expire or be revoked on the platform's side — reconnecting fixes it. See [a connected app stopped working](/docs/troubleshooting/connection-stopped-working). ## Bookings | Status | What it means | | - | - | | **Pending** | Requested, not yet confirmed. | | **Confirmed** | On the calendar. | | **Cancelled** | Called off. | | **Completed** | It happened. | | **No show** | The attendee didn't turn up. | ## Automations Each run of a scheduled or triggered automation records its own result. | Status | What it means | | - | - | | **Pending** | Queued, not started. | | **Running** | In progress. | | **Completed** | Finished. | | **Failed** | Stopped on an error. Running out of credits is recorded here. | | **Needs input** | Paused, waiting on you to approve or answer something. | | **Timed out** | Still going after four hours, so it was stopped. It never finished — that's different from failing. | A run marked **Test** was a rehearsal: it did the work but sent nothing, and it doesn't count towards the job's history. See [automations](/docs/features/automation). ## Your account | Status | What it means | | - | - | | **Active** | Normal. | | **Paused** | Temporarily stopped. | | **Inactive** | Closed. | | **Suspended** | Stopped by us. Contact support to find out why and what lifts it. | **Anything other than active takes your Crevio-hosted pages offline** — your website at `crevio.co/`, your product pages, and your blog all stop serving to visitors. Your data is untouched and comes back when the account does. Pausing is not the same as cancelling your subscription. See [my site or store is offline](/docs/troubleshooting/site-or-store-offline). # Automation Source: https://crevio.co/docs/tips/automation Automate your workflows with webhooks, the API, and built-in integrations The simplest way to automate your business is to **just ask Crevio.** Describe a job — "every Monday, draft and schedule my posts" or "when someone buys, send a thank-you email" — and Crevio runs it for you, on a schedule or whenever something happens. You choose how much freedom it has and how it reports back. > [!TIP] > > For the full guide to hands-off automation — recurring jobs, event triggers, approval levels, and staying in control — see [Put your business on autopilot](/docs/features/automation). The rest of this page covers more advanced, developer-style options like webhooks and the API. ## Webhook-powered workflows [Webhooks](/docs/developer/guides/webhooks) let you react to events in real time. When something happens in Crevio, your server gets notified. ### Common automations | Event | Automation idea | | - | - | | `order.paid` | Send a custom welcome email, add to your CRM, or trigger a Slack notification | | `customer.created` | Add the customer to your email marketing tool | | `invoice.past_due` | Send a reminder or flag the account in your system | | `product.updated` | Sync product data to your external website | > [!TIP] > > Crevio has [3,000+ built-in integrations](/docs/integrations/connected-apps) that your AI assistant can use directly. For advanced webhook-based workflows, you can also use services like Zapier or Make. ## API automation The [Crevio API](/docs/developer/guides/api-overview) lets you programmatically manage your business: * **Bulk customer creation** -- import customers from another platform * **Dynamic pricing** -- update price variants based on external factors * **Order reporting** -- pull order data into your own analytics system * **Automated discounts** -- create and manage discount codes programmatically ```typescript theme={null} import { Crevio } from "@crevio/sdk"; const crevio = new Crevio({ security: { apiKey: "YOUR_API_TOKEN" }, }); // Create a time-limited discount await crevio.discounts.create({ code: "FLASH50", discountType: "percent_off", percentOff: 50, maxRedemptions: 100, redeemBy: "2026-03-01T00:00:00Z", }); ``` ## Discord and Telegram auto-management Both integrations run automatically once configured: ### Discord * **On purchase**: Customer is added to your server and assigned the configured role * **On cancellation**: The configured action runs (remove role, kick, etc.) * No manual member management needed ### Telegram * **On purchase**: Customer receives an invite link via the Crevio bot * **On cancellation**: Customer is removed or banned based on your settings > [!NOTE] > > Both integrations require the customer to connect their account via OAuth. Prompt them during onboarding or on their order confirmation page. ## Scheduled publishing Use the blog's [scheduled publishing](/docs/features/blog#scheduled-publishing) to maintain a consistent content cadence: 1. Write multiple blog posts in advance 2. Set each one to publish at a specific date and time 3. Crevio automatically publishes them on schedule This keeps your website fresh and helps with SEO without requiring you to be online at publish time. # Boost your sales Source: https://crevio.co/docs/tips/boost-sales Practical, proven strategies to increase conversions, raise average order value, and grow revenue on your Crevio website. ## Use checkout links for direct purchases Skip the browsing step entirely. Create a [checkout link](/docs/features/checkout#checkout-links) for a specific price variant and share it directly in emails, social posts, or DMs. Customers land straight on the payment page. > [!TIP] > > Each checkout link comes with a QR code. Print it on business cards, event banners, or slides for instant mobile checkout. ## Pre-apply discount codes When creating a checkout link, attach a [discount](/docs/features/discounts) directly. Customers see the reduced price without entering a code -- reducing friction at the point of sale. ## Create urgency with limited discounts Set constraints on your discount codes to drive action: * **Max redemptions** -- limit a code to 50 uses so customers feel urgency * **Expiration dates** -- set a `redeem_by` date for time-limited promotions * **Combine both** -- "First 20 customers get 30% off, valid this week only" ## Cross-sell related products Each price variant can recommend up to 2 related products during checkout. When a customer is already committed to buying, they're more likely to add related items. **1. Edit your price variant** Go to the product's pricing section. **2. Add cross-sells** Select up to 2 related products to recommend during checkout. ## Optimize pay-what-you-want pricing When using pay-what-you-want, set your **preset amount** slightly above the minimum. Most customers anchor to the preset value. | Setting | Recommended approach | | - | - | | Minimum amount | Set to your floor price (e.g., \$5) | | Preset amount | Set 20-40% above minimum (e.g., \$8) | | Maximum amount | Leave blank or set high to not limit generous buyers | ## Use a waitlist for limited or high-touch offers For a cohort, coaching program or community with limited places, turn on [approvals](/docs/features/waitlists) so buyers apply instead of buying. This lets you: * Choose who gets in, using the answers to your questions * Make the offer feel selective, without chasing payment later: a paid buyer's card is saved when they apply and charged when you approve * See how many people want in before you open more places ## Offer free trials on subscriptions For subscription products, add a free trial period. This lowers the barrier to entry and lets customers experience your content before committing. > [!NOTE] > > Free trials require a connected Stripe account. Customers enter payment details upfront but aren't charged until the trial ends. # Content delivery best practices Source: https://crevio.co/docs/tips/content-delivery Get the most out of Crevio's experience types for delivering content to customers [Experiences](/docs/features/experiences) are how you deliver content and access to buyers after purchase. These best practices help you get the most out of each type. ## Courses Structure your courses for completion: * **Keep chapters focused** -- each chapter should cover one topic * **Use progress tracking** -- students can see their completion percentage, which motivates them to finish * **Add multiple instructors** -- for team-taught courses, assign instructors to provide credibility * **Order lessons logically** -- arrange content from foundational to advanced > [!TIP] > > Monitor lesson completion rates in your [analytics](/docs/features/analytics). If students drop off at a specific lesson, consider restructuring or breaking it into smaller pieces. ## Digital downloads * Keep individual files under **2 GB** -- this is the per-item limit * Use clear file names so customers know what they're downloading * Group related files into a single download experience for a cleaner delivery ## Discord communities Connect your server through the [Discord integration](/docs/integrations/discord#sell-access-to-your-server), then choose the right cancellation action for your community: | Action | Best for | | - | - | | No action | Lifetime access communities | | Remove role | Tiered access where you want members to stay but lose premium channels | | Kick user | Subscription communities where access should fully end | | Remove all roles | Clean break when a customer has multiple product roles | > [!NOTE] > > Customers must connect their Discord account via OAuth to receive automatic role assignment. Remind them in your onboarding. ## Telegram groups Set up the [Telegram integration](/docs/integrations/telegram) to automate member management, then: * Use the auto-invite flow so customers don't need to find your group manually * For multiple tiers, create separate Telegram groups per [price variant](/docs/features/pricing) * Enable automatic removal on cancellation to keep your group exclusive ## Access types Use **Secret** (default) for content that each customer should access individually. Use **Open** for team-shared resources where all team members need access. ## Seat-based access Use seat quantity when selling team licenses or group packages. Each seat generates a separate access token that can be claimed by a different person. ## Time-limited access Set **revoke after days** on a price variant to automatically remove access after a period. Good for: * Time-limited courses (e.g., 90-day boot camps) * Trial access to premium content * Seasonal or event-based content # Your guide to success Source: https://crevio.co/docs/tips/playbook A simple build-market-sell journey that turns Crevio into a business that runs itself -- from your first website to steady, growing income. You don't need a team, a tech stack, or years of experience to build something real. You need a clear path. This is it: a **Build → Market → Sell** journey that strings Crevio's features into one continuous flow, with one big idea running through all of it -- whenever you're not sure how to do something, **you can just ask Crevio.** Work through these stages in order. Each one links to a help article so you can go as deep as you like. ## Stage 1: Build your foundation This is where you go from idea to a real website with something to sell. **1. Get your website online** Describe your business and let Crevio build your website for you. You get a live website from day one. Start with [Getting started](/docs/introduction/getting-started), then make it yours with [your AI website](/docs/features/sites). **2. Add your products** Create what you're actually selling -- a service, a booking, a physical item, a course, or a download. Each product gets a price and the thing the customer receives. See [Products](/docs/features/products) and [Experiences](/docs/features/experiences). **3. Decide how you'll charge** One-off price, recurring subscription, free trial, payment plan, or pay-what-you-want -- pick what fits. See [Pricing](/docs/features/pricing) and [Subscriptions & recurring payments](/docs/features/subscriptions). **4. Get ready to receive money** Connect your payment account so your earnings flow to your bank. See [Getting your money (payouts)](/docs/features/payouts). > [!TIP] > > Stuck on what to sell or how to price it? Ask Crevio. Tell it about your business and your customers, and it'll suggest products and prices to start with. ## Stage 2: Market and find customers A great website with no visitors makes no sales. This stage is about getting in front of people. **1. Build your email list** Email is the channel you own. Collect subscribers and send broadcasts. See [Email marketing](/docs/features/email-marketing). **2. Show up on social media** Post consistently across your social channels -- and let Crevio write and schedule it for you so you stay visible without the grind. **3. Run ads when you're ready** Once something is selling, put fuel on the fire with paid ads to reach new people fast. **4. Get found on Google** Make your website easy to discover in search. See [Improve your SEO](/docs/tips/seo). > [!TIP] > > You don't have to be a marketer. Ask Crevio to "write a week of social posts about my new course" or "draft a launch email" -- and it does the heavy lifting. ## Stage 3: Sell more, automatically Now you turn visitors into buyers, and one-time buyers into loyal customers -- with less and less effort over time. **1. Make buying effortless** A smooth checkout and the right nudges convert browsers into buyers. See [Checkout](/docs/features/checkout) and [Boost your sales](/docs/tips/boost-sales). **2. Build trust with reviews** Collect reviews from happy customers and show your best ones on your product pages. See [Product reviews](/docs/features/reviews). **3. Use discounts to drive action** A well-timed offer creates urgency and closes sales. See [Discounts](/docs/features/discounts). **4. Automate your follow-ups** Welcome new buyers, recover abandoned carts, and ask for reviews -- all on autopilot. See [Automation](/docs/tips/automation). **5. Earn repeat income** Turn one-off sales into recurring revenue with memberships and subscriptions. See [Subscriptions & recurring payments](/docs/features/subscriptions). ## Stage 4: Analyze and improve The businesses that grow are the ones that pay attention. Small, steady improvements compound. **1. Watch what's working** See your revenue, your best products, and where your visitors come from. See [Analytics](/docs/features/analytics). **2. Ask Crevio what to do next** Tell Crevio your numbers and your goal -- "I want to double my monthly income" -- and let it suggest where to focus. **3. Repeat the loop** Double down on what's selling, fix what isn't, and keep marketing. Growth is a habit, not a one-off. > [!NOTE] > > You're never doing this alone. Crevio is built to run your business with you -- the more you ask it to handle, the more time you get back to create. ## Related > **[Getting started](/docs/introduction/getting-started)** > > Go from zero to a live website in minutes. > **[Boost your sales](/docs/tips/boost-sales)** > > Practical ways to turn visitors into buyers. > **[Automation](/docs/tips/automation)** > > Let Crevio handle the repetitive work for you. > **[Email marketing](/docs/features/email-marketing)** > > Build the customer list that powers your growth. # SEO optimization Source: https://crevio.co/docs/tips/seo Improve your search engine visibility on Crevio — optimize product, blog, and website SEO to rank higher and attract more organic buyers. ## Product SEO Every product has customizable SEO fields under the SEO section: | Field | Guideline | | - | - | | Title | Keep under 60 characters. Include your primary keyword. | | Description | Keep under 160 characters. Write a compelling summary. | > [!TIP] > > If you leave SEO fields empty, Crevio uses your product name and description as defaults. Custom SEO lets you target specific search terms. ## Blog SEO Your [blog](/docs/features/blog) is a content marketing engine. Use it strategically: * **Publish consistently** -- search engines reward fresh content * **Use categories** -- organized content helps search engines understand your site structure * **Set indexability** -- toggle indexability off for internal or draft-quality posts that shouldn't appear in search results * **Add social media images** -- these appear in link previews on social platforms and drive click-through ### Featured images Each blog post supports two image types: * **Featured image** -- displayed on your blog listing and at the top of the post * **Social media image** -- used in Open Graph and Twitter card previews when your post is shared ## Website SEO Your website page has its own SEO settings (title and description). This is the page search engines find at `yourname.crevio.app`. * Set a clear, keyword-rich title that describes what you sell * Write a description that communicates your value proposition in under 160 characters ### Ask Google to find your site Connect Google Search Console in **Customize** > **Connectors**, then ask Crevio, for example *"tell Google about my new site"* or *"ask Google to index my new pricing page"*. Through that connection Crevio can submit your sitemap, ask Google to look at a page again after you change it, and check whether a page is in Google yet. You don't need to sign in to Search Console yourself. Submitting only asks Google to visit. Google decides when, and whether, a page shows up in results, and that can take days. Bing has no connection: Crevio gives you the steps to submit your sitemap in Bing Webmaster Tools with your own login. ## Custom domains Using a [custom domain](/docs/integrations/custom-domain) instead of the default subdomain improves SEO: * Builds domain authority under your own brand * Looks more professional in search results * Avoids sharing domain reputation with other businesses > [!NOTE] > > Custom domains get automatic SSL certificates, so your site is served over HTTPS -- a ranking factor for search engines. You can also set up a custom [email domain](/docs/integrations/email-domain) to send outbound emails from your own domain (e.g., `hello@yourbrand.com`), which improves deliverability and brand recognition. ## General tips * Use descriptive product slugs (e.g., `/complete-react-course` not `/product-123`) * Write unique descriptions for each product -- avoid duplicate content * Link between your blog posts and product pages to build internal linking * Share your content on social media to generate backlinks # My changes aren't showing Source: https://crevio.co/docs/troubleshooting/changes-not-live Why a change you asked for hasn't appeared on your live site yet, and how to tell a slow publish from a failed one. You asked Crevio to change something, it said it was done, and your site looks the same. Here's what's actually going on, in the order it's worth checking. ## First: your work isn't lost When Crevio changes your site, it builds a new version and publishes it. Your existing site keeps serving the whole time. Only when the new version builds successfully does it take over. **A failed publish cannot replace a working site.** Exactly one version of your site is live at a time, and a version that didn't build never becomes that one. So "my change isn't showing" almost always means the new version hasn't gone live yet — not that anything was destroyed. ## Check these in order **1. Give it a few minutes** A publish typically takes around six minutes, and longer for a big change or a first build. If you asked a minute ago, it's still working. **2. Hard-refresh the page** Your browser caches pages aggressively. Reload with **Cmd+Shift+R** (Mac) or **Ctrl+Shift+R** (Windows), or open the site in a private window. This is the single most common cause. Check it before anything else. **3. Make sure you're looking at the live site** Not an old tab, not a preview link from earlier in the conversation. Go to your actual web address. **4. Check the version's status** Open your site's versions in the dashboard. The most recent one tells you where things stand: * **Building** — still going. Wait. * **Live** — it published. If you still can't see the change, it's a browser cache issue or the change isn't where you're looking. * **Failed** — it didn't build, and your previous version is still serving. Ask Crevio to fix it. ## If the version says failed Tell Crevio in chat: "the last publish failed, can you fix it?" It can read what went wrong and try again. You don't need to send us an error message or work out what broke. A failed publish is not a broken site. Visitors are still seeing your last working version the whole time. ## If it's been stuck building for a long time A publish that stops reporting progress is marked as failed automatically after 20 minutes, so a version stuck on **building** for longer than that will resolve itself into a **failed** you can retry. If you're past that and it still hasn't moved, that one's on us — [contact support](/docs/troubleshooting/contact-support) with your web address. ## The change published but looks wrong That's a different problem, and it's a normal one. The publish worked; the result isn't what you wanted. Just say so in chat — describe what you expected and what you got, and ask for the adjustment. You can also put the site back on an earlier version from your site's versions list, then take another run at the change. ## Related > **[My site or store is offline](/docs/troubleshooting/site-or-store-offline)** > > Your site isn't loading at all, or shows an unavailable page. > **[What every status means](/docs/reference/statuses)** > > Building, live, failed, superseded — the full list. # A connected app stopped working Source: https://crevio.co/docs/troubleshooting/connection-stopped-working Why a social account, connected app, or payment connection drops, and how to get it back without losing your setup. Something you connected — a social account, a connected app, your payment account — has stopped doing its job. Posts fail, an automation can't finish, or the dashboard shows the connection in an error state. ## Why this happens Connections don't last forever, and it's rarely something you did wrong. The permission you granted expires or gets withdrawn on the other platform's side: * The platform expired it on a schedule. Most do. * You changed your password there, which cancels connected apps. * You removed Crevio from that platform's connected-apps list. * The platform locked or suspended the account. * Someone on your team disconnected it. ## Reconnecting is the fix, and it's safe Go to the connection in your dashboard and reconnect it. You'll approve Crevio on the other platform, the same way you did originally. **You don't lose anything by reconnecting.** Your schedules, your instructions, your posted history, and your settings are all kept. Reconnecting restores the permission and everything resumes from where it stopped. It's also free — reconnecting spends no credits. ## What happens while it's disconnected Crevio stops rather than guessing. * **Social posts** that couldn't go out are marked **disconnected** rather than failed, so you can tell the difference between "the platform rejected this" and "we couldn't reach your account". They aren't silently posted from somewhere else. * **Automations** that depend on that connection stop at that step. * **Your schedule stays set.** Nothing is deleted, and nothing needs rebuilding. Once you reconnect, scheduled work picks up on its next run. ## Read the status | Status | What it means | | - | - | | **Active** | Working. | | **Error** | The permission has expired or been revoked. Reconnect. | | **Inactive** | Switched off rather than broken. Turn it back on. | ## If reconnecting doesn't hold If a connection drops again shortly after you reconnect it, the cause is usually on the platform side: * The account has limited or restricted API access. * A platform policy review is in progress. * The account you're connecting doesn't have permission to post — on some platforms a personal profile and a business page are different things, and only one of them can be posted to. [Get in touch](/docs/troubleshooting/contact-support) with the platform, the account name, and roughly when it started dropping. ## Related > **[Connected apps](/docs/integrations/connected-apps)** > > What you can connect and what Crevio does with it. > **[Social media posting](/docs/features/social)** > > Posting, scheduling, and which platforms are supported. # Getting help Source: https://crevio.co/docs/troubleshooting/contact-support The four ways to get an answer from Crevio, which one to use for what, and what to include so it gets solved on the first reply. There are four ways to get help, and picking the right one is most of the speed. ## Ask Crevio in chat **Best for: anything about your own business.** Your assistant knows your setup — your products, your customers, your web address, what it did yesterday. For "how do I…" and "why is my…", it can answer for *your* account rather than in general, and often just fix the thing while it's there. Ask the way you'd ask a colleague. "Why isn't my new pricing showing on the site?" works better than hunting for the right settings page. ## Search these guides **Best for: understanding how something works before you change it.** Use the search at the top of this site. Guides cover the whole product, and they're the right place for the general walkthrough — how pricing options work, what a payout schedule means, what each status is called. ## Fix it yourself in the dashboard **Best for: anything under Settings.** Billing, your plan, your credit balance, your card, your team, your domain. These are yours to change and don't need anyone's help. ## Email a person **Best for: money, your account, or something genuinely broken on our side.** > **[support@crevio.co](mailto:support@crevio.co)** > > A human reads this. Use it for a charge you don't recognise, a refund question, account access, or something you've already tried to fix and can't. > [!NOTE] > > Crevio's assistant can check your balance and plan, but it can't change your > plan or take a payment. If Crevio itself kept failing you, you can ask the > assistant for a refund: it reviews your recent chats, and refunds your most > recent charge only if it finds a serious failure on Crevio's side. It asks you > before doing it. If it declines, or for any other money question, write to a > person. If it ever tells you a charge has been reversed, check > **Settings** → **Billing** rather than taking its word for it. ## What to include Most back-and-forth comes from a missing detail. Send these up front and you'll usually get a fix rather than a question: 1. **What you expected to happen.** 2. **What actually happened**, including the exact wording of any message. 3. **Where** — the page, the address, or the steps to see it yourself. A screenshot beats a description almost every time. If it's about a specific order, customer, or charge, include the reference or the date and amount. ## What we can and can't do Being straight about this saves you waiting on things that aren't coming: * **We can** look into your account, investigate a charge, fix something broken on our side, and recover access. * **We can't** write your site content or run your marketing for you — that's what your assistant is for, and it's better at it. * **We can't** give you a fix date for a bug. If we're tracking it, we'll say so; we won't invent a timeline. * **We can't** change something on a platform we don't control. An account locked by Instagram or a card blocked by your bank has to be resolved with them. ## Reporting a bug Tell us in the same email, with the three things above. You don't need to diagnose it, work out which part broke, or send us anything technical — describing what you saw is exactly right and is what we need. # My custom domain isn't live yet Source: https://crevio.co/docs/troubleshooting/custom-domain-not-live What has to happen before your own domain serves your site, how long each step takes, and what to check when it stalls. You connected your domain and it isn't serving your site yet. That's normal for a while. Here's the sequence, so you can tell "still working" from "stuck". ## What has to happen **1. You add the record we show you** Connecting a domain doesn't move it. You add one **CNAME** record at your registrar — the company you bought the domain from — pointing at the target shown in your dashboard. Copy the value exactly as it appears there. It's specific to your domain. **2. The record spreads** DNS changes take time to reach everyone. Usually minutes, occasionally up to 48 hours. Nothing is wrong during this window. **3. We verify it** Once we can see the record, the domain moves from **pending**. **4. The certificate is issued** Your domain sits at **SSL pending** while its HTTPS certificate is issued. This is automatic — there is nothing for you to set up, buy, or renew. **5. It goes live** Status **active**. Your site serves on your domain over HTTPS. ## Read the status Your dashboard shows exactly where in that sequence you are: | Status | What it means | What to do | | - | - | - | | **Pending** | We can't see your record yet. | Wait, then check the record matches. | | **SSL pending** | Record found. Certificate being issued. | Wait. This one's on us. | | **Active** | Working. | Nothing. | | **Error** | The records aren't right. | Compare them against the list in your dashboard, character for character. | ## When it's stuck on pending Nearly always one of these: * **The record doesn't match.** Compare it to your dashboard exactly. A trailing dot, a missing subdomain, or the wrong record type all read as "not there". * **Your registrar added its own records.** Parking pages, redirects and placeholder records conflict with ours. Delete them. * **You edited the wrong domain.** Easy to do with several in one registrar account. * **It genuinely hasn't spread yet.** If you added the record in the last hour, this is the likeliest answer. ## Things you don't have to do * **You don't change nameservers.** Your domain stays at your registrar, managed by you. We only need the one record. * **You don't set up HTTPS.** The certificate is issued and renewed automatically once the record verifies. * **You don't give us your registrar login.** We never ask for it. ## Your Crevio address keeps working Your `crevio.co` address serves your site the whole time you're setting a custom domain up, and afterwards. Connecting a domain adds an address; it doesn't replace one. ## Still not live If the record is right and it's been more than 48 hours, [get in touch](/docs/troubleshooting/contact-support) with the domain name. Include a screenshot of the DNS records as they appear at your registrar — that's the one thing we can't see for you, and it resolves most cases immediately. # I've run out of credits Source: https://crevio.co/docs/troubleshooting/out-of-credits Exactly what stops working when your credit balance hits zero, what keeps running, and how to get going again. Credits are what the AI spends to do work for you. When your balance reaches zero, the AI stops — but your business does not. This page is the precise line between the two. ## Your business keeps running Nothing that makes you money depends on your credit balance. With zero credits: * **Your website stays online.** Visitors see it exactly as before. * **Customers can still buy.** Checkout works, payments go through, orders are recorded. * **Access is still delivered.** Buyers get what they paid for, automatically. * **Your dashboard still works.** Orders, customers, analytics, settings — all of it. * **Money still reaches you.** Payouts are unaffected. Running out of credits pauses your assistant. It does not take your business offline. ## What stops Anything where the AI does work on your behalf: * **Chat.** The assistant replies to say it's out of credits rather than doing the work. * **Scheduled automations.** Runs are recorded as failed, with running out of credits as the reason. The schedule itself is kept. * **Image and video generation.** * **Phone calls.** Outbound calls are refused. Inbound calls answer with a short "temporarily unavailable" message rather than ringing out. * **AI replies to incoming email.** The sender gets a short automatic note back instead of a written reply. * **Web research and lookups.** * **API calls that cost credits**, which return a payment-required error naming the shortfall. Nothing in that list loses your setup. Schedules, instructions, and drafts are all still there when you top up. ## Fix it **1. Open your plan settings** Go to **Settings** → **Billing**. **2. Top up** Add credits from \$5 up. They land right away and everything resumes. **3. Consider turning on auto top-up** It refills your balance automatically when it drops below 100 credits (you can change that), so a long job doesn't stall halfway. See [credits](/docs/features/credits). > [!NOTE] > > Top-ups need an active paid plan. On the free plan you can buy a one-time > starter pack of 300 credits for \$10, once every 30 days, or choose a plan. The owner and admins also get an email when the balance runs out, with a link straight to the fix. It's sent at most once a week. ## Why a balance can drop faster than you expect * **Every message to the assistant costs credits**, including the ones where it retries or fixes its own mistake. * **Bigger jobs cost more.** Building a whole page is many times a small copy tweak. * **Automations spend on their own schedule**, whether or not you're logged in. If your balance is disappearing faster than makes sense, **Settings** → **Billing** has a breakdown of what the credits went on. That's the place to look before asking. ## What this isn't * **Not a failed payment.** If a charge was declined, that's a different problem — see [a payment of mine failed](/docs/troubleshooting/payment-failed). * **Not a suspended account.** Zero credits doesn't take anything offline. * **Not a refund situation.** Credits already spent paid for work that ran. ## Related > **[Credits & what things cost](/docs/features/credits)** > > What a credit is worth and what spends one. > **[My site or store is offline](/docs/troubleshooting/site-or-store-offline)** > > If something actually is down, it isn't this. # A payment of mine failed Source: https://crevio.co/docs/troubleshooting/payment-failed What happens when your Crevio subscription charge is declined, why no money was taken, and how to clear it. Your card was declined on a Crevio charge. Here's what that means and what to do. ## Nothing was taken A declined charge collects nothing. There is no partial payment sitting somewhere, and nothing to refund. If your bank charged you an overdraft or insufficient-funds fee, that fee came from your bank, not from us — we never received any money. ## It often clears on its own Stripe retries a failed subscription charge automatically over the following days. A one-off decline — a card that hit its limit for the day, a bank blocking an unfamiliar charge — frequently goes through on the next attempt without you doing anything. We email the account owner (and your billing email, if you set one) the first time a renewal is declined, with a link to pay with another card. While it's retrying, your subscription is marked past due, and admins on the account see a banner at the top of every page with a link to update the card. Your plan stays on, but **this month's credits are added only once the payment goes through**. Anything left over from last month is still yours to use. **Your connected accounts stay connected the whole time.** A past-due payment doesn't disconnect your social accounts or connected apps, so there's nothing to reconnect once the charge goes through. Retries run for 14 days. If nothing has gone through by then, the subscription is canceled. ## Fix it **1. Open your billing portal** Go to **Settings** → **Billing** and open the billing portal. **2. Update the card** Add a working card or update the details on the existing one. **3. Let the retry run** The next attempt uses the new card. You don't need to trigger anything. ## Your bank wants you to confirm the payment Some banks ask you to approve a charge yourself — the extra confirmation step you get when paying online. A renewal charges automatically, so that step can't be completed for you: we email the account owner a link to confirm it. Only the cardholder can do this, and it takes about thirty seconds. Confirm it within 14 days or the subscription is canceled. If you can't find the email, go to **Settings** → **Billing** and pay the outstanding invoice from the billing portal. ## Why cards get declined Almost always something ordinary: * The card expired. * Not enough funds at the moment of the charge. * The bank blocked it as an unrecognised or foreign charge. A quick call to them usually clears this permanently. * The billing address on file no longer matches the card. ## What this isn't * **Not the same as running out of credits.** Your credit balance and your subscription are separate. See [I've run out of credits](/docs/troubleshooting/out-of-credits). * **Not a refund.** There's nothing to give back on a charge that never completed. ## A customer's payment failed, not mine That's the other direction, and it's normal — some card payments simply decline. The order is recorded as **failed** and no money moved. The customer can try again with another card. See [what every status means](/docs/reference/statuses#orders). ## Still stuck If you've updated the card and the charge still won't go through, or you see a charge you don't recognise, [get in touch](/docs/troubleshooting/contact-support) with the date and amount and we'll go through it with you. # My site or store is offline Source: https://crevio.co/docs/troubleshooting/site-or-store-offline Your website isn't loading, or visitors see an unavailable page. The handful of reasons why, and what fixes each one. Your site not loading is rarer than it feels — most of the time something else is going on that looks the same. Work down this list. ## Is it actually offline? Three things get mistaken for an outage: | What you're seeing | What it usually is | | - | - | | Your recent change isn't there | The new version hasn't published yet. Your old one is still serving, which is why the site looks fine but stale. See [my changes aren't showing](/docs/troubleshooting/changes-not-live). | | A blank page or an error on one page | A problem in that page, not the site being down. Ask Crevio to fix that page. | | The site loads for you but not a customer | Usually their network or a cached page. Try it in a private window and on mobile data. | If your site loads at all, it isn't offline. ## Your account isn't active This is the most common real cause, and the most fixable. **If your account is anything other than active, your Crevio-hosted pages stop serving.** That means your website at `crevio.co/`, your product pages, and your blog all show an unavailable page to visitors instead. Your account can be: * **Paused** — you or a teammate paused it. Resume it in **Settings**. * **Suspended** — we stopped it. [Ask us why](/docs/troubleshooting/contact-support) and what it takes to lift it; we'll tell you straight. * **Inactive** — the account has been closed. Nothing is deleted in any of these states. Your products, customers, orders and content are all intact and return exactly as they were. > [!NOTE] > > Pausing your account is not the same as cancelling your subscription. Pausing > stops the work; cancelling stops the billing. Doing one does not do the other. ## Your custom domain isn't set up yet If the site works on your `crevio.co` address but not on your own domain, the domain is the problem, not the site. See [my custom domain isn't live yet](/docs/troubleshooting/custom-domain-not-live). ## Your site was never published A site that has been built but never successfully published has no live version to serve. Check your site's versions — if none of them says **live**, ask Crevio to publish it. ## Nothing above matches Then it's worth us looking. [Get in touch](/docs/troubleshooting/contact-support) and include: * The exact web address you're trying, copied from the browser. * What you see — a specific error, a blank page, or a spinner that never ends. * Whether the `crevio.co` address works when the custom domain doesn't. * Roughly when it started. That's usually enough for us to find it without a back-and-forth.