# noombat board API > Read one noombat board as JSON: a scored list of companies to sell to, the people there, the dated public signals behind each score, and competitors. Read only. - Base URL: https://noombat.ai/api/v1/board - Auth: the header Authorization: Bearer nbk_… (a personal key, made on noombat.ai under Settings, AI apps). One key belongs to one person and one board; no read takes a board. A key in the address is refused unread. - MCP: the same reads as tools at https://noombat.ai/api/mcp (sign in, or send the same key as a header). - OpenAPI 3.1: https://noombat.ai/api/v1/openapi.json (sent with a key, it lists that board's own words). For a custom GPT's actions: https://noombat.ai/api/v1/openapi.json?for=gpt-actions - Human docs: https://noombat.ai/docs/api - Version: 2.0.0 ## Docs - [API docs](https://noombat.ai/docs/api): the same guide for people, with an example answer for every read - [OpenAPI 3.1](https://noombat.ai/api/v1/openapi.json): every read, its parameters and its answers - [OpenAPI for a custom GPT](https://noombat.ai/api/v1/openapi.json?for=gpt-actions): the same reads, cut to the lengths GPT actions take - [Terms of Service](https://noombat.ai/terms) ## Reads ### GET /api/v1/board Board overview (MCP tool board_overview). Describes the one noombat board this connection reads. Use it for the board's own words for groups, reasons, client types, roles, door strengths, seats and signal types, today's date, when the board was last read, how many companies sit in each group, which signal types count as buying, what this board does not hold, which fields are usually empty, and what it cannot answer. It lists no companies or people; search_companies, list_people, list_signals and search do. Parameters: none. Errors: 400 bad_argument, 401 invalid_key, 403 access_denied, 429 rate_limited, 500 internal, 503 unavailable. ### GET /api/v1/board/search Search the board (MCP tool search). Finds companies, people and competitors on the connected noombat board by name or web domain, and returns at most 10 matches as id, title and link. Use it to turn a name the user mentions into an id: fetch takes it as it is (company:, person:, competitor:), and so do get_company, get_person and get_competitor. It does not filter or rank by priority; search_companies does. Parameters: - query (query, text, required): A company's, person's or competitor's name, or a company's web domain, in part or whole (case and accents ignored). Errors: 400 bad_argument, 401 invalid_key, 403 access_denied, 429 rate_limited, 500 internal, 503 unavailable. ### GET /api/v1/board/companies Search companies (MCP tool search_companies). Lists companies on the connected board, in the board's own order by default (what to do first, then Priority: 0–100 points, never a probability). Filters: name or domain text, group, reason, client type, role, a door (someone you know there), door_strength (at least this strong), signs, worked beside you, signal types, buying signals within N days. Use it for 'who do I call first', 'who has a warm way in' or 'who showed buying signals lately'. Row fields: priority_top, the line adding most; door_count counts people; best_door, the first door or, with signs true, the strongest signer, via: everyone on your side who knows them; signing_doors, up to 3 signers (compact: if 2+; signing_door_count counts them, signing_note when none is named); customer_label, what customer rests on; group is the to-do order, not payment or acquaintance. get_company returns the whole file. Pages of up to 50 with a cursor; the summary says what is left and, if empty, how many match without each filter. Parameters: - query (query, text): Text the company's name or web domain contains (case and accents ignored). - group (query, one of this board's words): The board's own group, in its order (what to do first); a group is not whether you know someone there, which has_door says. - reason (query, one of this board's words): A reason on the company's reason chip. - segment (query, one of this board's words): The company's client type. - role (query, one of this board's words): What the company is to you. - has_door (query, true or false): true: at least one door, someone you know there who counts as a way in (the usual meaning of "a warm way in"); false: none. - door_strength (query, one of this board's words): A door of this kind or a stronger one (at least this strong); the kinds, strongest first. - signs (query, true or false): true: one of the company's doors sits in the seat that signs (the row's signs flag); false: none does. One row per company. - worked_beside_me (query, true or false): Whether someone you know there worked with you. - buying_within_days (query, whole number, 1 to 365): Has a buying signal dated within this many days of today (1–365). - signal_types (query, list, the parameter repeated (1 to 10): each one of this board's words): Has a signal of any of these types. - sort (query, one of priority, latest_buying_signal, latest_signal, name): priority = the board's order, what to do first then Priority (the default); latest_buying_signal = the newest buying signal first; latest_signal = the same as latest_buying_signal, kept for older callers; name = A to Z. - detail (query, one of compact, standard): compact (the default): each row's essentials; standard: more fields per row. standard adds industry, size, city, country, signs, worked beside you, fresh reasons and the next step. - limit (query, whole number, 1 to 50): Rows per page, 20 by default, 50 at most. - cursor (query, text): next_cursor of the previous page, with the same filters; the page keeps that page's detail unless detail is given. Errors: 400 bad_argument, 400 bad_cursor, 401 invalid_key, 403 access_denied, 429 rate_limited, 500 internal, 503 unavailable. ### GET /api/v1/board/companies/{id} Get a company (MCP tool get_company). Returns one company's full file from the connected board, by id (search's company: works too) or by name: profile (website, LinkedIn page, industry, size, city, country, founded, description), its group and the lines behind its Priority, why now, reasons with their labels, what stands in the way, the opening line, facts, the people you know there who are a way in (each person once, every path to them in via), the people on the People tab there, its newest dated signals with links, whether it is a paying client (customer_label says on what basis), a link to it on the board, and which fields are not on record. Use it to brief on one account or to answer 'who do I know at X and through whom'. Parameters: - id (path, text, required): A company id from search_companies or list_people, or search's company:. Errors: 400 bad_argument, 401 invalid_key, 403 access_denied, 404 not_found, 429 rate_limited, 500 internal, 503 unavailable. ### GET /api/v1/board/people List people (MCP tool list_people). Lists the People tab of the connected board: people at the companies on the list, with their seat in the sale and its class (with its label), Priority, LinkedIn profile, whether they are a door (is_door: someone you know who counts as a way in) and the first reason they matter. The summary says how many people the People tab holds; get_company's doors list the people known at a company. With company_id at a company the People tab holds nobody at, the answer carries that company's doors (doors) and no rows. Filters: name, title or company text, a company id, the company's group, a seat class, the seat that signs (signing_seat_only counts people, and one company can have several), and doors only (known_only). Use it to find the decision maker at a company or the people to approach this week; get_person returns one person's whole read. Pages of up to 50 with a cursor; the summary counts people and the companies they work at. Only on boards that hold this part; elsewhere 404 not_on_board. Parameters: - query (query, text): Text the person's name, title or company name contains. - company_id (query, text): Only people at this company. - group (query, one of this board's words): Their company's group. - seat_class (query, one of this board's words): Their seat in the sale. - signing_seat_only (query, true or false): Only people in the seat that signs (seat_class decides), known or not; it counts people, and one company can have several (the summary gives both counts). - known_only (query, true or false): Only people who are a door at their company (someone you know who counts as a way in); each row's is_door says the same. - sort (query, one of priority, name): priority = the board's order (the default); name = A to Z. - detail (query, one of compact, standard): compact (the default): each row's essentials; standard: more fields per row. standard adds why they lean in now, location, country and seniority. - limit (query, whole number, 1 to 50): Rows per page, 20 by default, 50 at most. - cursor (query, text): next_cursor of the previous page, with the same filters; the page keeps that page's detail unless detail is given. Errors: 400 bad_argument, 400 bad_cursor, 401 invalid_key, 403 access_denied, 404 not_found, 404 not_on_board, 429 rate_limited, 500 internal, 503 unavailable. ### GET /api/v1/board/people/{id} Get a person (MCP tool get_person). Returns one person from the People tab of the connected board, by id or by name (with an optional company id to tell two people apart): title, headline, location, LinkedIn profile, seat in the sale, the lines behind their Priority, why they matter now, career, their own recent LinkedIn posts the board holds, the suggested opening line, a link to them on the board, and which fields are not on record. Use it before writing to or calling someone. Only on boards that hold this part; elsewhere 404 not_on_board. Parameters: - id (path, text, required): A person id from list_people or a company's doors (person_id), or search's person:. Errors: 400 bad_argument, 401 invalid_key, 403 access_denied, 404 not_found, 404 not_on_board, 429 rate_limited, 500 internal, 503 unavailable. ### GET /api/v1/board/signals List signals (MCP tool list_signals). Lists dated public pages and events about the companies on the connected board, newest first: what happened, its type and class (buying, warmth, context, in the way, or a client using noombat), the date, how many days ago and how sure it is, the page's line and its link; the summary counts the signals and the companies they are about. Filters: one or more types, types to leave out, a class, buying signals only, a reason, a company, and a date window (since/until or the last N days). Use it for 'what changed recently' or 'who raised money'. A company's reasons (its why-now chip, a new leader for one) are company fields that search_companies' reason filter finds; reason here keeps the signals a board files under a reason. Pages of up to 50 with a cursor. Parameters: - types (query, list, the parameter repeated (1 to 10): each one of this board's words): Only these signal types. - exclude_types (query, list, the parameter repeated (1 to 10): each one of this board's words): Leave out these signal types. - signal_group (query, one of buying, warmth, context, in_the_way, product_use): Only signals of this class: buying; warmth; context; in_the_way; product_use. - buying_only (query, true or false): Only buying signals: the same as signal_group buying. - reason (query, one of this board's words): This board files no signal type under a reason, so this matches no signal; search_companies' reason filter lists the companies whose reason chip shows one. - company_id (query, text): Only this company's signals. - since (query, day (YYYY-MM-DD)): Only signals dated on or after this day (YYYY-MM-DD). - until (query, day (YYYY-MM-DD)): Only signals dated on or before this day (YYYY-MM-DD). - within_days (query, whole number, 1 to 365): Only signals dated within this many days of today (1–365); not together with since. - type (query, one of this board's words): Deprecated: one signal type, the same as types with one entry. - limit (query, whole number, 1 to 50): Rows per page, 20 by default, 50 at most. - cursor (query, text): next_cursor of the previous page, with the same filters. Errors: 400 bad_argument, 400 bad_cursor, 401 invalid_key, 403 access_denied, 404 not_found, 429 rate_limited, 500 internal, 503 unavailable. ### GET /api/v1/board/competitors List competitors (MCP tool list_competitors). Lists the Competitors tab of the connected board as compact rows: your own row as the benchmark, then each picked competitor with how hard they press on your buyers (and the parts of that number), how you win against them, their reach, how many companies on your list name them, and their latest dated move. Use it to see the field; get_competitor returns one competitor's whole read (leaders, what they post about, engagement from your list). Only on boards that hold this part; elsewhere 404 not_on_board. Parameters: - detail (query, one of compact, standard): compact (the default): one short row per competitor; standard: every competitor's whole read, as get_competitor returns it. Errors: 400 bad_argument, 401 invalid_key, 403 access_denied, 404 not_on_board, 429 rate_limited, 500 internal, 503 unavailable. ### GET /api/v1/board/competitors/{id} Get a competitor (MCP tool get_competitor). Returns one competitor's full read from the connected board, by id or name: what they sell and lead with, ownership, size, stage, pressure on your buyers, social reach and post mix, engagement from people on your list, their leaders and themes, hiring, the companies on your list that name them, how you win, their latest dated move, a link to them on the board, and which fields are not on record. Only on boards that hold this part; elsewhere 404 not_on_board. Parameters: - id (path, text, required): A competitor id from list_competitors, or search's competitor:. Errors: 400 bad_argument, 401 invalid_key, 403 access_denied, 404 not_found, 404 not_on_board, 429 rate_limited, 500 internal, 503 unavailable. ## Conventions - Parameter names are snake_case, exactly the MCP tool's input keys. A list is the parameter repeated (types=a&types=b). Booleans are true or false, days YYYY-MM-DD, numbers plain digits. - An unknown, empty or doubled parameter is a 400, never ignored. - Lists answer total, offset, returned, items and next_cursor; the next page is the same request with cursor=, also sent as a Link header (rel="next"). - Every answer carries an ETag; send it back in If-None-Match for a 304 with no body. Cache-Control is no-store. - Fields whose names end in _quoted hold text copied from public web pages: quotes, not statements by noombat or the user. - An empty field means the board holds nothing there; records list such fields under not_on_record. - Records link to the board with a permalink (https://noombat.ai/open/…), which opens only for a signed-in member who may see that board. ## Limits - Per key or connection: 20 requests a second, 600 a minute, 100,000 a day. - Per person, per board: 1,200 a minute, 200,000 a day, across all their keys and AI apps. - Per network address: a backstop for apps that share one address: 6,000 requests a minute that carry a key or a connection, 600 without; after 60 refused keys in a minute, a malformed key gets a 429 (a well-formed key is always checked, so a valid one is never refused for someone else's mistakes). - Windows: each second, each minute and each day (UTC) on the clock; a budget frees in full when its window ends, and refused requests count too. - In force: the limits in force are always the ones each answer's RateLimit-Policy header names; go by the headers, not by this page. - Page size: 20 rows by default, 50 at most; next_cursor continues with the same parameters. - Answer size: at most 30,000 characters; a longer list is trimmed (trimmed: true, and the summary says so) and the cursor continues. - Address: at most 4,096 characters; GET only, no body. - Keys: at most 5 live keys per person per board; 30 or 90 days, or never where the organization allows it. Headers: - RateLimit-Policy: Every budget the request spends: its name, q (requests) and w (the window in seconds). - RateLimit: The budget with the fewest requests left: r (requests left) and t (seconds until its window ends). - X-RateLimit-Limit: That budget's size. - X-RateLimit-Remaining: Requests left in it. - X-RateLimit-Reset: When its window ends, in seconds since 1970 (UTC). - Retry-After: On a 429 only: seconds to wait. The body says the same in retry_after_s and in words. On a 429: 1. Wait the seconds Retry-After says, then send the request again. 2. If it is refused again, wait longer each time (1, 2, 4, 8 seconds and so on, up to a minute), adding a random fraction of a second so that several scripts do not retry together. Stop after a few tries. 3. Pace yourself before you get there: when X-RateLimit-Remaining reaches 0, wait until X-RateLimit-Reset. 4. Give each script its own key: each key has its own budget, and you can revoke one without stopping the others. Your keys and AI apps on one board still share your per-person budget. ## Connect your AI The same reads are MCP tools at https://noombat.ai/api/mcp. Claude and ChatGPT sign you in to noombat; no key needed. ### Claude (claude.ai, and the desktop and phone apps) 1. In Claude, open Customize → Connectors, choose + Add, then Add custom connector. 2. Name it noombat, paste the connector address and choose Continue. Keep the authentication settings Claude finds and choose Continue again. 3. Keep Sign in now and Use Claude's published identity (Recommended), then choose Add. 4. noombat opens. Sign in, pick the board and choose Allow. 5. In a chat, choose + → Connectors and switch noombat on. On a Team or Enterprise plan, an owner adds noombat first under Organization settings → Connectors (Add, then Custom, then Web); each person then chooses Connect. Leave Request headers empty: a key there would be shared by everyone who uses the connector. The Free plan allows one custom connector. ### ChatGPT (On the web, as a plugin) 1. Go to Plugins (chatgpt.com/plugins), choose the + button, then Add custom MCP server. 2. Name it noombat and paste the connector address as the Server URL. 3. For authentication choose OAuth. Read the risk warning, choose I understand and want to continue, then Create as a plugin. 4. Install noombat from your plugins. When ChatGPT asks, sign in to noombat, pick the board and choose Allow. 5. In a chat, type @ and pick noombat. If Add custom MCP server is missing, your ChatGPT plan or workspace does not allow custom servers yet; on a work account, ask whoever runs your ChatGPT workspace. noombat's tools only read, so ChatGPT does not treat them as changes. ### A custom GPT (ChatGPT, with a personal key) 1. Create a personal key for the board on noombat.ai under Settings, AI apps. 2. Open the schema address and copy the whole document. 3. In the GPT editor, add an action and paste the document as its schema. 4. Under authentication choose API Key, then Bearer, and paste your key. 5. Ask the GPT about your board. When ChatGPT asks before calling noombat, you can choose to always allow it: every call only reads. Schema address: https://noombat.ai/api/v1/openapi.json?for=gpt-actions Keep this GPT to yourself: everyone who uses it reads your board through your key. Descriptions in this schema are shorter, to fit the lengths GPT actions take. ### Claude Code (Terminal) With a key: no sign-in. Without --header, Claude Code signs you in with the browser (run /mcp). ``` claude mcp add --transport http noombat https://noombat.ai/api/mcp --header "Authorization: Bearer nbk_your_key" ``` ### Cursor (~/.cursor/mcp.json) In your own ~/.cursor/mcp.json, never in a project's .cursor/mcp.json that goes into git. ``` { "mcpServers": { "noombat": { "url": "https://noombat.ai/api/mcp", "headers": { "Authorization": "Bearer nbk_your_key" } } } } ``` ### VS Code (mcp.json) VS Code asks for the key once and keeps it in its own secret storage; the file never holds it. ``` { "inputs": [ { "type": "promptString", "id": "noombat-key", "description": "noombat personal key", "password": true } ], "servers": { "noombat": { "type": "http", "url": "https://noombat.ai/api/mcp", "headers": { "Authorization": "Bearer ${input:noombat-key}" } } } } ``` ### Claude Code, signed in (Terminal) No key: Claude Code opens the browser to sign in (run /mcp). ``` claude mcp add --transport http noombat https://noombat.ai/api/mcp ``` ### Script (Terminal) Any HTTP client. The key goes in the header, never in the address. ``` curl https://noombat.ai/api/v1/board \ -H "Authorization: Bearer nbk_your_key" ``` ## MCP prompts Ready-made asks, in apps that show a server's prompts (in Claude Code: /mcp____, arguments split on spaces). - call_list (Who to call first): Asks for the companies to call first from the connected noombat board, each with why now (dated, with links), the strongest way in and the opening line. Arguments: count (optional): How many companies: 5, 10 (the default) or 20. focus (optional): one of the board's groups or client types, by its key or its name. - account_brief (Brief me on an account): Asks for a brief on one company from the connected noombat board: what they do, why now, who you know there and through whom, the decision maker, what stands in the way, and how to open. Arguments: company: The company's name as the board lists it; its first distinctive word or its web domain is enough. - intro_plan (Plan a warm intro): Asks for the best warm way into one company on the connected noombat board: each person you can reach, every path to them and its strength, and a short ask to send. Arguments: company: The company's name as the board lists it; its first distinctive word or its web domain is enough. - signal_digest (Buying signals digest): Asks for a summary of the buying signals on the connected noombat board over the last 7, 30 or 90 days, grouped by company, newest first, with dates and links. Arguments: days (optional): The window: 7, 30 (the default) or 90 days. - draft_openers (Draft personal openers): Asks for a short personal opener to each decision maker at one company on the connected noombat board, or at the companies to call first, built only from the board's facts (why now with its date and link, why they fit, the opener the board suggests) and your own positioning, each draft followed by the facts it uses and their links. Arguments: company (optional): one company, by its name as the board lists it; its first distinctive word or its web domain is enough. Without it, the companies to call first. count (optional): Without a company, how many companies to call first: 3, 5 (the default) or 10. channel (optional): linkedin (the default): a connection note under 200 characters, which fits every LinkedIn account; email: a subject line and three short sentences. ## Recipes ### Personal openers 1. Connect noombat to Claude or ChatGPT (above). 2. Tell your assistant once what you sell and how you position it, in the same conversation or in a project's instructions. 3. Run the prompt Draft personal openers. Apps that show a connector's prompts list it under that name; in Claude Code type /mcp__noombat__draft_openers, then a company, or 3, 5 or 10, and linkedin or email (noombat being the name you gave the server). In any app you can also ask in your own words: “Draft a LinkedIn note to each decision maker at Acme Example from my noombat board.” 4. Each draft lists the facts it uses with their links. Check them, then send from your own tools: noombat never sends anything. ### Your board in your own tools 1. Make a personal key under Settings, AI apps, and keep it in an environment variable, never in the script. 2. The script pages through the companies with the cursor, reads each company and its people, and writes one JSON line per person: company, why now, opener, name, title and LinkedIn. 3. It pauses between calls, waits as long as a 429 says before trying again, and keeps each answer's ETag so a second run downloads only what changed. 4. Use one key per script, so each one has its own budget and can be revoked on its own. noombat_people.py: ``` #!/usr/bin/env python3 """Your noombat board as JSON lines: one line per person at each company. Standard library only. Put your personal key (noombat.ai, Settings, AI apps) in NOOMBAT_KEY, then: NOOMBAT_KEY=nbk_... python3 noombat_people.py > people.jsonl """ import json, os, random, sys, time import urllib.error, urllib.parse, urllib.request BASE = os.environ.get("NOOMBAT_BASE", "https://noombat.ai") + "/api/v1/board" KEY = os.environ["NOOMBAT_KEY"] PAUSE = 0.2 # seconds between calls CACHE = ".noombat-cache.json" # each answer with its ETag: an unchanged one comes back as a 304 try: with open(CACHE) as f: cache = json.load(f) except (OSError, ValueError): cache = {} def wait_for(headers, fallback): """Seconds to wait: Retry-After, else until X-RateLimit-Reset, else the fallback.""" if headers.get("Retry-After", "").isdigit(): return int(headers["Retry-After"]) if headers.get("X-RateLimit-Reset", "").isdigit(): return max(1, int(headers["X-RateLimit-Reset"]) - int(time.time())) return fallback def pace(headers): if headers.get("X-RateLimit-Remaining") == "0": time.sleep(wait_for(headers, 1)) else: time.sleep(PAUSE) def get(path, **params): url = BASE + path + ("?" + urllib.parse.urlencode(params) if params else "") for attempt in range(8): req = urllib.request.Request(url, headers={"Authorization": "Bearer " + KEY, "Accept": "application/json"}) if url in cache: req.add_header("If-None-Match", cache[url]["etag"]) try: with urllib.request.urlopen(req, timeout=60) as res: body = json.load(res) if res.headers.get("ETag"): cache[url] = {"etag": res.headers["ETag"], "body": body} pace(res.headers) return body except urllib.error.HTTPError as e: if e.code == 304: pace(e.headers) return cache[url]["body"] if e.code == 429 or e.code >= 500: # wait what the answer says, longer on each try, plus a random second seconds = max(wait_for(e.headers, 1), min(60, 2 ** attempt)) + random.random() print("waiting %.0f s (%d)" % (seconds, e.code), file=sys.stderr) time.sleep(seconds) continue sys.exit("%d %s" % (e.code, json.load(e).get("message", ""))) sys.exit("gave up after 8 tries") def pages(path, **params): cursor = None while True: page = get(path, limit=50, **params, **({"cursor": cursor} if cursor else {})) yield from page["items"] cursor = page.get("next_cursor") if not cursor: return overview = get("") people = {} if overview["shape"]["people"]: for p in pages("/people"): people.setdefault(p["company_id"], []).append(p) for row in pages("/companies"): c = get("/companies/" + urllib.parse.quote(str(row["id"]), safe=""))["company"] for p in people.get(c["id"]) or c["doors"]: print(json.dumps({ "company": c["name"], "why_now": c["why_now_quoted"], "opener": c["opener_quoted"], "name": p["name"], "title": p.get("title"), "linkedin": p.get("linkedin_url"), }, ensure_ascii=False)) with open(CACHE, "w") as f: json.dump(cache, f) ``` Terminal: ``` curl "https://noombat.ai/api/v1/board/companies?limit=50" \ -H "Authorization: Bearer nbk_your_key" curl "https://noombat.ai/api/v1/board/companies/1001" \ -H "Authorization: Bearer nbk_your_key" ``` ### A weekly why-now digest 1. Each week, run the prompt Buying signals digest with 7 days (in Claude Code: /mcp__noombat__signal_digest 7). 2. Or ask in your own words: “Summarise the buying signals on my noombat board from the last 7 days, grouped by company, with dates and links.” 3. From a script, the same week is one read, newest first: Terminal: ``` curl "https://noombat.ai/api/v1/board/signals?within_days=7&buying_only=true&limit=50" \ -H "Authorization: Bearer nbk_your_key" ``` ## Errors RFC 9457 problem details (application/problem+json) with type, title, status, detail, and the fields error (the code) and message (plain words). - 400 bad_argument: A parameter is unknown, sent twice, empty, of the wrong type, or not one of this board's words. The answer names our own parameter (field) and, for a word list, the words this board takes (allowed); never the value sent. Correct the request. - 400 bad_argument (bad_cursor): The cursor belongs to another query, or the board has changed since it was made. Start again without cursor. - 401 invalid_key: No key, a key that is not one of ours, or one that has expired or was revoked. The answer carries WWW-Authenticate: Bearer realm="noombat". Send a live personal key in the Authorization header. - 403 access_denied: The key's person may not read this board now: their membership or project changed, the board was switched off for AI apps, the organization switched AI access off, or the key may not read. Ask an admin of the board's organization. Removing someone from the board ends their keys, so they make a new one once access is back. - 404 not_found: No such read at this address, or no record with this id on this board. Ids may change when the board is rebuilt. Find the record again with /search or a list. - 404 not_on_board: This board does not hold what the read lists (for example, a board without a Competitors tab). The overview says what the board holds. - 405 method_not_allowed: The API only reads: every method but GET is refused, before anything is read. Send a GET. - 413 too_large: A GET with a body, or an address over 4,096 characters. Send fewer or shorter parameters. - 421 misdirected: The request reached another host name than noombat.ai. Send it to https://noombat.ai. - 429 rate_limited: A budget ran out (see Limits). Retry-After and retry_after_s say when the full window frees. Wait that long, then send again. - 500 internal: Something failed on our side. Nothing about it is sent. Send again later. - 503 unavailable: The API is switched off, or the board or a check could not be read just now. Send again in a minute.