MapleSpike MapleSpike
[ 00 ] Quickstart
LIVE

One API key.
206 Canadian government data modules. Every response cited.

Get an API key, make your first call, and see the citation contract — in under 5 minutes.



$ curl -s https://api.maplespike.ca/v1/gov/search \
  -H "X-API-Key: ms_live_..." \
  -G -d "query=housing" \
  -d "jurisdiction=federal" \
  -d "_limit=2" | jq .

{
  "success": true,
  "data": { "releases": [...] },
  "citation": {
    "source_name": "open.canada.ca",
    "data_hash": "sha256:a1f3...",
    "license": "OGL-C"
  }
}
No key? Get one free at signup — 1,000 calls/month included. Or pass _mock=true for sample data with no upstream hit.
[01] Authentication

Multiple ways to authenticate

Four authentication methods, one JWT token format. All methods issue the same JWT — pick the one that fits your use case.

API Key (recommended for servers)

Create a key from the signup, then send it as the X-API-Key header:

$ curl -H "X-API-Key: ms_live_..." https://api.maplespike.ca/v1/health

OAuth (recommended for web apps)

Sign in with GitHub, Google, or any OIDC provider:

# List configured providers
$ curl https://api.maplespike.ca/v1/auth/oauth/providers

Web3 Wallet

Sign a SIWE (EIP-4361) message with your wallet:

POST /v1/auth/web3/challenge { "address": "0x..." }

Passkey / FIDO2

Register a passkey (Touch ID, Windows Hello, YubiKey):

POST /v1/auth/passkey/register/begin { "userId": "..." }

All methods issue JWTs with the same format. Use the token as a Bearer header or session cookie. Keys are hashed with SHA-256 at rest.

[02] Request + Response

One envelope. Every endpoint.

Every response carries the same structure — data, quality score, citation metadata, and usage info. Your agent always knows where the answer came from.

{
  "success": true,
  "data": { /* structured payload */ },
  "quality": {
    "freshness_seconds": 47,
    "confidence": "high",
    "certainty_score": 0.923
  },
  "citation": {
    "source_name": "open.canada.ca",
    "source_url": "https://...",
    "data_hash": "sha256:a1f3...",
    "license": "OGL-C"
  }
}
[03] API Reference

REST endpoints

Method Path Description
GET /v1/health System status and usage stats
GET /v1/openapi.json Full OpenAPI 3.1 specification
GET /v1/me Current tenant info and API keys
GET /v1/usage Current billing period usage
GET /v1/gov/releases Latest government data releases
GET /v1/gov/search?query= Full-text search across all sources
GET /v1/citation/:hash Retrieve citation by SHA-256 hash
GET /v1/signals Cross-reference signals (requires engine)
POST /v1/ai/ask Ask a question, get a sourced answer (edge AI)
POST /v1/ai/search Semantic search with edge embeddings
GET /v1/ai/models List available AI models
POST /v1/ai/analyze Analyze a document/transcript for topics, entities, summary (Pro+)
POST /v1/register Create account and API key
GET /v1/verify/:token Verify email address
POST /v1/auth/refresh Refresh JWT token
POST /v1/auth/logout Clear session
GET /v1/keys List API keys
POST /v1/keys Create a new API key
DELETE /v1/keys/:id Delete an API key
POST /v1/keys/:id/rotate Rotate an API key
POST /v1/billing/checkout Create checkout session
GET /v1/billing/plans Available pricing plans
GET /v1/extraction/tasks List browser extraction tasks for no-API portals
POST /v1/extraction/results Submit extracted data from browser client
GET /v1/extraction/cached/:source_id Get cached browser extraction results
[04] AI Endpoints
EDGE

Edge AI — ask, search, analyze

AI endpoints run on the Cloudflare edge (Llama 3.3 70B) with automatic fallback to the homelab cluster (Qwen 3.5 27B). Tier-aware routing: free tier uses edge first, pro/business uses homelab first, enterprise uses BYOK if configured.

POST /v1/ai/ask

Ask a natural language question about Canadian government data. The response includes the answer, model used, inference source (edge/homelab/byok), and token usage.

$ curl -s -X POST https://api.maplespike.ca/v1/ai/ask \
  -H "Content-Type: application/json" \
  -H "X-API-Key: ms_live_..." \
  -d '{
    "question": "What did the ethics commissioner investigate in 2024?",
    "model": "fast"
  '} | jq .


{
  "success": true,
  "data": {
    "answer": "The Ethics Commissioner investigated...",
    "model": "@cf/meta/llama-3.1-8b-instruct",
    "source": "edge",
    "tokens": { "prompt": 142, "completion": 89 },
    "cached": false
  },
  "meta": { "tier": "free", "rate_limit_remaining": 9 }
}

Optional context field injects up to 2000 chars of MapleSpike data into the system prompt. Use model: "fast" for Llama 3.1 8B (lower latency), omit for Llama 3.3 70B (higher quality).

POST /v1/ai/search

Semantic search using edge-generated embeddings (BGE base) routed to the homelab Qdrant vector database. Falls back to keyword search if embedding generation fails.

$ curl -s -X POST https://api.maplespike.ca/v1/ai/search \
  -H "Content-Type: application/json" \
  -H "X-API-Key: ms_live_..." \
  -d '{
    "query": "regulatory impacts on small business",
    "limit": 10
  '} | jq .


{
  "success": true,
  "data": { "results": [...] },
  "meta": { "source": "vector-edge-embedding" }
}

Max limit is 50. If the embedding service is unavailable, the API falls back to keyword search via /v1/gov/search and returns meta.source: "keyword-fallback".

POST /v1/ai/analyze (Pro tier+)

Submit a document or transcript for LLM-powered analysis. The model extracts key topics, notable entities, and an overall summary. Optionally specify a mode (e.g. "general", "legal", "financial") to hint the analysis focus. Defaults to "general" if omitted.

$ curl -s -X POST https://api.maplespike.ca/v1/ai/analyze \
  -H "Content-Type: application/json" \
  -H "X-API-Key: ms_live_..." \
  -d '{
    "text": "Mr. Speaker, today I am pleased to table Bill C-59...",
    "mode": "general"
  '} | jq .


{
  "success": true,
  "data": {
    "analysis": "Key Topics: 1) Budget implementation 2) Competition Act amendments...\n\nEntities: Bill C-59, Competition Bureau, Innovation Ministry...\n\nSummary: The speech introduces amendments to...",
    "model": "qwen3.5-4b-local",
    "mode": "general"
  }
}

Unlike /v1/ai/ask and /v1/ai/search which run directly on the Cloudflare edge, this endpoint is proxied to the homelab API server (Qwen 3.5). Requires Pro tier or higher (returns 402 UPGRADE_REQUIRED on Free). Max text length: 50,000 chars (first 8,000 chars are sent to the LLM). If the AI Gateway is unreachable, returns 503 AI_UNAVAILABLE.

GET /v1/ai/models

List available models and tier-aware routing rules. Public endpoint — no API key required.

$ curl -s https://api.maplespike.ca/v1/ai/models | jq .


{
  "success": true,
  "data": {
    "edge": {
      "chat": "@cf/meta/llama-3.3-70b-instruct-fp8-fast",
      "chatFast": "@cf/meta/llama-3.1-8b-instruct",
      "embedding": "@cf/baai/bge-base-en-v1.5"
    },
    "homelab": "qwen3.5-27b",
    "routing": {
      "free": "edge (within budget) → homelab fallback",
      "pro": "homelab primary → edge fallback",
      "enterprise": "byok (if configured) → homelab fallback"
    }
  }
}
[05] Browser Extraction

Extract data from no-API government portals

Some government portals (NWT, Nunavut) have no machine-readable API. The extraction system lets the portal client render pages in the user's browser, extract download links, and cache results server-side for MCP tools to use as fallback.

Flow: 1. Client GETs extraction tasks → 2. Browser visits source URLs → 3. Client POSTs extracted results → 4. MCP tools GET cached results as fallback

GET /v1/extraction/tasks

List extraction tasks for sources that need browser rendering. Optionally filter by jurisdiction via path param or query param.

# All extraction tasks
$ curl -s -H "X-API-Key: ms_live_..." \
  https://api.maplespike.ca/v1/extraction/tasks | jq .

# Filter by jurisdiction (path param)
$ curl -s -H "X-API-Key: ms_live_..." \
  https://api.maplespike.ca/v1/extraction/tasks/nunavut | jq .


{
  "success": true,
  "data": {
    "tasks": [{
      "source_id": "nunavut-bureau-statistics",
      "jurisdiction": "nunavut",
      "name": "Nunavut Bureau of Statistics",
      "url": "https://www.gov.nu.ca/en/...",
      "extract_type": "link_list",
      "selector": "a[href*='/sites/default/files/']",
      "cached": false,
      "cache_ttl_hours": 168
    }]
  }
}

POST /v1/extraction/results

Submit extracted data from the browser client. The server validates the source_id, blocks SSRF attempts (private IPs, localhost), and caches results with a timestamp.

$ curl -s -X POST https://api.maplespike.ca/v1/extraction/results \
  -H "Content-Type: application/json" \
  -H "X-API-Key: ms_live_..." \
  -d '{
    "source_id": "nunavut-bureau-statistics",
    "results": [{
      "title": "Population Estimates 2024",
      "url": "https://www.gov.nu.ca/sites/default/files/pop-2024.xlsx",
      "format": "xlsx"
    }]
  '} | jq .


{
  "success": true,
  "data": {
    "stored": true,
    "source_id": "nunavut-bureau-statistics",
    "count": 1,
    "rejected": 0,
    "cached_at": "2026-07-01T12:00:00.000Z"
  }
}

SSRF protection: URLs pointing to localhost, 127.x, 10.x, 192.168.x, or 172.16.x are silently filtered. The rejected field shows how many were blocked.

GET /v1/extraction/cached/:source_id

Retrieve cached extraction results if fresh (within cache_ttl_hours). MCP tools use this as fallback when live sources are unavailable.

$ curl -s -H "X-API-Key: ms_live_..." \
  https://api.maplespike.ca/v1/extraction/cached/nunavut-bureau-statistics | jq .


{
  "success": true,
  "data": {
    "source_id": "nunavut-bureau-statistics",
    "results": [...],
    "cached_at": "2026-07-01T12:00:00.000Z",
    "age_hours": 3.2,
    "fresh": true,
    "source_name": "Nunavut Bureau of Statistics",
    "jurisdiction": "nunavut"
  }
}


{
  "success": false,
  "error": {
    "code": "STALE",
    "message": "Cache expired (age: 172h, ttl: 168h)"
  }
}
Currently tracked sources: NWT Open Government Product, Nunavut Bureau of Statistics (3 sub-sources: demographics, economic, main). Cache TTL: 168 hours (7 days).
[ 06] Token Optimization

Trim responses for AI agents

Every token saved is money earned. These params go in the same request body — they're extracted before validation.

Param Type Effect
_fields string[] Return only named fields
_format "full" | "compact" Compact strips null/empty
_limit number Cap array results
_page number Pagination offset
_summary boolean Return aggregates, not rows
_mock true Sample data, free, no upstream hit
[ 07] Citation Contract

Every response. Every endpoint. Verifiable.

Every MapleSpike endpoint returns the same citation block — whether you're using the REST API, MCP tools, or cross-reference engine.

{
  "citation": {
    "source_name": "open.canada.ca",
    "source_url": "https://open.canada.ca/...",
    "retrieved_at": "2026-05-13T12:00Z",
    "data_hash": "sha256:a1f3...",
    "license": "OGL-C",
    "citation_text": "open.canada.ca, retrieved 2026-05-13. OGL-C."
  }
}

data_hash is the SHA-256 of the response payload at fetch time. Re-fetch the source yourself and compare — if hashes match, you saw what we saw, byte-for-byte.

[ 08] MCP Tools
174 TOOLS

Data tools for AI agents

All tools return the same { data, quality, citation } envelope.

{
  "mcpServers": {
    "maplespike": {
      "command": "npx",
      "args": ["@maplespike/mcp"],
      "env": { "MAPLESPIKE_API_KEY": "ms_live_..." }
    }
  }
}
174 tools
Category Tool Description
General query_gov_data Search across StatCan, CKAN, provincial portals
General fact_check Verify claims against official government data
General get_citation Retrieve citation by SHA-256 hash
General latest_releases Recent government data releases by category
General smart_search Intent-aware search across all sources
General explore_catalog Browse available data modules and categories
Parliament search_committees HoC + Senate committee evidence and transcripts
Parliament search_committees_op Committees via Open Parliament API
Parliament search_debates House of Commons debates (Hansard) by date or topic
Parliament search_bills Federal bills via Open Parliament with LEGISinfo IDs
Parliament track_bill Track a bill through Parliament end-to-end
Parliament search_votes House of Commons voting records via Open Parliament
Parliament get_member_info MP details: name, party, riding, photo URL
Parliament get_politician_influence Influence profile: lobbying, voting, GIC appointments
Parliament search_legislation Federal acts by name, keyword, or jurisdiction
Regulatory search_gazette Canada Gazette Parts I, II, III
Regulatory search_gazette_part1 Gazette Part I — notices and proposed regulations
Regulatory search_gazette_part2 Gazette Part II — statutory instruments and orders
Regulatory search_gazette_part3 Gazette Part III — acts of Parliament as enacted
Regulatory search_gic Governor-in-Council appointments by department
Elections search_elections Third-party advertising, election spending data
Corporate search_corporate Lobbying, procurement, exec statements by company
Corporate search_corporate_filings SEDAR+ filings, insider reports by company or ticker
Corporate search_sedi SEDI insider trading reports by issuer or insider
Corporate search_cipo CIPO patents and trademarks by applicant or tech area
Corporate search_corporate_registry Federal corporations registry data from CKAN
Corporate search_patents Canadian patent data from CIPO via CKAN
Corporate search_trademarks Canadian trademark data from CIPO via CKAN
Corporate search_financial_regulation Financial regulation and oversight data
Corporate search_provincial_lobbying Provincial lobbying registries (ON, BC, QC)
Procurement search_proactive_disclosure Proactive disclosure contracts by vendor or department
Procurement search_federal_contracts Federal contract awards from CKAN
Procurement search_federal_grants Federal grants and contributions data
Procurement search_goc_spending Government spending by vendor, department, program
Procurement search_federal_budget Federal budget by program, department, fiscal year
Procurement search_ati Access to Information requests by keyword or department
Oversight search_oversight OAG, PBO, Ethics Commissioner, CRTC, Competition Bureau
Oversight search_canlii Court decisions and citations via CanLII
Oversight search_a2aj Access to justice and legal aid resources
Oversight search_tribunals Federal tribunal appointments and decisions
Influence search_influence Tracked IOs, NGOs, think tanks, funding connections
Influence search_ngo_rss NGO and think tank publications via RSS
Influence ngo_narrative_tracker Track narratives by NGO or think tank organization
Immigration search_immigration IRCC data by country, province, category, or year
Immigration search_lmia LMIA quarterly data, TFW program by employer or NOC
Immigration search_ircc-citizenship Citizenship statistics and grants by province
Immigration search_ircc_entry_exit Port of entry data by nationality and quarter
Immigration search_ircc_express_entry CRS scores, program draws, category-based selection
Immigration search_ircc_family_sponsorship Parent and spousal sponsorship by visa office
Immigration search_ircc_pr_admissions PR admissions by province, category, or year
Immigration search_ircc_processing_times Processing times by application type and country
Immigration search_ircc_study_permits Study permits by institution, province, or country
Immigration search_ircc_work_permits Work permits by NOC code, province, or country
Immigration search_citizenship_data Canadian citizenship statistics from CKAN
Immigration search_immigration_refugees Immigration and refugee data from CKAN
Defence search_defence DND personnel, procurement, defence spending
Defence search_veterans Veterans Affairs: disability, benefits, wait times
Health search_health Health conditions, drugs, procedures, wait times
Health search_health_canada Drug recalls, medical device licences, regulations
Health search_pharmaceuticals Drug pricing, shortages, PMPRB data
Transport search_transport_safety TSB occurrences, air and rail safety investigations
Transport search_transportation_data Transportation and infrastructure data from CKAN
Transport search_geospatial Topographic maps, satellite imagery, GIS datasets
Transport search_arcgis_layers ArcGIS feature services for MB, SK, PE
Transport search_real_time_feeds Real-time alerts: weather, health advisories, amber alerts
Transport search_regional_authorities Regional transit and service authorities
Transport search_utilities Hydro, gas, and water utilities by province
Indigenous search_indigenous_relations Specific claims, TRC calls to action, Indigenous services
Indigenous search_indigenous_services_directory Indigenous services directory and listings
Indigenous search_indigenous_stats Indigenous peoples statistics from CKAN
Provincial search_ab_data Alberta: AHS health, AAIP immigration, courts, education
Provincial search_bc_data BC: PharmaCare, BCPNP immigration, courts, education
Provincial search_on_data Ontario: OHIP claims, OINP immigration, EQAO, courts
Provincial search_qc_data Quebec: RAMQ, MIFI immigration, courts, education
Provincial search_yukon_data Yukon open data from open.yukon.ca CKAN portal
Provincial search_nunavut_data Nunavut data from federal CKAN and StatsCan
Provincial search_provincial_data All 13 provinces and territories via CKAN and Socrata
Provincial search_provincial_legislatures Provincial Hansard and legislature debates
Provincial search_provincial_regulators Provincial regulators by profession or province
Provincial search_provincial_orgs Provincial organizations and agencies
Municipal search_municipal Municipal open data from major Canadian cities
Municipal search_municipal_data Municipal datasets across 10 Canadian cities
Municipal search_municipal_long_tail Long-tail municipal data queries and niche datasets
Economic query_cpi Consumer Price Index (inflation) from StatCan
Economic query_gdp GDP from StatCan with time-series and reference dates
Economic query_labour Labour force: employment, unemployment from StatCan
Economic query_population Population estimates by province and territory
Economic query_trade International merchandise trade from StatCan
Economic query_bridges Bridge infrastructure conditions by province
Economic search_statcan Search StatCan datasets by keyword or topic
Economic search_bank_of_canada Bank of Canada rates, speeches, and policy outlook
Economic compare_regions Compare economic indicators across provinces and territories
Environment search_npri National Pollutant Release Inventory by facility or substance
Environment search_nrcan Natural Resources Canada: commodities, regions, resources
Environment search_nrcan_renewable Renewable energy data from NRCAN
Environment search_nrcan_fires Wildfire data and fire monitoring from NRCAN
Environment search_nrcan_forests Forestry data and forest inventory from NRCAN
Environment search_nrcan_minerals Mineral and mining data from NRCAN
Environment search_impact_assessment Environmental impact assessments by project or sector
Environment search_species_at_risk Species at risk registry by species name or status
Environment search_fisheries Fisheries: species, regions, aquaculture, licenses
Environment search_agriculture Agriculture: commodities, provinces, farm income
Environment search_agriculture_data Agriculture and agri-food data from CKAN
Environment search_energy_data Energy production and consumption from CKAN
Environment search_climate_data Climate change and weather data from CKAN
Housing search_housing_cmhc CMHC housing starts, vacancy rates, affordable housing
Housing search_housing_data Housing and rental market data from CKAN
Housing search_cmhc CMHC metrics by city, province, or year
Housing search_real_estate Real estate market data and trends
International get_wdi_indicator World Bank Development Indicators by country
International compare_wdi_countries Compare a WDI indicator across multiple countries
International get_country_wdi_profile Country profile with key development indicators
International analyze_indicator_trend Analyze WDI indicator trend over time
International fetch_topic_indicators All indicators for a WDI topic (economy, health, social)
International get_indicator_metadata Metadata for a World Bank indicator
International get_comtrade_by_partner UN Comtrade trade data by partner country
International get_comtrade_by_commodity UN Comtrade trade data by commodity
International get_comtrade_trends UN Comtrade trade trends over time
International search_oecd_stat OECD statistics and indicators
International search_undp_hdi UNDP Human Development Index data
International search_unhcr_refugees UNHCR refugee statistics and displacement data
International search_us_cia CIA World Factbook country data
International search_au_abs Australian Bureau of Statistics
International search_nz_stats Statistics New Zealand
International search_uk_ons UK Office for National Statistics
International search_who_gho WHO Global Health Observatory
International search_eurostat Eurostat European statistics
International search_un UN SDMX data by dimension key
International search_ilo ILO labour statistics by indicator or country
Social search_social_programs EI claims, CCB payments, poverty rates by province
Social search_education_research NSERC, SSHRC, Canada Research Chairs by institution
Social search_education_stats Education enrolment statistics from CKAN
Social search_gender_stats Gender-based statistics and equality data from CKAN
Social search_official_languages Official languages data from CKAN
Social search_culture Canada Council grants, heritage funding, arts programs
Social search_culture_data Culture, arts, and heritage data from CKAN
Public Safety search_public_safety Public safety and emergency management from CKAN
Public Safety search_emergency_management Emergency management and disaster response data
Public Safety search_policing_security Policing and security data
Public Safety search_criminal_justice Prison populations, hate crimes, parole data
Media search_media_broadcasting Media and broadcasting data
Media search_telecommunications Broadband, spectrum auctions, telecom by provider
Media search_crtc CRTC decisions, licences, net neutrality rulings
Media search_crtc_decisions CRTC decision numbers and broadcasting rulings
Science search_science CSA missions, Mitacs grants, Ocean Networks, Polar Data
Science search_technology_data Technology, innovation, and telecom data from CKAN
Science search_knowledge_fabric Knowledge Fabric data portal queries
Science search_mining_data Mining and mineral production data from CKAN
Community search_parks Parks and recreation facilities in 12 Canadian cities
Community search_libraries Public library systems in 15 Canadian cities
Community search_universities Universities by institution, program, or metric
Community search_unions Labour unions by name, sector, or province
Community search_crown_corporations CBC, Canada Post, EDC and other crown corp financials
Charity search_charity_t3010 T3010 charity filings by name or category
Charity search_cra_charity CRA registered charities by name or BN
Global Affairs search_global_canada Global Affairs: trade agreements, climate, emissions
Global Affairs search_lode Open Database of Addresses: 10M+ civic addresses
AI ai_ask Ask a natural language question, get a sourced answer
AI ai_analyze Analyze a document or transcript for topics, entities, and summary
AI ai_search_semantic Semantic search with edge embeddings
Entity resolve_entity Resolve a person or organization name to canonical entity
Entity find_connections Find network connections between entities
Entity get_entity_profile Cross-reference a person across MP, lobbying, and GIC
Entity get_annotations Entity annotations and metadata by type
Entity search_cross_reference Cross-reference all modules at once — unified entity timeline
System cache_clear Clear tool response cache
System cache_status Check cache status and hit rates
System system_health System health check and diagnostics
System get_module_health Health check for a specific data module
System get_pipeline_health Pipeline ingestion health and status
System signal_check Check watched source signals for changes
System searxng_health SearXNG engine health: failures, suspensions, errors
System qa_schema Query module schemas by name
System qa_validate_module Validate module data quality and integrity

Showing all 174 MCP tools. Use the search box or category dropdown to filter. The full tool list is also available in llms.txt for machine consumption.

[ 09] Rate Limits

Per-plan caps

Rate limits are per-second and per-month. Hitting the per-second limit returns 429 with a Retry-After header.

Plan Per sec Per month Overage
Free 2/s 1,000 Hard cap (402)
Pro 25/s 50,000 $1/1K (planned)
Business 100/s 250,000 $0.80/1K (planned)
Enterprise Custom Custom Negotiated
[ 10] Errors

One shape. Specific categories.

All error responses carry success: false, a stable error code, and a human-readable message.

Code Status Retry Meaning
auth_invalid 401 No Fix API key or JWT
rate_limited 429 Yes Respect Retry-After header
quota_exhausted 402 No Upgrade plan or wait for reset
input_invalid 400 No Check input schema
source_unavailable 502 Yes Upstream source down, retry later
not_found 404 No Resource doesn't exist
server_error 500 Yes Backoff, report if persistent
[ 11] FAQ

Common questions

Do I need a credit card to start?

No. Free plan: 1,000 calls/month, every source, every SDK, citation hashes included. No card, no time limit.

What makes the citations verifiable?

Every response includes source name, exact upstream URL, retrieval timestamp, and a SHA-256 content hash. You can re-fetch and confirm exactly what the agent saw.

Which AI frameworks are supported?

MCP (Claude, Cursor, Windsurf, ChatGPT), Anthropic tool_use, OpenAI function calling. TypeScript and Python SDKs.

How fresh is the data?

Depends on the source. Committee evidence: ~24h. Canada Gazette: within hours of publication. CanLII: daily. Every response ships with a freshness_seconds field.

What is the cross-reference engine?

Search for any person or company and get their complete government footprint — lobbying meetings, committee testimony, GIC board appointments, procurement contracts, court cases, and campaign donations — in a unified timeline.

Is my API key secure?

Keys are hashed with SHA-256 at rest — we only see them at verify time. HTTPS-only transit. Rotate from the workspace instantly.