{"id":41,"date":"2026-02-22T11:30:00","date_gmt":"2026-02-22T11:30:00","guid":{"rendered":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/api-keys-and-authentication\/"},"modified":"2026-02-22T11:30:00","modified_gmt":"2026-02-22T11:30:00","slug":"api-keys-and-authentication","status":"publish","type":"post","link":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/api-keys-and-authentication\/","title":{"rendered":"API keys and authentication"},"content":{"rendered":"<p class=\"has-large-font-size\">Lattica&#8217;s API is REST + JSON. Authentication is a single header. Most integrations are working in under five minutes.<\/p>\n<h2>Generating a key<\/h2>\n<p>Open <strong>Settings \u2192 API \u2192 New API key<\/strong>. Choose:<\/p>\n<ul>\n<li><strong>Scope<\/strong> \u2014 read-only or read-write<\/li>\n<li><strong>Resource access<\/strong> \u2014 entire workspace, specific projects, or a single project<\/li>\n<li><strong>Expiry<\/strong> \u2014 never, 30 days, 90 days, or 1 year<\/li>\n<\/ul>\n<p>The key is shown <em>once<\/em>, at creation. Lattica never displays it again \u2014 store it in your secrets manager immediately. If you lose it, revoke and generate a new one.<\/p>\n<h2>Authentication<\/h2>\n<p>Pass the key in the <code>Authorization<\/code> header on every request:<\/p>\n<pre><code>curl https:\/\/api.lattica.app\/v1\/tasks \n  -H \"Authorization: Bearer lat_live_8FjK4qHN...\"<\/code><\/pre>\n<p>Tokens prefixed with <code>lat_live_<\/code> are production keys. Sandbox keys (for testing) start with <code>lat_test_<\/code> and operate against a mirror workspace populated with sample data.<\/p>\n<h2>Rate limits<\/h2>\n<table>\n<thead>\n<tr>\n<th>Plan<\/th>\n<th>Requests \/ minute<\/th>\n<th>Burst<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Free<\/td>\n<td>60<\/td>\n<td>120<\/td>\n<\/tr>\n<tr>\n<td>Team<\/td>\n<td>300<\/td>\n<td>600<\/td>\n<\/tr>\n<tr>\n<td>Business<\/td>\n<td>1,200<\/td>\n<td>2,400<\/td>\n<\/tr>\n<tr>\n<td>Enterprise<\/td>\n<td>Custom<\/td>\n<td>Custom<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Every response includes <code>X-RateLimit-Remaining<\/code> and <code>X-RateLimit-Reset<\/code> headers. Going over returns <code>429<\/code> with a <code>Retry-After<\/code> header in seconds.<\/p>\n<h2>Pagination<\/h2>\n<p>List endpoints return up to 100 items. For more, use cursor pagination \u2014 the response includes a <code>next_cursor<\/code>; pass it as <code>?cursor=...<\/code> on the next request.<\/p>\n<pre><code>GET \/v1\/tasks?limit=100\n\u2192 { \"data\": [...], \"next_cursor\": \"eyJpZCI6IjEyMzQ1In0\" }\n\nGET \/v1\/tasks?limit=100&cursor=eyJpZCI6IjEyMzQ1In0\n\u2192 { \"data\": [...], \"next_cursor\": null }   \u2190 end of results<\/code><\/pre>\n<h2>Errors<\/h2>\n<p>Standard HTTP codes. Error responses include a machine-readable <code>code<\/code> and a human-readable <code>message<\/code>:<\/p>\n<pre><code>{\n  \"error\": {\n    \"code\": \"task_not_found\",\n    \"message\": \"No task with id 'task_xyz' in workspace 'ws_8FjK4q'.\",\n    \"request_id\": \"req_aB12cD\"\n  }\n}<\/code><\/pre>\n<p>Always log <code>request_id<\/code> \u2014 it&#8217;s what support will ask for.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Generating keys, authentication header, rate limits per plan, pagination, and error response shape.<\/p>\n","protected":false},"author":0,"featured_media":42,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[40,54,56,55],"class_list":["post-41","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-api-automations","tag-api","tag-authentication","tag-developers","tag-rate-limits"],"_links":{"self":[{"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/posts\/41","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/comments?post=41"}],"version-history":[{"count":0,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/posts\/41\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/media\/42"}],"wp:attachment":[{"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/media?parent=41"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/categories?post=41"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/tags?post=41"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}