mencoro 1.0.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -5
  3. data/docs/AccountApi.md +1 -1
  4. data/docs/AnalyticsApi.md +96 -86
  5. data/docs/AsyncJobResource.md +3 -1
  6. data/docs/AsyncJobResourceError.md +20 -0
  7. data/docs/BillingApi.md +1 -1
  8. data/docs/CitedSourceRow.md +32 -0
  9. data/docs/CitedSourcesResponse.md +20 -0
  10. data/docs/ClusterBreakdownRow.md +82 -0
  11. data/docs/ClustersApi.md +74 -0
  12. data/docs/CompetitorCoOccurrenceResponse.md +18 -0
  13. data/docs/CompetitorCoOccurrenceRow.md +36 -0
  14. data/docs/CompetitorShareOfVoice.md +20 -0
  15. data/docs/CreateInvitation201Response.md +4 -0
  16. data/docs/CreateInvitationRequest.md +3 -1
  17. data/docs/CreateInvitationRequestProjectAccess.md +20 -0
  18. data/docs/DiscoveryApi.md +1 -1
  19. data/docs/GetMeStats200ResponseProjects.md +1 -1
  20. data/docs/GetOrganizationOverview200ResponseAggregate.md +1 -1
  21. data/docs/GetOrganizationOverview200ResponseProjectsInner.md +8 -2
  22. data/docs/GetOrganizationStats200ResponseInvitations.md +1 -1
  23. data/docs/GetOrganizationStats200ResponseMembers.md +1 -1
  24. data/docs/GetOrganizationStats200ResponseProjects.md +1 -1
  25. data/docs/InvitationResource.md +5 -1
  26. data/docs/JobsApi.md +1 -1
  27. data/docs/KeywordListingResource.md +12 -10
  28. data/docs/KeywordListingResourceCarriedPositions.md +24 -0
  29. data/docs/KeywordListingResourceCarriedPositionsSerp.md +20 -0
  30. data/docs/ListProjects200Response.md +1 -1
  31. data/docs/MemberResource.md +5 -1
  32. data/docs/MembersApi.md +78 -0
  33. data/docs/MentionMatchResource.md +44 -0
  34. data/docs/MentionSampleResponse.md +46 -0
  35. data/docs/MentionTypeCounts.md +26 -0
  36. data/docs/OrganizationsApi.md +3 -3
  37. data/docs/PerCompetitorSentiment.md +30 -0
  38. data/docs/PerEngineSentiment.md +28 -0
  39. data/docs/PerEntityMetrics.md +32 -0
  40. data/docs/PositionDistributionBucket.md +20 -0
  41. data/docs/ProjectMentionMixResponse.md +22 -0
  42. data/docs/ProjectMentionSamplesResponse.md +20 -0
  43. data/docs/ProjectRankTrackingClusterBreakdown.md +20 -0
  44. data/docs/ProjectRankTrackingStats.md +96 -0
  45. data/docs/ProjectRankTrackingTimeSeries.md +20 -0
  46. data/docs/ProjectSentimentBreakdown.md +20 -0
  47. data/docs/ProjectedMonthlyChecksResource.md +2 -2
  48. data/docs/ProjectsApi.md +76 -2
  49. data/docs/SearchTrackedQueryMentionMatches200Response.md +20 -0
  50. data/docs/SearchTrackedQuerySerpMatches200Response.md +20 -0
  51. data/docs/SerpMatchResource.md +30 -0
  52. data/docs/SetMemberProjectAccessRequest.md +20 -0
  53. data/docs/SubscriptionResource.md +1 -1
  54. data/docs/TimeSeriesPoint.md +22 -0
  55. data/docs/TrackedQueriesApi.md +175 -3
  56. data/docs/TrackedQueryCountResource.md +1 -1
  57. data/docs/TrackedQueryMoverRow.md +58 -0
  58. data/docs/TrackedQueryMoversResponse.md +22 -0
  59. data/docs/TrackedQueryRankTrackingTimeSeries.md +20 -0
  60. data/docs/TrackedQueryUsageResource.md +1 -1
  61. data/lib/mencoro/api/account_api.rb +3 -3
  62. data/lib/mencoro/api/analytics_api.rb +103 -85
  63. data/lib/mencoro/api/billing_api.rb +3 -3
  64. data/lib/mencoro/api/captures_api.rb +2 -2
  65. data/lib/mencoro/api/clusters_api.rb +76 -1
  66. data/lib/mencoro/api/discovery_api.rb +3 -3
  67. data/lib/mencoro/api/invitations_api.rb +1 -1
  68. data/lib/mencoro/api/jobs_api.rb +3 -3
  69. data/lib/mencoro/api/members_api.rb +95 -1
  70. data/lib/mencoro/api/organization_operations_api.rb +1 -1
  71. data/lib/mencoro/api/organizations_api.rb +7 -7
  72. data/lib/mencoro/api/projects_api.rb +80 -5
  73. data/lib/mencoro/api/tracked_queries_api.rb +220 -8
  74. data/lib/mencoro/api_client.rb +2 -2
  75. data/lib/mencoro/api_error.rb +1 -1
  76. data/lib/mencoro/api_model_base.rb +1 -1
  77. data/lib/mencoro/configuration.rb +1 -1
  78. data/lib/mencoro/models/accepted_job_resource.rb +1 -1
  79. data/lib/mencoro/models/ai_response_report_resource.rb +1 -1
  80. data/lib/mencoro/models/ai_response_resource.rb +1 -1
  81. data/lib/mencoro/models/apply_clustering_job_outcome.rb +1 -1
  82. data/lib/mencoro/models/apply_clustering_job_outcome_clusters_inner.rb +1 -1
  83. data/lib/mencoro/models/apply_clustering_job_outcome_failed_inner.rb +1 -1
  84. data/lib/mencoro/models/apply_clustering_job_outcome_skipped_clusters_inner.rb +1 -1
  85. data/lib/mencoro/models/apply_clustering_job_outcome_successful_inner.rb +1 -1
  86. data/lib/mencoro/models/async_job_resource.rb +17 -7
  87. data/lib/mencoro/models/async_job_resource_error.rb +217 -0
  88. data/lib/mencoro/models/batch_change_tracked_query_check_frequency_request_data.rb +1 -1
  89. data/lib/mencoro/models/batch_change_tracked_query_passes_request_data.rb +1 -1
  90. data/lib/mencoro/models/batch_create_query_clusters_outcome.rb +1 -1
  91. data/lib/mencoro/models/batch_create_query_clusters_outcome_failed_inner.rb +1 -1
  92. data/lib/mencoro/models/batch_create_query_clusters_outcome_successful_inner.rb +1 -1
  93. data/lib/mencoro/models/batch_create_query_clusters_request_data.rb +1 -1
  94. data/lib/mencoro/models/batch_create_tracked_queries_request_data.rb +1 -1
  95. data/lib/mencoro/models/batch_create_tracked_queries_result_resource.rb +1 -1
  96. data/lib/mencoro/models/batch_create_tracked_queries_result_resource_failed_inner.rb +1 -1
  97. data/lib/mencoro/models/batch_create_tracked_queries_result_resource_successful_inner.rb +1 -1
  98. data/lib/mencoro/models/batch_force_check_tracked_queries200_response.rb +1 -1
  99. data/lib/mencoro/models/batch_force_check_tracked_queries200_response_failed_inner.rb +1 -1
  100. data/lib/mencoro/models/batch_pause_tracked_queries200_response.rb +1 -1
  101. data/lib/mencoro/models/batch_pause_tracked_queries200_response_failed_inner.rb +1 -1
  102. data/lib/mencoro/models/batch_pause_tracked_queries200_response_successful_inner.rb +1 -1
  103. data/lib/mencoro/models/batch_resume_tracked_queries200_response.rb +1 -1
  104. data/lib/mencoro/models/batch_targets_request_data.rb +1 -1
  105. data/lib/mencoro/models/batch_write_outcome.rb +1 -1
  106. data/lib/mencoro/models/batch_write_outcome_failed_inner.rb +1 -1
  107. data/lib/mencoro/models/brand_profile_resource.rb +1 -1
  108. data/lib/mencoro/models/bulk_add_clusters_to_tracked_queries200_response.rb +1 -1
  109. data/lib/mencoro/models/bulk_add_clusters_to_tracked_queries_request.rb +1 -1
  110. data/lib/mencoro/models/bulk_remove_clusters_from_tracked_queries200_response.rb +1 -1
  111. data/lib/mencoro/models/bulk_remove_clusters_from_tracked_queries_request.rb +1 -1
  112. data/lib/mencoro/models/change_member_role_request.rb +1 -1
  113. data/lib/mencoro/models/change_tracked_query_check_frequency_request_data.rb +1 -1
  114. data/lib/mencoro/models/change_tracked_query_passes_request_data.rb +1 -1
  115. data/lib/mencoro/models/citation_resource.rb +1 -1
  116. data/lib/mencoro/models/cited_source_row.rb +298 -0
  117. data/lib/mencoro/models/cited_sources_response.rb +192 -0
  118. data/lib/mencoro/models/cluster_breakdown_row.rb +580 -0
  119. data/lib/mencoro/models/cluster_membership_request_data.rb +1 -1
  120. data/lib/mencoro/models/competitor_co_occurrence_response.rb +166 -0
  121. data/lib/mencoro/models/competitor_co_occurrence_row.rb +318 -0
  122. data/lib/mencoro/models/competitor_resource.rb +1 -1
  123. data/lib/mencoro/models/competitor_share_of_voice.rb +174 -0
  124. data/lib/mencoro/models/create_competitor_request.rb +1 -1
  125. data/lib/mencoro/models/create_invitation200_response.rb +1 -1
  126. data/lib/mencoro/models/create_invitation201_response.rb +60 -2
  127. data/lib/mencoro/models/create_invitation_request.rb +15 -5
  128. data/lib/mencoro/models/create_invitation_request_project_access.rb +201 -0
  129. data/lib/mencoro/models/create_organization201_response.rb +1 -1
  130. data/lib/mencoro/models/create_organization_request.rb +1 -1
  131. data/lib/mencoro/models/create_project_request.rb +1 -1
  132. data/lib/mencoro/models/create_project_request_competitors_inner.rb +1 -1
  133. data/lib/mencoro/models/create_query_cluster409_response.rb +1 -1
  134. data/lib/mencoro/models/create_query_cluster_request.rb +1 -1
  135. data/lib/mencoro/models/delete_query_cluster200_response.rb +1 -1
  136. data/lib/mencoro/models/entitlements_resource.rb +1 -1
  137. data/lib/mencoro/models/get_available_filters200_response.rb +1 -1
  138. data/lib/mencoro/models/get_available_filters200_response_clusters_inner.rb +1 -1
  139. data/lib/mencoro/models/get_me_stats200_response.rb +1 -1
  140. data/lib/mencoro/models/get_me_stats200_response_organizations.rb +1 -1
  141. data/lib/mencoro/models/get_me_stats200_response_projects.rb +2 -2
  142. data/lib/mencoro/models/get_membership_stats200_response.rb +1 -1
  143. data/lib/mencoro/models/get_mention_samples400_response.rb +1 -1
  144. data/lib/mencoro/models/get_mention_samples400_response_details_value_inner.rb +1 -1
  145. data/lib/mencoro/models/get_metric_glossary200_response.rb +1 -1
  146. data/lib/mencoro/models/get_metric_glossary200_response_metrics_inner.rb +1 -1
  147. data/lib/mencoro/models/get_organization_overview200_response.rb +1 -1
  148. data/lib/mencoro/models/get_organization_overview200_response_aggregate.rb +2 -2
  149. data/lib/mencoro/models/get_organization_overview200_response_projects_inner.rb +34 -3
  150. data/lib/mencoro/models/get_organization_stats200_response.rb +1 -1
  151. data/lib/mencoro/models/get_organization_stats200_response_invitations.rb +4 -7
  152. data/lib/mencoro/models/get_organization_stats200_response_members.rb +4 -7
  153. data/lib/mencoro/models/get_organization_stats200_response_projects.rb +2 -2
  154. data/lib/mencoro/models/get_share_of_voice_formula200_response.rb +1 -1
  155. data/lib/mencoro/models/get_tracking_coverage200_response.rb +1 -1
  156. data/lib/mencoro/models/get_tracking_coverage200_response_sample_inner.rb +1 -1
  157. data/lib/mencoro/models/invitation_resource.rb +64 -6
  158. data/lib/mencoro/models/keyword_listing_resource.rb +40 -14
  159. data/lib/mencoro/models/keyword_listing_resource_carried_positions.rb +187 -0
  160. data/lib/mencoro/models/keyword_listing_resource_carried_positions_serp.rb +192 -0
  161. data/lib/mencoro/models/keyword_listing_resource_mention_type_counts.rb +1 -1
  162. data/lib/mencoro/models/list_ai_responses200_response.rb +1 -1
  163. data/lib/mencoro/models/list_competitors200_response.rb +1 -1
  164. data/lib/mencoro/models/list_invitations200_response.rb +1 -1
  165. data/lib/mencoro/models/list_keyword_listings200_response.rb +1 -1
  166. data/lib/mencoro/models/list_members200_response.rb +1 -1
  167. data/lib/mencoro/models/list_organizations200_response.rb +1 -1
  168. data/lib/mencoro/models/list_projects200_response.rb +2 -2
  169. data/lib/mencoro/models/list_query_clusters200_response.rb +1 -1
  170. data/lib/mencoro/models/list_search_snapshots200_response.rb +1 -1
  171. data/lib/mencoro/models/list_shopping_snapshots200_response.rb +1 -1
  172. data/lib/mencoro/models/me_resource.rb +1 -1
  173. data/lib/mencoro/models/member_resource.rb +63 -5
  174. data/lib/mencoro/models/mention_match_resource.rb +432 -0
  175. data/lib/mencoro/models/mention_sample_response.rb +450 -0
  176. data/lib/mencoro/models/mention_type_counts.rb +268 -0
  177. data/lib/mencoro/models/operation_effect.rb +1 -1
  178. data/lib/mencoro/models/organization_resource.rb +1 -1
  179. data/lib/mencoro/models/per_competitor_sentiment.rb +304 -0
  180. data/lib/mencoro/models/per_engine_sentiment.rb +278 -0
  181. data/lib/mencoro/models/per_entity_metrics.rb +218 -0
  182. data/lib/mencoro/models/position_distribution_bucket.rb +190 -0
  183. data/lib/mencoro/models/preview_organization_operation200_response.rb +1 -1
  184. data/lib/mencoro/models/preview_organization_operation200_response_organization.rb +1 -1
  185. data/lib/mencoro/models/preview_organization_operation_request.rb +3 -3
  186. data/lib/mencoro/models/project_detail_resource.rb +1 -1
  187. data/lib/mencoro/models/project_detail_resource_competitors_inner.rb +1 -1
  188. data/lib/mencoro/models/project_mention_mix_response.rb +222 -0
  189. data/lib/mencoro/models/project_mention_samples_response.rb +192 -0
  190. data/lib/mencoro/models/project_rank_tracking_cluster_breakdown.rb +176 -0
  191. data/lib/mencoro/models/project_rank_tracking_stats.rb +718 -0
  192. data/lib/mencoro/models/project_rank_tracking_time_series.rb +176 -0
  193. data/lib/mencoro/models/project_resource.rb +1 -1
  194. data/lib/mencoro/models/project_sentiment_breakdown.rb +194 -0
  195. data/lib/mencoro/models/projected_monthly_checks_resource.rb +3 -3
  196. data/lib/mencoro/models/query_cluster_resource.rb +1 -1
  197. data/lib/mencoro/models/report_ai_response_request.rb +1 -1
  198. data/lib/mencoro/models/search_result_resource.rb +1 -1
  199. data/lib/mencoro/models/search_snapshot_resource.rb +1 -1
  200. data/lib/mencoro/models/search_tracked_queries200_response.rb +1 -1
  201. data/lib/mencoro/models/search_tracked_query_mention_matches200_response.rb +158 -0
  202. data/lib/mencoro/models/search_tracked_query_serp_matches200_response.rb +158 -0
  203. data/lib/mencoro/models/serp_match_resource.rb +314 -0
  204. data/lib/mencoro/models/set_member_project_access_request.rb +200 -0
  205. data/lib/mencoro/models/shopping_offer_resource.rb +1 -1
  206. data/lib/mencoro/models/shopping_snapshot_resource.rb +1 -1
  207. data/lib/mencoro/models/start_brand_discovery_job_request.rb +1 -1
  208. data/lib/mencoro/models/start_brand_name_suggestion_job_request.rb +1 -1
  209. data/lib/mencoro/models/start_clustering_job_request_data.rb +1 -1
  210. data/lib/mencoro/models/start_keyword_discovery_job_request.rb +1 -1
  211. data/lib/mencoro/models/start_prompt_discovery_job_request.rb +1 -1
  212. data/lib/mencoro/models/submitted_checks_resource.rb +1 -1
  213. data/lib/mencoro/models/subscription_resource.rb +3 -3
  214. data/lib/mencoro/models/time_series_point.rb +218 -0
  215. data/lib/mencoro/models/tracked_query_count_resource.rb +3 -3
  216. data/lib/mencoro/models/tracked_query_detail_resource.rb +3 -3
  217. data/lib/mencoro/models/tracked_query_mover_row.rb +492 -0
  218. data/lib/mencoro/models/tracked_query_movers_response.rb +202 -0
  219. data/lib/mencoro/models/tracked_query_rank_tracking_time_series.rb +176 -0
  220. data/lib/mencoro/models/tracked_query_resource.rb +3 -3
  221. data/lib/mencoro/models/tracked_query_usage_resource.rb +2 -2
  222. data/lib/mencoro/models/update_organization_request.rb +1 -1
  223. data/lib/mencoro/models/update_project_brand_profile_request.rb +1 -1
  224. data/lib/mencoro/models/update_project_request.rb +1 -1
  225. data/lib/mencoro/version.rb +2 -2
  226. data/lib/mencoro.rb +32 -1
  227. data/mencoro.gemspec +2 -2
  228. data/spec/models/async_job_resource_error_spec.rb +46 -0
  229. data/spec/models/cited_source_row_spec.rb +78 -0
  230. data/spec/models/cited_sources_response_spec.rb +42 -0
  231. data/spec/models/cluster_breakdown_row_spec.rb +228 -0
  232. data/spec/models/competitor_co_occurrence_response_spec.rb +36 -0
  233. data/spec/models/competitor_co_occurrence_row_spec.rb +90 -0
  234. data/spec/models/competitor_share_of_voice_spec.rb +42 -0
  235. data/spec/models/create_invitation_request_project_access_spec.rb +46 -0
  236. data/spec/models/keyword_listing_resource_carried_positions_serp_spec.rb +42 -0
  237. data/spec/models/keyword_listing_resource_carried_positions_spec.rb +54 -0
  238. data/spec/models/mention_match_resource_spec.rb +114 -0
  239. data/spec/models/mention_sample_response_spec.rb +114 -0
  240. data/spec/models/mention_type_counts_spec.rb +60 -0
  241. data/spec/models/per_competitor_sentiment_spec.rb +72 -0
  242. data/spec/models/per_engine_sentiment_spec.rb +66 -0
  243. data/spec/models/per_entity_metrics_spec.rb +78 -0
  244. data/spec/models/position_distribution_bucket_spec.rb +42 -0
  245. data/spec/models/project_mention_mix_response_spec.rb +48 -0
  246. data/spec/models/project_mention_samples_response_spec.rb +42 -0
  247. data/spec/models/project_rank_tracking_cluster_breakdown_spec.rb +42 -0
  248. data/spec/models/project_rank_tracking_stats_spec.rb +270 -0
  249. data/spec/models/project_rank_tracking_time_series_spec.rb +42 -0
  250. data/spec/models/project_sentiment_breakdown_spec.rb +42 -0
  251. data/spec/models/search_tracked_query_mention_matches200_response_spec.rb +42 -0
  252. data/spec/models/search_tracked_query_serp_matches200_response_spec.rb +42 -0
  253. data/spec/models/serp_match_resource_spec.rb +72 -0
  254. data/spec/models/set_member_project_access_request_spec.rb +46 -0
  255. data/spec/models/time_series_point_spec.rb +48 -0
  256. data/spec/models/tracked_query_mover_row_spec.rb +156 -0
  257. data/spec/models/tracked_query_movers_response_spec.rb +48 -0
  258. data/spec/models/tracked_query_rank_tracking_time_series_spec.rb +42 -0
  259. data/spec/spec_helper.rb +1 -1
  260. metadata +235 -108
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -20,7 +20,7 @@ module Mencoro
20
20
  @api_client = api_client
21
21
  end
22
22
  # Get the subscription of an organization
23
- # Minimum role: viewer. The most recent subscription contract of the organization, whatever its state: tier, billing interval, check budget and consumption, and the cancellation and grace dates. An organization that has never subscribed answers 200 with \"status\": \"none\" and every other field null - a null is \"not applicable\", never a stand-in for a zero budget or zero consumption. Stripe identifiers, prices and payment methods are not part of this API.
23
+ # Minimum role: viewer. The most recent subscription contract of the organization, whatever its state: tier, billing interval, check budget and consumption, and the cancellation and grace dates. An organization that has never subscribed answers 200 with \"status\": \"none\" and every other field null - a null is \"not applicable\", never a stand-in for a zero budget or zero consumption. Stripe identifiers, prices and payment methods are not part of this API. For a member restricted to selected projects, `tierCode`, `billingCycleType`, `billingCycleAnchor`, `checkBudget`, `checksConsumed`, `checksAvailable`, `nextResetAt` and `deactivationReason` are null: they keep `status`, `isEntitled` and the cancellation and grace dates.
24
24
  # @param organization_id [String]
25
25
  # @param [Hash] opts the optional parameters
26
26
  # @return [SubscriptionResource]
@@ -30,7 +30,7 @@ module Mencoro
30
30
  end
31
31
 
32
32
  # Get the subscription of an organization
33
- # Minimum role: viewer. The most recent subscription contract of the organization, whatever its state: tier, billing interval, check budget and consumption, and the cancellation and grace dates. An organization that has never subscribed answers 200 with \"status\": \"none\" and every other field null - a null is \"not applicable\", never a stand-in for a zero budget or zero consumption. Stripe identifiers, prices and payment methods are not part of this API.
33
+ # Minimum role: viewer. The most recent subscription contract of the organization, whatever its state: tier, billing interval, check budget and consumption, and the cancellation and grace dates. An organization that has never subscribed answers 200 with \"status\": \"none\" and every other field null - a null is \"not applicable\", never a stand-in for a zero budget or zero consumption. Stripe identifiers, prices and payment methods are not part of this API. For a member restricted to selected projects, `tierCode`, `billingCycleType`, `billingCycleAnchor`, `checkBudget`, `checksConsumed`, `checksAvailable`, `nextResetAt` and `deactivationReason` are null: they keep `status`, `isEntitled` and the cancellation and grace dates.
34
34
  # @param organization_id [String]
35
35
  # @param [Hash] opts the optional parameters
36
36
  # @return [Array<(SubscriptionResource, Integer, Hash)>] SubscriptionResource data, response status code and response headers
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -62,7 +62,7 @@ module Mencoro
62
62
  if @api_client.config.client_side_validation && project_id.nil?
63
63
  fail ArgumentError, "Missing the required parameter 'project_id' when calling CapturesApi.list_ai_responses"
64
64
  end
65
- allowable_values = ["chatgpt", "perplexity", "google_ai_overview", "google_ai_mode"]
65
+ allowable_values = ["chatgpt", "claude", "perplexity", "google_ai_overview", "google_ai_mode"]
66
66
  if @api_client.config.client_side_validation && opts[:'engines'] && !opts[:'engines'].all? { |item| allowable_values.include?(item) }
67
67
  fail ArgumentError, "invalid value for \"engines\", must include one of #{allowable_values}"
68
68
  end
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -365,6 +365,81 @@ module Mencoro
365
365
  return data, status_code, headers
366
366
  end
367
367
 
368
+ # Get one of a project's keyword clusters
369
+ # Minimum role: viewer. Returns a single keyword cluster of the project, the same projection the cluster listing returns for each of its rows. A cluster belonging to another project answers 404, the same answer an unknown id and a malformed one get, so the API never confirms that a cluster the caller cannot reach exists.
370
+ # @param organization_id [String]
371
+ # @param project_id [String] Must belong to the organization in the path.
372
+ # @param cluster_id [String] Must be a cluster of the project in the path.
373
+ # @param [Hash] opts the optional parameters
374
+ # @return [QueryClusterResource]
375
+ def get_query_cluster(organization_id, project_id, cluster_id, opts = {})
376
+ data, _status_code, _headers = get_query_cluster_with_http_info(organization_id, project_id, cluster_id, opts)
377
+ data
378
+ end
379
+
380
+ # Get one of a project&#39;s keyword clusters
381
+ # Minimum role: viewer. Returns a single keyword cluster of the project, the same projection the cluster listing returns for each of its rows. A cluster belonging to another project answers 404, the same answer an unknown id and a malformed one get, so the API never confirms that a cluster the caller cannot reach exists.
382
+ # @param organization_id [String]
383
+ # @param project_id [String] Must belong to the organization in the path.
384
+ # @param cluster_id [String] Must be a cluster of the project in the path.
385
+ # @param [Hash] opts the optional parameters
386
+ # @return [Array<(QueryClusterResource, Integer, Hash)>] QueryClusterResource data, response status code and response headers
387
+ def get_query_cluster_with_http_info(organization_id, project_id, cluster_id, opts = {})
388
+ if @api_client.config.debugging
389
+ @api_client.config.logger.debug 'Calling API: ClustersApi.get_query_cluster ...'
390
+ end
391
+ # verify the required parameter 'organization_id' is set
392
+ if @api_client.config.client_side_validation && organization_id.nil?
393
+ fail ArgumentError, "Missing the required parameter 'organization_id' when calling ClustersApi.get_query_cluster"
394
+ end
395
+ # verify the required parameter 'project_id' is set
396
+ if @api_client.config.client_side_validation && project_id.nil?
397
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling ClustersApi.get_query_cluster"
398
+ end
399
+ # verify the required parameter 'cluster_id' is set
400
+ if @api_client.config.client_side_validation && cluster_id.nil?
401
+ fail ArgumentError, "Missing the required parameter 'cluster_id' when calling ClustersApi.get_query_cluster"
402
+ end
403
+ # resource path
404
+ local_var_path = '/api/v1/organizations/{organizationId}/projects/{projectId}/clusters/{clusterId}'.sub('{organizationId}', CGI.escape(organization_id.to_s)).sub('{projectId}', CGI.escape(project_id.to_s)).sub('{clusterId}', CGI.escape(cluster_id.to_s))
405
+
406
+ # query parameters
407
+ query_params = opts[:query_params] || {}
408
+
409
+ # header parameters
410
+ header_params = opts[:header_params] || {}
411
+ # HTTP header 'Accept' (if needed)
412
+ header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
413
+
414
+ # form parameters
415
+ form_params = opts[:form_params] || {}
416
+
417
+ # http body (model)
418
+ post_body = opts[:debug_body]
419
+
420
+ # return_type
421
+ return_type = opts[:debug_return_type] || 'QueryClusterResource'
422
+
423
+ # auth_names
424
+ auth_names = opts[:debug_auth_names] || ['ApiKey']
425
+
426
+ new_options = opts.merge(
427
+ :operation => :"ClustersApi.get_query_cluster",
428
+ :header_params => header_params,
429
+ :query_params => query_params,
430
+ :form_params => form_params,
431
+ :body => post_body,
432
+ :auth_names => auth_names,
433
+ :return_type => return_type
434
+ )
435
+
436
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
437
+ if @api_client.config.debugging
438
+ @api_client.config.logger.debug "API called: ClustersApi#get_query_cluster\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
439
+ end
440
+ return data, status_code, headers
441
+ end
442
+
368
443
  # Rename a keyword cluster
369
444
  # Minimum role: manager. Changes the name of one keyword cluster and nothing else: the tracked queries assigned to it are untouched, and its id does not change, so nothing a client stored breaks. The new name is trimmed and lower-cased and must be unique within the project; a collision is refused with 409. Renaming to the name the cluster already has is accepted and is a no-op. The organization must not be archived; an archived project IS refused with 409, stricter than the Mencoro app, which lets cluster writes into one. Requires the write capability and an Idempotency-Key header.
370
445
  # @param organization_id [String]
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -103,7 +103,7 @@ module Mencoro
103
103
  end
104
104
 
105
105
  # Start a brand-name alias suggestion job
106
- # Minimum role: manager. Starts a background, web-search-grounded job that suggests alias spellings for one entity - a brand, a project or a competitor - described entirely by the body, and answers 202 with the job to poll; it never returns suggestions inline. The entity need not exist: nothing is looked up, nothing is attached and nothing is saved, so the suggestions are the caller's to apply. Names sent in `enteredBrandNames` are excluded from the result. The organization must be active; no subscription is required, matching the application behaviour this mirrors. Ten starts per minute per organization, counted across every key of every member; a retry carrying an Idempotency-Key already answered is served from the record and does not count.
106
+ # Minimum role: manager, with access to every project of the organization: the job names no project, so a member restricted to selected projects is refused as a role below the minimum is. Starts a background, web-search-grounded job that suggests alias spellings for one entity - a brand, a project or a competitor - described entirely by the body, and answers 202 with the job to poll; it never returns suggestions inline. The entity need not exist: nothing is looked up, nothing is attached and nothing is saved, so the suggestions are the caller's to apply. Names sent in `enteredBrandNames` are excluded from the result. The organization must be active; no subscription is required, matching the application behaviour this mirrors. Ten starts per minute per organization, counted across every key of every member; a retry carrying an Idempotency-Key already answered is served from the record and does not count.
107
107
  # @param organization_id [String]
108
108
  # @param idempotency_key [String] Repeat it to retry a start whose response was lost; the same key returns the same job instead of starting a second one.
109
109
  # @param start_brand_name_suggestion_job_request [StartBrandNameSuggestionJobRequest]
@@ -115,7 +115,7 @@ module Mencoro
115
115
  end
116
116
 
117
117
  # Start a brand-name alias suggestion job
118
- # Minimum role: manager. Starts a background, web-search-grounded job that suggests alias spellings for one entity - a brand, a project or a competitor - described entirely by the body, and answers 202 with the job to poll; it never returns suggestions inline. The entity need not exist: nothing is looked up, nothing is attached and nothing is saved, so the suggestions are the caller&#39;s to apply. Names sent in &#x60;enteredBrandNames&#x60; are excluded from the result. The organization must be active; no subscription is required, matching the application behaviour this mirrors. Ten starts per minute per organization, counted across every key of every member; a retry carrying an Idempotency-Key already answered is served from the record and does not count.
118
+ # Minimum role: manager, with access to every project of the organization: the job names no project, so a member restricted to selected projects is refused as a role below the minimum is. Starts a background, web-search-grounded job that suggests alias spellings for one entity - a brand, a project or a competitor - described entirely by the body, and answers 202 with the job to poll; it never returns suggestions inline. The entity need not exist: nothing is looked up, nothing is attached and nothing is saved, so the suggestions are the caller&#39;s to apply. Names sent in &#x60;enteredBrandNames&#x60; are excluded from the result. The organization must be active; no subscription is required, matching the application behaviour this mirrors. Ten starts per minute per organization, counted across every key of every member; a retry carrying an Idempotency-Key already answered is served from the record and does not count.
119
119
  # @param organization_id [String]
120
120
  # @param idempotency_key [String] Repeat it to retry a start whose response was lost; the same key returns the same job instead of starting a second one.
121
121
  # @param start_brand_name_suggestion_job_request [StartBrandNameSuggestionJobRequest]
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -20,7 +20,7 @@ module Mencoro
20
20
  @api_client = api_client
21
21
  end
22
22
  # Get an asynchronous job
23
- # Minimum role: manager. The status of one asynchronous job started inside this organization — geo prompt discovery, keyword discovery, query clustering, brand discovery or brand-name suggestion — and, once it has completed, its result. Poll it until `status` is terminal: `completed` or `failed`. A null `result` means the result is not known, either because the job is still in flight or because it failed; it never means the job produced an empty result. A failed job carries no reason: the stored one is an internal exception message, not a published field. A job started by another organization, a job of a type this API does not publish, and a job id that does not exist all answer 404 alike, so the API never confirms that an inaccessible job exists.
23
+ # Minimum role: manager. The status of one asynchronous job started inside this organization — geo prompt discovery, keyword discovery, query clustering, brand discovery or brand-name suggestion — and, once it has completed, its result. Poll it until `status` is terminal: `completed` or `failed`. A null `result` means the result is not known, either because the job is still in flight or because it failed; it never means the job produced an empty result. A failed job carries `error`: a stable `code` (`timed_out`, `provider_failed`, `submission_failed` or `internal_error`) and a fixed `message` saying what to do next; `error` is null for a job that has not failed. A job started by another organization, a job of a type this API does not publish, and a job id that does not exist all answer 404 alike, so the API never confirms that an inaccessible job exists.
24
24
  # @param organization_id [String]
25
25
  # @param job_id [String] Must be a job started inside the organization in the path.
26
26
  # @param [Hash] opts the optional parameters
@@ -31,7 +31,7 @@ module Mencoro
31
31
  end
32
32
 
33
33
  # Get an asynchronous job
34
- # Minimum role: manager. The status of one asynchronous job started inside this organization — geo prompt discovery, keyword discovery, query clustering, brand discovery or brand-name suggestion — and, once it has completed, its result. Poll it until &#x60;status&#x60; is terminal: &#x60;completed&#x60; or &#x60;failed&#x60;. A null &#x60;result&#x60; means the result is not known, either because the job is still in flight or because it failed; it never means the job produced an empty result. A failed job carries no reason: the stored one is an internal exception message, not a published field. A job started by another organization, a job of a type this API does not publish, and a job id that does not exist all answer 404 alike, so the API never confirms that an inaccessible job exists.
34
+ # Minimum role: manager. The status of one asynchronous job started inside this organization — geo prompt discovery, keyword discovery, query clustering, brand discovery or brand-name suggestion — and, once it has completed, its result. Poll it until &#x60;status&#x60; is terminal: &#x60;completed&#x60; or &#x60;failed&#x60;. A null &#x60;result&#x60; means the result is not known, either because the job is still in flight or because it failed; it never means the job produced an empty result. A failed job carries &#x60;error&#x60;: a stable &#x60;code&#x60; (&#x60;timed_out&#x60;, &#x60;provider_failed&#x60;, &#x60;submission_failed&#x60; or &#x60;internal_error&#x60;) and a fixed &#x60;message&#x60; saying what to do next; &#x60;error&#x60; is null for a job that has not failed. A job started by another organization, a job of a type this API does not publish, and a job id that does not exist all answer 404 alike, so the API never confirms that an inaccessible job exists.
35
35
  # @param organization_id [String]
36
36
  # @param job_id [String] Must be a job started inside the organization in the path.
37
37
  # @param [Hash] opts the optional parameters
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -367,6 +367,100 @@ module Mencoro
367
367
  return data, status_code, headers
368
368
  end
369
369
 
370
+ # Set which projects a member reaches
371
+ # Minimum role: owner. A member reaches every project of the organization (`all`) or only the listed projects (`selected`); a project outside a selection answers as if it did not exist. The change applies from the member's next request, including through any API key or MCP connection they own. An owner always reaches every project and cannot be limited. Setting the access a member already has changes nothing. Preview it first: the confirmation is bound to the member's access at preview time, so another change in between invalidates it.
372
+ # @param organization_id [String]
373
+ # @param member_id [String]
374
+ # @param x_mencoro_confirmation [String]
375
+ # @param idempotency_key [String]
376
+ # @param set_member_project_access_request [SetMemberProjectAccessRequest]
377
+ # @param [Hash] opts the optional parameters
378
+ # @return [MemberResource]
379
+ def set_member_project_access(organization_id, member_id, x_mencoro_confirmation, idempotency_key, set_member_project_access_request, opts = {})
380
+ data, _status_code, _headers = set_member_project_access_with_http_info(organization_id, member_id, x_mencoro_confirmation, idempotency_key, set_member_project_access_request, opts)
381
+ data
382
+ end
383
+
384
+ # Set which projects a member reaches
385
+ # Minimum role: owner. A member reaches every project of the organization (&#x60;all&#x60;) or only the listed projects (&#x60;selected&#x60;); a project outside a selection answers as if it did not exist. The change applies from the member&#39;s next request, including through any API key or MCP connection they own. An owner always reaches every project and cannot be limited. Setting the access a member already has changes nothing. Preview it first: the confirmation is bound to the member&#39;s access at preview time, so another change in between invalidates it.
386
+ # @param organization_id [String]
387
+ # @param member_id [String]
388
+ # @param x_mencoro_confirmation [String]
389
+ # @param idempotency_key [String]
390
+ # @param set_member_project_access_request [SetMemberProjectAccessRequest]
391
+ # @param [Hash] opts the optional parameters
392
+ # @return [Array<(MemberResource, Integer, Hash)>] MemberResource data, response status code and response headers
393
+ def set_member_project_access_with_http_info(organization_id, member_id, x_mencoro_confirmation, idempotency_key, set_member_project_access_request, opts = {})
394
+ if @api_client.config.debugging
395
+ @api_client.config.logger.debug 'Calling API: MembersApi.set_member_project_access ...'
396
+ end
397
+ # verify the required parameter 'organization_id' is set
398
+ if @api_client.config.client_side_validation && organization_id.nil?
399
+ fail ArgumentError, "Missing the required parameter 'organization_id' when calling MembersApi.set_member_project_access"
400
+ end
401
+ # verify the required parameter 'member_id' is set
402
+ if @api_client.config.client_side_validation && member_id.nil?
403
+ fail ArgumentError, "Missing the required parameter 'member_id' when calling MembersApi.set_member_project_access"
404
+ end
405
+ # verify the required parameter 'x_mencoro_confirmation' is set
406
+ if @api_client.config.client_side_validation && x_mencoro_confirmation.nil?
407
+ fail ArgumentError, "Missing the required parameter 'x_mencoro_confirmation' when calling MembersApi.set_member_project_access"
408
+ end
409
+ # verify the required parameter 'idempotency_key' is set
410
+ if @api_client.config.client_side_validation && idempotency_key.nil?
411
+ fail ArgumentError, "Missing the required parameter 'idempotency_key' when calling MembersApi.set_member_project_access"
412
+ end
413
+ # verify the required parameter 'set_member_project_access_request' is set
414
+ if @api_client.config.client_side_validation && set_member_project_access_request.nil?
415
+ fail ArgumentError, "Missing the required parameter 'set_member_project_access_request' when calling MembersApi.set_member_project_access"
416
+ end
417
+ # resource path
418
+ local_var_path = '/api/v1/organizations/{organizationId}/members/{memberId}/project-access'.sub('{organizationId}', CGI.escape(organization_id.to_s)).sub('{memberId}', CGI.escape(member_id.to_s))
419
+
420
+ # query parameters
421
+ query_params = opts[:query_params] || {}
422
+
423
+ # header parameters
424
+ header_params = opts[:header_params] || {}
425
+ # HTTP header 'Accept' (if needed)
426
+ header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
427
+ # HTTP header 'Content-Type'
428
+ content_type = @api_client.select_header_content_type(['application/json'])
429
+ if !content_type.nil?
430
+ header_params['Content-Type'] = content_type
431
+ end
432
+ header_params[:'X-Mencoro-Confirmation'] = x_mencoro_confirmation
433
+ header_params[:'Idempotency-Key'] = idempotency_key
434
+
435
+ # form parameters
436
+ form_params = opts[:form_params] || {}
437
+
438
+ # http body (model)
439
+ post_body = opts[:debug_body] || @api_client.object_to_http_body(set_member_project_access_request)
440
+
441
+ # return_type
442
+ return_type = opts[:debug_return_type] || 'MemberResource'
443
+
444
+ # auth_names
445
+ auth_names = opts[:debug_auth_names] || ['ApiKey']
446
+
447
+ new_options = opts.merge(
448
+ :operation => :"MembersApi.set_member_project_access",
449
+ :header_params => header_params,
450
+ :query_params => query_params,
451
+ :form_params => form_params,
452
+ :body => post_body,
453
+ :auth_names => auth_names,
454
+ :return_type => return_type
455
+ )
456
+
457
+ data, status_code, headers = @api_client.call_api(:PUT, local_var_path, new_options)
458
+ if @api_client.config.debugging
459
+ @api_client.config.logger.debug "API called: MembersApi#set_member_project_access\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
460
+ end
461
+ return data, status_code, headers
462
+ end
463
+
370
464
  # Suspend a member
371
465
  # Minimum role: owner. The member loses access on their very next request, including through any API key they own that is scoped to this organization. The last active owner cannot be suspended.
372
466
  # @param organization_id [String]
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -105,7 +105,7 @@ module Mencoro
105
105
  end
106
106
 
107
107
  # Count the tracked queries an organization has configured
108
- # Minimum role: viewer. How many tracked queries the organization has configured, counted live in PostgreSQL — the write model — over EVERY project it owns, archived projects included, and over every tracked query in them, active and paused alike. It is deliberately a DIFFERENT number from `aggregate.totalTrackedQueries` in getOrganizationOverview: that one sums a per-project copy held in the Elasticsearch read model and covers ACTIVE projects only, so it excludes archived projects and can lag behind a change that already shows here. Expect the two to disagree and do not treat either as wrong. This figure does reconcile exactly with countTrackedQueries, which counts one project through the same counter in the same store: sum its unfiltered `count` over every project, archived included, and you get this number. For the ACTIVE subset and what it will consume, call getOrganizationProjectedMonthlyChecks, which ranges over the same projects. Do NOT derive the paused count by subtracting one from the other: this number is read live from Postgres while that one is served from a cache invalidated by background subscribers, so the two can disagree while that invalidation catches up and the difference is then a count of nothing. For how many projects this ranges over, read `projects.total` and `projects.active` from getOrganizationStats. The value is never null: 0 means none are configured. This operation takes no query parameters — the population is fixed, and a parameter it cannot honour is rejected with 400 rather than silently ignored.
108
+ # Minimum role: viewer. For a member restricted to selected projects, every figure covers those projects only. How many tracked queries the organization has configured, counted live in PostgreSQL — the write model — over EVERY project it owns, archived projects included, and over every tracked query in them, active and paused alike. It is deliberately a DIFFERENT number from `aggregate.totalTrackedQueries` in getOrganizationOverview: that one sums a per-project copy held in the Elasticsearch read model and covers ACTIVE projects only, so it excludes archived projects and can lag behind a change that already shows here. Expect the two to disagree and do not treat either as wrong. This figure does reconcile exactly with countTrackedQueries, which counts one project through the same counter in the same store: sum its unfiltered `count` over every project, archived included, and you get this number. For the ACTIVE subset and what it will consume, call getOrganizationProjectedMonthlyChecks, which ranges over the same projects. Do NOT derive the paused count by subtracting one from the other: this number is read live from Postgres while that one is served from a cache invalidated by background subscribers, so the two can disagree while that invalidation catches up and the difference is then a count of nothing. For how many projects this ranges over, read `projects.total` and `projects.active` from getOrganizationStats. The value is never null: 0 means none are configured. This operation takes no query parameters — the population is fixed, and a parameter it cannot honour is rejected with 400 rather than silently ignored.
109
109
  # @param organization_id [String]
110
110
  # @param [Hash] opts the optional parameters
111
111
  # @return [TrackedQueryUsageResource]
@@ -115,7 +115,7 @@ module Mencoro
115
115
  end
116
116
 
117
117
  # Count the tracked queries an organization has configured
118
- # Minimum role: viewer. How many tracked queries the organization has configured, counted live in PostgreSQL — the write model — over EVERY project it owns, archived projects included, and over every tracked query in them, active and paused alike. It is deliberately a DIFFERENT number from &#x60;aggregate.totalTrackedQueries&#x60; in getOrganizationOverview: that one sums a per-project copy held in the Elasticsearch read model and covers ACTIVE projects only, so it excludes archived projects and can lag behind a change that already shows here. Expect the two to disagree and do not treat either as wrong. This figure does reconcile exactly with countTrackedQueries, which counts one project through the same counter in the same store: sum its unfiltered &#x60;count&#x60; over every project, archived included, and you get this number. For the ACTIVE subset and what it will consume, call getOrganizationProjectedMonthlyChecks, which ranges over the same projects. Do NOT derive the paused count by subtracting one from the other: this number is read live from Postgres while that one is served from a cache invalidated by background subscribers, so the two can disagree while that invalidation catches up and the difference is then a count of nothing. For how many projects this ranges over, read &#x60;projects.total&#x60; and &#x60;projects.active&#x60; from getOrganizationStats. The value is never null: 0 means none are configured. This operation takes no query parameters — the population is fixed, and a parameter it cannot honour is rejected with 400 rather than silently ignored.
118
+ # Minimum role: viewer. For a member restricted to selected projects, every figure covers those projects only. How many tracked queries the organization has configured, counted live in PostgreSQL — the write model — over EVERY project it owns, archived projects included, and over every tracked query in them, active and paused alike. It is deliberately a DIFFERENT number from &#x60;aggregate.totalTrackedQueries&#x60; in getOrganizationOverview: that one sums a per-project copy held in the Elasticsearch read model and covers ACTIVE projects only, so it excludes archived projects and can lag behind a change that already shows here. Expect the two to disagree and do not treat either as wrong. This figure does reconcile exactly with countTrackedQueries, which counts one project through the same counter in the same store: sum its unfiltered &#x60;count&#x60; over every project, archived included, and you get this number. For the ACTIVE subset and what it will consume, call getOrganizationProjectedMonthlyChecks, which ranges over the same projects. Do NOT derive the paused count by subtracting one from the other: this number is read live from Postgres while that one is served from a cache invalidated by background subscribers, so the two can disagree while that invalidation catches up and the difference is then a count of nothing. For how many projects this ranges over, read &#x60;projects.total&#x60; and &#x60;projects.active&#x60; from getOrganizationStats. The value is never null: 0 means none are configured. This operation takes no query parameters — the population is fixed, and a parameter it cannot honour is rejected with 400 rather than silently ignored.
119
119
  # @param organization_id [String]
120
120
  # @param [Hash] opts the optional parameters
121
121
  # @return [Array<(TrackedQueryUsageResource, Integer, Hash)>] TrackedQueryUsageResource data, response status code and response headers
@@ -439,7 +439,7 @@ module Mencoro
439
439
  end
440
440
 
441
441
  # Project a month of check consumption from the current tracking configuration
442
- # Minimum role: viewer. What the organization's current configuration would consume in a month, in check budget units — the same unit `checkBudget` and `checksAvailable` are counted in by the entitlements operation — so the two are directly comparable when sizing a plan. The arithmetic is published so it can be reproduced rather than trusted: for each ACTIVE tracked query, runs per month (daily 30, weekly 4, monthly 1) multiplied by its nPasses, summed. A weekly query bills 4, not 4.345: a month is modelled as 30 days and 4 weeks, a planning convention rather than a calendar. Take `checkFrequency` and `nPasses` from the tracked-query listing and the arithmetic will match — though the two sides are read from different places and settle at different times: this figure is computed in the Postgres write model and served from a cache that background subscribers invalidate, while that listing reads an Elasticsearch projection. Immediately after a write the two can disagree; neither is wrong, they are catching up. PAUSED queries are excluded from both figures; archived PROJECTS are not — archiving a project does not pause its tracked queries, so they still count here, exactly as they do in countOrganizationTrackedQueries. `activeTrackedQueryCount` describes the same population as that count, minus the paused queries — but do not compute the difference to learn how many are paused: THIS OPERATION IS CACHED and that one is read live, so the two can disagree while the cache is invalidated in the background. This is a projection of the configuration, not a forecast of what will actually be spent: it does not look at the remaining plan budget, does not know which checks will be skipped or retried, and reserves and debits nothing. It is also not the `checkCost` of countTrackedQueries, which prices one round over one project rather than a month over the organization. Both values are never null: 0 means nothing is scheduled. This operation takes no query parameters — the population is fixed, and a parameter it cannot honour is rejected with 400 rather than silently ignored.
442
+ # Minimum role: viewer. For a member restricted to selected projects, every figure covers those projects only. What the organization's current configuration would consume in a month, in checks — the same unit `checkBudget` and `checksAvailable` are counted in by the entitlements operation — so the two are directly comparable when sizing a plan. The arithmetic is published so it can be reproduced rather than trusted: for each ACTIVE tracked query, runs per month (daily 30, weekly 4, monthly 1) multiplied by its nPasses and engine weight, summed. Claude uses five checks per pass; every other engine uses one. A weekly query runs 4 times per month, not 4.345: a month is modelled as 30 days and 4 weeks, a planning convention rather than a calendar. Take `checkFrequency`, `nPasses` and `engine` from the tracked-query listing and the arithmetic will match — though the two sides are read from different places and settle at different times: this figure is computed in the Postgres write model and served from a cache that background subscribers invalidate, while that listing reads an Elasticsearch projection. Immediately after a write the two can disagree; neither is wrong, they are catching up. PAUSED queries are excluded from both figures; archived PROJECTS are not — archiving a project does not pause its tracked queries, so they still count here, exactly as they do in countOrganizationTrackedQueries. `activeTrackedQueryCount` describes the same population as that count, minus the paused queries — but do not compute the difference to learn how many are paused: THIS OPERATION IS CACHED and that one is read live, so the two can disagree while the cache is invalidated in the background. This is a projection of the configuration, not a forecast of what will actually be spent: it does not look at the remaining plan budget, does not know which checks will be skipped or retried, and reserves and debits nothing. It is also not the `checkCost` of countTrackedQueries, which prices one round over one project rather than a month over the organization. Both values are never null: 0 means nothing is scheduled. This operation takes no query parameters — the population is fixed, and a parameter it cannot honour is rejected with 400 rather than silently ignored.
443
443
  # @param organization_id [String]
444
444
  # @param [Hash] opts the optional parameters
445
445
  # @return [ProjectedMonthlyChecksResource]
@@ -449,7 +449,7 @@ module Mencoro
449
449
  end
450
450
 
451
451
  # Project a month of check consumption from the current tracking configuration
452
- # Minimum role: viewer. What the organization&#39;s current configuration would consume in a month, in check budget units — the same unit &#x60;checkBudget&#x60; and &#x60;checksAvailable&#x60; are counted in by the entitlements operation — so the two are directly comparable when sizing a plan. The arithmetic is published so it can be reproduced rather than trusted: for each ACTIVE tracked query, runs per month (daily 30, weekly 4, monthly 1) multiplied by its nPasses, summed. A weekly query bills 4, not 4.345: a month is modelled as 30 days and 4 weeks, a planning convention rather than a calendar. Take &#x60;checkFrequency&#x60; and &#x60;nPasses&#x60; from the tracked-query listing and the arithmetic will match — though the two sides are read from different places and settle at different times: this figure is computed in the Postgres write model and served from a cache that background subscribers invalidate, while that listing reads an Elasticsearch projection. Immediately after a write the two can disagree; neither is wrong, they are catching up. PAUSED queries are excluded from both figures; archived PROJECTS are not — archiving a project does not pause its tracked queries, so they still count here, exactly as they do in countOrganizationTrackedQueries. &#x60;activeTrackedQueryCount&#x60; describes the same population as that count, minus the paused queries — but do not compute the difference to learn how many are paused: THIS OPERATION IS CACHED and that one is read live, so the two can disagree while the cache is invalidated in the background. This is a projection of the configuration, not a forecast of what will actually be spent: it does not look at the remaining plan budget, does not know which checks will be skipped or retried, and reserves and debits nothing. It is also not the &#x60;checkCost&#x60; of countTrackedQueries, which prices one round over one project rather than a month over the organization. Both values are never null: 0 means nothing is scheduled. This operation takes no query parameters — the population is fixed, and a parameter it cannot honour is rejected with 400 rather than silently ignored.
452
+ # Minimum role: viewer. For a member restricted to selected projects, every figure covers those projects only. What the organization&#39;s current configuration would consume in a month, in checks — the same unit &#x60;checkBudget&#x60; and &#x60;checksAvailable&#x60; are counted in by the entitlements operation — so the two are directly comparable when sizing a plan. The arithmetic is published so it can be reproduced rather than trusted: for each ACTIVE tracked query, runs per month (daily 30, weekly 4, monthly 1) multiplied by its nPasses and engine weight, summed. Claude uses five checks per pass; every other engine uses one. A weekly query runs 4 times per month, not 4.345: a month is modelled as 30 days and 4 weeks, a planning convention rather than a calendar. Take &#x60;checkFrequency&#x60;, &#x60;nPasses&#x60; and &#x60;engine&#x60; from the tracked-query listing and the arithmetic will match — though the two sides are read from different places and settle at different times: this figure is computed in the Postgres write model and served from a cache that background subscribers invalidate, while that listing reads an Elasticsearch projection. Immediately after a write the two can disagree; neither is wrong, they are catching up. PAUSED queries are excluded from both figures; archived PROJECTS are not — archiving a project does not pause its tracked queries, so they still count here, exactly as they do in countOrganizationTrackedQueries. &#x60;activeTrackedQueryCount&#x60; describes the same population as that count, minus the paused queries — but do not compute the difference to learn how many are paused: THIS OPERATION IS CACHED and that one is read live, so the two can disagree while the cache is invalidated in the background. This is a projection of the configuration, not a forecast of what will actually be spent: it does not look at the remaining plan budget, does not know which checks will be skipped or retried, and reserves and debits nothing. It is also not the &#x60;checkCost&#x60; of countTrackedQueries, which prices one round over one project rather than a month over the organization. Both values are never null: 0 means nothing is scheduled. This operation takes no query parameters — the population is fixed, and a parameter it cannot honour is rejected with 400 rather than silently ignored.
453
453
  # @param organization_id [String]
454
454
  # @param [Hash] opts the optional parameters
455
455
  # @return [Array<(ProjectedMonthlyChecksResource, Integer, Hash)>] ProjectedMonthlyChecksResource data, response status code and response headers
@@ -502,7 +502,7 @@ module Mencoro
502
502
  end
503
503
 
504
504
  # Headline counts for an organization
505
- # Minimum role: viewer. Active members, projects (total and active) and pending invitations, in one call. Every value is a count and is always known: 0 means the organization really has none of that thing, and no field is ever null. `members.total` counts ACTIVE memberships only, so a suspended member is not included; `projects.total` counts every project including archived ones, and `projects.active` the non-archived subset. This is a current-state snapshot and takes no date window.
505
+ # Minimum role: viewer. Active members, projects (total and active) and pending invitations, in one call. Every value is a count: 0 means the organization really has none of that thing you can access. Only `members.total` and `invitations.pending` can be null, and only for a member restricted to selected projects, who is not shown them. `members.total` counts ACTIVE memberships only, so a suspended member is not included; `projects.total` counts every project you can access, archived ones included, and `projects.active` the non-archived subset. For a member restricted to selected projects, the project figures cover those projects only. This is a current-state snapshot and takes no date window.
506
506
  # @param organization_id [String]
507
507
  # @param [Hash] opts the optional parameters
508
508
  # @return [GetOrganizationStats200Response]
@@ -512,7 +512,7 @@ module Mencoro
512
512
  end
513
513
 
514
514
  # Headline counts for an organization
515
- # Minimum role: viewer. Active members, projects (total and active) and pending invitations, in one call. Every value is a count and is always known: 0 means the organization really has none of that thing, and no field is ever null. &#x60;members.total&#x60; counts ACTIVE memberships only, so a suspended member is not included; &#x60;projects.total&#x60; counts every project including archived ones, and &#x60;projects.active&#x60; the non-archived subset. This is a current-state snapshot and takes no date window.
515
+ # Minimum role: viewer. Active members, projects (total and active) and pending invitations, in one call. Every value is a count: 0 means the organization really has none of that thing you can access. Only &#x60;members.total&#x60; and &#x60;invitations.pending&#x60; can be null, and only for a member restricted to selected projects, who is not shown them. &#x60;members.total&#x60; counts ACTIVE memberships only, so a suspended member is not included; &#x60;projects.total&#x60; counts every project you can access, archived ones included, and &#x60;projects.active&#x60; the non-archived subset. For a member restricted to selected projects, the project figures cover those projects only. This is a current-state snapshot and takes no date window.
516
516
  # @param organization_id [String]
517
517
  # @param [Hash] opts the optional parameters
518
518
  # @return [Array<(GetOrganizationStats200Response, Integer, Hash)>] GetOrganizationStats200Response data, response status code and response headers
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Mencoro API
3
3
 
4
- #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`.
4
+ #Public API for Mencoro customers. Authenticate with an API key: `Authorization: Bearer mencoro_sk_...`. Every write operation requires an `Idempotency-Key` header: a retry carrying the same key and body within 30 days is answered from the stored result without running again; after 30 days the key is forgotten and a retry runs as a new operation.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: support@mencoro.com
@@ -191,7 +191,7 @@ module Mencoro
191
191
  end
192
192
 
193
193
  # Create a project and the brand monitoring profile its checks run against
194
- # Minimum role: manager, in an active organization. Requires the \"write\" capability. Creates the project, the brand monitoring profile holding the domains and brand names to watch, and one competitor per entry of `competitors`, in a single call. The project id is minted by the server; a caller-supplied id is rejected as an unknown field. What is NOT done: no tracked queries are created, no check is run and no scraping is scheduled — a new project has nothing collected against it until tracked queries are added. Each website entry may be a full URL or a bare domain: a URL is reduced to its host with any leading \"www.\" removed, so \"https://www.acme.com/pricing\" is stored as \"acme.com\". Duplicate domains and duplicate brand names are collapsed, exactly as the stored value objects do. Send an Idempotency-Key: a retry with the same key and the same body returns this same project instead of creating a second one.
194
+ # Minimum role: manager, in an active organization, with access to every project of it: a member restricted to selected projects is refused as a role below the minimum is. Requires the \"write\" capability. Creates the project, the brand monitoring profile holding the domains and brand names to watch, and one competitor per entry of `competitors`, in a single call. The project id is minted by the server; a caller-supplied id is rejected as an unknown field. What is NOT done: no tracked queries are created, no check is run and no scraping is scheduled — a new project has nothing collected against it until tracked queries are added. Each website entry may be a full URL or a bare domain: a URL is reduced to its host with any leading \"www.\" removed, so \"https://www.acme.com/pricing\" is stored as \"acme.com\". Duplicate domains and duplicate brand names are collapsed, exactly as the stored value objects do. Send an Idempotency-Key: a retry with the same key and the same body returns this same project instead of creating a second one.
195
195
  # @param organization_id [String]
196
196
  # @param idempotency_key [String]
197
197
  # @param create_project_request [CreateProjectRequest]
@@ -203,7 +203,7 @@ module Mencoro
203
203
  end
204
204
 
205
205
  # Create a project and the brand monitoring profile its checks run against
206
- # Minimum role: manager, in an active organization. Requires the \&quot;write\&quot; capability. Creates the project, the brand monitoring profile holding the domains and brand names to watch, and one competitor per entry of &#x60;competitors&#x60;, in a single call. The project id is minted by the server; a caller-supplied id is rejected as an unknown field. What is NOT done: no tracked queries are created, no check is run and no scraping is scheduled — a new project has nothing collected against it until tracked queries are added. Each website entry may be a full URL or a bare domain: a URL is reduced to its host with any leading \&quot;www.\&quot; removed, so \&quot;https://www.acme.com/pricing\&quot; is stored as \&quot;acme.com\&quot;. Duplicate domains and duplicate brand names are collapsed, exactly as the stored value objects do. Send an Idempotency-Key: a retry with the same key and the same body returns this same project instead of creating a second one.
206
+ # Minimum role: manager, in an active organization, with access to every project of it: a member restricted to selected projects is refused as a role below the minimum is. Requires the \&quot;write\&quot; capability. Creates the project, the brand monitoring profile holding the domains and brand names to watch, and one competitor per entry of &#x60;competitors&#x60;, in a single call. The project id is minted by the server; a caller-supplied id is rejected as an unknown field. What is NOT done: no tracked queries are created, no check is run and no scraping is scheduled — a new project has nothing collected against it until tracked queries are added. Each website entry may be a full URL or a bare domain: a URL is reduced to its host with any leading \&quot;www.\&quot; removed, so \&quot;https://www.acme.com/pricing\&quot; is stored as \&quot;acme.com\&quot;. Duplicate domains and duplicate brand names are collapsed, exactly as the stored value objects do. Send an Idempotency-Key: a retry with the same key and the same body returns this same project instead of creating a second one.
207
207
  # @param organization_id [String]
208
208
  # @param idempotency_key [String]
209
209
  # @param create_project_request [CreateProjectRequest]
@@ -430,6 +430,81 @@ module Mencoro
430
430
  return data, status_code, headers
431
431
  end
432
432
 
433
+ # Get one of a project's competitors
434
+ # Minimum role: viewer. Returns a single competitor of the project, the same projection the competitor listing returns for each of its rows. A competitor belonging to another project answers 404, the same answer an unknown id and a malformed one get, so the API never confirms that a competitor the caller cannot reach exists. A project whose brand monitoring profile has not been created yet has no competitors at all and answers 404 for any competitor id.
435
+ # @param organization_id [String]
436
+ # @param project_id [String] Must belong to the organization in the path.
437
+ # @param competitor_id [String] Must belong to the project in the path.
438
+ # @param [Hash] opts the optional parameters
439
+ # @return [CompetitorResource]
440
+ def get_competitor(organization_id, project_id, competitor_id, opts = {})
441
+ data, _status_code, _headers = get_competitor_with_http_info(organization_id, project_id, competitor_id, opts)
442
+ data
443
+ end
444
+
445
+ # Get one of a project&#39;s competitors
446
+ # Minimum role: viewer. Returns a single competitor of the project, the same projection the competitor listing returns for each of its rows. A competitor belonging to another project answers 404, the same answer an unknown id and a malformed one get, so the API never confirms that a competitor the caller cannot reach exists. A project whose brand monitoring profile has not been created yet has no competitors at all and answers 404 for any competitor id.
447
+ # @param organization_id [String]
448
+ # @param project_id [String] Must belong to the organization in the path.
449
+ # @param competitor_id [String] Must belong to the project in the path.
450
+ # @param [Hash] opts the optional parameters
451
+ # @return [Array<(CompetitorResource, Integer, Hash)>] CompetitorResource data, response status code and response headers
452
+ def get_competitor_with_http_info(organization_id, project_id, competitor_id, opts = {})
453
+ if @api_client.config.debugging
454
+ @api_client.config.logger.debug 'Calling API: ProjectsApi.get_competitor ...'
455
+ end
456
+ # verify the required parameter 'organization_id' is set
457
+ if @api_client.config.client_side_validation && organization_id.nil?
458
+ fail ArgumentError, "Missing the required parameter 'organization_id' when calling ProjectsApi.get_competitor"
459
+ end
460
+ # verify the required parameter 'project_id' is set
461
+ if @api_client.config.client_side_validation && project_id.nil?
462
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling ProjectsApi.get_competitor"
463
+ end
464
+ # verify the required parameter 'competitor_id' is set
465
+ if @api_client.config.client_side_validation && competitor_id.nil?
466
+ fail ArgumentError, "Missing the required parameter 'competitor_id' when calling ProjectsApi.get_competitor"
467
+ end
468
+ # resource path
469
+ local_var_path = '/api/v1/organizations/{organizationId}/projects/{projectId}/competitors/{competitorId}'.sub('{organizationId}', CGI.escape(organization_id.to_s)).sub('{projectId}', CGI.escape(project_id.to_s)).sub('{competitorId}', CGI.escape(competitor_id.to_s))
470
+
471
+ # query parameters
472
+ query_params = opts[:query_params] || {}
473
+
474
+ # header parameters
475
+ header_params = opts[:header_params] || {}
476
+ # HTTP header 'Accept' (if needed)
477
+ header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
478
+
479
+ # form parameters
480
+ form_params = opts[:form_params] || {}
481
+
482
+ # http body (model)
483
+ post_body = opts[:debug_body]
484
+
485
+ # return_type
486
+ return_type = opts[:debug_return_type] || 'CompetitorResource'
487
+
488
+ # auth_names
489
+ auth_names = opts[:debug_auth_names] || ['ApiKey']
490
+
491
+ new_options = opts.merge(
492
+ :operation => :"ProjectsApi.get_competitor",
493
+ :header_params => header_params,
494
+ :query_params => query_params,
495
+ :form_params => form_params,
496
+ :body => post_body,
497
+ :auth_names => auth_names,
498
+ :return_type => return_type
499
+ )
500
+
501
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
502
+ if @api_client.config.debugging
503
+ @api_client.config.logger.debug "API called: ProjectsApi#get_competitor\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
504
+ end
505
+ return data, status_code, headers
506
+ end
507
+
433
508
  # Get a project and its brand monitoring configuration
434
509
  # Minimum role: viewer. Returns the project together with the domains and brand names it is monitored for and the competitors it is measured against. A project that exists but belongs to another organization answers 404, never 403. A project that has been created but not yet configured for brand monitoring reports empty `websiteDomains`, `brandNames` and `competitors`. Headline metrics are not part of this response: use `listProjects` for the per-project figures, or `getProjectMetrics` for a window.
435
510
  # @param organization_id [String]
@@ -594,7 +669,7 @@ module Mencoro
594
669
  end
595
670
 
596
671
  # List an organization's projects
597
- # Minimum role: viewer. Metrics come from the same read model the application uses, so the figures match what the product shows. A null metric means \"not known yet\", never zero.Send `Accept: text/csv` to receive the same page as a CSV download instead of JSON: same filters, same authorization, same page window and the same maximum of 100 rows — it is this page in another format, not a bulk export, so a whole collection is still read by paging. The CSV carries no `total`, because a table whose every row is a record has nowhere to put one; read it from the JSON representation of the same request. A list-valued field is joined into one cell with `; ` as a display projection — parse the JSON if you need the structure. Cells beginning with `=`, `+`, `-` or `@` are prefixed with an apostrophe so a spreadsheet treats them as text rather than running them as formulas.
672
+ # Minimum role: viewer. Metrics come from the same read model the application uses, so the figures match what the product shows. A null metric means \"not known yet\", never zero. For a member restricted to selected projects, the list and `total` cover those projects only. Send `Accept: text/csv` to receive the same page as a CSV download instead of JSON: same filters, same authorization, same page window and the same maximum of 100 rows — it is this page in another format, not a bulk export, so a whole collection is still read by paging. The CSV carries no `total`, because a table whose every row is a record has nowhere to put one; read it from the JSON representation of the same request. A list-valued field is joined into one cell with `; ` as a display projection — parse the JSON if you need the structure. Cells beginning with `=`, `+`, `-` or `@` are prefixed with an apostrophe so a spreadsheet treats them as text rather than running them as formulas.
598
673
  # @param organization_id [String]
599
674
  # @param [Hash] opts the optional parameters
600
675
  # @option opts [Integer] :limit Page size. A larger value is rejected, never silently reduced. (default to 20)
@@ -610,7 +685,7 @@ module Mencoro
610
685
  end
611
686
 
612
687
  # List an organization&#39;s projects
613
- # Minimum role: viewer. Metrics come from the same read model the application uses, so the figures match what the product shows. A null metric means \&quot;not known yet\&quot;, never zero.Send &#x60;Accept: text/csv&#x60; to receive the same page as a CSV download instead of JSON: same filters, same authorization, same page window and the same maximum of 100 rows — it is this page in another format, not a bulk export, so a whole collection is still read by paging. The CSV carries no &#x60;total&#x60;, because a table whose every row is a record has nowhere to put one; read it from the JSON representation of the same request. A list-valued field is joined into one cell with &#x60;; &#x60; as a display projection — parse the JSON if you need the structure. Cells beginning with &#x60;&#x3D;&#x60;, &#x60;+&#x60;, &#x60;-&#x60; or &#x60;@&#x60; are prefixed with an apostrophe so a spreadsheet treats them as text rather than running them as formulas.
688
+ # Minimum role: viewer. Metrics come from the same read model the application uses, so the figures match what the product shows. A null metric means \&quot;not known yet\&quot;, never zero. For a member restricted to selected projects, the list and &#x60;total&#x60; cover those projects only. Send &#x60;Accept: text/csv&#x60; to receive the same page as a CSV download instead of JSON: same filters, same authorization, same page window and the same maximum of 100 rows — it is this page in another format, not a bulk export, so a whole collection is still read by paging. The CSV carries no &#x60;total&#x60;, because a table whose every row is a record has nowhere to put one; read it from the JSON representation of the same request. A list-valued field is joined into one cell with &#x60;; &#x60; as a display projection — parse the JSON if you need the structure. Cells beginning with &#x60;&#x3D;&#x60;, &#x60;+&#x60;, &#x60;-&#x60; or &#x60;@&#x60; are prefixed with an apostrophe so a spreadsheet treats them as text rather than running them as formulas.
614
689
  # @param organization_id [String]
615
690
  # @param [Hash] opts the optional parameters
616
691
  # @option opts [Integer] :limit Page size. A larger value is rejected, never silently reduced. (default to 20)