{"name":"Forge","description":"Multi-tenant field service CRM for contractors. Preferred integration: one natural-language agent call — do not rebuild CRM CRUD in the outer model.","version":"2.1.0","updatedAt":"2026-08-12","apiVersion":"v1","documentation":"https://forge.kin.team/developers","homepage":"https://forge.kin.team","contact":{"email":"hello@kin.team"},"baseUrl":"https://forge.kin.team/api/v1","health":"https://forge.kin.team/api/v1/health","openapi":"https://forge.kin.team/api/v1/openapi.yaml","agentGuide":"https://forge.kin.team/api/v1/agent-guide","agentLaws":"https://forge.kin.team/api/v1/agent-laws","agentBootstrap":"https://forge.kin.team/api/v1/agent/bootstrap","agentContract":{"laws":"https://forge.kin.team/api/v1/agent-laws","lawsVersion":"2.0.0","productLawVersion":"2.0.0","productLawModeDefault":"balanced","rule":"Product Law Balanced: resolve clear matches, block ambiguous/dupes, never create to update. Revise unpaid invoices in place. Obey recovery.suggestedTool. force is audited exception only.","onDuplicateJob":"Use forge_update_job with existing.jobNumber","onDuplicateClient":"Use forge_get_client / forge_update_client with existing.id — do not create a twin","onSiteInNotes":"Pass propertyId or propertyAddress/propertyLabel; Product Law links/creates property and strips site from notes","onSentInvoiceEdit":"Use forge_revise_invoice on the same INV-####","onOpenInvoice":"OPEN_INVOICE_EXISTS / ALREADY_INVOICED → forge_revise_invoice, never a second INV","onMissingThinTools":"Register forge_agent or full list+get+update set — create-only hosts cause duplicates","onForce":"force:true requires intentional exception; pass forceReason for audit log; prefer recovery tools"},"onConnect":{"required":true,"bootstrap":"https://forge.kin.team/api/v1/agent/bootstrap","mcpResource":"forge://agent-instructions","mcpTool":"forge_get_agent_instructions","rule":"Fetch bootstrap with the API key immediately after connect (and when guideVersion/lawsVersion changes). Inject standingInstructions into the agent system/identity context BEFORE any CRM tool use. Without this, agents freestyle — scope in line titles, $0 prices, site missing from PDF.","alsoRead":["https://forge.kin.team/api/v1/agent-laws","https://forge.kin.team/api/v1/agent-guide"]},"llmsTxt":"https://forge.kin.team/llms.txt","docs":{"hub":"https://forge.kin.team/developers","agentApi":"https://forge.kin.team/docs/FORGE_AGENT_API.md","toolMatrix":"https://forge.kin.team/docs/KIN_FORGE_TOOLS.md","nativeAgent":"https://forge.kin.team/docs/FORGE_NATIVE_AGENT.md","quickstart":"https://forge.kin.team/docs/INTEGRATION_QUICKSTART.md","agentLaws":"https://forge.kin.team/api/v1/agent-laws"},"authentication":{"apiKey":{"type":"http","scheme":"bearer","header":"Authorization","format":"Bearer fk_live_...","createIn":"Settings → API Keys (per company / tenant)","note":"Each key is scoped to exactly one tenant. Same endpoints for 1 or 10,000 companies."},"oauth2":{"authorizationUrl":"https://forge.kin.team/oauth/authorize","tokenUrl":"https://forge.kin.team/oauth/token","registrationUrl":"https://forge.kin.team/oauth/register","metadata":"https://forge.kin.team/.well-known/oauth-authorization-server","protectedResource":"https://forge.kin.team/.well-known/oauth-protected-resource"}},"preferredIntegration":{"name":"Native agent (one call)","reason":"Outer agents should send the user message to Forge. Forge runs multi-step tools, quality rules, duplicate guards, and approvals server-side.","endpoint":"https://forge.kin.team/api/v1/agent/run","method":"POST","timeoutSeconds":120,"agentLaws":"https://forge.kin.team/api/v1/agent-laws","onError":"Every error body includes recovery.suggestedTool + recovery.suggestedArgs. Call that next. Never create a second job/invoice to bypass a lock or missing thin tool.","headers":{"Authorization":"Bearer fk_live_...","Content-Type":"application/json","Idempotency-Key":"optional-uuid-recommended"},"body":{"message":"Quote Acme drywall unit 12 $2400. Do not send.","dryRun":false,"conversationId":null,"autoSend":false},"mcpTool":"forge_agent","docs":"https://forge.kin.team/docs/FORGE_AGENT_API.md"},"integrationPaths":[{"id":"native_agent","rank":1,"title":"Native agent HTTP","when":"Any chat agent, Kin, Claude custom tool, n8n, Zapier HTTP, internal bots","effort":"One tool registration","endpoint":"https://forge.kin.team/api/v1/agent/run"},{"id":"mcp","rank":2,"title":"Model Context Protocol","when":"Claude Desktop, Cursor, MCP hosts","discovery":"https://forge.kin.team/.well-known/mcp.json","serverUrl":"https://forge.kin.team/api/mcp","toolCount":145,"recommendedDefaultTool":"forge_agent"},{"id":"rest","rank":3,"title":"REST API v1","when":"Custom UI, ETL, full programmatic control","openapi":"https://forge.kin.team/api/v1/openapi.yaml","baseUrl":"https://forge.kin.team/api/v1"}],"endpoints":{"agentRun":{"method":"POST","path":"/api/v1/agent/run","auth":true},"agentRunStatus":{"method":"GET","path":"/api/v1/agent/runs/{runId}","auth":true},"agentApprove":{"method":"POST","path":"/api/v1/agent/approvals/{id}/approve","auth":true},"agentReject":{"method":"POST","path":"/api/v1/agent/approvals/{id}/reject","auth":true},"health":{"method":"GET","path":"/api/v1/health","auth":false},"openapi":{"method":"GET","path":"/api/v1/openapi.yaml","auth":false},"agentGuide":{"method":"GET","path":"/api/v1/agent-guide","auth":false},"agentLaws":{"method":"GET","path":"/api/v1/agent-laws","auth":false},"agentBootstrap":{"method":"GET","path":"/api/v1/agent/bootstrap","auth":"optional — richer with Bearer"},"team":{"method":"GET|POST|PATCH","path":"/api/v1/team/members","auth":true},"teamInvitations":{"method":"GET|POST","path":"/api/v1/team/invitations","auth":true},"clients":{"method":"GET|POST|PATCH","path":"/api/v1/clients","auth":true},"jobs":{"method":"GET|POST|PATCH","path":"/api/v1/jobs","auth":true},"quotes":{"method":"GET|POST|PATCH","path":"/api/v1/quotes","auth":true},"invoices":{"method":"GET|POST|PATCH","path":"/api/v1/invoices","auth":true},"properties":{"method":"GET|POST|PATCH","path":"/api/v1/properties","auth":true},"search":{"method":"GET","path":"/api/v1/search","auth":true},"batch":{"method":"POST","path":"/api/v1/batch","auth":true},"webhooks":{"method":"GET|POST","path":"/api/v1/webhooks","auth":true}},"fieldAliases":{"note":"Client writes accept friendly aliases so agents do not need Forge-internal names.","client":{"email":"billingEmail","phone":"billingPhone","address":"billingAddress","city":"billingCity","state":"billingProvince","province":"billingProvince","zip":"billingPostal","postal":"billingPostal"},"jobIdentifiers":"UUID, jobId, or J-#### accepted on get/update","quoteIdentifiers":"UUID or Q-#### accepted on get/update/send"},"agentRules":["Fetch GET /api/v1/agent/bootstrap on connect and inject standingInstructions before any CRM tool use.","Default multi-step CRM work to POST /api/v1/agent/run (or MCP forge_agent) — one NL message.","Product Law Balanced (v2) applies to all commercial creates: client, property, quote, job, invoice — UI, REST, MCP, native agent.","Never create a new job/quote/invoice/client to apply edits — list/get then update/revise (or use the native agent).","Site address belongs on a Property (propertyId or propertyAddress/propertyLabel), not only in notes.","Clear email/phone/name match → reuse client. Ambiguous multi-match → stop and ask (do not pick candidates[0]).","One open invoice per job — revise existing INV, do not mint a twin.","On Product Law / duplicate errors, call recovery.suggestedTool. force:true is audited; pass forceReason.","Use email alias for client billing email; root field is billingEmail.","Do not set autoSend:true in tests; never claim email sent without approval/send proof.","Send Idempotency-Key on mutating agent runs and create retries.","Client timeout for agent/run should be at least 120 seconds.","Partial thin-tool subsets on host platforms are not proof Forge lacks the capability — check agent-laws + this document."],"productLaw":{"version":"2.0.0","defaultMode":"balanced","modeSource":"tenants.settings.productLaw.mode | tenants.settings.agent.productLawMode","docs":"https://forge.kin.team/api/v1/agent-laws","domains":["client","property","quote","job","invoice"],"summary":"Server constitution on commercial writes. Balanced resolves clear identity/site matches, blocks ambiguous and duplicate creates, and returns recovery tools. Same laws for humans and agents.","force":{"param":"force","reasonParam":"forceReason","note":"Bypasses Product Law only as intentional exception; audited. Prefer recovery.suggestedTool."},"errorCodes":["DUPLICATE_DETECTED","CLIENT_MATCH_AMBIGUOUS","PROPERTY_REQUIRED","PROPERTY_AMBIGUOUS","SITE_IN_NOTES","ALREADY_INVOICED","OPEN_INVOICE_EXISTS","FORCE_REASON_REQUIRED"]},"mcp":{"discovery":"https://forge.kin.team/.well-known/mcp.json","server":"https://forge.kin.team/api/mcp","tools":["forge_get_overview","forge_search","forge_list_jobs","forge_get_job","forge_create_job","forge_update_job","forge_complete_job","forge_get_job_costs","forge_add_job_cost","forge_remove_job_cost","forge_list_clients","forge_get_client","forge_create_client","forge_update_client","forge_list_contacts","forge_create_contact","forge_update_contact","forge_list_quotes","forge_create_quote","forge_update_quote","forge_get_quote","forge_get_transitions","forge_list_invoices","forge_get_invoice","forge_create_invoice","forge_convert_job_to_invoice","forge_update_invoice","forge_revise_invoice","forge_reopen_invoice","forge_void_invoice","forge_send_invoice","forge_send_quote","forge_record_payment","forge_list_timesheets","forge_list_receipts","forge_remember","forge_recall","forge_create_property","forge_list_properties","forge_get_property","forge_update_property","forge_list_property_contacts","forge_assign_property_contact","forge_list_trash","forge_delete_client","forge_merge_clients","forge_move_record","forge_delete_property","forge_delete_quote","forge_delete_job","forge_delete_invoice","forge_restore","forge_list_change_orders","forge_get_change_order","forge_create_change_order","forge_update_change_order","forge_send_change_order","forge_request_deposit","forge_assign_crew","forge_list_job_photos","forge_attach_job_photo","forge_mark_job_photos","forge_create_site_visit","forge_sync_job_from_quote","forge_list_visits","forge_create_visit","forge_update_visit","forge_complete_visit","forge_approve_timesheets","forge_lock_pay_period","forge_update_receipt","forge_link_receipt","forge_approve_receipt","forge_publish_invoice_qb","forge_sync_invoice_qb_dates","forge_get_schedule","forge_list_crew","forge_get_availability","forge_unassign_crew","forge_reschedule_visit","forge_list_unscheduled_jobs","forge_list_payments","forge_get_payment","forge_void_payment","forge_list_overdue_invoices","forge_get_ar_summary","forge_send_payment_reminder","forge_batch_send_invoices","forge_get_invoice_public_link","forge_approve_quote","forge_decline_quote","forge_mark_quote_sent","forge_mark_invoice_sent","forge_convert_quote_to_job","forge_book_job","forge_duplicate_quote","forge_create_time_entry","forge_get_time_entry","forge_update_time_entry","forge_delete_time_entry","forge_list_time_corrections","forge_approve_time_correction","forge_list_time_off","forge_create_time_off","forge_decide_time_off","forge_list_payroll_periods","forge_get_payroll_period","forge_list_team","forge_invite_team_member","forge_add_team_member","forge_update_team_member","forge_list_team_invitations","forge_revoke_team_invitation","forge_list_services","forge_get_service","forge_match_service","forge_create_service","forge_update_service","forge_list_tax_rates","forge_get_tax_rate","forge_create_tax_rate","forge_update_tax_rate","forge_list_custom_fields","forge_get_custom_field_values","forge_set_custom_field_values","forge_create_custom_field","forge_get_profitability_report","forge_get_labor_report","forge_get_revenue_report","forge_get_materials_report","forge_export_payroll","forge_send_customer_sms","forge_send_customer_email","forge_list_customer_messages","forge_list_sms_conversations","forge_get_sms_thread","forge_mark_sms_read","forge_send_quote_sms","forge_send_change_order_sms","forge_get_agent_instructions","forge_list_site_specs","forge_get_site_specs","forge_upsert_site_spec","forge_archive_site_spec","forge_agent"],"recommendedTools":{"multi_step":"forge_agent","search":"forge_search","get":"forge_get_quote"},"defaultSurface":{"name":"default","tools":["forge_agent","forge_get_agent_instructions","forge_search","forge_list_clients","forge_get_client","forge_merge_clients","forge_move_record","forge_list_properties","forge_get_property","forge_list_quotes","forge_get_quote","forge_list_jobs","forge_get_job","forge_list_invoices","forge_get_invoice"],"rule":"Default MCP tools/list is this allowlist. Thin creates are hidden and blocked. Full catalog: X-Forge-Mcp-Surface: full."},"toolCategories":{"agent":["forge_agent"],"clients":["forge_list_clients","forge_get_client","forge_create_client","forge_update_client","forge_list_contacts","forge_create_contact","forge_update_contact","forge_delete_client"],"properties":["forge_list_properties","forge_get_property","forge_create_property","forge_update_property","forge_list_property_contacts","forge_assign_property_contact","forge_delete_property"],"quotes":["forge_list_quotes","forge_get_quote","forge_create_quote","forge_update_quote","forge_send_quote","forge_delete_quote","forge_request_deposit"],"jobs":["forge_list_jobs","forge_get_job","forge_create_job","forge_update_job","forge_get_transitions","forge_assign_crew","forge_list_job_photos","forge_attach_job_photo","forge_delete_job"],"visits":["forge_list_visits","forge_create_visit","forge_update_visit","forge_complete_visit"],"invoices":["forge_list_invoices","forge_get_invoice","forge_create_invoice","forge_convert_job_to_invoice","forge_update_invoice","forge_revise_invoice","forge_reopen_invoice","forge_void_invoice","forge_send_invoice","forge_record_payment","forge_delete_invoice","forge_publish_invoice_qb","forge_sync_invoice_qb_dates"],"changeOrders":["forge_list_change_orders","forge_get_change_order","forge_create_change_order","forge_update_change_order","forge_send_change_order"],"timePayroll":["forge_list_timesheets","forge_create_time_entry","forge_get_time_entry","forge_update_time_entry","forge_delete_time_entry","forge_list_time_corrections","forge_approve_time_correction","forge_list_time_off","forge_create_time_off","forge_decide_time_off","forge_list_payroll_periods","forge_get_payroll_period","forge_approve_timesheets","forge_lock_pay_period","forge_list_team"],"receipts":["forge_list_receipts","forge_update_receipt","forge_link_receipt","forge_approve_receipt"],"ops":["forge_get_overview","forge_search","forge_list_trash","forge_restore","forge_remember","forge_recall"]}},"webhooks":{"docs":"https://forge.kin.team/developers#webhooks","manage":"https://forge.kin.team/api/v1/webhooks"},"statusPageHint":"https://forge.kin.team/api/v1/health"}