# Garfunkel by GAR AI > Pay-per-post analysis of TikTok, Instagram and X posts: transcript, translation, hook, tags, comment intent. API, CLI and MCP. Garfunkel by GAR AI (product of GAR AI) analyzes social posts: submit TikTok, Instagram or X post URLs, whole accounts ("every post from @handle since 2025-01-01"), or uploaded media; get back transcripts, translations, tags, summaries, hooks, shot pacing (beta) and embeddings. Prepaid balance in dollars (a video post up to 60 s is 75¢; API amounts are integer cents with *_usd strings beside them); estimates are free and failures are never charged. New accounts get $10 free to start after email confirmation; the balance never expires. Chat with your data is free (100 questions per team per day). Raw media is deleted after processing. Try one public post without an account on the home page, / (3 per day per visitor). Auth: `Authorization: Bearer gma_live_…` (org-scoped API key; env GARFUNKEL_API_KEY for the CLI and MCP). All POSTs accept `Idempotency-Key`. Errors: `{"error":{"code","message","details","retryable"}}`. ## Docs - [OpenAPI 3.1 spec](/api/v1/openapi.json): every endpoint, request and response schema. - [Docs](/docs): API, CLI and MCP guide. - [Pricing](/pricing): price per post kind, packs ("Pay $100, get $110"), posts per pack, spending rewards, invite a friend. - [MCP endpoint](/api/mcp): Streamable HTTP; OAuth 2.1 (discovery via /.well-known/oauth-protected-resource/api/mcp, dynamic client registration, PKCE) or an API key. Tools: estimate_job, submit_job, confirm_job, get_job, wait_for_job, list_results, get_result, search_results, export_results, analyze_comments, get_comments, chat_with_data, get_credit_balance, show_post, create_checkout. ## Typical flow 1. POST /api/v1/jobs with {"items":[{"url":"…"}],"dry_run":true} → estimate. 2. POST /api/v1/jobs (same body, dry_run false) → 202 {id}. The price is set aside from your balance. 3. Poll GET /api/v1/jobs/{id} until status is completed. 4. GET /api/v1/results?job_id={id} or /api/v1/results/export?job_id={id}&format=jsonl. Account jobs: items like {"account":"@nasa","platform":"x","since":"2025-01-01"} are discovered for free; then the job is awaiting_confirmation — read `notices` and POST /api/v1/jobs/{id}/confirm (or set options.max_credits to auto-confirm). Short balance: POST /jobs (and confirm / comments jobs) returns 402 insufficient_credits but KEEPS the job in `awaiting_payment` (nothing reserved). `error.details` has required, balance, shortfall, suggested_pack, topup and job_id; POST /api/v1/credits/checkout {"credits":N,"resume_job_id":"job_…"} → give `url` to your user; the job queues automatically once paid (unpaid jobs are canceled after 7 days). Uploads: POST /api/v1/uploads → PUT bytes to upload_url → use {"upload_id":"upl_…"} as an item.