Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 28 additions & 4 deletions src/resource_clients/actor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -968,6 +968,8 @@ interface CommonActorPricingInfo {
notifiedAboutFutureChangeAt?: Date;
notifiedAboutChangeAt?: Date;
reasonForChange?: string;
isPriceChangeNotificationSuppressed?: boolean;
forceContainsSignificantPriceChange?: boolean;
}

/**
Expand Down Expand Up @@ -996,17 +998,39 @@ export interface FlatPricePerMonthActorPricingInfo extends CommonActorPricingInf
export interface PricePerDatasetItemActorPricingInfo extends CommonActorPricingInfo {
pricingModel: 'PRICE_PER_DATASET_ITEM';
/** Name of the unit that is being charged */
unitName?: string;
pricePerUnitUsd: number;
unitName: string;
/** Flat price per unit in USD. Mutually exclusive with `tieredPricing`. */
pricePerUnitUsd?: number;
/** Tier-keyed pricing. Mutually exclusive with `pricePerUnitUsd`. */
tieredPricing?: Record<string, TieredPricingPerDatasetItemEntry>;
}

/**
* Price per dataset item for a single pricing tier.
*/
export interface TieredPricingPerDatasetItemEntry {
tieredPricePerUnitUsd: number;
}

/**
* Definition of a chargeable event for pay-per-event Actors.
*/
export interface ActorChargeEvent {
eventPriceUsd: number;
/** Flat price per event in USD. Mutually exclusive with `eventTieredPricingUsd`. */
eventPriceUsd?: number;
/** Tier-keyed pricing. Mutually exclusive with `eventPriceUsd`. */
eventTieredPricingUsd?: Record<string, TieredPricingPerEventEntry>;
eventTitle: string;
eventDescription?: string;
eventDescription: string;
isPrimaryEvent?: boolean;
isOneTimeEvent?: boolean;
}

/**
* Price per event for a single pricing tier.
*/
export interface TieredPricingPerEventEntry {
tieredEventPriceUsd: number;
}

/**
Expand Down
33 changes: 33 additions & 0 deletions test/pricing_types.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import type { ActorChargeEvent, PricePerDatasetItemActorPricingInfo } from 'apify-client';
import { describe, expect, test } from 'vitest';

describe('Actor pricing types', () => {
test('represent tiered pricing without a flat price', () => {
const event: ActorChargeEvent = {
eventTitle: 'Processed item',
eventDescription: 'An item was processed.',
eventTieredPricingUsd: {
STARTER: { tieredEventPriceUsd: 0.01 },
},
Comment on lines +9 to +11

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the tiered pricing, do we need all the tiers (STARTER, SILVER...) to be populated, or can we have a partial response like this?

isPrimaryEvent: true,
isOneTimeEvent: false,
};
const datasetItemPricing: PricePerDatasetItemActorPricingInfo = {
pricingModel: 'PRICE_PER_DATASET_ITEM',
unitName: 'result',
tieredPricing: {
STARTER: { tieredPricePerUnitUsd: 0.02 },
},
apifyMarginPercentage: 0.2,
createdAt: new Date(),
startedAt: new Date(),
isPriceChangeNotificationSuppressed: true,
forceContainsSignificantPriceChange: false,
};

expect(event.eventPriceUsd).toBeUndefined();
expect(datasetItemPricing.pricePerUnitUsd).toBeUndefined();
expect(event.eventTieredPricingUsd?.STARTER.tieredEventPriceUsd).toBe(0.01);
expect(datasetItemPricing.tieredPricing?.STARTER.tieredPricePerUnitUsd).toBe(0.02);
});
});
Loading