Skip to main content
Tiro gives you two ways to connect: the REST API for programmatic access from your backend, or the MCP Server for AI clients like Claude and ChatGPT.

Get your API key

Go to the Tiro Platform API Keys page and create a key.
2

Pick a workspace

Use the workspace switcher in the sidebar to choose the workspace your key should reach. The key is scoped to that workspace.
3

Create a key

Click Create New API Key. Copy the full key including the dot — abc123.xR7mK9pL2qW4....
4

Store it

Save it as an environment variable. You can’t view it again after closing the creation dialog.
Store your API key in an environment variable. Never hardcode it or commit it.
Using a personal API key from before workspaces? Those keys are deprecated and stop working on June 30, 2026. Migrate to a workspace key.

Make your first request

Fetch your notes:
curl -H "Authorization: Bearer $TIRO_API_KEY" \
     -H "Content-Type: application/json" \
     https://api.tiro.ooo/v1/external/notes
const response = await fetch("https://api.tiro.ooo/v1/external/notes", {
  headers: {
    "Authorization": `Bearer ${process.env.TIRO_API_KEY}`,
    "Content-Type": "application/json",
  },
});

const data = await response.json();
console.log(`Found ${data.content.length} notes`);
import os
import requests

headers = {
    'Authorization': f'Bearer {os.getenv("TIRO_API_KEY")}',
    'Content-Type': 'application/json'
}

response = requests.get('https://api.tiro.ooo/v1/external/notes', headers=headers)
data = response.json()
print(f"Found {len(data['content'])} notes")
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "os"
)

func main() {
    client := &http.Client{}
    req, _ := http.NewRequest("GET", "https://api.tiro.ooo/v1/external/notes", nil)
    
    apiKey := os.Getenv("TIRO_API_KEY")
    req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey))
    req.Header.Set("Content-Type", "application/json")
    
    resp, _ := client.Do(req)
    defer resp.Body.Close()
    
    var data map[string]interface{}
    json.NewDecoder(resp.Body).Decode(&data)
    fmt.Printf("Found %v notes\n", len(data["content"].([]interface{})))
}
@RestController
class NotesController {
    
    @Value("\${tiro.api.key}")
    private lateinit var apiKey: String
    
    private val restTemplate = RestTemplate()
    
    @GetMapping("/my-notes")
    fun getMyNotes(): ResponseEntity<Map<String, Any>> {
        val headers = HttpHeaders()
        headers.set("Authorization", "Bearer $apiKey")
        headers.contentType = MediaType.APPLICATION_JSON
        
        val entity = HttpEntity<String>(headers)
        
        val response = restTemplate.exchange(
            "https://api.tiro.ooo/v1/external/notes",
            HttpMethod.GET,
            entity,
            object : ParameterizedTypeReference<Map<String, Any>>() {}
        )
        
        val data = response.body!!
        println("Found ${(data["content"] as List<*>).size} notes")
        
        return ResponseEntity.ok(data)
    }
}
Tiro returns a paginated list of your notes. Each object contains the title, creation date, processing status, and a guid you use to fetch transcripts, summaries, and documents. Now that you have a list, read the Note Data Model to understand what each guid unlocks — transcripts, summaries, documents, and folders.