{"openapi":"3.1.0","info":{"title":"GatiFlow SaaS API — Public API","description":"Customer-facing GatiFlow Intelligence API. Authenticate with an API key in the `X-API-Key` header, except on `GET /api/v1/public/deep-dive`, which needs no credential, and on `GET /api/v1/public/weekly-report`, which needs the web-app session bearer instead, so an API key receives 401 there.\n\nRate limits and daily quotas are per plan and per organization: every API key an organization holds draws on the same per-minute limit and the same daily quota. `GET /api/v1/intelligence/report`, `GET /api/v1/intelligence/report/export` return both `X-RateLimit-*` and `X-DailyQuota-*` response headers. `GET /api/v1/intelligence/report-history`, `GET /api/v1/intelligence/report/at/{snapshot_id}` return `X-RateLimit-*` alone: they are rate limited and consume no quota. The remaining operations are metered without reporting a header, so read the figures from `GET /api/v1/usage` or from the plan. The operation that takes no credential is capped per caller address instead, and states its own ceiling.\n\n## What people use it for\n\n**You own an API and want to know what your sector is doing** -- `GET /api/v1/intelligence/report` returns the week filtered to the topics on your organization profile, and its `trend_analysis` block carries the movement (`velocity`, `spikes`, `emerging`, `declining`) instead of a feed you have to read. A daily call is enough: rather than serve intelligence older than 24 hours the endpoint returns 503 with `Retry-After`.\n\n**You built the product and marketing is the part you are worst at** -- `sections.market_trends` and the `emerging` list in `GET /api/v1/intelligence/report` name the topics your buyers are already reading about, so a post has a subject before it has a deadline. `GET /api/v1/public/deep-dive` returns the preview of the current long-form article with no API key, and the address where the whole article is free to read.\n\n**You want the signals inside the tools your team already uses** -- `GET /api/v1/intelligence/report/export` returns the same report as a file for a warehouse load or a weekly deck: CSV on Pro, CSV or PDF on Business. `GET /api/v1/intelligence/report-history` and `GET /api/v1/intelligence/report/at/{snapshot_id}` walk the snapshots your plan retains, so a dashboard starts with history instead of one row, and `GET /api/v1/usage` lists the reports and exports a scheduled job fetched with its key, without a second log.","version":"2.5.0","contact":{"name":"GatiFlow Support","email":"support@gatiflow.io","url":"https://gatiflow.io/api-docs"},"license":{"name":"Proprietary","url":"https://gatiflow.io/terms"},"termsOfService":"https://gatiflow.io/terms"},"servers":[{"url":"https://api.gatiflow.io","description":"Production"}],"externalDocs":{"description":"API documentation","url":"https://gatiflow.io/api-docs"},"tags":[{"name":"intelligence","description":"The intelligence report for the calling organization, its file export and the snapshots the plan retains. Every operation here takes an API key."},{"name":"public","description":"Two payloads published outside the API key: the latest Deep Dive preview, which takes no credential, and the Daily Insights payload, which takes the web-app session."},{"name":"usage","description":"The usage log of the API key that authenticates the call."},{"name":"webhooks","description":"The event GatiFlow sends to the HTTPS endpoints an organization registers in Settings."}],"paths":{"/api/v1/intelligence/report":{"get":{"tags":["intelligence"],"summary":"Generate an intelligence report","description":"Runs a report for the calling organization over the most recent collection cycle and returns it as JSON. Every signal carries its sources, a mention count and a confidence score, and on plans that include evidence, the raw evidence behind that count.\n\nSignal caps per plan: Starter 15, Pro 40, Business 100. An expired trial falls back to a watermarked 3-signal preview with confidence and evidence removed.\n\nResults are filtered to the topics configured on the organization profile. A successful call consumes one unit of the daily quota; a failed generation refunds it. If the underlying data is older than 24 hours the endpoint returns 503 with a Retry-After header rather than serving stale intelligence.\n\nThe schema_version query parameter selects the shape of the contract block, not the version of the payload: 1.1 and 1.2 both return the full contract with capabilities and limits, while the default 1.0 returns the compact one. The response reports the schema it actually is, at the top level and inside the contract, and the two always agree.","operationId":"report_api_v1_intelligence_report_get","parameters":[{"name":"schema_version","in":"query","required":false,"schema":{"type":"string","pattern":"^(1\\.0|1\\.1|1\\.2)$","description":"Shape of the contract block: 1.0, the default, is the compact one; 1.1 and 1.2 add the plan's capabilities and limits.","default":"1.0","title":"Schema Version"},"description":"Shape of the contract block: 1.0, the default, is the compact one; 1.1 and 1.2 add the plan's capabilities and limits."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares.","title":"X-Api-Key"},"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares."}],"responses":{"200":{"description":"Intelligence report for the calling organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntelligenceReport"},"examples":{"starter":{"summary":"Starter plan, full contract (schema 1.2)","description":"Evidence and confidence are present. Signals are capped at 15 and exports are not available.","value":{"schema_version":"1.2","org_id":"3f2a9c14-0b7e-4d21-9a56-8c1d4e7b0f33","plan":"starter","generated_at":"2026-09-03T06:00:11.482913+00:00","contract":{"schema_version":"1.2","plan_level":"Starter","report_type":"Market & Talent Intelligence","capabilities":{"exports":[],"show_evidence":true,"show_confidence":true,"org_briefing":false},"limits":{"max_trends":15,"max_talents":8,"max_signals":15}},"metadata":{"generated_at":"2026-09-03T06:00:11.482913+00:00","product":"GatiFlow Intelligence","report_version":"1.2","confidentiality":"B2B Internal / Client Use","ai_generated":{"applies_to":["executive_summary.narrative"],"model":"Anthropic Claude (Sonnet)","purpose":"Convert structured signals into human-readable narrative; numeric claims fact-checked."}},"score":{"overall_confidence":0.86,"signal_count":38},"sections":{"executive_summary":{"title":"Market & Talent Intelligence Overview","summary":"Full analysis of 38 signals from 9 of 13 sources. Top topics: rust, inference, postgres. 1 talent signals identified.","narrative":"","overall_confidence":0.86},"market_trends":{"title":"Market Intelligence Signals","count":1,"data":[{"source":"hackernews,arxiv","title":"rust","detail":"Strength: high | Mentions: 16","category":"market_trend","timestamp":"2026-09-03T06:00:11.482913+00:00","url":"https://news.ycombinator.com/item?id=41234567","confidence":0.91,"evidence":{"title":"rust","sources":["hackernews","arxiv"],"mentions":16,"metric":"mentions"}}]},"talent_signals":{"title":"Talent Intelligence Signals","count":1,"data":[{"source":"github","title":"@octodev","detail":"Senior Rust engineer, 8 public repositories this quarter","category":"talent","timestamp":"2026-09-03T06:00:11.482913+00:00","url":"https://github.com/octodev","confidence":0.82,"evidence":{"role":"Senior Backend","seniority":"senior","stack":["rust"]}}]},"hiring_signals":{"title":"Hiring & Opportunity Signals","count":1,"data":[{"source":"hiring","title":"Series B infrastructure hiring","detail":"Backend openings up week over week","category":"hiring_signal","timestamp":"2026-09-03T06:00:11.482913+00:00","confidence":0.77,"evidence":{"company_size":"50-200","trend":"expanding"}}]}},"analytics":{"market_overview":{"total_profiles_analyzed":1,"average_score":84.0,"top_score":84},"seniority_distribution":{"leadership_90_99":0,"senior_80_89":1,"mid_70_79":0,"junior_65_69":0},"seniority_levels":{"senior":1},"stack_distribution":{"rust":1},"role_distribution":{"Senior Backend":1},"strategic_insights":[]},"trend_analysis":{"status":"ok","engine":"v3","tracking_stats":{"signals_current":38,"signals_tracked_7d":12,"longest_tracked_days":14},"weeks_of_data":2,"snapshot_count":27,"analysis_timestamp":"2026-09-03T06:00:11.482913+00:00","velocity":[{"topic":"rust","category":"market_trend","current_mentions":16,"current_sources":2,"sources_list":["arxiv","hackernews"],"current_confidence":0.91,"current_metric":16.0,"metric_kind":"mentions","tracked_days":9,"presence":"active","change_pct":42.9,"baseline_metric":11.2,"status":"tracked","metric_trend":"rising"}],"spikes":[],"emerging":[],"declining":[],"silent_but_rising":[],"hot_memory":[],"summary":"Fastest growing: rust (+42.9% vs previous period)"},"client_info":{"client_name":"Acme Capital","org_name":"Acme Capital","plan":"Starter","daily_limit":100,"used_today":3,"subscription_status":"active"}}},"pro":{"summary":"Pro plan, full contract (schema 1.2)","description":"Same shape as Starter with the Pro caps: up to 40 signals and CSV export.","value":{"schema_version":"1.2","org_id":"3f2a9c14-0b7e-4d21-9a56-8c1d4e7b0f33","plan":"pro","generated_at":"2026-09-03T06:00:11.482913+00:00","contract":{"schema_version":"1.2","plan_level":"Pro","report_type":"Market & Talent Intelligence","capabilities":{"exports":["csv"],"show_evidence":true,"show_confidence":true,"org_briefing":false},"limits":{"max_trends":40,"max_talents":30,"max_signals":40}},"metadata":{"generated_at":"2026-09-03T06:00:11.482913+00:00","product":"GatiFlow Intelligence","report_version":"1.2","confidentiality":"B2B Internal / Client Use","ai_generated":{"applies_to":["executive_summary.narrative"],"model":"Anthropic Claude (Sonnet)","purpose":"Convert structured signals into human-readable narrative; numeric claims fact-checked."}},"score":{"overall_confidence":0.86,"signal_count":38},"sections":{"executive_summary":{"title":"Market & Talent Intelligence Overview","summary":"Full analysis of 38 signals from 9 of 13 sources. Top topics: rust, inference, postgres. 1 talent signals identified.","narrative":"","overall_confidence":0.86},"market_trends":{"title":"Market Intelligence Signals","count":1,"data":[{"source":"hackernews,arxiv","title":"rust","detail":"Strength: high | Mentions: 16","category":"market_trend","timestamp":"2026-09-03T06:00:11.482913+00:00","url":"https://news.ycombinator.com/item?id=41234567","confidence":0.91,"evidence":{"title":"rust","sources":["hackernews","arxiv"],"mentions":16,"metric":"mentions"}}]},"talent_signals":{"title":"Talent Intelligence Signals","count":1,"data":[{"source":"github","title":"@octodev","detail":"Senior Rust engineer, 8 public repositories this quarter","category":"talent","timestamp":"2026-09-03T06:00:11.482913+00:00","url":"https://github.com/octodev","confidence":0.82,"evidence":{"role":"Senior Backend","seniority":"senior","stack":["rust"]}}]},"hiring_signals":{"title":"Hiring & Opportunity Signals","count":1,"data":[{"source":"hiring","title":"Series B infrastructure hiring","detail":"Backend openings up week over week","category":"hiring_signal","timestamp":"2026-09-03T06:00:11.482913+00:00","confidence":0.77,"evidence":{"company_size":"50-200","trend":"expanding"}}]}},"analytics":{"market_overview":{"total_profiles_analyzed":1,"average_score":84.0,"top_score":84},"seniority_distribution":{"leadership_90_99":0,"senior_80_89":1,"mid_70_79":0,"junior_65_69":0},"seniority_levels":{"senior":1},"stack_distribution":{"rust":1},"role_distribution":{"Senior Backend":1},"strategic_insights":[]},"trend_analysis":{"status":"ok","engine":"v3","tracking_stats":{"signals_current":38,"signals_tracked_7d":12,"longest_tracked_days":14},"weeks_of_data":2,"snapshot_count":27,"analysis_timestamp":"2026-09-03T06:00:11.482913+00:00","velocity":[{"topic":"rust","category":"market_trend","current_mentions":16,"current_sources":2,"sources_list":["arxiv","hackernews"],"current_confidence":0.91,"current_metric":16.0,"metric_kind":"mentions","tracked_days":9,"presence":"active","change_pct":42.9,"baseline_metric":11.2,"status":"tracked","metric_trend":"rising"}],"spikes":[],"emerging":[],"declining":[],"silent_but_rising":[],"hot_memory":[],"summary":"Fastest growing: rust (+42.9% vs previous period)"},"client_info":{"client_name":"Acme Capital","org_name":"Acme Capital","plan":"Pro","daily_limit":100,"used_today":3,"subscription_status":"active"}}}}}},"headers":{"X-RateLimit-Limit":{"description":"Requests the plan allows in one rate-limit window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset-Seconds":{"description":"Length of the sliding window, in seconds. A request refused with 429 succeeds once this many seconds have passed.","schema":{"type":"integer","minimum":0}},"X-DailyQuota-Limit":{"description":"Calls the plan allows per day.","schema":{"type":"integer","minimum":0}},"X-DailyQuota-Remaining":{"description":"Calls left in today's quota.","schema":{"type":"integer","minimum":0}}}},"401":{"description":"The X-API-Key header is missing, or the key is unknown, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The organization has no subscription, or the subscription is not active.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The organization is inactive, its owner's email address is still unverified after the three-day grace period, or the key lacks the intelligence:read scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A parameter is missing, malformed or out of range. error.details lists each problem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The plan's per-minute rate limit or daily quota is exhausted. error.message says which: Rate limit exceeded, or Daily quota exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The underlying data is older than 24 hours. Sent with a Retry-After header, in seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaleDataError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before asking again.","schema":{"type":"integer","minimum":0}}}}},"security":[{"ApiKeyAuth":[]}],"x-agentic-access":{"action-class":"connected","consequence":"read","subject":"optional","audience":"https://api.gatiflow.io","escalation":{"human-in-the-loop":"none"},"audit":"none"}}},"/api/v1/intelligence/report/export":{"get":{"tags":["intelligence"],"summary":"Export the report as a file","description":"Returns the same report as GET /intelligence/report, serialized to a downloadable file instead of JSON. The response body is the file itself, with a Content-Disposition attachment header and a dated filename.\n\nExport formats follow the plan: Starter has none and receives 403, Pro can export CSV, Business can export CSV and PDF.\n\nA successful export consumes one unit of the daily quota, the same as a report call. If the underlying data is older than 24 hours the endpoint returns 503 with a Retry-After header.","operationId":"export_report_api_v1_intelligence_report_export_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv|pdf)$","description":"File format: csv on Pro and Business, pdf on Business.","default":"csv","title":"Format"},"description":"File format: csv on Pro and Business, pdf on Business."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares.","title":"X-Api-Key"},"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares."}],"responses":{"200":{"description":"The report as a file attachment. Content-Type follows the requested format.","content":{"text/csv":{"schema":{"type":"string","format":"binary"},"example":"section,title,detail,source,category,confidence,url,timestamp\r\nmarket_trends,rust,Strength: high | Mentions: 16,\"hackernews,arxiv\",market_trend,0.91,https://news.ycombinator.com/item?id=41234567,2026-09-03T06:00:11.482913+00:00\r\ntalent_signals,'@octodev,\"Senior Rust engineer, 8 public repositories this quarter\",github,talent,0.82,https://github.com/octodev,2026-09-03T06:00:11.482913+00:00\r\nhiring_signals,Series B infrastructure hiring,Backend openings up week over week,hiring,hiring_signal,0.77,,2026-09-03T06:00:11.482913+00:00\r\n"},"application/pdf":{"schema":{"type":"string","format":"binary"}}},"headers":{"X-RateLimit-Limit":{"description":"Requests the plan allows in one rate-limit window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset-Seconds":{"description":"Length of the sliding window, in seconds. A request refused with 429 succeeds once this many seconds have passed.","schema":{"type":"integer","minimum":0}},"X-DailyQuota-Limit":{"description":"Calls the plan allows per day.","schema":{"type":"integer","minimum":0}},"X-DailyQuota-Remaining":{"description":"Calls left in today's quota.","schema":{"type":"integer","minimum":0}}}},"401":{"description":"The X-API-Key header is missing, or the key is unknown, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The organization has no subscription, or the subscription is not active.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The plan does not include the requested export format, the organization is inactive, its owner's email address is still unverified after the three-day grace period, or the key lacks the intelligence:read scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A parameter is missing, malformed or out of range. error.details lists each problem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The plan's per-minute rate limit or daily quota is exhausted. error.message says which: Rate limit exceeded, or Daily quota exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The underlying data is older than 24 hours. Sent with a Retry-After header, in seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaleDataError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before asking again.","schema":{"type":"integer","minimum":0}}}}},"security":[{"ApiKeyAuth":[]}],"x-agentic-access":{"action-class":"connected","consequence":"read","subject":"optional","audience":"https://api.gatiflow.io","escalation":{"human-in-the-loop":"none"},"audit":"none"}}},"/api/v1/intelligence/report-history":{"get":{"tags":["intelligence"],"summary":"List retained report snapshots","description":"Lists the report snapshots retained for this organization, newest first. Snapshots are written by the collection cycle, not by report calls, so this list reflects what was actually collected. Each entry carries a snapshot_id in the YYYYMMDDTHHmm format, which is what GET /intelligence/report/at/{snapshot_id} expects.\n\nRetention follows the plan: Starter keeps 7 days, Pro keeps 90 days, Business keeps 365 days. An expired trial retains nothing and receives an empty list.\n\nThis endpoint returns metadata only and does not consume daily quota, but it does count against the plan per-minute rate limit.","operationId":"report_history_list_api_v1_intelligence_report_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"How many snapshots to return, newest first.","default":20,"title":"Limit"},"description":"How many snapshots to return, newest first."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares.","title":"X-Api-Key"},"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares."}],"responses":{"200":{"description":"Snapshot metadata for this organization, newest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportHistory"},"examples":{"pro":{"summary":"Two snapshots on a Pro key","value":{"snapshots":[{"snapshot_id":"20260903T0600","generated_at":"2026-09-03T06:00:11.482913+00:00","signal_count":38},{"snapshot_id":"20260902T0600","generated_at":"2026-09-02T06:00:09.117204+00:00","signal_count":35}],"count":2,"plan":"pro","retention_days":90}},"empty":{"summary":"No retained snapshots","description":"Returned for an expired trial, which retains nothing.","value":{"snapshots":[],"count":0,"plan":"free","retention_days":0}}}}},"headers":{"X-RateLimit-Limit":{"description":"Requests the plan allows in one rate-limit window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset-Seconds":{"description":"Length of the sliding window, in seconds. A request refused with 429 succeeds once this many seconds have passed.","schema":{"type":"integer","minimum":0}}}},"401":{"description":"The X-API-Key header is missing, or the key is unknown, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The organization has no subscription, or the subscription is not active.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The organization is inactive, its owner's email address is still unverified after the three-day grace period, or the key lacks the intelligence:read scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A parameter is missing, malformed or out of range. error.details lists each problem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The plan's per-minute rate limit is exhausted: error.message is Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-agentic-access":{"action-class":"connected","consequence":"read","subject":"optional","audience":"https://api.gatiflow.io","escalation":{"human-in-the-loop":"none"},"audit":"none"}}},"/api/v1/intelligence/report/at/{snapshot_id}":{"get":{"tags":["intelligence"],"summary":"Retrieve an archived report snapshot","description":"Returns a report that was archived by an earlier collection cycle, in the same shape as GET /intelligence/report. Use GET /intelligence/report-history to discover the ids that exist.\n\nsnapshot_id uses the YYYYMMDDTHHmm format, for example 20260509T1225. An id in any other shape returns 400 without a lookup.\n\nAvailability follows the plan retention window: Starter keeps 7 days, Pro keeps 90 days, Business keeps 365 days. A plan with no history receives 403, and an id outside the window returns 404.\n\nReading an archived snapshot does not consume daily quota, but it does count against the plan per-minute rate limit, including requests with an invalid id.","operationId":"report_at_snapshot_api_v1_intelligence_report_at__snapshot_id__get","parameters":[{"name":"snapshot_id","in":"path","required":true,"schema":{"type":"string","description":"A snapshot_id from GET /intelligence/report-history, in the YYYYMMDDTHHmm format.","title":"Snapshot Id"},"description":"A snapshot_id from GET /intelligence/report-history, in the YYYYMMDDTHHmm format."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares.","title":"X-Api-Key"},"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares."}],"responses":{"200":{"description":"The archived report for the requested snapshot_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntelligenceReport"},"examples":{"pro":{"summary":"One archived snapshot","description":"The stored report, in the same shape GET /intelligence/report returns.","value":{"schema_version":"1.2","org_id":"3f2a9c14-0b7e-4d21-9a56-8c1d4e7b0f33","plan":"pro","generated_at":"2026-09-03T06:00:11.482913+00:00","contract":{"schema_version":"1.2","plan_level":"Pro","report_type":"Market & Talent Intelligence","capabilities":{"exports":["csv"],"show_evidence":true,"show_confidence":true,"org_briefing":false},"limits":{"max_trends":40,"max_talents":30,"max_signals":40}},"metadata":{"generated_at":"2026-09-03T06:00:11.482913+00:00","product":"GatiFlow Intelligence","report_version":"1.2","confidentiality":"B2B Internal / Client Use","ai_generated":{"applies_to":["executive_summary.narrative"],"model":"Anthropic Claude (Sonnet)","purpose":"Convert structured signals into human-readable narrative; numeric claims fact-checked."}},"score":{"overall_confidence":0.86,"signal_count":38},"sections":{"executive_summary":{"title":"Market & Talent Intelligence Overview","summary":"Full analysis of 38 signals from 9 of 13 sources. Top topics: rust, inference, postgres. 1 talent signals identified.","narrative":"","overall_confidence":0.86},"market_trends":{"title":"Market Intelligence Signals","count":1,"data":[{"source":"hackernews,arxiv","title":"rust","detail":"Strength: high | Mentions: 16","category":"market_trend","timestamp":"2026-09-03T06:00:11.482913+00:00","url":"https://news.ycombinator.com/item?id=41234567","confidence":0.91,"evidence":{"title":"rust","sources":["hackernews","arxiv"],"mentions":16,"metric":"mentions"}}]},"talent_signals":{"title":"Talent Intelligence Signals","count":1,"data":[{"source":"github","title":"@octodev","detail":"Senior Rust engineer, 8 public repositories this quarter","category":"talent","timestamp":"2026-09-03T06:00:11.482913+00:00","url":"https://github.com/octodev","confidence":0.82,"evidence":{"role":"Senior Backend","seniority":"senior","stack":["rust"]}}]},"hiring_signals":{"title":"Hiring & Opportunity Signals","count":1,"data":[{"source":"hiring","title":"Series B infrastructure hiring","detail":"Backend openings up week over week","category":"hiring_signal","timestamp":"2026-09-03T06:00:11.482913+00:00","confidence":0.77,"evidence":{"company_size":"50-200","trend":"expanding"}}]}},"analytics":{"market_overview":{"total_profiles_analyzed":1,"average_score":84.0,"top_score":84},"seniority_distribution":{"leadership_90_99":0,"senior_80_89":1,"mid_70_79":0,"junior_65_69":0},"seniority_levels":{"senior":1},"stack_distribution":{"rust":1},"role_distribution":{"Senior Backend":1},"strategic_insights":[]},"trend_analysis":{"status":"ok","engine":"v3","tracking_stats":{"signals_current":38,"signals_tracked_7d":12,"longest_tracked_days":14},"weeks_of_data":2,"snapshot_count":27,"analysis_timestamp":"2026-09-03T06:00:11.482913+00:00","velocity":[{"topic":"rust","category":"market_trend","current_mentions":16,"current_sources":2,"sources_list":["arxiv","hackernews"],"current_confidence":0.91,"current_metric":16.0,"metric_kind":"mentions","tracked_days":9,"presence":"active","change_pct":42.9,"baseline_metric":11.2,"status":"tracked","metric_trend":"rising"}],"spikes":[],"emerging":[],"declining":[],"silent_but_rising":[],"hot_memory":[],"summary":"Fastest growing: rust (+42.9% vs previous period)"},"client_info":{"client_name":"Acme Capital","org_name":"Acme Capital","plan":"Pro","daily_limit":100,"used_today":3,"subscription_status":"active"}}}}}},"headers":{"X-RateLimit-Limit":{"description":"Requests the plan allows in one rate-limit window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset-Seconds":{"description":"Length of the sliding window, in seconds. A request refused with 429 succeeds once this many seconds have passed.","schema":{"type":"integer","minimum":0}}}},"401":{"description":"The X-API-Key header is missing, or the key is unknown, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The organization has no subscription, or the subscription is not active.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The plan does not retain history, the organization is inactive, its owner's email address is still unverified after the three-day grace period, or the key lacks the intelligence:read scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A parameter is missing, malformed or out of range. error.details lists each problem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"snapshot_id is not in the YYYYMMDDTHHmm format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No snapshot with that id inside the plan retention window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The plan's per-minute rate limit is exhausted: error.message is Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-agentic-access":{"action-class":"connected","consequence":"read","subject":"optional","audience":"https://api.gatiflow.io","escalation":{"human-in-the-loop":"none"},"audit":"none"}}},"/api/v1/usage":{"get":{"tags":["usage"],"summary":"List recent calls made with this API key","description":"Returns the usage log of the API key used on this call: one entry for every report and every export it fetched, with the endpoint, the HTTP status and the timestamp, newest first, together with the organization name. Those are the two operations that consume daily quota, and an entry is written only when the call succeeds, so a refused call and a call to any other operation leave no entry.\n\nThe scope is the key, not the organization. An organization holding several keys sees only the activity of the key that authenticated the request, so rotating a key starts a fresh log rather than continuing the old one.\n\nPass limit to change how many events come back. The default is 100 and the endpoint never returns more than 500, whatever is requested. Reading this log does not consume daily quota.","operationId":"get_my_usage_api_v1_usage_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"How many entries to return, newest first. Values above 500 return 500.","default":100,"title":"Limit"},"description":"How many entries to return, newest first. Values above 500 return 500."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares.","title":"X-Api-Key"},"description":"The API key, prefix gf_: the credential the ApiKeyAuth scheme declares."}],"responses":{"200":{"description":"The reports and exports fetched with the API key used on this request, newest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageLog"},"examples":{"recent":{"summary":"The last few reports and exports fetched with this key","value":{"org_name":"Acme Capital","total_returned":3,"usage":[{"endpoint":"/intelligence/report?schema_version=1.0","status_code":200,"timestamp":"2026-09-03T06:00:11.482913+00:00"},{"endpoint":"/intelligence/report/export?format=csv","status_code":200,"timestamp":"2026-09-03T05:58:02.194771+00:00"},{"endpoint":"/intelligence/report?schema_version=1.2","status_code":200,"timestamp":"2026-09-02T18:04:37.008320+00:00"}]}},"no_calls":{"summary":"A key that has not fetched a report or an export yet","value":{"org_name":"Acme Capital","total_returned":0,"usage":[]}}}}}},"401":{"description":"The X-API-Key header is missing, or the key is unknown, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The organization has no subscription, or the subscription is not active.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The organization is inactive, or its owner's email address is still unverified after the three-day grace period.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A parameter is missing, malformed or out of range. error.details lists each problem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-agentic-access":{"action-class":"connected","consequence":"read","subject":"optional","audience":"https://api.gatiflow.io","escalation":{"human-in-the-loop":"none"},"audit":"none"}}},"/api/v1/public/weekly-report":{"get":{"tags":["public"],"summary":"Get the Daily Insights payload","description":"Returns the shared Daily Insights report: the curated view of the latest collection cycle that backs the Insights page. Sections carry the same signal shape as the intelligence report, with sources, counts and confidence, and the evidence attached.\n\nThe payload is shaped to the caller plan. Pro and Business receive it whole. Starter receives the same report with per-signal velocity removed and section counts re-applied at the Starter caps. A paid or trialing plan is required; an expired trial receives 402.\n\nPass date as YYYY-MM-DD to read an archived day instead of the current one. An unknown date returns 404 and a malformed one returns 400.","operationId":"weekly_report_api_v1_public_weekly_report_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"An archived day as YYYY-MM-DD. Omit it for the current Daily Insights.","title":"Date"},"description":"An archived day as YYYY-MM-DD. Omit it for the current Daily Insights."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The web-app session as `Bearer <token>`: the credential the SessionBearer scheme declares.","title":"Authorization"},"description":"The web-app session as `Bearer <token>`: the credential the SessionBearer scheme declares."}],"responses":{"200":{"description":"Daily Insights payload, shaped to the caller's plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyInsights"},"examples":{"pro":{"summary":"Current day, Pro key","value":{"generated_at":"2026-09-03T06:00:11.482913+00:00","week_of":"September 03, 2026","title":"GatiFlow Daily Insights — Sep 03, 2026","subtitle":"The day's intelligence, distilled from the latest collection cycle.","sections":{"executive_summary":{"title":"Market & Talent Intelligence Overview","summary":"Full analysis of 38 signals from 9 of 13 sources. Top topics: rust, inference, postgres. 1 talent signals identified.","narrative":"","overall_confidence":0.86},"market_trends":{"title":"Market Intelligence Signals","count":1,"data":[{"source":"hackernews,arxiv","title":"rust","detail":"Strength: high | Mentions: 16","category":"market_trend","timestamp":"2026-09-03T06:00:11.482913+00:00","url":"https://news.ycombinator.com/item?id=41234567","confidence":0.91,"evidence":{"title":"rust","sources":["hackernews","arxiv"],"mentions":16,"metric":"mentions"}}]},"talent_signals":{"title":"Talent Intelligence Signals","count":1,"data":[{"source":"github","title":"@octodev","detail":"Senior Rust engineer, 8 public repositories this quarter","category":"talent","timestamp":"2026-09-03T06:00:11.482913+00:00","url":"https://github.com/octodev","confidence":0.82,"evidence":{"role":"Senior Backend","seniority":"senior","stack":["rust"]}}]},"hiring_signals":{"title":"Hiring & Opportunity Signals","count":1,"data":[{"source":"hiring","title":"Series B infrastructure hiring","detail":"Backend openings up week over week","category":"hiring_signal","timestamp":"2026-09-03T06:00:11.482913+00:00","confidence":0.77,"evidence":{"company_size":"50-200","trend":"expanding"}}]}},"score":{"overall_confidence":0.86,"signal_count":38},"analytics":{"market_overview":{"total_profiles_analyzed":1,"average_score":84.0,"top_score":84},"seniority_distribution":{"leadership_90_99":0,"senior_80_89":1,"mid_70_79":0,"junior_65_69":0},"seniority_levels":{"senior":1},"stack_distribution":{"rust":1},"role_distribution":{"Senior Backend":1},"strategic_insights":[]},"cta":{"message":"Get full reports with evidence, exports, and custom topics via API.","signup_url":"https://gatiflow.io/register","api_docs":"https://api.gatiflow.io/docs"},"metadata":{"product":"GatiFlow Intelligence","data_sources":"up to 13","update_frequency":"Every 6 hours","report_type":"Daily Insights"}}}}}}},"400":{"description":"date is not in the YYYY-MM-DD format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A parameter is missing, malformed or out of range. error.details lists each problem.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"No web session, or the session token is invalid, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The organization is not on a paid or trialing plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No Insights snapshot exists for the requested date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The current Insights report has not been generated yet, or the session could not be checked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"SessionBearer":[]}],"x-agentic-access":{"action-class":"connected","consequence":"read","subject":"required","audience":"https://api.gatiflow.io","escalation":{"human-in-the-loop":"none"},"audit":"none"}}},"/api/v1/public/deep-dive":{"get":{"tags":["public"],"summary":"Get the latest Deep Dive preview","description":"Returns the opening preview of the most recent Deep Dive article, plus its topic, title, word count and publication date. No authentication is required.\n\nThe full text is not served here. It is published on the web, free to read with no account, at the address in url; slug is the last segment of that address.\n\nDeep Dive articles are written by a language model from the collected signals, which the response declares. When nothing has been published yet the endpoint returns 200 with status set to no_article rather than an error.\n\nBecause the operation takes no credential there is no key to meter, so the ceiling is per caller address: 60 requests a minute, above which the endpoint returns 429. The article changes once a week, so a caller that polls has nothing to gain from a shorter interval.","operationId":"get_latest_deep_dive_api_v1_public_deep_dive_get","responses":{"200":{"description":"Preview of the most recent Deep Dive article.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeepDivePreview"},"examples":{"published":{"summary":"An article is published","value":{"status":"ok","id":"9d41f0a2-6c58-4c9e-8a3b-27d5e1b40f6a","slug":"what-falling-inference-prices-did-to-the-infrastructure-layer","url":"https://gatiflow.io/deep-dive/what-falling-inference-prices-did-to-the-infrastructure-layer","topic":"inference cost","title":"What Falling Inference Prices Did To The Infrastructure Layer","preview":"The first two paragraphs of the article, in plain text.","word_count":1834,"published_at":"2026-08-30T09:00:00+00:00","full_article_available":true,"upgrade_message":"The full article is free to read at https://gatiflow.io/deep-dive/what-falling-inference-prices-did-to-the-infrastructure-layer"}},"none_yet":{"summary":"Nothing published yet","value":{"status":"no_article","message":"No deep dive available yet. Check back Saturday morning."}}}}}},"429":{"description":"Too many requests from this address. This operation takes no credential, so the ceiling is per caller address: 60 requests a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[],"x-agentic-access":{"action-class":"connected","consequence":"read","subject":"optional","audience":"https://api.gatiflow.io","escalation":{"human-in-the-loop":"none"},"audit":"none"}}}},"webhooks":{"intelligence:alert":{"post":{"summary":"Alerts raised for the organization's watchlist","description":"Sent to every active webhook of an organization on the Pro or Business plan when a collection cycle raises alerts that match its watchlist: a watched topic spiking or emerging, or a watched company appearing in the hiring feed for the first time. Alerts are raised while Signal Alerts is switched on in Settings, and one delivery carries every alert the cycle raised for the organization.\n\nCollection runs every six hours and delivery runs in the same cycle, right after the alerts are raised. A delivery that is not acknowledged is retried at each following cycle, up to five attempts, with the same X-GatiFlow-Delivery-Id; after the fifth failure the webhook is switched off and the organization owner is emailed. Ordering between deliveries is not guaranteed.\n\nVerify every request before acting on it: X-GatiFlow-Signature is t=<unix timestamp>,v1=<hex>, where <hex> is the HMAC-SHA256 of '<timestamp>.<raw body>' under the secret shown once when the webhook was created. See https://gatiflow.io/api-docs/webhooks.","operationId":"intelligenceAlert","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertEvent"}}},"required":true},"responses":{"2XX":{"description":"Acknowledged. Any status below 400 within 10 seconds counts as delivered; redirects are not followed."},"default":{"description":"A 4xx or 5xx, a timeout or a refused connection is a failed attempt and is retried."}},"tags":["webhooks"],"parameters":[{"name":"X-GatiFlow-Event","in":"header","required":true,"description":"The event type, the same value as event in the body.","schema":{"type":"string","enum":["intelligence:alert"]}},{"name":"X-GatiFlow-Signature","in":"header","required":true,"description":"t=<unix timestamp>,v1=<HMAC-SHA256 hex of '<timestamp>.<raw body>' under the webhook secret>. Compare in constant time and reject a mismatch.","schema":{"type":"string","pattern":"^t=[0-9]+,v1=[0-9a-f]{64}$"}},{"name":"X-GatiFlow-Timestamp","in":"header","required":true,"description":"The t= value of the signature, on its own. It is fixed when the event is raised and travels unchanged through every retry.","schema":{"type":"integer"}},{"name":"X-GatiFlow-Delivery-Id","in":"header","required":true,"description":"One id per logical delivery, repeated on every retry. Use it to discard duplicates.","schema":{"type":"string","format":"uuid"}},{"name":"X-GatiFlow-Attempt","in":"header","required":true,"description":"Which attempt this is, 1 to 5.","schema":{"type":"integer","minimum":1,"maximum":5}}]}}},"components":{"schemas":{"AIGeneratedDeclaration":{"properties":{"applies_to":{"items":{"type":"string"},"type":"array","title":"Applies To"},"model":{"type":"string","title":"Model"},"purpose":{"type":"string","title":"Purpose"},"regulation":{"type":"string","title":"Regulation"}},"type":"object","required":["applies_to","model","purpose"],"title":"AIGeneratedDeclaration","description":"Which parts of the payload a language model wrote."},"AlertData":{"properties":{"alert_count":{"type":"integer","minimum":1.0,"title":"Alert Count"},"alerts":{"items":{"oneOf":[{"$ref":"#/components/schemas/SpikeAlert"},{"$ref":"#/components/schemas/EmergingAlert"},{"$ref":"#/components/schemas/NewHirerAlert"}],"discriminator":{"propertyName":"type","mapping":{"emerging":"#/components/schemas/EmergingAlert","new_hirer":"#/components/schemas/NewHirerAlert","spike":"#/components/schemas/SpikeAlert"}}},"type":"array","title":"Alerts"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["alert_count","alerts","generated_at"],"title":"AlertData","description":"Every alert one collection cycle raised for the organization's\nwatchlist, and when the cycle raised them."},"AlertEvent":{"properties":{"event":{"type":"string","const":"intelligence:alert","title":"Event"},"data":{"$ref":"#/components/schemas/AlertData"}},"type":"object","required":["event","data"],"title":"AlertEvent","description":"The body of every ``intelligence:alert`` delivery."},"ClientInfo":{"properties":{"client_name":{"type":"string","title":"Client Name"},"org_name":{"type":"string","title":"Org Name"},"plan":{"type":"string","title":"Plan"},"daily_limit":{"type":"integer","title":"Daily Limit"},"used_today":{"type":"integer","title":"Used Today"},"subscription_status":{"type":"string","title":"Subscription Status"},"trial_days_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trial Days Remaining"}},"type":"object","required":["client_name","org_name","plan","daily_limit","used_today"],"title":"ClientInfo","description":"Who the report was built for and how much of today's quota is used."},"DailyInsights":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"week_of":{"type":"string","title":"Week Of"},"title":{"type":"string","title":"Title"},"subtitle":{"type":"string","title":"Subtitle"},"sections":{"$ref":"#/components/schemas/ReportSections"},"score":{"$ref":"#/components/schemas/ReportScore"},"analytics":{"$ref":"#/components/schemas/ReportAnalytics"},"cta":{"$ref":"#/components/schemas/InsightsCallToAction"},"metadata":{"$ref":"#/components/schemas/InsightsMetadata"}},"type":"object","required":["generated_at","week_of","title","subtitle","sections","score","analytics","cta","metadata"],"title":"DailyInsights","description":"The shared Daily Insights report, shaped to the caller's plan."},"DeepDivePreview":{"properties":{"status":{"type":"string","enum":["ok","no_article"],"title":"Status"},"message":{"type":"string","title":"Message"},"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"url":{"type":"string","format":"uri","title":"Url"},"topic":{"type":"string","title":"Topic"},"title":{"type":"string","title":"Title"},"preview":{"type":"string","title":"Preview"},"word_count":{"type":"integer","title":"Word Count"},"published_at":{"type":"string","format":"date-time","title":"Published At"},"full_article_available":{"type":"boolean","title":"Full Article Available"},"upgrade_message":{"type":"string","title":"Upgrade Message"}},"type":"object","required":["status"],"title":"DeepDivePreview","description":"The opening of the latest Deep Dive, or ``status: no_article``.\n\nThe full article is free to read at ``url``. ``upgrade_message`` predates\nthat and is kept for v1 callers; it now names the same address."},"EmergingAlert":{"properties":{"type":{"type":"string","const":"emerging","title":"Type"},"topic":{"type":"string","title":"Topic"},"current_mentions":{"type":"integer","title":"Current Mentions"},"sources":{"type":"integer","title":"Sources","description":"Number of independent sources that observed it."}},"type":"object","required":["type","topic","current_mentions","sources"],"title":"EmergingAlert","description":"A watched topic appeared, with no baseline to compare against yet."},"ErrorDetail":{"properties":{"message":{"type":"string","title":"Message","description":"Why the request was refused, in plain words."},"code":{"type":"string","enum":["HTTP_ERROR","NOT_FOUND","VALIDATION_ERROR","INTERNAL_ERROR"],"title":"Code","description":"NOT_FOUND for a 404, VALIDATION_ERROR for a 422, HTTP_ERROR for every other refusal."},"http_status":{"type":"integer","title":"Http Status"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Also sent as the X-Request-ID response header."},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{"$ref":"#/components/schemas/ValidationIssue"},"type":"array"}],"title":"Details","description":"The list of problems on a 422; an empty object otherwise."}},"type":"object","required":["message","code","http_status","request_id","details"],"title":"ErrorDetail","description":"What went wrong, and the id to quote when asking about it."},"ErrorMetadata":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"provider":{"type":"string","title":"Provider"},"version":{"type":"string","title":"Version"}},"type":"object","required":["timestamp","provider","version"],"title":"ErrorMetadata","description":"When the refusal was produced, and by which API and version."},"ErrorResponse":{"properties":{"status":{"type":"string","const":"error","title":"Status"},"error":{"$ref":"#/components/schemas/ErrorDetail"},"metadata":{"$ref":"#/components/schemas/ErrorMetadata"}},"type":"object","required":["status","error","metadata"],"title":"ErrorResponse","description":"Every refusal the API returns, whatever its status."},"ExecutiveSummary":{"properties":{"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary"},"narrative":{"type":"string","title":"Narrative"},"overall_confidence":{"type":"number","title":"Overall Confidence"}},"type":"object","required":["title","summary","narrative","overall_confidence"],"title":"ExecutiveSummary","description":"The report overview. ``narrative`` is written by a language model and\ndeclared as such in ``metadata.ai_generated``."},"InsightsCallToAction":{"properties":{"message":{"type":"string","title":"Message"},"signup_url":{"type":"string","title":"Signup Url"},"api_docs":{"type":"string","title":"Api Docs"}},"type":"object","required":["message","signup_url","api_docs"],"title":"InsightsCallToAction","description":"Where a reader of Daily Insights goes next: sign-up and the API\ndocumentation."},"InsightsMetadata":{"properties":{"product":{"type":"string","title":"Product"},"data_sources":{"type":"string","title":"Data Sources"},"update_frequency":{"type":"string","title":"Update Frequency"},"report_type":{"type":"string","title":"Report Type"}},"type":"object","required":["product","data_sources","update_frequency","report_type"],"title":"InsightsMetadata","description":"What produced the Daily Insights payload, from how many sources, and\nhow often it is updated."},"IntelligenceReport":{"properties":{"schema_version":{"type":"string","title":"Schema Version","description":"The contract shape this payload follows, 1.0 or 1.2."},"org_id":{"type":"string","title":"Org Id"},"plan":{"type":"string","title":"Plan"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"contract":{"$ref":"#/components/schemas/ReportContract"},"metadata":{"$ref":"#/components/schemas/ReportMetadata"},"score":{"$ref":"#/components/schemas/ReportScore"},"sections":{"$ref":"#/components/schemas/ReportSections"},"analytics":{"$ref":"#/components/schemas/ReportAnalytics"},"trend_analysis":{"$ref":"#/components/schemas/TrendAnalysis"},"client_info":{"$ref":"#/components/schemas/ClientInfo"}},"type":"object","required":["schema_version","org_id","plan","generated_at","contract","metadata","score","sections","analytics"],"title":"IntelligenceReport","description":"The intelligence report for the calling organization.\n\nThe same shape is served for an archived snapshot, which carries no\n``client_info`` because it was built by the collection cycle rather than\nfor a caller."},"MarketOverview":{"properties":{"total_profiles_analyzed":{"type":"integer","title":"Total Profiles Analyzed"},"average_score":{"type":"number","title":"Average Score"},"top_score":{"type":"number","title":"Top Score"}},"type":"object","required":["total_profiles_analyzed","average_score","top_score"],"title":"MarketOverview","description":"How many talent profiles the report analyzed, and their average and\ntop scores."},"NewHirerAlert":{"properties":{"type":{"type":"string","const":"new_hirer","title":"Type"},"company":{"type":"string","title":"Company"},"title":{"type":"string","title":"Title"},"source":{"type":"string","title":"Source"}},"type":"object","required":["type","company","title","source"],"title":"NewHirerAlert","description":"A watched company appeared in the hiring feed for the first time."},"OrgBriefing":{"properties":{"title":{"type":"string","title":"Title"},"narrative":{"type":"string","title":"Narrative"}},"type":"object","required":["title","narrative"],"title":"OrgBriefing","description":"Business plan only: a paragraph on the organization's own watchlist."},"ReportAnalytics":{"properties":{"market_overview":{"$ref":"#/components/schemas/MarketOverview"},"seniority_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Seniority Distribution","description":"Profiles per score band."},"seniority_levels":{"additionalProperties":{"type":"integer"},"type":"object","title":"Seniority Levels","description":"Profiles per seniority label."},"stack_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Stack Distribution"},"role_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Role Distribution"},"strategic_insights":{"items":{"type":"string"},"type":"array","title":"Strategic Insights"}},"type":"object","required":["market_overview","seniority_distribution","seniority_levels","stack_distribution","role_distribution","strategic_insights"],"title":"ReportAnalytics","description":"Distributions over the talent profiles in the report."},"ReportCapabilities":{"properties":{"exports":{"items":{"type":"string","enum":["csv","pdf"]},"type":"array","title":"Exports","description":"Export formats the plan includes."},"show_evidence":{"type":"boolean","title":"Show Evidence"},"show_confidence":{"type":"boolean","title":"Show Confidence"},"org_briefing":{"type":"boolean","title":"Org Briefing"}},"type":"object","required":["exports","show_evidence","show_confidence","org_briefing"],"title":"ReportCapabilities","description":"What the plan includes beyond its caps: export formats, evidence,\nconfidence and the organization briefing. Schema 1.1 and 1.2 only."},"ReportContract":{"properties":{"schema_version":{"type":"string","title":"Schema Version"},"plan_level":{"type":"string","title":"Plan Level"},"report_type":{"type":"string","title":"Report Type"},"capabilities":{"$ref":"#/components/schemas/ReportCapabilities"},"limits":{"$ref":"#/components/schemas/ReportLimits"}},"type":"object","required":["schema_version","plan_level","report_type"],"title":"ReportContract","description":"What the plan entitles the caller to. Schema 1.0, the default, carries\nthe first three fields only; 1.1 and 1.2 add capabilities and limits."},"ReportHistory":{"properties":{"snapshots":{"items":{"$ref":"#/components/schemas/SnapshotSummary"},"type":"array","title":"Snapshots"},"count":{"type":"integer","title":"Count"},"plan":{"type":"string","title":"Plan"},"retention_days":{"type":"integer","minimum":0.0,"title":"Retention Days"}},"type":"object","required":["snapshots","count","plan","retention_days"],"title":"ReportHistory","description":"Retained snapshots, newest first."},"ReportLimits":{"properties":{"max_trends":{"type":"integer","title":"Max Trends"},"max_talents":{"type":"integer","title":"Max Talents"},"max_signals":{"type":"integer","title":"Max Signals"},"profile_topics":{"type":"integer","title":"Profile Topics"},"profile_companies":{"type":"integer","title":"Profile Companies"}},"type":"object","required":["max_trends","max_talents","max_signals"],"title":"ReportLimits","description":"The caps the plan puts on the report -- trends, talent profiles and\nsignals -- and how many topics and companies of the organization profile\nit applies. Schema 1.1 and 1.2 only."},"ReportMetadata":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"product":{"type":"string","title":"Product"},"report_version":{"type":"string","title":"Report Version"},"confidentiality":{"type":"string","title":"Confidentiality"},"ai_generated":{"$ref":"#/components/schemas/AIGeneratedDeclaration"},"watermark":{"type":"string","title":"Watermark","description":"Present on the expired-trial preview only."},"data_collected_at":{"type":"string","title":"Data Collected At"},"data_source":{"type":"string","title":"Data Source"},"data_age_hours":{"type":"number","title":"Data Age Hours"},"staleness_warning":{"type":"string","title":"Staleness Warning"},"corroboration_gate":{"type":"string","enum":["active","inactive"],"title":"Corroboration Gate"},"raw_observations_held":{"type":"integer","title":"Raw Observations Held"},"relevance_ranking":{"type":"string","enum":["active","neutral"],"title":"Relevance Ranking"},"collection_health":{"additionalProperties":true,"type":"object","title":"Collection Health"},"narrative_credits":{"additionalProperties":true,"type":"object","title":"Narrative Credits"},"narrative_exhausted":{"type":"boolean","title":"Narrative Exhausted"},"quality":{"additionalProperties":true,"type":"object","title":"Quality"}},"type":"object","required":["generated_at","product","report_version","confidentiality","ai_generated"],"title":"ReportMetadata","description":"Provenance of the report: when it was built, from what, and how fresh\nthe underlying data is."},"ReportScore":{"properties":{"overall_confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Overall Confidence"},"signal_count":{"type":"integer","minimum":0.0,"title":"Signal Count"},"confidence_interval":{"additionalProperties":true,"type":"object","title":"Confidence Interval"},"categories":{"additionalProperties":{"type":"number"},"type":"object","title":"Categories"},"source_diversity":{"type":"integer","title":"Source Diversity"},"cross_source_signals":{"type":"integer","title":"Cross Source Signals"},"collection_health":{"additionalProperties":true,"type":"object","title":"Collection Health"}},"type":"object","required":["overall_confidence","signal_count"],"title":"ReportScore","description":"Aggregate confidence over the signals in the report."},"ReportSections":{"properties":{"executive_summary":{"$ref":"#/components/schemas/ExecutiveSummary"},"market_trends":{"$ref":"#/components/schemas/SignalSection"},"talent_signals":{"$ref":"#/components/schemas/SignalSection"},"hiring_signals":{"$ref":"#/components/schemas/SignalSection"},"org_briefing":{"$ref":"#/components/schemas/OrgBriefing"}},"type":"object","required":["executive_summary","market_trends","talent_signals","hiring_signals"],"title":"ReportSections","description":"The report body."},"SignalItem":{"properties":{"source":{"type":"string","title":"Source","description":"Source ids that observed the signal, comma-separated."},"title":{"type":"string","title":"Title"},"detail":{"type":"string","title":"Detail"},"category":{"type":"string","title":"Category","description":"Signal category, for example market_trend, research_paper, talent or hiring_signal."},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"url":{"type":"string","title":"Url"},"confidence":{"type":"number","title":"Confidence"},"evidence":{"additionalProperties":true,"type":"object","title":"Evidence","description":"The source metadata behind the counts, as collected."},"velocity":{"additionalProperties":true,"type":"object","title":"Velocity","description":"Pro and Business. The change in the signal's stars (repositories), mentions (papers) or followers (talent) since the previous collection: previous, current, delta, delta_pct, and period_hours, the hours between the two collections."},"entity_type":{"type":"string","title":"Entity Type"},"entity_key":{"type":"string","title":"Entity Key"},"relevance":{"type":"number","title":"Relevance"},"hiring_status":{"type":"string","title":"Hiring Status"},"company":{"type":"string","title":"Company"},"example_headline":{"type":"string","title":"Example Headline"}},"type":"object","required":["source","title","detail","category","timestamp"],"title":"SignalItem","description":"One signal in a report section.\n\n``confidence`` and ``evidence`` are present on plans that include them\nand absent on the expired-trial preview."},"SignalSection":{"properties":{"title":{"type":"string","title":"Title"},"count":{"type":"integer","minimum":0.0,"title":"Count","description":"Number of items in data."},"data":{"items":{"$ref":"#/components/schemas/SignalItem"},"type":"array","title":"Data"}},"type":"object","required":["title","count","data"],"title":"SignalSection","description":"A section of signals, capped by the plan."},"SnapshotSummary":{"properties":{"snapshot_id":{"type":"string","pattern":"^\\d{8}T\\d{4}$","title":"Snapshot Id","description":"YYYYMMDDTHHmm"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"signal_count":{"type":"integer","title":"Signal Count"}},"type":"object","required":["snapshot_id","generated_at","signal_count"],"title":"SnapshotSummary","description":"One retained snapshot: its id, when the collection cycle wrote it and\nhow many signals it holds."},"SpikeAlert":{"properties":{"type":{"type":"string","const":"spike","title":"Type"},"topic":{"type":"string","title":"Topic"},"change_pct":{"type":"number","title":"Change Pct"},"current_mentions":{"type":"integer","title":"Current Mentions"},"sources":{"type":"integer","title":"Sources","description":"Number of independent sources that observed it."}},"type":"object","required":["type","topic","change_pct","current_mentions","sources"],"title":"SpikeAlert","description":"A watched topic grew past the spike threshold against its baseline."},"StaleDataDetail":{"properties":{"error":{"type":"string","const":"data_too_stale","title":"Error"},"message":{"type":"string","title":"Message"},"data_age_hours":{"type":"number","title":"Data Age Hours","description":"Age of the newest collected data, in hours."},"threshold_hours":{"type":"number","title":"Threshold Hours","description":"The ceiling the operation enforces, in hours."}},"type":"object","required":["error","message","data_age_hours","threshold_hours"],"title":"StaleDataDetail","description":"Why a report was refused as too old to serve."},"StaleDataError":{"properties":{"status":{"type":"string","const":"error","title":"Status"},"error":{"$ref":"#/components/schemas/StaleDataErrorDetail"},"metadata":{"$ref":"#/components/schemas/ErrorMetadata"}},"type":"object","required":["status","error","metadata"],"title":"StaleDataError","description":"The 503 an operation returns rather than serve intelligence older than\nits freshness ceiling. The same envelope as every error, with a structured\n``error.message``, sent with a ``Retry-After`` header."},"StaleDataErrorDetail":{"properties":{"message":{"$ref":"#/components/schemas/StaleDataDetail"},"code":{"type":"string","const":"HTTP_ERROR","title":"Code"},"http_status":{"type":"integer","const":503,"title":"Http Status"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"},"details":{"additionalProperties":true,"type":"object","title":"Details"}},"type":"object","required":["message","code","http_status","request_id","details"],"title":"StaleDataErrorDetail","description":"The error block of a stale-data 503: the fields of every error, with\n``message`` structured instead of written as text."},"TrendAnalysis":{"properties":{"status":{"type":"string","title":"Status","description":"ok, or insufficient_history before any history exists."},"engine":{"type":"string","title":"Engine"},"tracking_stats":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tracking Stats"},"weeks_of_data":{"type":"number","title":"Weeks Of Data"},"snapshot_count":{"type":"integer","title":"Snapshot Count"},"analysis_timestamp":{"type":"string","title":"Analysis Timestamp"},"velocity":{"items":{"$ref":"#/components/schemas/TrendMovement"},"type":"array","title":"Velocity"},"spikes":{"items":{"$ref":"#/components/schemas/TrendMovement"},"type":"array","title":"Spikes"},"emerging":{"items":{"$ref":"#/components/schemas/TrendMovement"},"type":"array","title":"Emerging"},"declining":{"items":{"$ref":"#/components/schemas/TrendMovement"},"type":"array","title":"Declining"},"silent_but_rising":{"items":{"$ref":"#/components/schemas/TrendMovement"},"type":"array","title":"Silent But Rising"},"hot_memory":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Hot Memory","description":"Topics seen in at least 8 of the last 12 collections but not in this one; a short trend section is topped up from them."},"summary":{"type":"string","title":"Summary"}},"type":"object","required":["status"],"title":"TrendAnalysis","description":"Week-over-week movement across the retained collection history.\n``status`` is ``insufficient_history`` until there is history to compare."},"TrendMovement":{"properties":{"topic":{"type":"string","title":"Topic"},"category":{"type":"string","title":"Category"},"current_mentions":{"type":"integer","title":"Current Mentions"},"current_sources":{"type":"integer","title":"Current Sources"},"sources_list":{"items":{"type":"string"},"type":"array","title":"Sources List"},"current_confidence":{"type":"number","title":"Current Confidence"},"current_metric":{"type":"number","title":"Current Metric"},"metric_kind":{"type":"string","title":"Metric Kind"},"tracked_days":{"type":"integer","title":"Tracked Days"},"presence":{"type":"string","title":"Presence"},"change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change Pct","description":"Null when there is no baseline yet."},"baseline_metric":{"type":"number","title":"Baseline Metric"},"baseline_is_partial":{"type":"boolean","title":"Baseline Is Partial"},"spike_magnitude":{"type":"number","title":"Spike Magnitude"},"tracked_days_before":{"type":"integer","title":"Tracked Days Before"},"last_seen_days_ago":{"type":"integer","title":"Last Seen Days Ago"},"last_confidence":{"type":"number","title":"Last Confidence"},"status":{"type":"string","title":"Status"},"metric_trend":{"type":"string","title":"Metric Trend"}},"type":"object","required":["topic","category"],"title":"TrendMovement","description":"A topic's movement against its own history."},"UsageEvent":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"status_code":{"type":"integer","title":"Status Code"},"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"date-time","title":"Timestamp"}},"type":"object","required":["endpoint","status_code","timestamp"],"title":"UsageEvent","description":"One report or export the key fetched: the endpoint called, the status\nit returned and when."},"UsageLog":{"properties":{"org_name":{"type":"string","title":"Org Name"},"total_returned":{"type":"integer","title":"Total Returned"},"usage":{"items":{"$ref":"#/components/schemas/UsageEvent"},"type":"array","title":"Usage"}},"type":"object","required":["org_name","total_returned","usage"],"title":"UsageLog","description":"The usage log of the API key used on the call, newest first: one entry\nper successful report or export, the two operations that consume quota."},"ValidationIssue":{"properties":{"type":{"type":"string","title":"Type"},"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Loc","description":"Where the problem is, for example ['query', 'limit']."},"msg":{"type":"string","title":"Msg"},"input":{"title":"Input"},"ctx":{"type":"string","title":"Ctx","description":"The constraint that failed, as text."},"url":{"type":"string","title":"Url"}},"type":"object","required":["type","loc","msg"],"title":"ValidationIssue","description":"One problem with the request, as a 422 lists it in ``error.details``."}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key (prefix gf_) created in Dashboard → API Keys."},"SessionBearer":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Web session token issued to the browser at sign-in. One published operation takes it, `GET /api/v1/public/weekly-report`. It cannot be created from an API key, and an API key sent to that operation receives 401."}}},"x-provenance":{"method":"published","publisher":"GatiFlow","source":"https://gatiflow.io/openapi.json","generated_from":"the running routes (app/api/public_docs.py), compared byte for byte by the test suite"}}