@gscdump/contracts 4.6.0 → 4.7.0

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.
@@ -1,3 +1,4 @@
1
+ import { siteHoldReasonSchema } from "../entitlements.mjs";
1
2
  import { watchedUrlsChangeRequestSchema, watchedUrlsChangeResponseSchema, watchedUrlsResponseSchema } from "../indexing-coverage.mjs";
2
3
  import { addPartnerTeamMemberSchema, bindPartnerSiteTeamSchema, bindPartnerTeamCatalogResponseSchema, bindPartnerTeamCatalogSchema, builderStateSchema, createPartnerTeamSchema, gscComparisonFilterSchema, gscdumpAnalysisBundleResponseSchema, gscdumpAnalysisPresetSchema, gscdumpAnalysisResponseSchema, gscdumpAvailableSiteSchema, gscdumpCanonicalMismatchesResponseSchema, gscdumpDataDetailResponseSchema, gscdumpDataResponseSchema, gscdumpDeletePartnerUserResponseSchema, gscdumpIndexPercentResponseSchema, gscdumpIndexingDiagnosticsResponseSchema, gscdumpIndexingResponseSchema, gscdumpIndexingTransitionFieldSchema, gscdumpKeywordSparklinesResponseSchema, gscdumpPageTrendResponseSchema, gscdumpQueryTrendResponseSchema, gscdumpSiteRegistrationSchema, gscdumpSitemapChangesResponseSchema, gscdumpSitemapExportQuerySchema, gscdumpSitemapExportResponseSchema, gscdumpSitemapMembershipParamsSchema, gscdumpSitemapMembershipResponseSchema, gscdumpSitemapUrlsQuerySchema, gscdumpSitemapUrlsResponseSchema, gscdumpSitemapsResponseSchema, gscdumpTeamRoleSchema, gscdumpTopAssociationResponseSchema, gscdumpUserRegistrationSchema, indexingUrlsResponseSchema, partnerSiteTeamBindingResponseSchema, partnerSitemapActionResponseSchema, partnerSitemapActionSchema, partnerTeamCreatedResponseSchema, partnerTeamDeletedResponseSchema, partnerTeamMemberAddedResponseSchema, partnerTeamMemberRemovedResponseSchema, partnerTeamMemberRoleResponseSchema, partnerTeamMembersResponseSchema, partnerTeamRenamedResponseSchema, registerPartnerSiteSchema, registerPartnerUserSchema, renamePartnerTeamSchema, searchTypeSchema, siteIntIdCrosswalkResponseSchema, sitemapChangesTruncationReasonSchema, teamCatalogRefSchema, updatePartnerUserTokensSchema } from "../schemas.mjs";
3
4
  import { bingConnectionV1Schemas } from "./bing.mjs";
@@ -386,6 +387,52 @@ function createGscdumpV1Protocol() {
386
387
  ok: z.literal(true),
387
388
  keyId: partnerUserApiKeyId
388
389
  }), partnerResponseMeta);
390
+ const entitlementCount = z.number().int().nonnegative();
391
+ const entitlementUsage = defineResponseObject({
392
+ used: entitlementCount,
393
+ allowance: entitlementCount
394
+ });
395
+ const preservedRowsUsage = defineResponseObject({
396
+ used: entitlementCount.nullable(),
397
+ allowance: entitlementCount
398
+ });
399
+ const urlInspectionsUsage = defineResponseObject({
400
+ used: entitlementCount,
401
+ allowance: entitlementCount.nullable(),
402
+ resetsAt: z.iso.date()
403
+ });
404
+ const entitlementMeters = defineResponseObject({
405
+ sites: entitlementUsage.producer,
406
+ preservedRows: preservedRowsUsage.producer,
407
+ urlInspections: urlInspectionsUsage.producer
408
+ }, {
409
+ sites: entitlementUsage.client,
410
+ preservedRows: preservedRowsUsage.client,
411
+ urlInspections: urlInspectionsUsage.client
412
+ });
413
+ const heldSite = defineResponseObject({
414
+ siteId: realtimeSchemas.publicSiteId,
415
+ hold: siteHoldReasonSchema
416
+ });
417
+ const exemptEntitlements = defineResponseObject({ mode: z.literal("exempt") });
418
+ const meteredEntitlementsShape = {
419
+ mode: z.literal("metered"),
420
+ phase: z.enum(["beta", "billing"]),
421
+ sizeLimitRowsPerDay: z.number().int().positive()
422
+ };
423
+ const meteredEntitlements = defineResponseObject({
424
+ ...meteredEntitlementsShape,
425
+ meters: entitlementMeters.producer,
426
+ heldSites: z.array(heldSite.producer)
427
+ }, {
428
+ ...meteredEntitlementsShape,
429
+ meters: entitlementMeters.client,
430
+ heldSites: z.array(heldSite.client)
431
+ });
432
+ const userEntitlementsResponse = defineSuccessResponse({
433
+ producer: z.discriminatedUnion("mode", [exemptEntitlements.producer, meteredEntitlements.producer]),
434
+ client: z.discriminatedUnion("mode", [exemptEntitlements.client, meteredEntitlements.client])
435
+ }, partnerResponseMeta);
389
436
  const trendQuery = z.strictObject({
390
437
  startDate: calendarDate,
391
438
  endDate: calendarDate,
@@ -813,6 +860,87 @@ function createGscdumpV1Protocol() {
813
860
  }
814
861
  }
815
862
  }),
863
+ getUserEntitlements: defineHttpOperation({
864
+ ...gscdumpV1OperationRoute("partner.users.entitlements.get"),
865
+ visibility: "public",
866
+ semantics: {
867
+ kind: "query",
868
+ sideEffects: "none",
869
+ idempotent: true,
870
+ retry: "idempotent",
871
+ readConsistency: "primary"
872
+ },
873
+ auth: {
874
+ credentials: ["user_key", "partner_key"],
875
+ scopes: ["users:read"],
876
+ ownership: [{
877
+ credential: "user_key",
878
+ rule: "self"
879
+ }, {
880
+ credential: "partner_key",
881
+ rule: "linked_user"
882
+ }]
883
+ },
884
+ request: {
885
+ params: z.strictObject({ userId: realtimeSchemas.publicUserId }),
886
+ query: null,
887
+ headers: requestHeaders,
888
+ body: null
889
+ },
890
+ responses: { 200: userEntitlementsResponse },
891
+ errors: partnerUserErrors,
892
+ errorResponse: errorEnvelopeSchemas(partnerUserErrors, realtimeSchemas.publicRequestId),
893
+ resources: {
894
+ reads: [{
895
+ type: "partner.user",
896
+ idFrom: "params.userId"
897
+ }, {
898
+ type: "user.sites",
899
+ idFrom: "params.userId"
900
+ }],
901
+ changes: []
902
+ },
903
+ lifecycle: { introduced: "4.7.0" },
904
+ docs: {
905
+ summary: "Get user entitlements",
906
+ description: "Returns the Meters that apply to the user's partner Sites. If the partner is exempt, the response is `{ mode: \"exempt\" }` and no free allowance applies. If the partner is metered, the response gives the usage of the user's Billing owner against each free allowance, the size limit in query×page rows per day, and the held Sites the user can read. `urlInspections.allowance` is `null` when URL Inspections have no cap. `urlInspections.resetsAt` is the first UTC day of the next usage month.",
907
+ tags: ["Users"],
908
+ examples: {
909
+ request: { params: { userId: "u_01" } },
910
+ response: {
911
+ data: {
912
+ mode: "metered",
913
+ phase: "beta",
914
+ meters: {
915
+ sites: {
916
+ used: 2,
917
+ allowance: 3
918
+ },
919
+ preservedRows: {
920
+ used: 12e4,
921
+ allowance: 25e4
922
+ },
923
+ urlInspections: {
924
+ used: 310,
925
+ allowance: 5e3,
926
+ resetsAt: "2026-11-01"
927
+ }
928
+ },
929
+ sizeLimitRowsPerDay: 2500,
930
+ heldSites: [{
931
+ siteId: "s_02",
932
+ hold: "size_limit"
933
+ }]
934
+ },
935
+ meta: {
936
+ requestId: "req_01",
937
+ surface: "partner",
938
+ version: "1.0"
939
+ }
940
+ }
941
+ }
942
+ }
943
+ }),
816
944
  listAvailableSites: defineHttpOperation({
817
945
  ...gscdumpV1OperationRoute("partner.users.sites.available.list"),
818
946
  visibility: "public",
@@ -5281,6 +5409,7 @@ function createGscdumpV1Protocol() {
5281
5409
  indexNowSubmissionResponse,
5282
5410
  indexNowSubmissionReceiptsResponse,
5283
5411
  lifecycleResponse,
5412
+ userEntitlementsResponse,
5284
5413
  registerSiteRequest,
5285
5414
  sitemapChangesQuery,
5286
5415
  sitemapChangesResponse,
@@ -21,6 +21,11 @@ export declare const GSCDUMP_V1_ROUTE_CATALOG: {
21
21
  readonly method: "GET";
22
22
  readonly template: "/users/{userId}/lifecycle";
23
23
  };
24
+ readonly 'partner.users.entitlements.get': {
25
+ readonly surface: "partner";
26
+ readonly method: "GET";
27
+ readonly template: "/users/{userId}/entitlements";
28
+ };
24
29
  readonly 'partner.users.sites.available.list': {
25
30
  readonly surface: "partner";
26
31
  readonly method: "GET";
@@ -8,6 +8,11 @@ const GSCDUMP_V1_ROUTE_CATALOG = {
8
8
  method: "GET",
9
9
  template: "/users/{userId}/lifecycle"
10
10
  },
11
+ "partner.users.entitlements.get": {
12
+ surface: "partner",
13
+ method: "GET",
14
+ template: "/users/{userId}/entitlements"
15
+ },
11
16
  "partner.users.sites.available.list": {
12
17
  surface: "partner",
13
18
  method: "GET",
@@ -4,5 +4,5 @@ export declare const WEBHOOK_EVENT_HEADER = "X-GSCDump-Event";
4
4
  export declare const WEBHOOK_DELIVERY_HEADER = "X-GSCDump-Delivery";
5
5
  export declare const WEBHOOK_CONTRACT_VERSION_HEADER = "X-GSCDump-Contract-Version";
6
6
  export declare const WEBHOOK_TIMESTAMP_HEADER = "X-GSCDump-Timestamp";
7
- export declare const CANONICAL_WEBHOOK_EVENTS: readonly ["user.lifecycle.changed", "site.lifecycle.changed", "site.analytics.ready", "site.indexing.ready", "site.auth.failed", "job.failed"];
8
- export declare const VALID_WEBHOOK_EVENTS: readonly ["user.lifecycle.changed", "site.lifecycle.changed", "site.analytics.ready", "site.indexing.ready", "site.auth.failed", "job.failed"];
7
+ export declare const CANONICAL_WEBHOOK_EVENTS: readonly ["user.lifecycle.changed", "site.lifecycle.changed", "site.analytics.ready", "site.indexing.ready", "site.auth.failed", "job.failed", "user.allowance.notice"];
8
+ export declare const VALID_WEBHOOK_EVENTS: readonly ["user.lifecycle.changed", "site.lifecycle.changed", "site.analytics.ready", "site.indexing.ready", "site.auth.failed", "job.failed", "user.allowance.notice"];
@@ -10,7 +10,8 @@ const CANONICAL_WEBHOOK_EVENTS = [
10
10
  "site.analytics.ready",
11
11
  "site.indexing.ready",
12
12
  "site.auth.failed",
13
- "job.failed"
13
+ "job.failed",
14
+ "user.allowance.notice"
14
15
  ];
15
16
  const VALID_WEBHOOK_EVENTS = CANONICAL_WEBHOOK_EVENTS;
16
17
  export { CANONICAL_WEBHOOK_EVENTS, VALID_WEBHOOK_EVENTS, WEBHOOK_CONTRACT_VERSION, WEBHOOK_CONTRACT_VERSION_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_TIMESTAMP_HEADER };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gscdump/contracts",
3
3
  "type": "module",
4
- "version": "4.6.0",
4
+ "version": "4.7.0",
5
5
  "description": "Shared gscdump.com API, webhook, realtime, and lifecycle contracts.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",