diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3c7a6458..2d42c78b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -18,7 +18,7 @@ jobs:
lint:
timeout-minutes: 10
name: lint
- runs-on: ${{ github.repository == 'stainless-sdks/onlyfansapi-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
+ runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -26,7 +26,7 @@ jobs:
- name: Set up Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
- node-version: '20'
+ node-version: '24'
- name: Set up pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0
@@ -42,7 +42,7 @@ jobs:
build:
timeout-minutes: 5
name: build
- runs-on: ${{ github.repository == 'stainless-sdks/onlyfansapi-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
+ runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
permissions:
contents: read
@@ -53,7 +53,7 @@ jobs:
- name: Set up Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
- node-version: '20'
+ node-version: '24'
- name: Set up pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0
@@ -87,7 +87,7 @@ jobs:
test:
timeout-minutes: 10
name: test
- runs-on: ${{ github.repository == 'stainless-sdks/onlyfansapi-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
+ runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -95,7 +95,7 @@ jobs:
- name: Set up Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
- node-version: '20'
+ node-version: '24'
- name: Set up pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0
diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml
index 36638c43..9946a640 100644
--- a/.github/workflows/publish-npm.yml
+++ b/.github/workflows/publish-npm.yml
@@ -19,7 +19,7 @@ jobs:
- name: Set up Node
uses: actions/setup-node@3235b876344d2a9aa001b8d1453c930bba69e610 # v3.9.1
with:
- node-version: '20'
+ node-version: '24'
- name: Set up pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 2be9c43c..0ee8c012 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.2.0"
+ ".": "0.3.0"
}
diff --git a/.stats.yml b/.stats.yml
index 46252709..d44c6514 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 266
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/onlyfansapi/onlyfansapi-b9b67bf32f2b519e3230760d49e20c30e66107a6991f1a1f1a108f6c578c2fde.yml
-openapi_spec_hash: da475361c28b843ddd1b45bbea333762
-config_hash: a522aab696c4535f715ae59ddfe8222f
+configured_endpoints: 265
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/onlyfansapi/onlyfansapi-136aa659b2d54ff3c25f6b35164a84db20dba3a7b513bf2c72544bbdb13ce6c1.yml
+openapi_spec_hash: 94a889e758a4baf8e3b699a6cbe17d01
+config_hash: 397c91e15c0024f8b5bbed9b82c2348c
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fbadecd7..a85d2758 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,314 @@
# Changelog
+## 0.3.0 (2026-09-08)
+
+Full Changelog: [v0.2.0...v0.3.0](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/compare/v0.2.0...v0.3.0)
+
+### Features
+
+* **api:** api update ([bcb4333](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/bcb433306b894fa441069b82ada209f8b69cdaf0))
+* **api:** api update ([aba20a2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/aba20a2a3bb3ee1c0042d788444fd028177bbad2))
+* **api:** api update ([4f6a4b1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4f6a4b1123fbd30d6dea9fe29d8097c66dbd56b9))
+* **api:** api update ([e6a3744](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e6a3744a49c67c07a13b754da25f966dd575fb8f))
+* **api:** api update ([bea549c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/bea549cdb8bbc70102d7a003a34d7531267cf977))
+* **api:** api update ([5fcccc3](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5fcccc3983bc22bbed85d777bd3e531d001e158a))
+* **api:** api update ([b6faa83](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b6faa832a3256aff91e88d97f7f4a84010af5e8b))
+* **api:** api update ([42e360e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/42e360e01891aa83c6094b5818a20d47661c9c5b))
+* **api:** api update ([86dcb4a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/86dcb4aae6c967c4f3aed9042601d443afd669d2))
+* **api:** api update ([54d9204](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/54d9204d9e9b9f7dd0df69b1eefb7ffe9fd115c3))
+* **api:** api update ([26bfd2f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/26bfd2f4fa3ec0dac275ad7118b76c23e0ed6795))
+* **api:** api update ([d3a1a78](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/d3a1a78dbe6800f3c034a2d8cce76b5ac5f087b1))
+* **api:** api update ([4ee500f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4ee500fa05f6b57589247227e377be2215b1665b))
+* **api:** api update ([a6414f2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a6414f263b35e28e282fcf7224441f0466c91a2d))
+* **api:** api update ([e3b66fe](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e3b66fe32d50aea4cb31cf3c38366b2b73800057))
+* **api:** api update ([4506117](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4506117f2093186adb059dff68bd87ea28a83d16))
+* **api:** api update ([6138edb](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/6138edbfd3ca4b4aa4849c256e25c822bb49d096))
+* **api:** api update ([83e3d6c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/83e3d6cfeca9fa359cc23e382a3b64246bda8850))
+* **api:** api update ([4e91ca8](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4e91ca8fa4a834aafc43098531fba13d3674c034))
+* **api:** api update ([aa4aa54](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/aa4aa540d93c20e31b576057e1e581310c3cfa69))
+* **api:** api update ([4fbb859](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4fbb859afb5187affb78d8da08e0e80ac9b88f08))
+* **api:** api update ([d038dcc](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/d038dccb3bdfc62607294da36196ecb7ed63a345))
+* **api:** api update ([32a2de4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/32a2de499831f648826e8beddc398476bba76b38))
+* **api:** api update ([60a12b7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/60a12b7b75674ce51d75070e1099a5985ad0301f))
+* **api:** api update ([36aef4d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/36aef4d8ffb785813184c5c13ead1c0959ef7c46))
+* **api:** api update ([2c9a767](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2c9a767c308cefb16cdd1faabdc5732962dddee3))
+* **api:** api update ([87db0e8](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/87db0e87c1940c5a141ae30927935909075e2cc6))
+* **api:** api update ([8824606](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8824606bff272556da8254269911652611c6494f))
+* **api:** api update ([e123144](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e1231449cce515de8d5492124cfa72979810b298))
+* **api:** api update ([61713fa](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/61713fa30b530675bc926f819d2b9d2ed3e2b62b))
+* **api:** api update ([3844bbe](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3844bbe2ec05baae1dec0c56eb629ac7a5cf90f2))
+* **api:** api update ([970f3f4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/970f3f4d95b07dee453b6fa18a18cb5757f87d4e))
+* **api:** api update ([0b6215c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/0b6215cc98b68b7f505624c951cb03f99b8257ef))
+* **api:** api update ([c2841f3](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c2841f3ce1e2abfa30b7e781222c63b713693606))
+* **api:** api update ([f9a031e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f9a031ebc6dca5941112d5fb26aadea0322d8596))
+* **api:** api update ([e2dbf11](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e2dbf119a2686aa6eb23895b1b978cc17eb3d29a))
+* **api:** api update ([005cae9](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/005cae94d28d256cd957ef3814b8cf780465977c))
+* **api:** api update ([9f58d7d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/9f58d7d2f16795ea0c8032507a888b1820aba184))
+* **api:** api update ([c4ae3cb](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c4ae3cb4ef846f5424a4b561a18273a39103e8d0))
+* **api:** api update ([a574d06](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a574d06c31db307fd5edf3e80eb6a77dc91ac7b1))
+* **api:** api update ([f889ebc](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f889ebc0653e173b528e13b32b7fcbb96bf83740))
+* **api:** api update ([f2a8182](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f2a81829408791c7ffa3a2ad47aa78dd3d67b280))
+* **api:** api update ([493f801](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/493f801f4b21bd5ee26815332f97c7f93abfbba8))
+* **api:** api update ([a7d36e3](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a7d36e3f72d5f916ed4521bdd378f41db8f384c4))
+* **api:** api update ([905eab1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/905eab1e668773fa567ce2d8cf8a83fc88841115))
+* **api:** api update ([a641d4f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a641d4f8fcaa58b4b6a7881042350c4ea21c6c78))
+* **api:** api update ([44b45d6](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/44b45d61afec8819406fdd26cc993bc4092f91a8))
+* **api:** api update ([c68358e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c68358e391ce5e376e2cbc085657bba13fbd7aec))
+* **api:** api update ([58f7b05](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/58f7b05ddf001c0edf8cb69e384f39fe6bb38a46))
+* **api:** api update ([7b11647](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/7b11647efd4ba6b17397a296dcd6bb96ce6fa4df))
+* **api:** api update ([b6cf87a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b6cf87a37941f0680d384189070b5644a6b65b0c))
+* **api:** api update ([8f8fe16](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8f8fe16deb2de4e410c4979ff5bd248f9deab6df))
+* **api:** api update ([f00ecc3](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f00ecc30014ab7a63a181befc844c94237501f41))
+* **api:** api update ([9d1bb6a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/9d1bb6ad180f82f8a5c66db91aeabb1ca2a553a7))
+* **api:** api update ([3d296db](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3d296dbdabc88d9cbc48cc7bf51f0f21862cc248))
+* **api:** api update ([a5222ce](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a5222cef4658f92d1ae7d43187ca41125be95d3c))
+* **api:** api update ([192f58c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/192f58c964898b8fb203ba707c3df8185274987c))
+* **api:** api update ([62a9f53](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/62a9f53e829445b3b556bc7293decbd358917437))
+* **api:** api update ([fb5c3df](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/fb5c3dfd7fa7624e9374447708c5d5e6855727b6))
+* **api:** api update ([69a949e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/69a949ec387188986067a1bdf170c493ff28c726))
+* **api:** api update ([337f7a2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/337f7a2125ea799932b78e9ed9ae1ccada65c579))
+* **api:** api update ([2cbabdb](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2cbabdb14ea2688c82f44997f135f0a72dc2d16e))
+* **api:** api update ([4c7a93f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4c7a93f8c606efc8af1526c6f48cb7c89c36be2e))
+* **api:** api update ([9ce2aa6](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/9ce2aa6f721ac0d29e9df40842d73b31e79ff1dd))
+* **api:** api update ([5cfd594](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5cfd59461d7c5dab03b9494ae7fed050d32245af))
+* **api:** api update ([fff8441](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/fff844158588c4f46f2852dde860146665c9fc3a))
+* **api:** api update ([1d9a0c5](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/1d9a0c5912229874240e0d908027166e3ecaaede))
+* **api:** api update ([38520d5](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/38520d5a53aee50ab5e63fd681dbe41f60975e32))
+* **api:** api update ([5aa4052](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5aa40521b3ce9da183fd4a085e212a9e9ceeb9dc))
+* **api:** api update ([2d64f1c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2d64f1c452749123bedd72bfa483ddc8581040a7))
+* **api:** api update ([b171312](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b1713128fa95a05720ed334d86b6857879d24e11))
+* **api:** api update ([417ad1b](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/417ad1be06dca832aaa46e36381283a7aafb0ee5))
+* **api:** api update ([5b06658](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5b0665890241f975296e598ba372798e2503c50e))
+* **api:** api update ([272c179](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/272c179ea75ee89878cdcb266cdab091da482665))
+* **api:** api update ([ec2634a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ec2634a995a791f6ccddc7b67f7d4c6d1bb8f7e6))
+* **api:** api update ([3e0a345](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3e0a345062bac966959f3b7721f0406ff69fdab5))
+* **api:** api update ([31ed287](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/31ed2877f1d4402b4754a182aa5879aab7bd385a))
+* **api:** api update ([689d233](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/689d233e300522110065ec175be643ca2ee4e8e0))
+* **api:** api update ([c750efd](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c750efdb9a5de976d683ae46f4eb413c99b93418))
+* **api:** api update ([bbd60e4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/bbd60e4b43b5ddb54f016d77f82257c518d5ebd6))
+* **api:** api update ([147758e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/147758e76eab39656b84c04d4ae34e603c5df1df))
+* **api:** api update ([a0e836d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a0e836d4ce3d6f281480a96f58fca44fd284396c))
+* **api:** api update ([89c5e42](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/89c5e42cef884a79b12f94e46ef57db7fbc0a7ff))
+* **api:** api update ([3afd696](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3afd6962de92809cc874cc9d7063a582cadeb249))
+* **api:** api update ([ce629ee](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ce629ee6c9301c4f995ecc6f759ec78d6bf0cb4b))
+* **api:** api update ([b788b3d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b788b3da30bf45bebfae380ea42df969e60ac239))
+* **api:** api update ([9f26b20](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/9f26b20b4f33f4614f5f1d93be7af8d73db1aa19))
+* **api:** api update ([deed586](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/deed586cf07f491301b374e8e13ee7c2eb72c3c6))
+* **api:** api update ([86b81e9](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/86b81e920e43c914adbf33ef58cfd89d27a8f340))
+* **api:** api update ([af3ad4c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/af3ad4c1ebacff3450d4f5736a8ff8d9ae5bc00f))
+* **api:** api update ([56b70f4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/56b70f412fbc16fd91626258a24337328a2424a9))
+* **api:** api update ([e5bdf55](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e5bdf55f24d1119c700471c6c1a86e1796d4cb99))
+* **api:** api update ([580fdf8](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/580fdf8dc64588806a999891dd725c2a85b294d4))
+* **api:** api update ([fa1a596](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/fa1a596d5423fdb21a8d8ed08f7a3c0fe2fe9e5b))
+* **api:** api update ([782dc0d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/782dc0dbbf587cd1082c4ce1a6e0d3f64bb33e17))
+* **api:** api update ([024e41a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/024e41a0be2fce20ae5c917351a0bb588c7180d5))
+* **api:** api update ([0ef2e1a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/0ef2e1a40a856f93967721e3d6748bb778c83312))
+* **api:** api update ([5192b8b](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5192b8b5ecd9af3a7cc6fea97f9dd2c0f069a505))
+* **api:** api update ([2ef1c9c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2ef1c9ca97d00f839d2b618e6d79c1b2a95b059d))
+* **api:** api update ([cc79dff](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/cc79dff2e07c30103bf172515605cc1f8dfd1ec2))
+* **api:** api update ([495397f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/495397f34f312169309ee21c6ceefe6ef59e14e3))
+* **api:** api update ([e61ad5f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e61ad5f0e14e7991085277d49c3e875959b222d7))
+* **api:** api update ([2e8e9b1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2e8e9b181be5c729cc18568fec26ed15d1e6f99f))
+* **api:** api update ([270dc0a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/270dc0a17050b01c3be1bf3176bb2159fc586d9b))
+* **api:** api update ([37abcf7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/37abcf7ea60372babdf15da9e3ec8ff89f9645ba))
+* **api:** api update ([6f6a22f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/6f6a22f8841b6103b5e64218f87ba89928cd8c08))
+* **api:** api update ([56e07ec](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/56e07ec66b6dd86d20bf617e7d10a84a584863b2))
+* **api:** api update ([49ae0d6](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/49ae0d642eed9ce0c95ab8c8ed5e537996ae348b))
+* **api:** api update ([88f35b7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/88f35b75602f27ba7892484e974ae39195226048))
+* **api:** api update ([3140ed0](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3140ed05e163af0634af8f1a7c9dbc389467e0b7))
+* **api:** api update ([cd234d7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/cd234d799b97aed2688b2b13f137f7322b68e2f0))
+* **api:** api update ([d09e999](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/d09e99944b3226690bdf6b54fed70de72f04bd23))
+* **api:** api update ([b65da15](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b65da15c20c990c6fb8a4d5a925ea61ccae6c042))
+* **api:** api update ([f93f8b1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f93f8b18a19bf2eaf9f64f27105a1a75df13d008))
+* **api:** api update ([8624c42](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8624c42cc31061225991977ef151fdd9b1bf7085))
+* **api:** api update ([8969b09](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8969b09d7f36c441be1a0c117c375822ed957a0a))
+* **api:** api update ([60f7448](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/60f7448ee6c34b836224b7d1ee8041bcd0e8e3cd))
+* **api:** api update ([08ca129](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/08ca12910ff21d6af495d29ee1fdce75acefdcda))
+* **api:** api update ([e9b60e6](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e9b60e6b381f666d18746007c2dd51550611e6a6))
+* **api:** api update ([aa0d198](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/aa0d19873f9c3a6b39ced1813d89e3919b743efa))
+* **api:** api update ([2a32b42](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2a32b4252053b9cd5ac680dd0296ed5732c46eea))
+* **api:** api update ([3ec4e50](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3ec4e503beaac3988ff69f19e283fbd69f6a8d6d))
+* **api:** api update ([869dee7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/869dee73823e8a6076f090742b8f6827dfc591d2))
+* **api:** api update ([987d63e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/987d63e4908c296387cd03b34ccd13fe8677d1fc))
+* **api:** api update ([6fc5b34](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/6fc5b34b7d825ddbfd22b842a413fd895b8393f6))
+* **api:** api update ([aeb9cd7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/aeb9cd7289ea350aed75a424f338fa7bc4dc04ab))
+* **api:** api update ([2c214c9](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2c214c977e81b568453bedfca9e20ba71eded732))
+* **api:** api update ([46bb310](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/46bb3108ad58222fabcfd3534a76b890c4bbad49))
+* **api:** api update ([d6863b6](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/d6863b6b734fab1c467e555b018920fac0076903))
+* **api:** api update ([d378396](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/d378396db52989a50573241f9a856b0d973b3376))
+* **api:** api update ([27db2cf](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/27db2cf5729dbb3765e0afcb0175f5e6a1dc76de))
+* **api:** api update ([61fcffa](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/61fcffa48a2eaf0bfa164627b046647462480e5c))
+* **api:** api update ([873ac7b](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/873ac7b51bb7b008c5a97394f53caee5d5ec05d4))
+* **api:** api update ([f76a4bd](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f76a4bd2540fb40cb5d7e4db915d1872d97c9db8))
+* **api:** api update ([8f2145c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8f2145c25ae5cd41c17329a14316beb4eca2976b))
+* **api:** api update ([60fc089](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/60fc0896052523b9940304ab45e2715a77792075))
+* **api:** api update ([5847a3c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5847a3c64f544bdecb9d71e842d159845733eb9e))
+* **api:** api update ([56ece82](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/56ece823f9f9910690d12902501dd5b6dde76cfb))
+* **api:** api update ([8bce9f2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8bce9f27a81899c50c0b58b6c561fc365ad0ae64))
+* **api:** api update ([a641005](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a6410058d0a2b910ba4a5c164e587d880ef77847))
+* **api:** api update ([00d94b2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/00d94b24bb5fc7293f037723ed5cc24f729e6f0f))
+* **api:** api update ([a4d1f39](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a4d1f392afd9e3a2e3d642d7c1efcf0e0d5b3597))
+* **api:** api update ([44bece2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/44bece23d2e3864b19f6ef18f33357dba26bd391))
+* **api:** api update ([8d91b47](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8d91b47ac5079a7a3b6d4335fdd136cd8b37b465))
+* **api:** api update ([51c1702](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/51c1702a88ef83bf91f55c6233a08a733fb99182))
+* **api:** api update ([1a1c5d2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/1a1c5d2895fccf54710292faf345c839efc21910))
+* **api:** api update ([0729449](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/07294490fa8a639ae9cd7afae4e99cc6ad73716c))
+* **api:** api update ([1c8ed61](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/1c8ed614ee0a88bbaa8fd04da0c83be0b9e6086f))
+* **api:** api update ([09a7095](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/09a70956c32f0f132d7efc68eb3aa42719035ea7))
+* **api:** api update ([6110f07](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/6110f07a409b9fb1ea72f6947484295a4b6ec1cb))
+* **api:** api update ([ccab2a9](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ccab2a9e458023e5a5455d0e51a0f2792a4b7d6a))
+* **api:** api update ([c667de1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c667de1845506fe11beec46e6cea9acf9923d9e6))
+* **api:** api update ([ca3fa7d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ca3fa7ddbcd49c8605d373b58ba67b8274e15d12))
+* **api:** api update ([f69e7eb](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f69e7eb681f044222c5782ef01a64602fdf6c6ab))
+* **api:** api update ([ce1a135](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ce1a135817d04e5c3117460575c6020b04abffb1))
+* **api:** api update ([683e0b1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/683e0b105d4102f1bd666ae01daed62ac7c8790b))
+* **api:** api update ([fbf7e77](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/fbf7e77f0d648207ee5fc2d9bb71aee2b62a02e2))
+* **api:** api update ([838cd76](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/838cd7643d9b8deacf7791e53832be01e406b8b2))
+* **api:** api update ([b6c0885](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b6c0885f19707df9d98c54b6f373e6df0fe4a798))
+* **api:** api update ([de18ad7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/de18ad7686fff09d042877f87f0b6916ed9f850d))
+* **api:** api update ([1860995](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/186099583e86b9c51d6816952ec7b5e587868857))
+* **api:** api update ([057e021](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/057e021b08ec70e5fb1a0dc1c90e1ee893d9bdd9))
+* **api:** api update ([f219bef](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f219bef63b654d615304ee680f4fad139fbc049a))
+* **api:** api update ([9eb0b72](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/9eb0b72e2dbd58b45ff9fb8dcc584d1c81df100f))
+* **api:** api update ([2e87746](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2e87746284c269b0315ccea719df1c52acf9e2ee))
+* **api:** api update ([a933eb6](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a933eb65500d19109bedc378d3f3c1798bc27327))
+* **api:** api update ([78a6086](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/78a6086fd29d9f7f05a2aceb3398c98cd088662f))
+* **api:** api update ([6cfc271](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/6cfc2713a3bc70d590ae9108034fb0ef0cf91efd))
+* **api:** api update ([9fe6eae](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/9fe6eaeca808b011253e00774430bc183c67f9e8))
+* **api:** api update ([5ddb40a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5ddb40a3dbd792ee33ab4e16d3bfa71459fdb0c0))
+* **api:** api update ([4760ed2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4760ed26064c793f74b4bf703af45d7fd29c87b1))
+* **api:** api update ([97fa1f7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/97fa1f7abc78795df6a97f76803ea98e0464f73a))
+* **api:** api update ([f64165c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f64165c927f64b9a71efa777cc9db3017b8be03b))
+* **api:** api update ([97c4d97](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/97c4d977ffa0de991bb420ab5227e0de2ce608f8))
+* **api:** api update ([148c5be](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/148c5be9ecaf607a045aaa8de69b445b32b42579))
+* **api:** api update ([66e3ff6](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/66e3ff6099d06788a97beb18b25f81ace59f621a))
+* **api:** api update ([e4b6686](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e4b66860a66a2041ffbf5ea8a389e3f1381c812e))
+* **api:** api update ([3038a94](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3038a9435ec5a252da6402c6086a48de0f2f9e8a))
+* **api:** api update ([8b69c42](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8b69c4237e6944a1a70dab3bbdd860084565d8b7))
+* **api:** api update ([2afbb35](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2afbb351ea9dc6775eaf9d153287c5f2c0f3db8f))
+* **api:** api update ([56e0cc3](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/56e0cc3c3854b1d5c5b6c5bc4a7efb1374778459))
+* **api:** api update ([3238886](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/32388862eff60330248c922e532ab55ad96f56fb))
+* **api:** api update ([23a3de0](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/23a3de0f20ebb26e5f465052efa8b6150f23eee1))
+* **api:** api update ([2644339](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/264433997b883b834866128e11a1c82ccd34e029))
+* **api:** api update ([d9d3274](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/d9d3274e6e95514d06931ce67e32857537395713))
+* **api:** api update ([955f228](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/955f228cb735459ac88dc456e0c3cc373875eba4))
+* **api:** api update ([8674431](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8674431ec34f4908501f16a06ca18e3578b62bb0))
+* **api:** api update ([2410b93](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2410b936bb45023df611d5d8413e00f1ee48f8c0))
+* **api:** api update ([abf8dba](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/abf8dba90fb21497883acf3603107a8eaec6181a))
+* **api:** api update ([98972c7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/98972c77e930a545b38bd36266cf4f698d6c54ea))
+* **api:** api update ([a613f4c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a613f4c7ef30e0ae4ba0535b69b09ddb1f9bcfbd))
+* **api:** api update ([c4e478e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c4e478e44edaa13dae27abc3d12c31efa90cee4d))
+* **api:** api update ([95f1dfb](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/95f1dfbb8dc2d031124c0cdd4a88f9b0b03fc7bf))
+* **api:** api update ([778f909](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/778f909697924ee12cde9d3e077b06d50be2e6c2))
+* **api:** api update ([8eb5a2c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8eb5a2cebf48c593a0bcb678f932079c9a21b40a))
+* **api:** api update ([a235e0f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a235e0f9f69796efa1dae6706a0aab68691d5e82))
+* **api:** api update ([f9a5724](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f9a5724970299d7be7ac5ed5e9f006413deb455f))
+* **api:** api update ([ee2c0d7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ee2c0d776f70e34442181bb355bccda787a756b9))
+* **api:** api update ([6b4c186](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/6b4c186dec4378e46c32c7f27948f5699c6a80fd))
+* **api:** api update ([86f8ba8](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/86f8ba812c11263ecd6c6e207ea255fcbc9d0ff0))
+* **api:** api update ([3b4c759](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3b4c759f314a0f6ca3dc79a0e7880db08bf0b02b))
+* **api:** api update ([316d824](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/316d82489708356f77ff704c63fd5130d9f8254e))
+* **api:** api update ([58d1f67](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/58d1f67f10575b1d9bc3fa50ae9dbb03c38ed255))
+* **api:** api update ([c55e299](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c55e2999f032401ef6cba186e6cfd05153b61e6a))
+* **api:** api update ([8829b3d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8829b3d3a3539a166c1cb62d1c350736121cf57c))
+* **api:** api update ([37d10c0](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/37d10c068743a3535f8677cd0903ba3fb74f1d29))
+* **api:** api update ([c4bd5b1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c4bd5b1fb739e27c9f3fc9fb56c023961f203598))
+* **api:** api update ([b7c1073](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b7c10733fedd5451641f86bb5110b4e961fc0d72))
+* **api:** api update ([4977171](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/497717178c8f21ac5d53cd649935e386943c7001))
+* **api:** api update ([c2716dd](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c2716dd0d249e110eda8fceacb15ecf62226c6a0))
+* **api:** api update ([e99b7a5](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e99b7a5e42bf4401462d1857df9c7dd2818259c6))
+* **api:** api update ([d40bc24](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/d40bc248e2007524825da5e11411937106e84ae5))
+* **api:** api update ([ea37ee1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ea37ee11911649f40b998d54dd4a8b7ac584eef5))
+* **api:** api update ([38a5647](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/38a56478411ff2974e676c6d1ca82d16eff698a0))
+* **api:** api update ([f7ee288](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f7ee2880456193addd601b5c5688cdba838bc66e))
+* **api:** api update ([20e3d06](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/20e3d06c1ace9398301ba5453afe10f7304f524e))
+* **api:** api update ([8e3cd6f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8e3cd6f63633c2099203013eab8adfd00993b510))
+* **api:** api update ([16bb725](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/16bb72544eedd4aea207360fbafaef6b2a022984))
+* **api:** api update ([7e379ae](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/7e379ae329d208fb7dec30a45a90575e8b2556bb))
+* **api:** api update ([bf50100](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/bf50100ec625d9b035aa16871e9281b13cc2e037))
+* **api:** api update ([880fdc1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/880fdc106d2ffecd7d9167d24279707fbe4b141e))
+* **api:** api update ([9897ca1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/9897ca1b62bc83e7275c43f960682253265cfd21))
+* **api:** api update ([203522d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/203522d703c42cdb8c03e1e2e134b1fb0b36790e))
+* **api:** api update ([c85defa](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c85defafcf6fcb645823f6af12b1df6dc3231f51))
+* **api:** api update ([37abea6](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/37abea676a67e8b07ecdee2ae967bbbc57e328ec))
+* **api:** api update ([dc7480e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/dc7480e8cef2e141df3f6bbc1aae1d3da10d7b8c))
+* **api:** api update ([9aae0b0](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/9aae0b0ce7271c4d0f37d9e42457cbed86552a17))
+* **api:** api update ([f3b60cf](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f3b60cf920fcdb2779315eaa49a94b3030b8bbb4))
+* **api:** api update ([d5a171e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/d5a171e03d462137a5b217891711ff938e5f1700))
+* **api:** api update ([85c1517](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/85c1517138e5dc37a56f405d31363d9b2a9dee89))
+* **api:** api update ([8bed78d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8bed78da3c4bd1f286aa441b65576dafbd985ae6))
+* **api:** api update ([e928819](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e9288199b8a3ea07445850bfb8ab109a5611f2ff))
+* **api:** api update ([e8f55e4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e8f55e499778343f80fc11b423598ea1148f0881))
+* **api:** api update ([b1d6f19](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b1d6f198688ba2d1b5aef8d12b65376ea431178f))
+* **api:** api update ([0e64ad9](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/0e64ad9145eab434d84cda92853ad4812e94f661))
+* **api:** api update ([5f32ddc](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5f32ddcd443c1de9485003e8a1e9661781903bee))
+* **api:** api update ([a2eea78](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a2eea789ebbd99a4e4869d3abb5a227e4f8d6629))
+* **api:** api update ([212f078](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/212f078a3fffc70ede17b3e4de23903d14178086))
+* **api:** api update ([41b02ef](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/41b02efb70098a498ae0639a9b75e5f5450f81f0))
+* **api:** api update ([2db03f5](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2db03f51d66f3af287a0a20fae080b38474ac952))
+* **api:** api update ([e4dd2dd](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/e4dd2ddb74ae17f1abdf3baea48da5ff680f3d40))
+* **api:** api update ([0073ccc](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/0073ccce57bb70a2a33ac9f25eaa3f02c5947143))
+* **api:** api update ([93b27d8](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/93b27d8d781b405d7bed40880c4552423dd2de9a))
+* **api:** api update ([c4048c4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c4048c43712afebfbf52d6afa8ff0d9f61fa65eb))
+* **api:** api update ([07e7142](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/07e7142105072534c10d8a6f293ddb1540200039))
+* **api:** api update ([14b9f56](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/14b9f56d6162a62e5555d6727b9bac9a75aab24a))
+* **api:** api update ([891a201](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/891a20154858e332f6965a897a11c1e3eb60d46d))
+* **api:** api update ([980ff36](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/980ff369e0ef08500ae478ded5a232da7f38b5ed))
+* **api:** api update ([b25bee6](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b25bee6f69bce712a4937386383ccec055309f39))
+* **api:** api update ([5a77418](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5a77418eb4f2058adb334944d241e7b91f3711c7))
+* **api:** api update ([4a111d4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4a111d4f097391fdc6dc920ba1606c0d8621708a))
+* **api:** api update ([a43dc12](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a43dc1250b1a5933fa4af5a965447b93fc14e793))
+* **api:** api update ([f0b9fb8](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f0b9fb8ad5624c01e220df4381cc37a1213a1692))
+* **api:** api update ([ca21354](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ca2135486d6ca505afe5c49142f29adc7e227fa3))
+* **api:** api update ([01c6418](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/01c6418872a4dc0595e42f781d03386a82bff9be))
+* **api:** api update ([057180b](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/057180b905228cbb29c753be8ecac5683c600dd0))
+* **api:** api update ([a48a7e2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a48a7e23be200f80b19c72e4b2c82f974cec1117))
+* **api:** api update ([f9977f2](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/f9977f213c80713606e9cfc600e15c7383e4644f))
+* **api:** api update ([aee1709](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/aee1709a9d39bd78be1db9aaaf0e3a2497a45f83))
+* **api:** api update ([66e39a4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/66e39a42bb0d0c4bb70d0450f0cbff98cc45fe5c))
+* **api:** api update ([9ca88c4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/9ca88c44a83eb4ab893c19c433044176fcc479d1))
+* **api:** api update ([59cc52a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/59cc52af2ecf36763f5d1f06c7bba9a55519141e))
+* **api:** api update ([bc7b763](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/bc7b763675ba43a49f8cab78a30255866c35e4b2))
+* **api:** api update ([710d78e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/710d78e95405788e056f3a338a2d8fd772a26eee))
+* **api:** api update ([3bdb33f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3bdb33f46ecd9a661a99ffbe1eeb4ce7ddfb57cb))
+* **api:** api update ([0d0c1dc](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/0d0c1dcf0720c6f4ef56779a1c4e6f2fad1a33c3))
+* **api:** api update ([8d3c93c](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8d3c93c186cb7a11fd84226957137a7505e045d7))
+* **api:** api update ([0017f6f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/0017f6f209548fe6a8ead615b86b913a6df7baf1))
+* **api:** api update ([1f119f5](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/1f119f566c1f540f8a466d371fb6956ceecce30a))
+* **api:** api update ([a79343d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a79343d9a35f5a31e3d29320e1588e1d3c529f10))
+* **api:** api update ([8ebf680](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8ebf680384a856aed45875ae4453bb594d8316c6))
+* **api:** api update ([8b449c4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/8b449c44c869ab90ada7acc26123d58bfc083f1f))
+* **api:** api update ([4b821d9](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4b821d974a38d50ae58321f62a83cd6c62998bb5))
+* **api:** api update ([3dbb7ca](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3dbb7ca5c9b27baa4a7be982f69394a683db7090))
+* **api:** api update ([4019fcb](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4019fcbe6b6fdcc117c6b8dabc174ab166498520))
+* **api:** api update ([ebdc5d4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ebdc5d46ba1bec74cc573fafff2d20ac4849db76))
+* **api:** api update ([1de2a95](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/1de2a952889d464577df810a8da0d7af3bbc1c7c))
+* **api:** api update ([b5ac8cc](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/b5ac8ccaa35aab1bfd6c8d391a9cb42302a4849a))
+* **api:** api update ([882ec77](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/882ec779a553bf8f0d1db0ca35ef2609c5a8078c))
+* **api:** api update ([4eec03f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4eec03ff386d8c64bd83285865c82bb061bf70a6))
+* **api:** api update ([3df5007](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3df5007c69007088fc11a9aa01fb31088d9b5206))
+* **api:** api update ([3d8f2c4](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3d8f2c4ca4509051e645536e656d82dadc9a20f2))
+* **api:** api update ([ac2d398](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ac2d39857ba083470553fab82c27f940926081b6))
+* **api:** api update ([5ffb97d](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/5ffb97d9f3802d47f115a57bee40f3581801a3cd))
+* **api:** api update ([c2bc00b](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/c2bc00b282aca8daa45b24e6f4dc0fe66a606af4))
+* **api:** api update ([864ab2a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/864ab2a56a9233228eb3053c0126794e1ae58182))
+* **api:** api update ([21aaa90](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/21aaa9051c98389cd43e3ed577b1a55dc90c1cdd))
+* **api:** api update ([a514bd1](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/a514bd1af8d12749bf37af858f70087126d6efbf))
+* **api:** api update ([83acb2e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/83acb2edc04277e8494e469cd596cec1faa4ed81))
+* **api:** api update ([ad300ac](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ad300ac3fb405cebd716bdd0e28d40b419ca6012))
+* **api:** api update ([3974622](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/39746225a5043e7b0861eda2ef1f491f6407da3a))
+* **api:** api update ([4dc96ad](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4dc96addfdd7e241dcfcb967cd4c237ad417b85a))
+* **api:** api update ([2ba0e5f](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/2ba0e5f5ee52365b833d6904268201f398aaa001))
+* **api:** api update ([1312108](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/131210835bbd489c99ed6056302e0e1c30b0de12))
+* **api:** api update ([ff87eb3](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/ff87eb31769d1fa7de42185fd8089f543809a6b5))
+* **stlc:** configurable CI runner and private-production-repo support in workflow templates ([4b430d7](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4b430d7c5fddde37e4130e8e9eed501d83400a5d))
+
+
+### Bug Fixes
+
+* **ci:** bump @arethetypeswrong/cli to ^0.18.0 and run CI workflows on Node 24 ([3547c2a](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/3547c2afac2f2460d46c51a0624868f7c5a8c111))
+* **client:** send content-type header for requests with an omitted optional body ([4f2d93e](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/commit/4f2d93e20ba3469807891876d90405abac984b85))
+
## 0.2.0 (2026-05-25)
Full Changelog: [v0.1.1...v0.2.0](https://github.com/onlyfansapi/onlyfansapi-typescript-sdk/compare/v0.1.1...v0.2.0)
diff --git a/api.md b/api.md
index 3164dc40..43412799 100644
--- a/api.md
+++ b/api.md
@@ -192,14 +192,6 @@ Methods:
# Messages
-Types:
-
-- MessageAttachTagsResponse
-
-Methods:
-
-- client.messages.attachTags(messageID, { ...params }) -> MessageAttachTagsResponse
-
# ClientSessions
Types:
@@ -431,13 +423,12 @@ Methods:
Types:
-- MediaDownloadResponse
- MediaScrapeResponse
- MediaUploadResponse
Methods:
-- client.media.download(cdnURL, { ...params }) -> string
+- client.media.download(cdnURL, { ...params }) -> void
- client.media.scrape(account, { ...params }) -> MediaScrapeResponse
- client.media.upload(account, { ...params }) -> MediaUploadResponse
diff --git a/package.json b/package.json
index 36a7c755..7dcb9bdf 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@onlyfansapi/onlyfans-sdk",
- "version": "0.2.0",
+ "version": "0.3.0",
"description": "The official TypeScript library for the Only Fans API API",
"author": "Only Fans API ",
"types": "dist/index.d.ts",
@@ -28,7 +28,7 @@
},
"dependencies": {},
"devDependencies": {
- "@arethetypeswrong/cli": "^0.17.0",
+ "@arethetypeswrong/cli": "^0.18.0",
"@swc/core": "^1.3.102",
"@swc/jest": "^0.2.29",
"@types/jest": "^29.4.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6497094d..a953c6f7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,8 +11,8 @@ importers:
.:
devDependencies:
'@arethetypeswrong/cli':
- specifier: ^0.17.0
- version: 0.17.0
+ specifier: ^0.18.0
+ version: 0.18.4
'@swc/core':
specifier: ^1.3.102
version: 1.4.16
@@ -78,20 +78,20 @@ packages:
integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==,
}
- '@arethetypeswrong/cli@0.17.0':
+ '@arethetypeswrong/cli@0.18.4':
resolution:
{
- integrity: sha512-xSMW7bfzVWpYw5JFgZqBXqr6PdR0/REmn3DkxCES5N0JTcB0CVgbIynJCvKBFmXaPc3hzmmTrb7+yPDRoOSZdA==,
+ integrity: sha512-kNWo6LTzGAuLYPpJ7Sgo63whSUeeSuKMlYx6IBgzs4ONEG807gW4hSSENvpeCHzO2H2wIzG5EFl0OKBbqGBAyA==,
}
- engines: { node: '>=18' }
+ engines: { node: '>=20' }
hasBin: true
- '@arethetypeswrong/core@0.17.0':
+ '@arethetypeswrong/core@0.18.4':
resolution:
{
- integrity: sha512-FHyhFizXNetigTVsIhqXKGYLpazPS5YNojEPpZEUcBPt9wVvoEbNIvG+hybuBR+pjlRcbyuqhukHZm1fr+bDgA==,
+ integrity: sha512-M5F0ePyN6h2Z6XxRiyIPqjGbltotXLjR0CKA0uKspsDu0QmgTNYvRb4RSQPMUs2ZXZHCCYpbaZbFbYOXLxCjUA==,
}
- engines: { node: '>=18' }
+ engines: { node: '>=20' }
'@babel/code-frame@7.28.6':
resolution:
@@ -363,6 +363,12 @@ packages:
integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==,
}
+ '@braidai/lang@1.1.2':
+ resolution:
+ {
+ integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==,
+ }
+
'@colors/colors@1.5.0':
resolution:
{
@@ -665,6 +671,12 @@ packages:
integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==,
}
+ '@loaderkit/resolve@1.0.6':
+ resolution:
+ {
+ integrity: sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==,
+ }
+
'@nodelib/fs.scandir@2.1.5':
resolution:
{
@@ -1678,10 +1690,10 @@ packages:
integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==,
}
- fflate@0.8.2:
+ fflate@0.8.3:
resolution:
{
- integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==,
+ integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==,
}
file-entry-cache@8.0.0:
@@ -2366,11 +2378,12 @@ packages:
integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==,
}
- lru-cache@10.4.3:
+ lru-cache@11.5.2:
resolution:
{
- integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==,
+ integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==,
}
+ engines: { node: 20 || >=22 }
lru-cache@5.1.1:
resolution:
@@ -2852,14 +2865,6 @@ packages:
}
hasBin: true
- semver@7.7.1:
- resolution:
- {
- integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==,
- }
- engines: { node: '>=10' }
- hasBin: true
-
semver@7.7.3:
resolution:
{
@@ -3365,23 +3370,24 @@ packages:
snapshots:
'@andrewbranch/untar.js@1.0.3': {}
- '@arethetypeswrong/cli@0.17.0':
+ '@arethetypeswrong/cli@0.18.4':
dependencies:
- '@arethetypeswrong/core': 0.17.0
+ '@arethetypeswrong/core': 0.18.4
chalk: 4.1.2
cli-table3: 0.6.5
commander: 10.0.1
marked: 9.1.6
marked-terminal: 7.2.1(marked@9.1.6)
- semver: 7.7.1
+ semver: 7.7.3
- '@arethetypeswrong/core@0.17.0':
+ '@arethetypeswrong/core@0.18.4':
dependencies:
'@andrewbranch/untar.js': 1.0.3
+ '@loaderkit/resolve': 1.0.6
cjs-module-lexer: 1.4.1
- fflate: 0.8.2
- lru-cache: 10.4.3
- semver: 7.7.1
+ fflate: 0.8.3
+ lru-cache: 11.5.2
+ semver: 7.7.3
typescript: 5.6.1-rc
validate-npm-package-name: 5.0.1
@@ -3574,6 +3580,8 @@ snapshots:
'@bcoe/v8-coverage@0.2.3': {}
+ '@braidai/lang@1.1.2': {}
+
'@colors/colors@1.5.0':
optional: true
@@ -3849,6 +3857,10 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.1
'@jridgewell/sourcemap-codec': 1.4.15
+ '@loaderkit/resolve@1.0.6':
+ dependencies:
+ '@braidai/lang': 1.1.2
+
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -4462,7 +4474,7 @@ snapshots:
dependencies:
bser: 2.1.1
- fflate@0.8.2: {}
+ fflate@0.8.3: {}
file-entry-cache@8.0.0:
dependencies:
@@ -4909,7 +4921,7 @@ snapshots:
jest-util: 29.7.0
natural-compare: 1.4.0
pretty-format: 29.7.0
- semver: 7.7.1
+ semver: 7.7.3
transitivePeerDependencies:
- supports-color
@@ -5013,7 +5025,7 @@ snapshots:
lodash.merge@4.6.2: {}
- lru-cache@10.4.3: {}
+ lru-cache@11.5.2: {}
lru-cache@5.1.1:
dependencies:
@@ -5254,8 +5266,6 @@ snapshots:
semver@6.3.1: {}
- semver@7.7.1: {}
-
semver@7.7.3: {}
shebang-command@2.0.0:
@@ -5512,7 +5522,7 @@ snapshots:
yargs@16.2.0:
dependencies:
cliui: 7.0.4
- escalade: 3.1.1
+ escalade: 3.2.0
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
diff --git a/src/client.ts b/src/client.ts
index 249b1c38..5223d108 100644
--- a/src/client.ts
+++ b/src/client.ts
@@ -104,7 +104,7 @@ import {
MeGetTopPercentageResponse,
MeRetrieveResponse,
} from './resources/me';
-import { MessageAttachTagsParams, MessageAttachTagsResponse, Messages } from './resources/messages';
+import { Messages } from './resources/messages';
import {
PayoutListRequestsParams,
PayoutListRequestsResponse,
@@ -256,7 +256,6 @@ import {
import {
Media,
MediaDownloadParams,
- MediaDownloadResponse,
MediaScrapeParams,
MediaScrapeResponse,
MediaUploadParams,
@@ -1045,11 +1044,19 @@ export class OnlyFansAPI {
return () => controller.abort();
}
- private buildBody({ options: { body, headers: rawHeaders } }: { options: FinalRequestOptions }): {
+ private buildBody({ options }: { options: FinalRequestOptions }): {
bodyHeaders: HeadersLike;
body: BodyInit | undefined;
} {
+ const { body, headers: rawHeaders } = options;
if (!body) {
+ // A resource method always passes a `body` key when its operation defines a
+ // request body, even if the caller omitted an optional body param. Keep the
+ // content-type for those, and only elide it for operations with no body at
+ // all (e.g. GET/DELETE).
+ if (body == null && 'body' in options) {
+ return this.#encoder({ body, headers: buildHeaders([rawHeaders]) });
+ }
return { bodyHeaders: undefined, body: undefined };
}
const headers = buildHeaders([rawHeaders]);
@@ -1147,7 +1154,7 @@ export class OnlyFansAPI {
trialLinks: API.TrialLinks = new API.TrialLinks(this);
giphy: API.Giphy = new API.Giphy(this);
/**
- * APIs for managing tags on free trial links and tracking links
+ * APIs for managing tags on free trial links, tracking links, and Smart Links
*/
linkTags: API.LinkTags = new API.LinkTags(this);
massMessaging: API.MassMessaging = new API.MassMessaging(this);
@@ -1314,11 +1321,7 @@ export declare namespace OnlyFansAPI {
type ChatUnmuteParams as ChatUnmuteParams,
};
- export {
- Messages as Messages,
- type MessageAttachTagsResponse as MessageAttachTagsResponse,
- type MessageAttachTagsParams as MessageAttachTagsParams,
- };
+ export { Messages as Messages };
export {
ClientSessions as ClientSessions,
@@ -1430,7 +1433,6 @@ export declare namespace OnlyFansAPI {
export {
Media as Media,
- type MediaDownloadResponse as MediaDownloadResponse,
type MediaScrapeResponse as MediaScrapeResponse,
type MediaUploadResponse as MediaUploadResponse,
type MediaDownloadParams as MediaDownloadParams,
diff --git a/src/resources/accounts.ts b/src/resources/accounts.ts
index e8b821f8..48987d7b 100644
--- a/src/resources/accounts.ts
+++ b/src/resources/accounts.ts
@@ -29,7 +29,9 @@ export class Accounts extends APIResource {
*
* @example
* ```ts
- * const response = await client.accounts.disconnect('nobis');
+ * const response = await client.accounts.disconnect(
+ * 'pariatur',
+ * );
* ```
*/
disconnect(id: string, options?: RequestOptions): APIPromise {
diff --git a/src/resources/analytics/financial/profitability.ts b/src/resources/analytics/financial/profitability.ts
index ec20b645..3f9fd712 100644
--- a/src/resources/analytics/financial/profitability.ts
+++ b/src/resources/analytics/financial/profitability.ts
@@ -56,45 +56,87 @@ export class Profitability extends APIResource {
}
}
-export type ProfitabilityGetHistoryResponse =
- Array;
+export interface ProfitabilityGetHistoryResponse {
+ data?: Array;
+}
export namespace ProfitabilityGetHistoryResponse {
- export interface ProfitabilityGetHistoryResponseItem {
- gross_revenue?: number;
+ export interface Data {
+ activeMilestones?: string | null;
+
+ agencyEarnings?: string;
+
+ commissionAmount?: string;
+
+ commissionRate?: string;
+
+ costs?: Array;
+
+ creatorName?: string;
- margin?: number;
+ hasCommissionForPeriod?: boolean;
+
+ hasCostsForPeriod?: boolean;
+
+ marginPercentage?: string;
month?: number;
- net_revenue?: number;
+ onlyFansUserId?: number;
+
+ profit?: string;
+
+ projectedNet?: string;
+
+ ratePeriods?: Array;
+
+ referralNote?: string | null;
- profit?: number;
+ totalCosts?: string;
year?: number;
}
}
-export type ProfitabilityGetProfitabilityResponse =
- Array;
+export interface ProfitabilityGetProfitabilityResponse {
+ data?: Array;
+}
export namespace ProfitabilityGetProfitabilityResponse {
- export interface ProfitabilityGetProfitabilityResponseItem {
- commission?: number;
+ export interface Data {
+ activeMilestones?: string | null;
+
+ agencyEarnings?: string;
+
+ commissionAmount?: string;
+
+ commissionRate?: string;
+
+ costs?: Array;
+
+ creatorName?: string;
- creator_id?: number;
+ hasCommissionForPeriod?: boolean;
- gross_revenue?: number;
+ hasCostsForPeriod?: boolean;
- margin?: number;
+ marginPercentage?: string;
- name?: string;
+ month?: number;
+
+ onlyFansUserId?: number;
+
+ profit?: string;
- net_revenue?: number;
+ projectedNet?: string;
- profit?: number;
+ ratePeriods?: Array;
- total_costs?: number;
+ referralNote?: string | null;
+
+ totalCosts?: string;
+
+ year?: number;
}
}
diff --git a/src/resources/authenticate.ts b/src/resources/authenticate.ts
index d10eea6c..9d00c7a9 100644
--- a/src/resources/authenticate.ts
+++ b/src/resources/authenticate.ts
@@ -511,7 +511,7 @@ export interface AuthenticateStartParams {
* The country of the managed proxy server you want to use. Eg. "us" for United
* States. Cannot be used together with customProxy.
*/
- proxyCountry?: 'us' | 'uk';
+ proxyCountry?: 'us' | 'uk' | 'gb';
/**
* The browser User-Agent string. Required when auth_type is `raw_data`.
diff --git a/src/resources/chats/chats.ts b/src/resources/chats/chats.ts
index 77c97030..d8f32988 100644
--- a/src/resources/chats/chats.ts
+++ b/src/resources/chats/chats.ts
@@ -157,8 +157,8 @@ export class Chats extends APIResource {
/**
* Calling this endpoint will show the target fan a "Model is typing..." note in
- * the chat for ~4 seconds. If you want to continue showing the indicator call this
- * endpoint multiple times. Free - no credits charged.
+ * the chat for ~4 seconds. Duplicate calls for the same account and chat are
+ * coalesced during that window.
*
* @example
* ```ts
@@ -1273,7 +1273,8 @@ export interface ChatListParams {
query?: string;
/**
- * Whether to skip user details in response (all or none). Default = all
+ * Whether to skip user details in the response (`all` or `none`). Defaults to
+ * `all`.
*/
skip_users?: 'all' | 'none';
}
@@ -1309,8 +1310,8 @@ export interface ChatListMediaParams {
offset?: string;
/**
- * Query param: Whether to skip user details in response (all or none). Default =
- * all
+ * Query param: Whether to skip user details in the response (`all` or `none`).
+ * Defaults to `all`.
*/
skip_users?: string;
diff --git a/src/resources/chats/messages.ts b/src/resources/chats/messages.ts
index 1feab3f5..823071e0 100644
--- a/src/resources/chats/messages.ts
+++ b/src/resources/chats/messages.ts
@@ -2,6 +2,7 @@
import { APIResource } from '../../core/resource';
import { APIPromise } from '../../core/api-promise';
+import { buildHeaders } from '../../internal/headers';
import { RequestOptions } from '../../internal/request-options';
import { path } from '../../internal/utils/path';
@@ -123,6 +124,30 @@ export class Messages extends APIResource {
/**
* Send a new message to a chat.
*
+ * **Idempotency.** Pass an `Idempotency-Key` header to make retries safe. The
+ * first request with a given key is executed normally and its response is stored
+ * for **24 hours**; any later request with the same key returns that stored
+ * response, plus an `Idempotent-Replayed: true` header, without contacting
+ * OnlyFans and without consuming credits. The replayed body is the original
+ * response with its `_meta._credits` block rewritten to show `used: 0` and your
+ * current balance.
+ *
+ * Keys are scoped to your team, this endpoint and the account in the URL, so the
+ * same value can be reused safely against a different account. Use a fresh, unique
+ * value (a UUID works well) for each message you send; it must be 1-255 printable
+ * ASCII characters.
+ *
+ * - `400 IDEMPOTENCY_KEY_INVALID` — the header value is empty, too long, or
+ * contains non-ASCII characters.
+ * - `409 IDEMPOTENCY_CONFLICT` — an earlier request with this key is still
+ * running. Retry once it finishes.
+ * - `422 IDEMPOTENCY_KEY_MISMATCH` — this key was already used with a different
+ * request body or chat.
+ *
+ * Responses with a `5xx` status (and `408`/`429`) are never stored, so a failed
+ * send can be retried with the same key. The header is optional: omit it and the
+ * endpoint behaves exactly as before.
+ *
* @example
* ```ts
* const response = await client.chats.messages.send('123', {
@@ -131,8 +156,15 @@ export class Messages extends APIResource {
* ```
*/
send(chatID: string, params: MessageSendParams, options?: RequestOptions): APIPromise {
- const { account, ...body } = params;
- return this._client.post(path`/api/${account}/chats/${chatID}/messages`, { body, ...options });
+ const { account, 'Idempotency-Key': idempotencyKey, ...body } = params;
+ return this._client.post(path`/api/${account}/chats/${chatID}/messages`, {
+ body,
+ ...options,
+ headers: buildHeaders([
+ { ...(idempotencyKey != null ? { 'Idempotency-Key': idempotencyKey } : undefined) },
+ options?.headers,
+ ]),
+ });
}
/**
@@ -853,7 +885,7 @@ export interface MessageListParams {
order?: string;
/**
- * Query param: Whether to skip user details (all or none)
+ * Query param: Whether to skip user details (`all` or `none`).
*/
skip_users?: string;
}
@@ -912,6 +944,14 @@ export interface MessageSendParams {
*/
account: string;
+ /**
+ * Body param: Screen `text` for OnlyFans banned words and block the send if any
+ * are found (returns a 422 listing the offending words). `strict_ban` blocks all
+ * tiers, `risky` blocks Risky + Replace/soften, `replace_soften` blocks
+ * Replace/soften only. Omit to disable screening.
+ */
+ blockBannedWords?: 'strict_ban' | 'risky' | 'replace_soften';
+
/**
* Body param: The ID of the Giphy GIF to attach to the message. Get IDs from the
* Giphy listing endpoints (`/giphy/trending`, `/giphy/search`).
@@ -937,8 +977,8 @@ export interface MessageSendParams {
previews?: Array;
/**
- * Body param: Price for paid content (0 or between 3-200). In case this is not
- * zero, **mediaFiles** is required
+ * Body param: Price for paid content in USD (0 or between 3-200). In case this is
+ * not zero, **mediaFiles** is required
*/
price?: number;
@@ -967,6 +1007,11 @@ export interface MessageSendParams {
* Body param: The message text content. Required unless a media file is present.
*/
text?: string;
+
+ /**
+ * Header param
+ */
+ 'Idempotency-Key'?: string;
}
export interface MessageUnlikeParams {
diff --git a/src/resources/client-sessions.ts b/src/resources/client-sessions.ts
index fa88e804..51ee2e89 100644
--- a/src/resources/client-sessions.ts
+++ b/src/resources/client-sessions.ts
@@ -82,7 +82,7 @@ export interface ClientSessionCreateParams {
*/
client_reference_id?: string;
- proxy_country?: 'us' | 'uk' | null;
+ proxy_country?: 'us' | 'uk' | 'gb' | null;
}
export declare namespace ClientSessions {
diff --git a/src/resources/data-exports.ts b/src/resources/data-exports.ts
index 7655bbef..c88cdde2 100644
--- a/src/resources/data-exports.ts
+++ b/src/resources/data-exports.ts
@@ -230,6 +230,8 @@ export namespace DataExportRetrieveResponse {
failed_at?: string | null;
+ failed_downloads?: number;
+
failed_reason?: string | null;
file_type?: string;
@@ -327,6 +329,8 @@ export namespace DataExportListResponse {
failed_at?: string | null;
+ failed_downloads?: number;
+
failed_reason?: string | null;
file_type?: string;
@@ -532,8 +536,9 @@ export interface DataExportCreateParams {
/**
* The output file format. Supported formats vary by export type: `csv` or `xlsx`
- * for transactions, chat_messages, trial_links, tracking_links, smart_links,
- * payouts, chargebacks, public_profiles, fans, followings; `zip` for media_vault.
+ * for transactions, chat_messages, fansly_chat_messages, trial_links,
+ * tracking_links, smart_links, payouts, chargebacks, public_profiles, fans,
+ * followings, profile_visitors; `zip` for media_vault.
*/
file_type: 'csv' | 'xlsx' | 'zip';
@@ -543,7 +548,10 @@ export interface DataExportCreateParams {
start_date: string;
/**
- * The type of data to export
+ * The type of data to export. Use `fansly_chat_messages` to export Fansly chat
+ * messages (all other types are OnlyFans). `profile_visitors` returns one row per
+ * account per day, scraped one day at a time so the daily numbers are not
+ * aggregated away by OnlyFans.
*/
type:
| 'transactions'
@@ -556,11 +564,14 @@ export interface DataExportCreateParams {
| 'chargebacks'
| 'public_profiles'
| 'fans'
- | 'followings';
+ | 'followings'
+ | 'profile_visitors'
+ | 'fansly_chat_messages';
/**
* Array of account prefixed IDs to export data from. Not required for
- * `public_profiles` type.
+ * `public_profiles` type. For `fansly_chat_messages`, pass Fansly account prefixed
+ * IDs (`fansly_acct_...`); all other types take OnlyFans account IDs.
*/
account_ids?: Array;
@@ -580,19 +591,23 @@ export interface DataExportCreateParams {
* account, max 10,000,000), `maxChats` (optional per-account chat scrape limit),
* `skipMassMessages` (optional, bool), `chatIds` (optional array of numeric
* fan/chat IDs; filters output and can drastically reduce totals). For
- * `media_vault`: `mediaType` (required, one of: `all`, `photo`, `gif`, `video`,
- * `audio`). For `fans`: `type` (required, one of: `all`, `active`, `expired`,
- * `latest`). For `followings`: `type` (required, one of: `all`, `active`,
- * `expired`). For `public_profiles`: `query` (optional, full-text search),
- * `gender` (optional, filter: male, female, trans, couple), `minSubscribePrice`
- * (optional, USD), `maxSubscribePrice` (optional, USD), `location` (optional),
- * `minPostsCount` (optional, minimum posts), `minPhotosCount` (optional, minimum
- * photos), `minVideosCount` (optional, minimum videos), `minSubscribersCount`
- * (optional, minimum subscribers), `minJoinDate` (optional, ISO 8601 date),
- * `minLastSeenAt` (optional, ISO 8601 date), `createdAtFrom` (optional, ISO 8601
- * date, profile added to DB after), `createdAtTo` (optional, ISO 8601 date,
- * profile added to DB before), `instagram` (optional), `twitter` (optional),
- * `tiktok` (optional), `maxResults` (optional, limit results).
+ * `fansly_chat_messages`: `maxMessages` (required per account, max 10,000,000),
+ * `maxChats` (optional per-account chat scrape limit), `chatIds` (optional array
+ * of Fansly group ID strings; filters output and can drastically reduce totals).
+ * For `media_vault`: `mediaType` (required, one of: `all`, `photo`, `gif`,
+ * `video`, `audio`). For `fans`: `type` (required, one of: `all`, `active`,
+ * `expired`, `latest`). For `followings`: `type` (required, one of: `all`,
+ * `active`, `expired`). For `public_profiles`: `query` (optional, full-text
+ * search), `gender` (optional, filter: male, female, trans, couple),
+ * `minSubscribePrice` (optional, USD), `maxSubscribePrice` (optional, USD),
+ * `location` (optional), `minPostsCount` (optional, minimum posts),
+ * `minPhotosCount` (optional, minimum photos), `minVideosCount` (optional, minimum
+ * videos), `minSubscribersCount` (optional, minimum subscribers),
+ * `maxSubscribersCount` (optional, maximum subscribers), `minJoinDate` (optional,
+ * ISO 8601 date), `minLastSeenAt` (optional, ISO 8601 date), `createdAtFrom`
+ * (optional, ISO 8601 date, profile added to DB after), `createdAtTo` (optional,
+ * ISO 8601 date, profile added to DB before), `instagram` (optional), `twitter`
+ * (optional), `tiktok` (optional), `maxResults` (optional, limit results).
*/
options?: { [key: string]: unknown };
}
@@ -642,9 +657,14 @@ export interface DataExportListParams {
| 'media_vault'
| 'trial_links'
| 'tracking_links'
+ | 'smart_links'
| 'payouts'
| 'chargebacks'
- | 'public_profiles';
+ | 'public_profiles'
+ | 'fans'
+ | 'followings'
+ | 'profile_visitors'
+ | 'fansly_chat_messages';
}
export declare namespace DataExports {
diff --git a/src/resources/engagement/messages/direct-messages.ts b/src/resources/engagement/messages/direct-messages.ts
index 94453029..9f617a42 100644
--- a/src/resources/engagement/messages/direct-messages.ts
+++ b/src/resources/engagement/messages/direct-messages.ts
@@ -329,8 +329,8 @@ export namespace DirectMessageChartResponse {
export interface DirectMessageListParams {
/**
- * The latest message to retrieve. Keep empty to get all. MUST BE DATE AFTER
- * `startDate`. This is also used for pagination.
+ * The latest message to retrieve. Keep empty to get all. It must be after
+ * `startDate` and is also used for pagination.
*/
endDate?: string;
@@ -357,7 +357,7 @@ export interface DirectMessageListParams {
export interface DirectMessageChartParams {
/**
- * End of the chart window in `Y-m-d H:i:s` format. Must be after `startDate`.
+ * End of the chart window in `Y-m-d H:i:s` format. It must be after `startDate`.
*/
endDate?: string;
diff --git a/src/resources/engagement/messages/mass-messages.ts b/src/resources/engagement/messages/mass-messages.ts
index 4cfff425..802d3272 100644
--- a/src/resources/engagement/messages/mass-messages.ts
+++ b/src/resources/engagement/messages/mass-messages.ts
@@ -231,8 +231,8 @@ export namespace MassMessageChartResponse {
export interface MassMessageListParams {
/**
- * The latest message to retrieve. Keep empty to get all. MUST BE DATE AFTER
- * `startDate`. This is also used for pagination.
+ * The latest message to retrieve. Keep empty to get all. It must be after
+ * `startDate` and is also used for pagination.
*/
endDate?: string;
@@ -254,7 +254,7 @@ export interface MassMessageListParams {
export interface MassMessageChartParams {
/**
- * End of the chart window in `Y-m-d H:i:s` format. Must be after `startDate`.
+ * End of the chart window in `Y-m-d H:i:s` format. It must be after `startDate`.
*/
endDate?: string;
diff --git a/src/resources/engagement/messages/messages.ts b/src/resources/engagement/messages/messages.ts
index 7e83f2ad..08a451d2 100644
--- a/src/resources/engagement/messages/messages.ts
+++ b/src/resources/engagement/messages/messages.ts
@@ -31,9 +31,10 @@ export class Messages extends APIResource {
* @example
* ```ts
* const response =
- * await client.engagement.messages.getMessageBuyers('et', {
- * account: 'acct_XXXXXXXXXXXXXXX',
- * });
+ * await client.engagement.messages.getMessageBuyers(
+ * 'earum',
+ * { account: 'acct_XXXXXXXXXXXXXXX' },
+ * );
* ```
*/
getMessageBuyers(
@@ -434,7 +435,7 @@ export interface MessageGetMessageBuyersParams {
offset?: number;
/**
- * Query param: Optional flag for subsequent pages (example: all)
+ * Query param: Optional flag for subsequent pages (example: all).
*/
skip_users?: string;
@@ -446,8 +447,8 @@ export interface MessageGetMessageBuyersParams {
export interface MessageGetTopMessageParams {
/**
- * The end date for the period. Keep empty to retrieve until now. MUST BE DATE
- * AFTER `startDate`.
+ * The end date for the period. Keep empty to retrieve until now. It must be after
+ * `startDate`.
*/
endDate?: string;
diff --git a/src/resources/fans/fans.ts b/src/resources/fans/fans.ts
index d5dc2438..82d81c3a 100644
--- a/src/resources/fans/fans.ts
+++ b/src/resources/fans/fans.ts
@@ -52,7 +52,19 @@ export class Fans extends APIResource {
}
/**
- * Get a paginated list of fans for an Account. Newest fans are first.
+ * Get a paginated list of fans for an Account. Newest fans are first. Paginate by
+ * following `_pagination.next_page` until it is null (`data.hasMore` is the
+ * authoritative flag). Do NOT use the page's item count to detect the last page —
+ * OnlyFans occasionally returns fewer than `limit` items (e.g. 19 for limit=20) on
+ * a non-final page because it filters entries server-side; no fans are skipped. To
+ * track progress, GET `/{account}/me` returns data.subscribersCount (the current
+ * active-subscriber count) as a total.
+ *
+ * Supports `filter[max_total_spent]` (e.g. `filter[max_total_spent]=0` for fans
+ * who have never spent), which OnlyFans itself cannot do. Those requests are
+ * answered from OnlyFansAPI's own fan index rather than proxied, so the page is
+ * limited to fans we have already indexed for this account — see `data._source` in
+ * the response.
*
* @example
* ```ts
@@ -70,7 +82,17 @@ export class Fans extends APIResource {
}
/**
- * Get a paginated list of fans for an Account. Newest fans are first.
+ * Get a paginated list of fans for an Account. Newest fans are first. Paginate by
+ * following `_pagination.next_page` until it is null (`data.hasMore` is the
+ * authoritative flag). Do NOT use the page's item count to detect the last page —
+ * OnlyFans occasionally returns fewer than `limit` items (e.g. 19 for limit=20) on
+ * a non-final page because it filters entries server-side; no fans are skipped.
+ *
+ * Supports `filter[max_total_spent]` (e.g. `filter[max_total_spent]=0` for fans
+ * who have never spent), which OnlyFans itself cannot do. Those requests are
+ * answered from OnlyFansAPI's own fan index rather than proxied, so the page is
+ * limited to fans we have already indexed for this account — see `data._source` in
+ * the response.
*
* @example
* ```ts
@@ -89,6 +111,17 @@ export class Fans extends APIResource {
/**
* Get a paginated list of expired fans for an Account. Newest fans are first.
+ * Paginate by following `_pagination.next_page` until it is null (`data.hasMore`
+ * is the authoritative flag). Do NOT use the page's item count to detect the last
+ * page — OnlyFans occasionally returns fewer than `limit` items (e.g. 19 for
+ * limit=20) on a non-final page because it filters entries server-side; no fans
+ * are skipped.
+ *
+ * Supports `filter[max_total_spent]` (e.g. `filter[max_total_spent]=0` for fans
+ * who have never spent), which OnlyFans itself cannot do. Those requests are
+ * answered from OnlyFansAPI's own fan index rather than proxied, so the page is
+ * limited to fans we have already indexed for this account — see `data._source` in
+ * the response.
*
* @example
* ```ts
@@ -1937,8 +1970,8 @@ export interface FanListActiveParams {
filter?: FanListActiveParams.Filter;
/**
- * Number of fans to return (1-50). Must be at least 1. Must not be greater
- * than 20.
+ * Number of fans to return (1-20). OnlyFans does not allow more than 20 per page.
+ * Must be at least 1. Must not be greater than 20.
*/
limit?: number;
@@ -1961,22 +1994,56 @@ export interface FanListActiveParams {
export namespace FanListActiveParams {
export interface Filter {
/**
- * Filter by minimum subscription duration in months. Must be at least 0.
+ * Filter by minimum subscription duration in months. Must use bracket syntax:
+ * filter[duration]=1 — the dot form (filter.duration=1) is rejected with a 422,
+ * because PHP rewrites it to `filter_duration` and the filter could not be
+ * applied. Must be at least 0.
*/
duration?: number;
/**
- * Filter by online status (`1` for online fans).
+ * Filter by **maximum** amount total spent by a fan — use
+ * `filter[max_total_spent]=0` to isolate fans who have never spent. Combine with
+ * `filter[total_spent]` for a range. Must use bracket syntax:
+ * filter[max_total_spent]=0 — the dot form is rejected with a 422, because PHP
+ * rewrites it to `filter_max_total_spent` and the filter could not be applied.
+ *
+ * OnlyFans itself has no maximum-spend filter, so this one is resolved against
+ * OnlyFansAPI's own fan index instead of being proxied. The fan objects in
+ * `data.list` are still fetched live from OnlyFans and are re-checked against your
+ * filters before being returned, but only fans we have already indexed for this
+ * account can appear. Each response reports its own coverage under `data._source`;
+ * when `data._source.is_complete` is `false` a full-base backfill is queued
+ * automatically, so retry later for a complete answer.
+ *
+ * `data._source.omitted_from_page` counts fans that matched your filters but which
+ * OnlyFans returned no usable data for on that page (a deleted account, or a
+ * partial response). They are left out of `data.list` and not revisited later in
+ * the same walk, so a non-zero value means that page was short — start a fresh
+ * walk to retry them. Cannot be combined with `filter[online]`. Must be at
+ * least 0.
+ */
+ max_total_spent?: number;
+
+ /**
+ * Filter by online status (`1` for online fans). Must use bracket syntax:
+ * filter[online]=1 — the dot form (filter.online=1) is rejected with a 422,
+ * because PHP rewrites it to `filter_online` and the filter could not be applied.
*/
online?: 1 | 0 | null;
/**
- * Filter by minimum tips. Must be at least 0.
+ * Filter by minimum tips. Must use bracket syntax: filter[tips]=100 — the dot form
+ * (filter.tips=100) is rejected with a 422, because PHP rewrites it to
+ * `filter_tips` and the filter could not be applied. Must be at least 0.
*/
tips?: number;
/**
- * Filter by minimum amount total spent by a fan. Must be at least 0.
+ * Filter by minimum amount total spent by a fan. Must use bracket syntax:
+ * filter[total_spent]=100 — the dot form (filter.total_spent=100) is rejected with
+ * a 422, because PHP rewrites it to `filter_total_spent` and the filter could not
+ * be applied. Must be at least 0.
*/
total_spent?: number;
}
@@ -1986,8 +2053,8 @@ export interface FanListAllParams {
filter?: FanListAllParams.Filter;
/**
- * Number of fans to return (1-50). Must be at least 1. Must not be greater
- * than 20.
+ * Number of fans to return (1-20). OnlyFans does not allow more than 20 per page.
+ * Must be at least 1. Must not be greater than 20.
*/
limit?: number;
@@ -2010,22 +2077,56 @@ export interface FanListAllParams {
export namespace FanListAllParams {
export interface Filter {
/**
- * Filter by minimum subscription duration in months. Must be at least 0.
+ * Filter by minimum subscription duration in months. Must use bracket syntax:
+ * filter[duration]=1 — the dot form (filter.duration=1) is rejected with a 422,
+ * because PHP rewrites it to `filter_duration` and the filter could not be
+ * applied. Must be at least 0.
*/
duration?: number;
/**
- * Filter by online status (`1` for online fans).
+ * Filter by **maximum** amount total spent by a fan — use
+ * `filter[max_total_spent]=0` to isolate fans who have never spent. Combine with
+ * `filter[total_spent]` for a range. Must use bracket syntax:
+ * filter[max_total_spent]=0 — the dot form is rejected with a 422, because PHP
+ * rewrites it to `filter_max_total_spent` and the filter could not be applied.
+ *
+ * OnlyFans itself has no maximum-spend filter, so this one is resolved against
+ * OnlyFansAPI's own fan index instead of being proxied. The fan objects in
+ * `data.list` are still fetched live from OnlyFans and are re-checked against your
+ * filters before being returned, but only fans we have already indexed for this
+ * account can appear. Each response reports its own coverage under `data._source`;
+ * when `data._source.is_complete` is `false` a full-base backfill is queued
+ * automatically, so retry later for a complete answer.
+ *
+ * `data._source.omitted_from_page` counts fans that matched your filters but which
+ * OnlyFans returned no usable data for on that page (a deleted account, or a
+ * partial response). They are left out of `data.list` and not revisited later in
+ * the same walk, so a non-zero value means that page was short — start a fresh
+ * walk to retry them. Cannot be combined with `filter[online]`. Must be at
+ * least 0.
+ */
+ max_total_spent?: number;
+
+ /**
+ * Filter by online status (`1` for online fans). Must use bracket syntax:
+ * filter[online]=1 — the dot form (filter.online=1) is rejected with a 422,
+ * because PHP rewrites it to `filter_online` and the filter could not be applied.
*/
online?: 1 | 0 | null;
/**
- * Filter by minimum tips. Must be at least 0.
+ * Filter by minimum tips. Must use bracket syntax: filter[tips]=100 — the dot form
+ * (filter.tips=100) is rejected with a 422, because PHP rewrites it to
+ * `filter_tips` and the filter could not be applied. Must be at least 0.
*/
tips?: number;
/**
- * Filter by minimum amount total spent by a fan. Must be at least 0.
+ * Filter by minimum amount total spent by a fan. Must use bracket syntax:
+ * filter[total_spent]=100 — the dot form (filter.total_spent=100) is rejected with
+ * a 422, because PHP rewrites it to `filter_total_spent` and the filter could not
+ * be applied. Must be at least 0.
*/
total_spent?: number;
}
@@ -2035,8 +2136,8 @@ export interface FanListExpiredParams {
filter?: FanListExpiredParams.Filter;
/**
- * Number of fans to return (1-50). Must be at least 1. Must not be greater
- * than 20.
+ * Number of fans to return (1-20). OnlyFans does not allow more than 20 per page.
+ * Must be at least 1. Must not be greater than 20.
*/
limit?: number;
@@ -2059,22 +2160,56 @@ export interface FanListExpiredParams {
export namespace FanListExpiredParams {
export interface Filter {
/**
- * Filter by minimum subscription duration in months. Must be at least 0.
+ * Filter by minimum subscription duration in months. Must use bracket syntax:
+ * filter[duration]=1 — the dot form (filter.duration=1) is rejected with a 422,
+ * because PHP rewrites it to `filter_duration` and the filter could not be
+ * applied. Must be at least 0.
*/
duration?: number;
/**
- * Filter by online status (`1` for online fans).
+ * Filter by **maximum** amount total spent by a fan — use
+ * `filter[max_total_spent]=0` to isolate fans who have never spent. Combine with
+ * `filter[total_spent]` for a range. Must use bracket syntax:
+ * filter[max_total_spent]=0 — the dot form is rejected with a 422, because PHP
+ * rewrites it to `filter_max_total_spent` and the filter could not be applied.
+ *
+ * OnlyFans itself has no maximum-spend filter, so this one is resolved against
+ * OnlyFansAPI's own fan index instead of being proxied. The fan objects in
+ * `data.list` are still fetched live from OnlyFans and are re-checked against your
+ * filters before being returned, but only fans we have already indexed for this
+ * account can appear. Each response reports its own coverage under `data._source`;
+ * when `data._source.is_complete` is `false` a full-base backfill is queued
+ * automatically, so retry later for a complete answer.
+ *
+ * `data._source.omitted_from_page` counts fans that matched your filters but which
+ * OnlyFans returned no usable data for on that page (a deleted account, or a
+ * partial response). They are left out of `data.list` and not revisited later in
+ * the same walk, so a non-zero value means that page was short — start a fresh
+ * walk to retry them. Cannot be combined with `filter[online]`. Must be at
+ * least 0.
+ */
+ max_total_spent?: number;
+
+ /**
+ * Filter by online status (`1` for online fans). Must use bracket syntax:
+ * filter[online]=1 — the dot form (filter.online=1) is rejected with a 422,
+ * because PHP rewrites it to `filter_online` and the filter could not be applied.
*/
online?: 1 | 0 | null;
/**
- * Filter by minimum tips. Must be at least 0.
+ * Filter by minimum tips. Must use bracket syntax: filter[tips]=100 — the dot form
+ * (filter.tips=100) is rejected with a 422, because PHP rewrites it to
+ * `filter_tips` and the filter could not be applied. Must be at least 0.
*/
tips?: number;
/**
- * Filter by minimum amount total spent by a fan. Must be at least 0.
+ * Filter by minimum amount total spent by a fan. Must use bracket syntax:
+ * filter[total_spent]=100 — the dot form (filter.total_spent=100) is rejected with
+ * a 422, because PHP rewrites it to `filter_total_spent` and the filter could not
+ * be applied. Must be at least 0.
*/
total_spent?: number;
}
@@ -2082,14 +2217,14 @@ export namespace FanListExpiredParams {
export interface FanListLatestParams {
/**
- * End date for filtering (required with start_date). This field is required when
- * start_date is present.
+ * End date for filtering (required with start_date). Must be a valid date. Must
+ * not be greater than 255 characters.
*/
end_date?: string | null;
/**
* Number of fans to return (1-50). Must be at least 1. Must not be greater
- * than 100.
+ * than 50.
*/
limit?: number;
@@ -2099,8 +2234,8 @@ export interface FanListLatestParams {
offset?: number;
/**
- * Start date for filtering (required with end_date). This field is required when
- * end_date is present.
+ * Start date for filtering (required with end_date). Must be a valid date. Must
+ * not be greater than 255 characters.
*/
start_date?: string | null;
@@ -2117,14 +2252,14 @@ export interface FanListTopParams {
by?: 'total' | 'subscribes' | 'tips' | 'messages' | 'post' | 'streams' | null;
/**
- * End date for filtering (required with start_date). This field is required when
- * start_date is present.
+ * End date for filtering (required with start_date). Must be a valid date. Must
+ * not be greater than 255 characters.
*/
end_date?: string | null;
/**
- * Start date for filtering (required with end_date). This field is required when
- * end_date is present.
+ * Start date for filtering (required with end_date). Must be a valid date. Must
+ * not be greater than 255 characters.
*/
start_date?: string | null;
}
diff --git a/src/resources/fans/summary.ts b/src/resources/fans/summary.ts
index 2dc63d98..db003eeb 100644
--- a/src/resources/fans/summary.ts
+++ b/src/resources/fans/summary.ts
@@ -62,19 +62,33 @@ export interface SummaryGenerateSummaryResponse {
export interface SummaryGetSummaryResponse {
analyzed_message_count?: number;
+ custom_fields?: Array;
+
error_message?: string | null;
last_analyzed_at?: string;
+ last_buy_date?: string;
+
status?: string;
summary_data?: SummaryGetSummaryResponse.SummaryData;
}
export namespace SummaryGetSummaryResponse {
+ export interface CustomField {
+ key?: string;
+
+ label?: string;
+ }
+
export interface SummaryData {
+ content_dislikes?: string;
+
content_preferences?: string;
+ dos_and_donts?: string;
+
family_pets?: string;
hobbies?: string;
@@ -91,6 +105,8 @@ export namespace SummaryGetSummaryResponse {
requests?: string;
+ spend_cadence?: string;
+
themes?: string;
travel_plans?: string;
diff --git a/src/resources/following.ts b/src/resources/following.ts
index 86149cf8..8337b8c3 100644
--- a/src/resources/following.ts
+++ b/src/resources/following.ts
@@ -10,7 +10,16 @@ import { path } from '../internal/utils/path';
*/
export class Following extends APIResource {
/**
- * Get a paginated list of followings for an Account. Newest followings are first.
+ * Get a paginated list of followings for an Account. By default OnlyFans returns
+ * this list newest-first, sorted by `subscribedByData.subscribeAt` descending. The
+ * expired list does not share this order, so do not assume it applies there. Pass
+ * `sort` (optionally with `sortDirection`) to reorder the list — see the parameter
+ * description for the caveat that OnlyFans persists the chosen order account-wide.
+ * An empty page is not the end of the list: OnlyFans applies `offset` to the whole
+ * following collection before filtering it down to the requested list, so a page
+ * can come back empty while more results follow. Keep following
+ * `_pagination.next_page` until it is `null` instead of stopping at the first
+ * empty page.
*
* @example
* ```ts
@@ -28,7 +37,16 @@ export class Following extends APIResource {
}
/**
- * Get a paginated list of followings for an Account. Newest followings are first.
+ * Get a paginated list of followings for an Account. By default OnlyFans returns
+ * this list newest-first, sorted by `subscribedByData.subscribeAt` descending. The
+ * expired list does not share this order, so do not assume it applies there. Pass
+ * `sort` (optionally with `sortDirection`) to reorder the list — see the parameter
+ * description for the caveat that OnlyFans persists the chosen order account-wide.
+ * An empty page is not the end of the list: OnlyFans applies `offset` to the whole
+ * following collection before filtering it down to the requested list, so a page
+ * can come back empty while more results follow. Keep following
+ * `_pagination.next_page` until it is `null` instead of stopping at the first
+ * empty page.
*
* @example
* ```ts
@@ -46,8 +64,24 @@ export class Following extends APIResource {
}
/**
- * Get a paginated list of expired followings for an Account. Newest followings are
- * first.
+ * Get a paginated list of expired followings for an Account. This list has no
+ * order guarantee. Unlike the all and active lists, it is sorted by neither
+ * `subscribedByData.subscribeAt` nor `subscribedByData.expiredAt`. To poll for new
+ * expirations, page through the full list each cycle (`limit=50`, follow
+ * `_pagination.next_page` until it is null) and diff it against your own store
+ * using `subscribedByData.expiredAt`. Do NOT stop early at the first entry you
+ * have already seen, as that can silently skip real expirations. An empty page is
+ * not the end of the list either: OnlyFans applies `offset` to the whole following
+ * collection and only then filters that window down to expired subscriptions, so
+ * early pages can come back empty while hundreds of expired rows still follow.
+ * Keep following `_pagination.next_page` until it is `null` instead of stopping at
+ * the first empty page. Pass `sort=expire_date` (optionally with `sortDirection`)
+ * to get a deterministic order instead — see the parameter description for the
+ * caveat that OnlyFans persists the chosen order account-wide. Ordering by expiry
+ * descending puts the still-active subscriptions first and moves the expired rows
+ * to the tail of the collection, so prefer `sortDirection=asc` or
+ * `sort=is_expired` for expired-first results; for that reason `sort=expire_date`
+ * defaults to `asc` on this list when no `sortDirection` is given.
*
* @example
* ```ts
@@ -887,6 +921,35 @@ export interface FollowingListActiveParams {
* Search within following name/username.
*/
query?: string | null;
+
+ /**
+ * Order the list by `last_activity` (the followed creator's last activity),
+ * `expire_date` (subscription expiry), `subscribe_date` (subscription start) or
+ * `is_expired` (expired first — OnlyFans only offers this one on the expired
+ * list). Omit it to keep whichever order is currently stored for the account.
+ * **Note:** OnlyFans persists this order account-wide, so it also applies to later
+ * requests that omit `sort` and to the creator's own onlyfans.com UI, until it is
+ * changed again. **Expired list:** OnlyFans applies `offset` to the whole
+ * following collection and only then filters it down to expired subscriptions, so
+ * ordering by expiry descending puts the still-active subscriptions first and
+ * moves the expired rows to the tail of the collection — the first several hundred
+ * offsets then come back empty. Use `sortDirection=asc` or `sort=is_expired` to
+ * get expired-first results. For that reason `sort=expire_date` on the expired
+ * list defaults to `asc` instead of `desc` when you do not pass `sortDirection`.
+ * Whatever order you pick, an empty page is **not** the end of the list: keep
+ * following `_pagination.next_page` until it is `null` rather than stopping at the
+ * first empty page. This field is required when sortDirection is
+ * present.
+ */
+ sort?: 'last_activity' | 'expire_date' | 'subscribe_date' | 'is_expired' | null;
+
+ /**
+ * Direction for `sort`: `desc` (default) or `asc`. Requires `sort` to be set.
+ * Exception: `sort=expire_date` on the expired list defaults to `asc`, because
+ * `desc` moves the expired rows to the tail of the underlying collection and
+ * leaves the early pages empty. Passing `sortDirection` explicitly always wins.
+ */
+ sortDirection?: 'asc' | 'desc' | null;
}
export namespace FollowingListActiveParams {
@@ -921,6 +984,35 @@ export interface FollowingListAllParams {
* Search within following name/username.
*/
query?: string | null;
+
+ /**
+ * Order the list by `last_activity` (the followed creator's last activity),
+ * `expire_date` (subscription expiry), `subscribe_date` (subscription start) or
+ * `is_expired` (expired first — OnlyFans only offers this one on the expired
+ * list). Omit it to keep whichever order is currently stored for the account.
+ * **Note:** OnlyFans persists this order account-wide, so it also applies to later
+ * requests that omit `sort` and to the creator's own onlyfans.com UI, until it is
+ * changed again. **Expired list:** OnlyFans applies `offset` to the whole
+ * following collection and only then filters it down to expired subscriptions, so
+ * ordering by expiry descending puts the still-active subscriptions first and
+ * moves the expired rows to the tail of the collection — the first several hundred
+ * offsets then come back empty. Use `sortDirection=asc` or `sort=is_expired` to
+ * get expired-first results. For that reason `sort=expire_date` on the expired
+ * list defaults to `asc` instead of `desc` when you do not pass `sortDirection`.
+ * Whatever order you pick, an empty page is **not** the end of the list: keep
+ * following `_pagination.next_page` until it is `null` rather than stopping at the
+ * first empty page. This field is required when sortDirection is
+ * present.
+ */
+ sort?: 'last_activity' | 'expire_date' | 'subscribe_date' | 'is_expired' | null;
+
+ /**
+ * Direction for `sort`: `desc` (default) or `asc`. Requires `sort` to be set.
+ * Exception: `sort=expire_date` on the expired list defaults to `asc`, because
+ * `desc` moves the expired rows to the tail of the underlying collection and
+ * leaves the early pages empty. Passing `sortDirection` explicitly always wins.
+ */
+ sortDirection?: 'asc' | 'desc' | null;
}
export namespace FollowingListAllParams {
@@ -955,6 +1047,35 @@ export interface FollowingListExpiredParams {
* Search within following name/username.
*/
query?: string | null;
+
+ /**
+ * Order the list by `last_activity` (the followed creator's last activity),
+ * `expire_date` (subscription expiry), `subscribe_date` (subscription start) or
+ * `is_expired` (expired first — OnlyFans only offers this one on the expired
+ * list). Omit it to keep whichever order is currently stored for the account.
+ * **Note:** OnlyFans persists this order account-wide, so it also applies to later
+ * requests that omit `sort` and to the creator's own onlyfans.com UI, until it is
+ * changed again. **Expired list:** OnlyFans applies `offset` to the whole
+ * following collection and only then filters it down to expired subscriptions, so
+ * ordering by expiry descending puts the still-active subscriptions first and
+ * moves the expired rows to the tail of the collection — the first several hundred
+ * offsets then come back empty. Use `sortDirection=asc` or `sort=is_expired` to
+ * get expired-first results. For that reason `sort=expire_date` on the expired
+ * list defaults to `asc` instead of `desc` when you do not pass `sortDirection`.
+ * Whatever order you pick, an empty page is **not** the end of the list: keep
+ * following `_pagination.next_page` until it is `null` rather than stopping at the
+ * first empty page. This field is required when sortDirection is
+ * present.
+ */
+ sort?: 'last_activity' | 'expire_date' | 'subscribe_date' | 'is_expired' | null;
+
+ /**
+ * Direction for `sort`: `desc` (default) or `asc`. Requires `sort` to be set.
+ * Exception: `sort=expire_date` on the expired list defaults to `asc`, because
+ * `desc` moves the expired rows to the tail of the underlying collection and
+ * leaves the early pages empty. Passing `sortDirection` explicitly always wins.
+ */
+ sortDirection?: 'asc' | 'desc' | null;
}
export namespace FollowingListExpiredParams {
diff --git a/src/resources/index.ts b/src/resources/index.ts
index 05009760..cf7a6854 100644
--- a/src/resources/index.ts
+++ b/src/resources/index.ts
@@ -134,14 +134,13 @@ export {
} from './me';
export {
Media,
- type MediaDownloadResponse,
type MediaScrapeResponse,
type MediaUploadResponse,
type MediaDownloadParams,
type MediaScrapeParams,
type MediaUploadParams,
} from './media/media';
-export { Messages, type MessageAttachTagsResponse, type MessageAttachTagsParams } from './messages';
+export { Messages } from './messages';
export {
Notifications,
type NotificationListResponse,
diff --git a/src/resources/link-tags.ts b/src/resources/link-tags.ts
index 5489cf2d..104cf494 100644
--- a/src/resources/link-tags.ts
+++ b/src/resources/link-tags.ts
@@ -5,12 +5,12 @@ import { APIPromise } from '../core/api-promise';
import { RequestOptions } from '../internal/request-options';
/**
- * APIs for managing tags on free trial links and tracking links
+ * APIs for managing tags on free trial links, tracking links, and Smart Links
*/
export class LinkTags extends APIResource {
/**
- * Get all existing tags that have been used on free trial links and/or tracking
- * links for this account. This is a free endpoint.
+ * Get all existing tags that have been used on free trial links, tracking links,
+ * and/or Smart Links for this account. This is a free endpoint.
*
* @example
* ```ts
@@ -73,9 +73,9 @@ export namespace LinkTagListResponse {
export interface LinkTagListParams {
/**
- * Filter by link type. If not provided, returns tags for both types.
+ * Filter by link type. If not provided, returns tags for all types.
*/
- type?: 'trial_links' | 'tracking_links';
+ type?: 'trial_links' | 'tracking_links' | 'smart_links';
}
export declare namespace LinkTags {
diff --git a/src/resources/mass-messaging.ts b/src/resources/mass-messaging.ts
index 93673373..afe1be74 100644
--- a/src/resources/mass-messaging.ts
+++ b/src/resources/mass-messaging.ts
@@ -7,7 +7,8 @@ import { path } from '../internal/utils/path';
export class MassMessaging extends APIResource {
/**
- * Get the content of a mass message.
+ * Get the content and settings of a mass message, including a message scheduled
+ * for later.
*
* @example
* ```ts
@@ -27,7 +28,8 @@ export class MassMessaging extends APIResource {
}
/**
- * Update a mass message.
+ * Update the content, recipients, media, price, or scheduled send time of an
+ * existing mass message.
*
* @example
* ```ts
@@ -47,7 +49,8 @@ export class MassMessaging extends APIResource {
}
/**
- * List the pending or recently sent mass messages in the message queue.
+ * List pending, scheduled, and recently sent mass messages. Use an item ID to
+ * retrieve, update, reschedule, delete, or unsend the message.
*
* @example
* ```ts
@@ -676,6 +679,14 @@ export interface MassMessagingUpdateParams {
*/
text: string;
+ /**
+ * Body param: Screen `text` for OnlyFans banned words and block the update if any
+ * are found (returns a 422 listing the offending words). `strict_ban` blocks all
+ * tiers, `risky` blocks Risky + Replace/soften, `replace_soften` blocks
+ * Replace/soften only. Omit to disable screening.
+ */
+ blockBannedWords?: 'strict_ban' | 'risky' | 'replace_soften';
+
/**
* Body param: The ID of the Giphy GIF to attach to the message. Get IDs from the
* Giphy listing endpoints (`/giphy/trending`, `/giphy/search`).
@@ -701,8 +712,8 @@ export interface MassMessagingUpdateParams {
previews?: Array;
/**
- * Body param: Price for paid content (0 or between 3-200). In case this is not
- * zero, **mediaFiles** is required
+ * Body param: Price for paid content in USD (0 or between 3-200). In case this is
+ * not zero, **mediaFiles** is required
*/
price?: number;
@@ -731,8 +742,8 @@ export interface MassMessagingDeleteParams {
export interface MassMessagingRetrieveOverviewParams {
/**
- * The latest mass message to retrieve. Keep empty to get all. MUST BE DATE AFTER
- * `startDate`. This is also used for pagination.
+ * The latest mass message to retrieve. Keep empty to get all. It must be after
+ * `startDate` and is also used for pagination.
*/
endDate?: string;
@@ -758,6 +769,14 @@ export interface MassMessagingSendParams {
*/
text: string;
+ /**
+ * Screen `text` for OnlyFans banned words and block the send if any are found
+ * (returns a 422 listing the offending words). `strict_ban` blocks all tiers,
+ * `risky` blocks Risky + Replace/soften, `replace_soften` blocks Replace/soften
+ * only. Omit to disable screening.
+ */
+ blockBannedWords?: 'strict_ban' | 'risky' | 'replace_soften';
+
/**
* Array of user list IDs that the mass message will NOT be sent to.
*/
@@ -788,7 +807,7 @@ export interface MassMessagingSendParams {
previews?: Array;
/**
- * Price for paid content (0 or between 3-200). In case this is not zero,
+ * Price for paid content in USD (0 or between 3-200). In case this is not zero,
* **mediaFiles** is required
*/
price?: number;
@@ -818,6 +837,13 @@ export interface MassMessagingSendParams {
*/
scheduledDate?: string;
+ /**
+ * Only send to fans who subscribed within the last N calendar days (1-30,
+ * including today). Can be combined with `userLists` and `userIds`. Cannot be
+ * combined with `scheduledDate` or `saveForLater`.
+ */
+ subscribedWithinLastDays?: number;
+
/**
* Array of user IDs that the mass message will be sent to.
*/
diff --git a/src/resources/media/index.ts b/src/resources/media/index.ts
index da4dede6..a471989a 100644
--- a/src/resources/media/index.ts
+++ b/src/resources/media/index.ts
@@ -2,7 +2,6 @@
export {
Media,
- type MediaDownloadResponse,
type MediaScrapeResponse,
type MediaUploadResponse,
type MediaDownloadParams,
diff --git a/src/resources/media/media.ts b/src/resources/media/media.ts
index 08cee5e2..80790763 100644
--- a/src/resources/media/media.ts
+++ b/src/resources/media/media.ts
@@ -30,21 +30,22 @@ export class Media extends APIResource {
* Downloads a file directly from a `https://cdn*.onlyfans.com/*` URL. When the
* file is already cached on our CDN, this endpoint returns a `302` redirect to a
* `https://cdn.fansapi.com/*` URL. Most HTTP clients follow redirects
- * automatically (`curl` requires `-L`). Otherwise, the file is streamed through
- * our proxies and queued for caching.
+ * automatically (`curl` requires `-L`). Otherwise, the file is redirected to
+ * `dl.fansapi.com`, which streams it through the account proxy and reports billing
+ * back to the API.
*
* @example
* ```ts
- * const response = await client.media.download('cdnUrl', {
+ * await client.media.download('cdnUrl', {
* account: 'acct_XXXXXXXXXXXXXXX',
* });
* ```
*/
- download(cdnURL: string, params: MediaDownloadParams, options?: RequestOptions): APIPromise {
+ download(cdnURL: string, params: MediaDownloadParams, options?: RequestOptions): APIPromise {
const { account } = params;
return this._client.get(path`/api/${account}/media/download/${cdnURL}`, {
...options,
- headers: buildHeaders([{ Accept: 'text/plain' }, options?.headers]),
+ headers: buildHeaders([{ Accept: '*/*' }, options?.headers]),
});
}
@@ -93,8 +94,6 @@ export class Media extends APIResource {
}
}
-export type MediaDownloadResponse = string;
-
export interface MediaScrapeResponse {
expiration_date?: string;
@@ -173,7 +172,9 @@ export interface MediaScrapeParams {
export interface MediaUploadParams {
/**
* Set to `true` to process uploads in the background. Returns a `polling_url` to
- * check status. Recommended for large files.
+ * check status. Recommended for large files. Instead of polling, you can subscribe
+ * to the `media_uploads.completed` and `media_uploads.failed` webhook events —
+ * they only fire for async uploads.
*/
async?: boolean;
@@ -201,7 +202,6 @@ Media.Vault = Vault;
export declare namespace Media {
export {
- type MediaDownloadResponse as MediaDownloadResponse,
type MediaScrapeResponse as MediaScrapeResponse,
type MediaUploadResponse as MediaUploadResponse,
type MediaDownloadParams as MediaDownloadParams,
diff --git a/src/resources/media/uploads.ts b/src/resources/media/uploads.ts
index a2c52d62..91c04eb5 100644
--- a/src/resources/media/uploads.ts
+++ b/src/resources/media/uploads.ts
@@ -17,6 +17,11 @@ export class Uploads extends APIResource {
* - `completed` — Upload finished, `media` and `credits_used` are included
* - `failed` — Upload failed, `error` is included
*
+ * Instead of polling, you can subscribe to the `media_uploads.completed` and
+ * `media_uploads.failed` webhook events. They carry the same fields as this
+ * endpoint and are only sent for async (`async=true`) uploads — synchronous
+ * uploads return their result directly.
+ *
* @example
* ```ts
* const response = await client.media.uploads.getStatus(
@@ -42,7 +47,8 @@ export type UploadGetStatusResponse =
| UploadGetStatusResponse.UnionMember0
| UploadGetStatusResponse.UnionMember1
| UploadGetStatusResponse.UnionMember2
- | UploadGetStatusResponse.UnionMember3;
+ | UploadGetStatusResponse.UnionMember3
+ | UploadGetStatusResponse.UnionMember4;
export namespace UploadGetStatusResponse {
/**
@@ -66,19 +72,30 @@ export namespace UploadGetStatusResponse {
}
/**
- * Completed POST /media/vault upload
+ * Upload rejected by OnlyFans — `error` carries the upstream reason verbatim
*/
export interface UnionMember2 {
+ error?: string;
+
+ prefixed_id?: string;
+
+ status?: string;
+ }
+
+ /**
+ * Completed POST /media/vault upload
+ */
+ export interface UnionMember3 {
credits_used?: number;
- media?: UnionMember2.Media;
+ media?: UnionMember3.Media;
prefixed_id?: string;
status?: string;
}
- export namespace UnionMember2 {
+ export namespace UnionMember3 {
export interface Media {
id?: number;
@@ -133,17 +150,17 @@ export namespace UploadGetStatusResponse {
/**
* Completed POST /media/upload upload
*/
- export interface UnionMember3 {
+ export interface UnionMember4 {
credits_used?: number;
- media?: UnionMember3.Media;
+ media?: UnionMember4.Media;
prefixed_id?: string;
status?: string;
}
- export namespace UnionMember3 {
+ export namespace UnionMember4 {
export interface Media {
additional?: Media.Additional;
diff --git a/src/resources/media/vault/lists/lists.ts b/src/resources/media/vault/lists/lists.ts
index 2161d5cb..736cea07 100644
--- a/src/resources/media/vault/lists/lists.ts
+++ b/src/resources/media/vault/lists/lists.ts
@@ -58,17 +58,32 @@ export class Lists extends APIResource {
* ```ts
* const list = await client.media.vault.lists.update('123', {
* account: 'acct_XXXXXXXXXXXXXXX',
+ * name: 'My renamed list',
* });
* ```
*/
update(listID: string, params: ListUpdateParams, options?: RequestOptions): APIPromise {
- const { account } = params;
- return this._client.put(path`/api/${account}/media/vault/lists/${listID}`, options);
+ const { account, ...body } = params;
+ return this._client.put(path`/api/${account}/media/vault/lists/${listID}`, { body, ...options });
}
/**
* List your Vault lists (categories).
*
+ * Every response carries an `ETag` computed over the `data` payload. Send it back
+ * as `If-None-Match` on your next call and you will get a `304 Not Modified` with
+ * an empty body when nothing changed, so you can keep serving your cached copy
+ * instead of re-parsing the full list. Credits are debited either way — we still
+ * have to ask OnlyFans for the current state to know whether it changed.
+ *
+ * The `ETag` covers `data` only, never `_meta` — your credits balance changes on
+ * every call, so including it would mean the `ETag` never matches. Because a `304`
+ * has no body, it also has no `_meta`: read the current credits and rate-limit
+ * counters from the `X-OFAPI-Credits-Used`, `X-OFAPI-Credits-Balance`,
+ * `X-Rate-Limit-Limit-Minute` and `X-Rate-Limit-Remaining-Minute` response
+ * headers, which are sent on `304` responses too. The `_meta` inside a body you
+ * cached earlier is stale by definition.
+ *
* @example
* ```ts
* const lists = await client.media.vault.lists.list(
@@ -298,104 +313,191 @@ export namespace ListUpdateResponse {
}
}
-export interface ListListResponse {
- _meta?: ListListResponse._Meta;
-
- data?: ListListResponse.Data;
-}
+/**
+ * Success
+ */
+export type ListListResponse = ListListResponse.UnionMember0 | ListListResponse.UnionMember1;
export namespace ListListResponse {
- export interface _Meta {
- _cache?: _Meta._Cache;
-
- _credits?: _Meta._Credits;
+ /**
+ * Success
+ */
+ export interface UnionMember0 {
+ _meta?: UnionMember0._Meta;
- _rate_limits?: _Meta._RateLimits;
+ data?: UnionMember0.Data;
}
- export namespace _Meta {
- export interface _Cache {
- is_cached?: boolean;
+ export namespace UnionMember0 {
+ export interface _Meta {
+ _cache?: _Meta._Cache;
- note?: string;
+ _credits?: _Meta._Credits;
+
+ _rate_limits?: _Meta._RateLimits;
}
- export interface _Credits {
- balance?: number;
+ export namespace _Meta {
+ export interface _Cache {
+ is_cached?: boolean;
- note?: string;
+ note?: string;
+ }
- used?: number;
+ export interface _Credits {
+ balance?: number;
+
+ note?: string;
+
+ used?: number;
+ }
+
+ export interface _RateLimits {
+ limit_day?: number;
+
+ limit_minute?: number;
+
+ remaining_day?: number;
+
+ remaining_minute?: number;
+ }
}
- export interface _RateLimits {
- limit_day?: number;
+ export interface Data {
+ all?: Data.All;
- limit_minute?: number;
+ canCreateVaultLists?: boolean;
- remaining_day?: number;
+ hasMore?: boolean;
- remaining_minute?: number;
+ list?: Array;
+
+ order?: string;
+
+ sort?: string;
}
- }
- export interface Data {
- all?: Data.All;
+ export namespace Data {
+ export interface All {
+ audiosCount?: number;
+
+ gifsCount?: number;
+
+ medias?: Array;
- canCreateVaultLists?: boolean;
+ photosCount?: number;
- hasMore?: boolean;
+ videosCount?: number;
+ }
+
+ export namespace All {
+ export interface Media {
+ type?: string;
+
+ url?: string;
+ }
+ }
+
+ export interface List {
+ id?: number;
+
+ audiosCount?: number;
+
+ canDelete?: boolean;
+
+ canUpdate?: boolean;
+
+ gifsCount?: number;
+
+ hasMedia?: boolean;
+
+ medias?: Array;
- list?: Array;
+ name?: string;
- order?: string;
+ photosCount?: number;
- sort?: string;
+ type?: string;
+
+ videosCount?: number;
+ }
+ }
}
- export namespace Data {
- export interface All {
- audiosCount?: number;
+ /**
+ * Success (lightweight=true)
+ */
+ export interface UnionMember1 {
+ _meta?: UnionMember1._Meta;
- gifsCount?: number;
+ data?: UnionMember1.Data;
+ }
- medias?: Array;
+ export namespace UnionMember1 {
+ export interface _Meta {
+ _cache?: _Meta._Cache;
- photosCount?: number;
+ _credits?: _Meta._Credits;
- videosCount?: number;
+ _rate_limits?: _Meta._RateLimits;
}
- export namespace All {
- export interface Media {
- type?: string;
+ export namespace _Meta {
+ export interface _Cache {
+ is_cached?: boolean;
- url?: string;
+ note?: string;
+ }
+
+ export interface _Credits {
+ balance?: number;
+
+ note?: string;
+
+ used?: number;
+ }
+
+ export interface _RateLimits {
+ limit_day?: number;
+
+ limit_minute?: number;
+
+ remaining_day?: number;
+
+ remaining_minute?: number;
}
}
- export interface List {
- id?: number;
+ export interface Data {
+ all?: Data.All;
- audiosCount?: number;
+ canCreateVaultLists?: boolean;
- canDelete?: boolean;
+ hasMore?: boolean;
- canUpdate?: boolean;
+ list?: Array;
- gifsCount?: number;
+ order?: string;
- hasMedia?: boolean;
+ sort?: string;
+ }
+
+ export namespace Data {
+ export interface All {
+ mediaCount?: number;
+ }
- medias?: Array;
+ export interface List {
+ id?: number;
- name?: string;
+ canUpdate?: boolean;
- photosCount?: number;
+ mediaCount?: number;
- type?: string;
+ name?: string;
- videosCount?: number;
+ type?: string;
+ }
}
}
}
@@ -462,12 +564,25 @@ export interface ListRetrieveParams {
export interface ListUpdateParams {
/**
- * The Account ID
+ * Path param: The Account ID
*/
account: string;
+
+ /**
+ * Body param: The new name for the vault list. Must not be greater than 255
+ * characters.
+ */
+ name: string;
}
export interface ListListParams {
+ /**
+ * Set to `true` to return only `id`, `name`, `type`, `canUpdate` and a rolled-up
+ * `mediaCount` per list, dropping the `medias` previews. Much smaller payload —
+ * ideal for rendering a folder picker. Default: `false`
+ */
+ lightweight?: boolean;
+
/**
* Number of media to return per page. Default: `24`
*/
diff --git a/src/resources/media/vault/lists/media.ts b/src/resources/media/vault/lists/media.ts
index 6f8aff53..d62bfa6c 100644
--- a/src/resources/media/vault/lists/media.ts
+++ b/src/resources/media/vault/lists/media.ts
@@ -12,7 +12,7 @@ export class Media extends APIResource {
* @example
* ```ts
* const response = await client.media.vault.lists.media.add(
- * 'nihil',
+ * 'voluptate',
* { account: 'acct_XXXXXXXXXXXXXXX', mediaIds: ['string'] },
* );
* ```
@@ -28,7 +28,7 @@ export class Media extends APIResource {
* @example
* ```ts
* const media = await client.media.vault.lists.media.remove(
- * 'nihil',
+ * 'voluptate',
* { account: 'acct_XXXXXXXXXXXXXXX', mediaIds: ['string'] },
* );
* ```
diff --git a/src/resources/media/vault/vault.ts b/src/resources/media/vault/vault.ts
index dab8621a..43595d4d 100644
--- a/src/resources/media/vault/vault.ts
+++ b/src/resources/media/vault/vault.ts
@@ -573,7 +573,9 @@ export interface VaultDeleteParams {
export interface VaultUploadParams {
/**
* Set to `true` to process uploads in the background. Returns a `polling_url` to
- * check status. Recommended for large files.
+ * check status. Recommended for large files. Instead of polling, you can subscribe
+ * to the `media_uploads.completed` and `media_uploads.failed` webhook events —
+ * they only fire for async uploads.
*/
async?: boolean;
diff --git a/src/resources/messages.ts b/src/resources/messages.ts
index 7793d393..458bbdfc 100644
--- a/src/resources/messages.ts
+++ b/src/resources/messages.ts
@@ -1,105 +1,5 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import { APIResource } from '../core/resource';
-import { APIPromise } from '../core/api-promise';
-import { RequestOptions } from '../internal/request-options';
-import { path } from '../internal/utils/path';
-export class Messages extends APIResource {
- /**
- * Attach Tags (Release Forms) to a message that has already been sent. Please
- * note, that this is a "sync" operation - for example, if you provide empty
- * `rfTag` it will remove all existing tags already attached to the message.
- *
- * @example
- * ```ts
- * const response = await client.messages.attachTags(
- * '123456789',
- * { account: 'acct_XXXXXXXXXXXXXXX' },
- * );
- * ```
- */
- attachTags(
- messageID: string,
- params: MessageAttachTagsParams,
- options?: RequestOptions,
- ): APIPromise {
- const { account, ...body } = params;
- return this._client.post(path`/api/${account}/messages/${messageID}/attach-tags`, { body, ...options });
- }
-}
-
-export interface MessageAttachTagsResponse {
- _meta?: MessageAttachTagsResponse._Meta;
-
- data?: MessageAttachTagsResponse.Data;
-}
-
-export namespace MessageAttachTagsResponse {
- export interface _Meta {
- _cache?: _Meta._Cache;
-
- _credits?: _Meta._Credits;
-
- _rate_limits?: _Meta._RateLimits;
- }
-
- export namespace _Meta {
- export interface _Cache {
- is_cached?: boolean;
-
- note?: string;
- }
-
- export interface _Credits {
- balance?: number;
-
- note?: string;
-
- used?: number;
- }
-
- export interface _RateLimits {
- limit_day?: number;
-
- limit_minute?: number;
-
- remaining_day?: number;
-
- remaining_minute?: number;
- }
- }
-
- export interface Data {
- success?: boolean;
- }
-}
-
-export interface MessageAttachTagsParams {
- /**
- * Path param: The Account ID
- */
- account: string;
-
- /**
- * Body param: Array of OnlyFans Release Form Guest IDs to tag in your message
- */
- rfGuest?: string;
-
- /**
- * Body param: Array of OnlyFans Release Form Partners IDs to tag in your message
- */
- rfPartner?: string;
-
- /**
- * Body param: Array of OnlyFans Creator User IDs to tag in your message
- */
- rfTag?: string;
-}
-
-export declare namespace Messages {
- export {
- type MessageAttachTagsResponse as MessageAttachTagsResponse,
- type MessageAttachTagsParams as MessageAttachTagsParams,
- };
-}
+export class Messages extends APIResource {}
diff --git a/src/resources/notifications/notifications.ts b/src/resources/notifications/notifications.ts
index f9106609..6e4c520a 100644
--- a/src/resources/notifications/notifications.ts
+++ b/src/resources/notifications/notifications.ts
@@ -623,7 +623,7 @@ export interface NotificationListParams {
limit?: number;
/**
- * Whether to skip user details. Default `all`
+ * Whether to skip user details. Defaults to `all`.
*/
skip_users?: 'all' | 'none';
diff --git a/src/resources/posts/comments.ts b/src/resources/posts/comments.ts
index 1da3469e..36ae6c40 100644
--- a/src/resources/posts/comments.ts
+++ b/src/resources/posts/comments.ts
@@ -12,7 +12,7 @@ export class Comments extends APIResource {
* @example
* ```ts
* const comment = await client.posts.comments.create(
- * 'impedit',
+ * 'repellat',
* {
* account: 'acct_XXXXXXXXXXXXXXX',
* text: 'This is a comment.',
@@ -38,7 +38,7 @@ export class Comments extends APIResource {
* @example
* ```ts
* const comments = await client.posts.comments.list(
- * 'impedit',
+ * 'repellat',
* { account: 'acct_XXXXXXXXXXXXXXX' },
* );
* ```
diff --git a/src/resources/posts/posts.ts b/src/resources/posts/posts.ts
index bea51422..281afd12 100644
--- a/src/resources/posts/posts.ts
+++ b/src/resources/posts/posts.ts
@@ -1126,6 +1126,14 @@ export interface PostCreateParams {
*/
text: string;
+ /**
+ * Screen `text` for OnlyFans banned words and block the post if any are found
+ * (returns a 422 listing the offending words). `strict_ban` blocks all tiers,
+ * `risky` blocks Risky + Replace/soften, `replace_soften` blocks Replace/soften
+ * only. Omit to disable screening.
+ */
+ blockBannedWords?: 'strict_ban' | 'risky' | 'replace_soften';
+
/**
* Number of days after which the post will expire. Between 1 and 30 days. Keep
* empty for no expiration.
@@ -1217,6 +1225,14 @@ export interface PostUpdateParams {
*/
text: string;
+ /**
+ * Body param: Screen `text` for OnlyFans banned words and block the update if any
+ * are found (returns a 422 listing the offending words). `strict_ban` blocks all
+ * tiers, `risky` blocks Risky + Replace/soften, `replace_soften` blocks
+ * Replace/soften only. Omit to disable screening.
+ */
+ blockBannedWords?: 'strict_ban' | 'risky' | 'replace_soften';
+
/**
* Body param: Number of days after which the post will expire. Between 1 and 30
* days. Keep empty for no expiration.
diff --git a/src/resources/queue.ts b/src/resources/queue.ts
index 86b5a584..4b2a6f2c 100644
--- a/src/resources/queue.ts
+++ b/src/resources/queue.ts
@@ -7,14 +7,14 @@ import { path } from '../internal/utils/path';
export class Queue extends APIResource {
/**
- * List posts and messages in the queue.
+ * List scheduled posts and mass messages for a date range. Use the type filter to
+ * return only posts, messages, or both.
*
* @example
* ```ts
* const queues = await client.queue.list(
* 'acct_XXXXXXXXXXXXXXX',
* {
- * limit: 20,
* publishDateEnd: '2025-01-01',
* publishDateStart: '2025-01-01',
* timezone: 'Europe/Prague',
@@ -308,25 +308,31 @@ export namespace QueuePublishResponse {
export interface QueueListParams {
/**
- * Maximum number of queue items to return (default = 20)
- */
- limit: number;
-
- /**
- * Latest publish date to return
+ * Latest publish date to return. Must be a valid date. Must be a valid date. Must
+ * be a date after or equal to publishDateStart.
*/
publishDateEnd: string;
/**
- * Earliest publish date to return (must be at least today)
+ * Earliest publish date to return (must be at least today). Must be a valid date.
+ * Must be a valid date. Must be a date after or equal to today.
*/
publishDateStart: string;
/**
- * Time timezone of the provided dates.
- * [View available timezone values](https://www.php.net/manual/en/timezones.php)
+ * Timezone of the provided dates.
+ * [View available timezone values](https://www.php.net/manual/en/timezones.php).
+ * Must be a valid time zone, such as Africa/Accra.
*/
timezone: string;
+
+ /**
+ * Maximum number of queue items to return (default 20). Must be at least 1. Must
+ * not be greater than 100.
+ */
+ limit?: number;
+
+ type?: Array<'chat' | 'post'>;
}
export interface QueueCountParams {
diff --git a/src/resources/release-forms.ts b/src/resources/release-forms.ts
index 13463acf..ca0b3863 100644
--- a/src/resources/release-forms.ts
+++ b/src/resources/release-forms.ts
@@ -55,7 +55,8 @@ export class ReleaseForms extends APIResource {
/**
* Get a paginated list of users that can be tagged in release forms. These are
* verified creators who have signed release forms to appear in your content. Use
- * `offset` and `limit` for pagination.
+ * `offset` and `limit` for pagination, following `_pagination.next_page` until it
+ * is `null`.
*
* @example
* ```ts
@@ -331,11 +332,11 @@ export namespace ReleaseFormListTaggableUsersResponse {
export interface _Pagination {
next_page?: string;
+
+ notice?: string;
}
export interface Data {
- hasMore?: boolean;
-
items?: Array;
}
diff --git a/src/resources/saved-for-later/messages/settings.ts b/src/resources/saved-for-later/messages/settings.ts
index 599a9525..09d6973d 100644
--- a/src/resources/saved-for-later/messages/settings.ts
+++ b/src/resources/saved-for-later/messages/settings.ts
@@ -50,7 +50,7 @@ export class Settings extends APIResource {
* const response =
* await client.savedForLater.messages.settings.enableOrUpdateAutomaticMessaging(
* 'acct_XXXXXXXXXXXXXXX',
- * { period: 12 },
+ * { period: 24 },
* );
* ```
*/
diff --git a/src/resources/saved-for-later/posts/settings.ts b/src/resources/saved-for-later/posts/settings.ts
index 2b04cbb2..41feb4c0 100644
--- a/src/resources/saved-for-later/posts/settings.ts
+++ b/src/resources/saved-for-later/posts/settings.ts
@@ -50,7 +50,7 @@ export class Settings extends APIResource {
* const response =
* await client.savedForLater.posts.settings.enableOrUpdateAutomaticPosting(
* 'acct_XXXXXXXXXXXXXXX',
- * { period: 12 },
+ * { period: 24 },
* );
* ```
*/
diff --git a/src/resources/shared-tracking-links/shared-tracking-links.ts b/src/resources/shared-tracking-links/shared-tracking-links.ts
index 3dc886c1..a4071c4d 100644
--- a/src/resources/shared-tracking-links/shared-tracking-links.ts
+++ b/src/resources/shared-tracking-links/shared-tracking-links.ts
@@ -208,20 +208,41 @@ export namespace SharedTrackingLinkRevokeAccessResponse {
export interface SharedTrackingLinkListParams {
/**
- * The number of shared tracking links to return. Default `10`
+ * The number of shared tracking links to return. Default `10`. Must be at least 1.
+ * Must not be greater than 100.
*/
limit?: number;
/**
- * The offset used for pagination. Default `0`
+ * The offset used for pagination. Default `0`. Must be at least 0.
*/
offset?: number;
/**
- * Wait for the database sync to finish, instead of running it in the background.
- * **Will result in longer response times, use with caution**. Default `false`
+ * Whether pagination metadata is enabled. Default `1`.
*/
- synchronous?: boolean | null;
+ pagination?: 0 | 1;
+
+ /**
+ * Whether deleted links participate in sorting. Default `1`.
+ */
+ sorting_deleted?: 0 | 1;
+
+ /**
+ * Whether statistics are included. Default `true`. Must not be greater than 10
+ * characters.
+ */
+ stats?: string;
+
+ /**
+ * Wait for the database sync instead of processing it in the background.
+ */
+ synchronous?: boolean;
+
+ /**
+ * Whether to include deleted shared tracking links. Default `1`.
+ */
+ with_deleted?: 0 | 1;
}
export interface SharedTrackingLinkRevokeAccessParams {
diff --git a/src/resources/shared-trial-links/shared-trial-links.ts b/src/resources/shared-trial-links/shared-trial-links.ts
index bf1fa6c3..2935a811 100644
--- a/src/resources/shared-trial-links/shared-trial-links.ts
+++ b/src/resources/shared-trial-links/shared-trial-links.ts
@@ -209,20 +209,22 @@ export namespace SharedTrialLinkRevokeAccessResponse {
export interface SharedTrialLinkListParams {
/**
- * The number of shared trial links to return. Default `10`
+ * The number of shared trial links to return. Default `10`. Must be at least 1.
+ * Must not be greater than 100.
*/
limit?: number;
/**
- * The offset used for pagination. Default `0`
+ * The offset used for pagination. Default `0`. Must be at least 0.
*/
offset?: number;
+ pagination?: 0 | 1;
+
/**
- * Wait for the database sync to finish, instead of running it in the background.
- * **Will result in longer response times, use with caution**. Default `false`
+ * Wait for the database sync instead of processing it in the background.
*/
- synchronous?: boolean | null;
+ synchronous?: boolean;
}
export interface SharedTrialLinkRevokeAccessParams {
diff --git a/src/resources/smart-link-postbacks.ts b/src/resources/smart-link-postbacks.ts
index 82dbf90d..43a3ff0a 100644
--- a/src/resources/smart-link-postbacks.ts
+++ b/src/resources/smart-link-postbacks.ts
@@ -18,7 +18,7 @@ export class SmartLinkPostbacks extends APIResource {
* await client.smartLinkPostbacks.create({
* conversion_types: ['new_subscriber', 'new_transaction'],
* smart_link_scope: 'campaign_specific',
- * url: 'https://example.com/postback?click={click_id}&type={conversion_type}&gclid={gclid}',
+ * url: 'https://example.com/postback?click={external_click_id}&type={conversion_type}&gclid={gclid}',
* });
* ```
*/
@@ -51,7 +51,7 @@ export class SmartLinkPostbacks extends APIResource {
* await client.smartLinkPostbacks.update(123, {
* conversion_types: ['new_subscriber'],
* smart_link_scope: 'global',
- * url: 'https://example.com/postback?click={click_id}&type={conversion_type}',
+ * url: 'https://example.com/postback?click={external_click_id}&type={conversion_type}',
* });
* ```
*/
@@ -122,10 +122,16 @@ export namespace SmartLinkPostbackCreateResponse {
export interface Data {
id?: number;
+ body?: string;
+
conversion_types?: Array;
created_at?: string;
+ headers?: Array;
+
+ http_method?: string;
+
latest_response?: string | null;
smart_link_ids?: Array;
@@ -134,10 +140,22 @@ export namespace SmartLinkPostbackCreateResponse {
smart_links?: Array;
+ traffic_source_ids?: Array;
+
+ traffic_sources?: Array;
+
updated_at?: string;
url?: string;
}
+
+ export namespace Data {
+ export interface Header {
+ name?: string;
+
+ value?: string;
+ }
+ }
}
export interface SmartLinkPostbackRetrieveResponse {
@@ -172,10 +190,16 @@ export namespace SmartLinkPostbackRetrieveResponse {
export interface Data {
id?: number;
+ body?: string;
+
conversion_types?: Array;
created_at?: string;
+ headers?: Array;
+
+ http_method?: string;
+
latest_response?: string | null;
smart_link_ids?: Array;
@@ -184,12 +208,22 @@ export namespace SmartLinkPostbackRetrieveResponse {
smart_links?: Array;
+ traffic_source_ids?: Array;
+
+ traffic_sources?: Array;
+
updated_at?: string;
url?: string;
}
export namespace Data {
+ export interface Header {
+ name?: string;
+
+ value?: string;
+ }
+
export interface SmartLink {
account_display_name?: string;
@@ -234,10 +268,16 @@ export namespace SmartLinkPostbackUpdateResponse {
export interface Data {
id?: number;
+ body?: string;
+
conversion_types?: Array;
created_at?: string;
+ headers?: Array;
+
+ http_method?: string;
+
latest_response?: string | null;
smart_link_ids?: Array;
@@ -246,12 +286,22 @@ export namespace SmartLinkPostbackUpdateResponse {
smart_links?: Array;
+ traffic_source_ids?: Array;
+
+ traffic_sources?: Array;
+
updated_at?: string;
url?: string;
}
export namespace Data {
+ export interface Header {
+ name?: string;
+
+ value?: string;
+ }
+
export interface SmartLink {
account_display_name?: string;
@@ -296,10 +346,16 @@ export namespace SmartLinkPostbackListResponse {
export interface Data {
id?: number;
+ body?: string;
+
conversion_types?: Array;
created_at?: string;
+ headers?: Array;
+
+ http_method?: string;
+
latest_response?: Data.LatestResponse;
smart_link_ids?: Array;
@@ -308,12 +364,22 @@ export namespace SmartLinkPostbackListResponse {
smart_links?: Array;
+ traffic_source_ids?: Array;
+
+ traffic_sources?: Array;
+
updated_at?: string;
url?: string;
}
export namespace Data {
+ export interface Header {
+ name?: string;
+
+ value?: string;
+ }
+
export interface LatestResponse {
id?: number;
@@ -359,17 +425,50 @@ export interface SmartLinkPostbackCreateParams {
smart_link_scope: 'global' | 'campaign_specific';
/**
- * The destination URL. Variables such as `{click_id}`, `{fbclid}`, `{gclid}`, and
- * `{ttclid}` are replaced when the postback is dispatched.
+ * The destination URL. Variables such as `{external_click_id}`, `{fbclid}`,
+ * `{gclid}`, `{gbraid}`, `{wbraid}`, `{ttclid}`, and `{sccid}` are replaced when
+ * the postback is dispatched.
*/
url: string;
+ /**
+ * Optional request body template for POST postbacks. Variables are replaced when
+ * the postback is dispatched.
+ */
+ body?: string;
+
+ /**
+ * Optional request headers. Header values may include postback variables.
+ */
+ headers?: Array;
+
+ /**
+ * HTTP method used for the postback request. Defaults to `GET` when omitted.
+ */
+ http_method?: 'GET' | 'POST';
+
/**
* Smart Link ULIDs. Required when `smart_link_scope` is `campaign_specific`.
*/
smart_link_ids?: Array;
}
+export namespace SmartLinkPostbackCreateParams {
+ export interface Header {
+ /**
+ * This field is required when headers._.value is present. Must match
+ * the regex /\A[A-Za-z0-9!#$%&'_+.^\_`|~-]+\z/. Must not be greater than 100
+ * characters.
+ */
+ name?: string | null;
+
+ /**
+ * Must not be greater than 2000 characters.
+ */
+ value?: string | null;
+ }
+}
+
export interface SmartLinkPostbackUpdateParams {
/**
* One or more Smart Link conversion types that should trigger this postback.
@@ -386,12 +485,44 @@ export interface SmartLinkPostbackUpdateParams {
*/
url: string;
+ /**
+ * Optional request body template for POST postbacks. Variables are replaced when
+ * the postback is dispatched.
+ */
+ body?: string;
+
+ /**
+ * Optional request headers. Header values may include postback variables.
+ */
+ headers?: Array;
+
+ /**
+ * HTTP method used for the postback request. Existing value is kept when omitted.
+ */
+ http_method?: 'GET' | 'POST';
+
/**
* Smart Link ULIDs. Required when `smart_link_scope` is `campaign_specific`.
*/
smart_link_ids?: Array;
}
+export namespace SmartLinkPostbackUpdateParams {
+ export interface Header {
+ /**
+ * This field is required when headers._.value is present. Must match
+ * the regex /\A[A-Za-z0-9!#$%&'_+.^\_`|~-]+\z/. Must not be greater than 100
+ * characters.
+ */
+ name?: string | null;
+
+ /**
+ * Must not be greater than 2000 characters.
+ */
+ value?: string | null;
+ }
+}
+
export declare namespace SmartLinkPostbacks {
export {
type SmartLinkPostbackCreateResponse as SmartLinkPostbackCreateResponse,
diff --git a/src/resources/smart-links.ts b/src/resources/smart-links.ts
index 5d729c2f..36b175de 100644
--- a/src/resources/smart-links.ts
+++ b/src/resources/smart-links.ts
@@ -76,7 +76,7 @@ export class SmartLinks extends APIResource {
* @example
* ```ts
* const response = await client.smartLinks.listClicks(
- * 'rerum',
+ * 'dolorem',
* );
* ```
*/
@@ -95,7 +95,7 @@ export class SmartLinks extends APIResource {
* @example
* ```ts
* const response = await client.smartLinks.listConversions(
- * 'facilis',
+ * 'a',
* );
* ```
*/
@@ -113,9 +113,7 @@ export class SmartLinks extends APIResource {
*
* @example
* ```ts
- * const response = await client.smartLinks.listFans(
- * 'ducimus',
- * );
+ * const response = await client.smartLinks.listFans('libero');
* ```
*/
listFans(
@@ -132,7 +130,7 @@ export class SmartLinks extends APIResource {
* @example
* ```ts
* const response = await client.smartLinks.listSpenders(
- * 'nam',
+ * 'sed',
* );
* ```
*/
@@ -149,7 +147,7 @@ export class SmartLinks extends APIResource {
*
* @example
* ```ts
- * await client.smartLinks.retrieveCohortArps('eaque');
+ * await client.smartLinks.retrieveCohortArps('omnis');
* ```
*/
retrieveCohortArps(
@@ -171,7 +169,7 @@ export class SmartLinks extends APIResource {
* @example
* ```ts
* const response = await client.smartLinks.retrieveStats(
- * 'impedit',
+ * 'in',
* );
* ```
*/
@@ -244,7 +242,7 @@ export namespace SmartLinkCreateResponse {
name?: string;
- revenue?: string | null;
+ revenue?: string;
subscribers_count?: number;
@@ -609,6 +607,8 @@ export namespace SmartLinkListClicksResponse {
fbclid?: string | null;
+ gbraid?: string | null;
+
gclid?: string;
gross_clicks?: number;
@@ -621,6 +621,8 @@ export namespace SmartLinkListClicksResponse {
referrer?: string;
+ sccid?: string | null;
+
ttclid?: string;
user_agent?: string;
@@ -634,6 +636,8 @@ export namespace SmartLinkListClicksResponse {
utm_source?: string;
utm_term?: string;
+
+ wbraid?: string | null;
}
export interface Summary {
@@ -752,6 +756,8 @@ export namespace SmartLinkListConversionsResponse {
fbclid?: string | null;
+ gbraid?: string | null;
+
gclid?: string;
gross_clicks?: number;
@@ -764,6 +770,8 @@ export namespace SmartLinkListConversionsResponse {
referrer?: string;
+ sccid?: string | null;
+
ttclid?: string;
user_agent?: string;
@@ -777,6 +785,8 @@ export namespace SmartLinkListConversionsResponse {
utm_source?: string;
utm_term?: string;
+
+ wbraid?: string | null;
}
export interface Fan {
@@ -853,7 +863,11 @@ export namespace SmartLinkListFansResponse {
offset?: number;
+ previously_subscribed?: string | null;
+
sort?: string;
+
+ subscribed_using_promo?: string | null;
}
export interface Row {
@@ -877,14 +891,46 @@ export namespace SmartLinkListFansResponse {
revenue_net?: number;
+ subscription_insights?: Row.SubscriptionInsights;
+
tips_net?: number;
username?: string;
}
+ export namespace Row {
+ export interface SubscriptionInsights {
+ current_subscription?: SubscriptionInsights.CurrentSubscription;
+
+ current_subscription_from_smart_link?: boolean;
+
+ has_subscription_data?: boolean;
+
+ previously_subscribed?: boolean;
+
+ subscribed_using_promo?: boolean;
+ }
+
+ export namespace SubscriptionInsights {
+ export interface CurrentSubscription {
+ action?: string;
+
+ is_free?: boolean;
+
+ price?: number;
+
+ regular_price?: number;
+
+ type?: string;
+ }
+ }
+ }
+
export interface Summary {
fans_total?: number;
+ fans_with_1_plus_messages_total?: number;
+
fans_with_3_plus_messages_total?: number;
revenue_net_total?: number;
@@ -1043,17 +1089,14 @@ export interface SmartLinkListParams {
*/
account_ids?: string | null;
+ filter?: SmartLinkListParams.Filter;
+
/**
* The number of Smart Links to return. Default `50`. Must be at least 1. Must not
* be greater than 1000.
*/
limit?: number;
- /**
- * Comma-separated Meta Pixel IDs to include.
- */
- meta_pixel_ids?: string | null;
-
/**
* Filter Smart Links by name. Must not be greater than 255 characters.
*/
@@ -1063,6 +1106,20 @@ export interface SmartLinkListParams {
* The offset used for pagination. Default `0`. Must be at least 0.
*/
offset?: number;
+
+ /**
+ * Comma-separated ad platform Pixel IDs to include.
+ */
+ pixel_ids?: string | null;
+}
+
+export namespace SmartLinkListParams {
+ export interface Filter {
+ /**
+ * Must not be greater than 50 characters.
+ */
+ tags?: Array;
+ }
}
export interface SmartLinkListClicksParams {
@@ -1101,7 +1158,12 @@ export interface SmartLinkListConversionsParams {
/**
* Optional conversion type filter
*/
- conversion_type?: 'new_subscriber' | 'new_transaction' | 'message_received' | 'fan_sent_3_messages';
+ conversion_type?:
+ | 'new_subscriber'
+ | 'new_transaction'
+ | 'message_received'
+ | 'fan_sent_1_message'
+ | 'fan_sent_3_messages';
/**
* Optional report range end date
@@ -1170,6 +1232,12 @@ export interface SmartLinkListFansParams {
*/
offset?: number;
+ /**
+ * Optional - Filter to returning subscribers (fans previously subscribed before
+ * this subscription)
+ */
+ previously_subscribed?: boolean;
+
/**
* Optional sort field. Default `-revenue_net`
*/
@@ -1182,6 +1250,11 @@ export interface SmartLinkListFansParams {
| '-messages_sent_by_fan'
| 'converted_at'
| '-converted_at';
+
+ /**
+ * Optional - Filter to fans who subscribed via a promotion/offer
+ */
+ subscribed_using_promo?: boolean;
}
export interface SmartLinkListSpendersParams {
diff --git a/src/resources/statistics/reach.ts b/src/resources/statistics/reach.ts
index f5fcbe46..1c97aae6 100644
--- a/src/resources/statistics/reach.ts
+++ b/src/resources/statistics/reach.ts
@@ -372,7 +372,7 @@ export interface ReachGetProfileVisitorsParams {
end_date: string;
/**
- * The start date for the period
+ * The start date for the period.
*/
start_date: string;
diff --git a/src/resources/statistics/statements.ts b/src/resources/statistics/statements.ts
index 47b62523..50e6cdcf 100644
--- a/src/resources/statistics/statements.ts
+++ b/src/resources/statistics/statements.ts
@@ -14,7 +14,10 @@ export class Statements extends APIResource {
* const response =
* await client.statistics.statements.getEarnings(
* 'acct_XXXXXXXXXXXXXXX',
- * { start_date: '2025-01-01 00:00:00' },
+ * {
+ * end_date: '2025-03-31 23:59:59',
+ * start_date: '2025-01-01 00:00:00',
+ * },
* );
* ```
*/
@@ -103,14 +106,14 @@ export namespace StatementGetEarningsResponse {
export interface StatementGetEarningsParams {
/**
- * The start date for the period
+ * The end date for the period.
*/
- start_date: string;
+ end_date: string;
/**
- * The end date for the period.
+ * The start date for the period.
*/
- end_date?: string;
+ start_date: string;
/**
* Filter by All / Subscriptions / Tips / Posts / Messages / Streams
diff --git a/src/resources/statistics/statistics.ts b/src/resources/statistics/statistics.ts
index e9efa4d3..9f91810e 100644
--- a/src/resources/statistics/statistics.ts
+++ b/src/resources/statistics/statistics.ts
@@ -21,16 +21,12 @@ export class Statistics extends APIResource {
* const response =
* await client.statistics.calculateTotalTransactions(
* 'acct_XXXXXXXXXXXXXXX',
- * {
- * end_date: '2025-03-31 23:59:59',
- * start_date: '2025-01-01 00:00:00',
- * },
* );
* ```
*/
calculateTotalTransactions(
account: string,
- query: StatisticCalculateTotalTransactionsParams,
+ query: StatisticCalculateTotalTransactionsParams | null | undefined = {},
options?: RequestOptions,
): APIPromise {
return this._client.get(path`/api/${account}/statistics/total-transactions`, { query, ...options });
@@ -390,12 +386,12 @@ export interface StatisticCalculateTotalTransactionsParams {
/**
* The end date for the period. Keep empty to calculate everything.
*/
- end_date: string;
+ end_date?: string;
/**
* The start date for the period. Keep empty to calculate everything.
*/
- start_date: string;
+ start_date?: string;
}
export interface StatisticGetOverviewParams {
@@ -432,6 +428,12 @@ export interface StatisticGetSubscriberMetricsParams {
* time out if timeframe is too large. Default = `false`
*/
detailed?: boolean | null;
+
+ /**
+ * Use only with `detailed=true` - otherwise, it has no effect. Filter the
+ * subscriber statistics (default = total)
+ */
+ detailed_type?: 'total' | 'renew' | 'new' | null;
}
Statistics.Statements = Statements;
diff --git a/src/resources/stories/highlights.ts b/src/resources/stories/highlights.ts
index a61cc3b3..190efad0 100644
--- a/src/resources/stories/highlights.ts
+++ b/src/resources/stories/highlights.ts
@@ -121,7 +121,7 @@ export class Highlights extends APIResource {
* @example
* ```ts
* const response = await client.stories.highlights.addStory(
- * 'maxime',
+ * 'commodi',
* {
* account: 'acct_XXXXXXXXXXXXXXX',
* highlight_id: 1234567890,
@@ -148,7 +148,7 @@ export class Highlights extends APIResource {
* @example
* ```ts
* const response =
- * await client.stories.highlights.removeStory('maxime', {
+ * await client.stories.highlights.removeStory('commodi', {
* account: 'acct_XXXXXXXXXXXXXXX',
* highlight_id: 1234567890,
* });
diff --git a/src/resources/stories/stories.ts b/src/resources/stories/stories.ts
index 459671f8..5d920772 100644
--- a/src/resources/stories/stories.ts
+++ b/src/resources/stories/stories.ts
@@ -30,7 +30,9 @@ export class Stories extends APIResource {
highlights: HighlightsAPI.Highlights = new HighlightsAPI.Highlights(this._client);
/**
- * Post a new media or vault file to your story.
+ * Post a new media or vault file to your story, optionally with text overlays,
+ * @mentions, and a question sticker. Overlay elements are rendered by OnlyFans on
+ * top of your story media at view time.
*
* @example
* ```ts
@@ -228,6 +230,10 @@ export namespace StoryCreateResponse {
canDelete?: boolean;
+ canvasHeight?: number;
+
+ canvasWidth?: number;
+
commentsCount?: number;
createdAt?: string;
@@ -246,9 +252,11 @@ export namespace StoryCreateResponse {
media?: Array;
- question?: string | null;
+ question?: Data.Question;
- releaseForms?: Array;
+ releaseForms?: Array;
+
+ texts?: Array;
tipsAmount?: string;
@@ -311,6 +319,114 @@ export namespace StoryCreateResponse {
}
}
}
+
+ export interface Question {
+ entity?: Question.Entity;
+
+ positions?: Question.Positions;
+
+ type?: string;
+ }
+
+ export namespace Question {
+ export interface Entity {
+ id?: number;
+
+ createdAt?: string;
+
+ text?: string;
+ }
+
+ export interface Positions {
+ angle?: number;
+
+ color?: string;
+
+ height?: number;
+
+ left?: number;
+
+ top?: number;
+
+ width?: number;
+
+ x?: string | null;
+
+ y?: string | null;
+
+ zIndex?: number;
+ }
+ }
+
+ export interface ReleaseForm {
+ id?: number;
+
+ name?: string;
+
+ partnerSource?: string;
+
+ type?: string;
+
+ user?: ReleaseForm.User;
+ }
+
+ export namespace ReleaseForm {
+ export interface User {
+ id?: number;
+
+ avatar?: string | null;
+
+ avatarThumbs?: string | null;
+
+ isFromGuest?: boolean;
+
+ isIdentityVerified?: boolean;
+
+ ivStatus?: string;
+
+ name?: string;
+
+ username?: string;
+
+ view?: string;
+ }
+ }
+
+ export interface Text {
+ angle?: number;
+
+ bgColor?: string;
+
+ color?: string;
+
+ fontFamily?: string;
+
+ fontSize?: string;
+
+ fontStyle?: string | null;
+
+ fontWeight?: number;
+
+ left?: number;
+
+ scale?: number;
+
+ text?: string;
+
+ textAlign?: string;
+
+ textHeight?: number;
+
+ textWidth?: number;
+
+ top?: number;
+
+ type?: string;
+
+ users?: Array;
+
+ zIndex?: number;
+ }
}
}
@@ -1232,10 +1348,160 @@ export namespace StoryRetrieveStatsResponse {
export interface StoryCreateParams {
/**
- * Array of media file upload prefixed_ids, or OF media IDs (required if price is
- * not 0).
+ * Array of media file upload prefixed_ids, or OF vault media IDs.
*/
mediaFiles: Array;
+
+ /**
+ * Canvas height overlay positions are relative to. Default `1920`.
+ */
+ canvasHeight?: number;
+
+ /**
+ * Canvas width overlay positions are relative to. Default `1080`.
+ */
+ canvasWidth?: number;
+
+ /**
+ * Interactive question sticker viewers can answer.
+ */
+ question?: StoryCreateParams.Question;
+
+ /**
+ * Text and @mention overlays.
+ */
+ texts?: Array;
+}
+
+export namespace StoryCreateParams {
+ /**
+ * Interactive question sticker viewers can answer.
+ */
+ export interface Question {
+ /**
+ * Sticker accent color (hex). Default `#FF51DC`.
+ */
+ color?: string;
+
+ /**
+ * Sticker height in canvas px. Default `160`.
+ */
+ height?: number;
+
+ /**
+ * Horizontal position as a percentage of the canvas width (0-100). Default `25`.
+ */
+ left?: number;
+
+ /**
+ * The question to ask.
+ */
+ text?: string;
+
+ /**
+ * Vertical position as a percentage of the canvas height (0-100). Default `30`.
+ */
+ top?: number;
+
+ /**
+ * Sticker width in canvas px. Default `257`.
+ */
+ width?: number;
+ }
+
+ export interface Text {
+ /**
+ * The overlay text. For mentions this must be the `@username` to mention (OnlyFans
+ * resolves the user and adds them to the story's release forms).
+ */
+ text: string;
+
+ /**
+ * Rotation in degrees. Default `0`.
+ */
+ angle?: number;
+
+ /**
+ * Background color (hex, `#00000000` = transparent). Native editor palette:
+ * #FFFFFF #000000 #69818C #FF51DC #FF4081 #FA3240 #FF8040 #FCA800 #70CF27 #00C864
+ * #00B1CC #2196F3 #7953F5 #A832BF. Default: transparent for texts, white for
+ * mentions.
+ */
+ bgColor?: string;
+
+ /**
+ * Text color (hex). Defaults to the native editor behavior: white on a colored
+ * background, black on a white background (mentions: OnlyFans blue `#0091EA` on
+ * white).
+ */
+ color?: string;
+
+ /**
+ * Font family. Families support specific weights only: Roboto (400/500/700),
+ * PTMono (400), ShantellSans (400), SofiaSans (400, renders uppercase),
+ * YanoneKaffeesatz (700), RubikMedium (500), RubikBlack (700). Default `Roboto`.
+ * Ignored for mentions (always Roboto 500).
+ */
+ fontFamily?:
+ | 'Roboto'
+ | 'PTMono'
+ | 'ShantellSans'
+ | 'SofiaSans'
+ | 'YanoneKaffeesatz'
+ | 'RubikMedium'
+ | 'RubikBlack';
+
+ /**
+ * Font size in canvas px (8-100). The native editor uses 9-36. Default `20`.
+ */
+ fontSize?: number;
+
+ /**
+ * Font weight; must match the chosen family (see `fontFamily`).
+ */
+ fontWeight?: 400 | 500 | 700;
+
+ /**
+ * Horizontal position as a percentage of the canvas width (0-100). Default `25`.
+ */
+ left?: number;
+
+ /**
+ * Scale factor. Default `1`.
+ */
+ scale?: number;
+
+ /**
+ * Text alignment. Default `left`.
+ */
+ textAlign?: 'left' | 'center' | 'right';
+
+ /**
+ * Rendered text box height in canvas px. Estimated automatically when omitted.
+ */
+ textHeight?: number;
+
+ /**
+ * Rendered text box width in canvas px. Estimated automatically when omitted.
+ */
+ textWidth?: number;
+
+ /**
+ * Vertical position as a percentage of the canvas height (0-100). Defaults stagger
+ * each overlay below the previous one.
+ */
+ top?: number;
+
+ /**
+ * Overlay type. Default `text`.
+ */
+ type?: 'text' | 'mention';
+
+ /**
+ * Stacking order. Defaults to placement order.
+ */
+ zIndex?: number;
+ }
}
export interface StoryRetrieveParams {
diff --git a/src/resources/tracking-links/tracking-links.ts b/src/resources/tracking-links/tracking-links.ts
index d9224e62..6ed89cd0 100644
--- a/src/resources/tracking-links/tracking-links.ts
+++ b/src/resources/tracking-links/tracking-links.ts
@@ -47,7 +47,7 @@ export class TrackingLinks extends APIResource {
* @example
* ```ts
* const trackingLink = await client.trackingLinks.retrieve(
- * 'et',
+ * 'similique',
* { account: 'acct_XXXXXXXXXXXXXXX' },
* );
* ```
@@ -85,7 +85,7 @@ export class TrackingLinks extends APIResource {
* @example
* ```ts
* const trackingLink = await client.trackingLinks.delete(
- * 'et',
+ * 'similique',
* { account: 'acct_XXXXXXXXXXXXXXX' },
* );
* ```
@@ -104,7 +104,7 @@ export class TrackingLinks extends APIResource {
*
* @example
* ```ts
- * await client.trackingLinks.getCohortArps('et', {
+ * await client.trackingLinks.getCohortArps('repellat', {
* account: 'acct_XXXXXXXXXXXXXXX',
* });
* ```
@@ -134,7 +134,7 @@ export class TrackingLinks extends APIResource {
* @example
* ```ts
* const response = await client.trackingLinks.getStats(
- * 'voluptatem',
+ * 'explicabo',
* { account: 'acct_XXXXXXXXXXXXXXX' },
* );
* ```
@@ -823,47 +823,49 @@ export interface TrackingLinkRetrieveParams {
export interface TrackingLinkListParams {
/**
- * The end date for Tracking Links. Keep empty to get all.
+ * The end date for tracking links. Keep empty to get all. Must not be greater than
+ * 255 characters.
*/
endDate?: string | null;
/**
- * The number of tracking links to return. Default `3`
+ * The number of tracking links to return. Default `10`. Must be at least 1. Must
+ * not be greater than 100.
*/
- limit?: number | null;
+ limit?: number;
/**
- * The offset used for pagination. Default `0`
+ * The offset used for pagination. Default `0`. Must be at least 0.
*/
- offset?: number | null;
+ offset?: number;
+
+ pagination?: 0 | 1;
/**
- * Sort the results. Default `desc`
+ * Sort direction. Default `desc`.
*/
- sort?: 'desc' | 'asc' | null;
+ sort?: 'asc' | 'desc';
/**
- * Sort by subscriber count (claims), or creation date
+ * Sort by subscriber count (`claims`) or creation date (`created_date`).
*/
- sortby?: 'claims' | 'created_date' | null;
+ sortby?: 'claims' | 'created_date';
/**
- * The start date for Tracking Links. Keep empty to get all.
+ * The start date for tracking links. Keep empty to get all. Must not be greater
+ * than 255 characters.
*/
startDate?: string | null;
/**
- * Wait for the revenue data to finish processing, instead of processing in the
- * background. **Will result in longer response times, use with caution**. Default
- * `false`
+ * Wait for revenue calculation instead of processing it in the background.
*/
- synchronous?: boolean | null;
+ synchronous?: boolean;
/**
- * Whether or not to include deleted tracking links in the response. Default
- * `false`
+ * Whether to include deleted tracking links. Default `true`.
*/
- with_deleted?: boolean | null;
+ with_deleted?: 0 | 1;
}
export interface TrackingLinkDeleteParams {
diff --git a/src/resources/transactions.ts b/src/resources/transactions.ts
index af9a9107..8f558ab0 100644
--- a/src/resources/transactions.ts
+++ b/src/resources/transactions.ts
@@ -155,7 +155,7 @@ export interface TransactionListParams {
marker?: string;
/**
- * The start date for transactions list. Default: `-30days`
+ * The start date for the transactions list. Defaults to 30 days ago.
*/
startDate?: string;
diff --git a/src/resources/trial-links/trial-links.ts b/src/resources/trial-links/trial-links.ts
index a13402e7..9cc790a5 100644
--- a/src/resources/trial-links/trial-links.ts
+++ b/src/resources/trial-links/trial-links.ts
@@ -51,7 +51,7 @@ export class TrialLinks extends APIResource {
* @example
* ```ts
* const trialLink = await client.trialLinks.retrieve(
- * 'officia',
+ * 'consectetur',
* { account: 'acct_XXXXXXXXXXXXXXX' },
* );
* ```
@@ -72,13 +72,12 @@ export class TrialLinks extends APIResource {
* ```ts
* const trialLinks = await client.trialLinks.list(
* 'acct_XXXXXXXXXXXXXXX',
- * { limit: 10, offset: 0 },
* );
* ```
*/
list(
account: string,
- query: TrialLinkListParams,
+ query: TrialLinkListParams | null | undefined = {},
options?: RequestOptions,
): APIPromise {
return this._client.get(path`/api/${account}/trial-links`, { query, ...options });
@@ -90,7 +89,7 @@ export class TrialLinks extends APIResource {
* @example
* ```ts
* const trialLink = await client.trialLinks.delete(
- * 'officia',
+ * 'consectetur',
* { account: 'acct_XXXXXXXXXXXXXXX' },
* );
* ```
@@ -130,7 +129,7 @@ export class TrialLinks extends APIResource {
* @example
* ```ts
* const response = await client.trialLinks.listSubscribers(
- * 'eum',
+ * 'incidunt',
* {
* account: 'acct_XXXXXXXXXXXXXXX',
* limit: 10,
@@ -156,7 +155,7 @@ export class TrialLinks extends APIResource {
*
* @example
* ```ts
- * await client.trialLinks.retrieveCohortArps('eius', {
+ * await client.trialLinks.retrieveCohortArps('dolore', {
* account: 'acct_XXXXXXXXXXXXXXX',
* });
* ```
@@ -181,7 +180,7 @@ export class TrialLinks extends APIResource {
* @example
* ```ts
* const response = await client.trialLinks.retrieveStats(
- * 'aut',
+ * 'autem',
* { account: 'acct_XXXXXXXXXXXXXXX' },
* );
* ```
@@ -1077,31 +1076,42 @@ export interface TrialLinkRetrieveParams {
export interface TrialLinkListParams {
/**
- * The number of trial links to return. Default `10`
+ * The end date for trial links. Keep empty to get all. Must not be greater than
+ * 255 characters.
*/
- limit: number;
+ endDate?: string | null;
/**
- * The offset used for pagination. Default `0`
+ * Field to sort by. Default `create_date`.
*/
- offset: number;
+ field?: 'create_date' | 'expire_date' | 'subscribe_counts' | 'subscribe_days' | 'claims_count';
+
+ /**
+ * The number of trial links to return. Default `10`. Must be at least 1. Must not
+ * be greater than 100.
+ */
+ limit?: number;
+
+ /**
+ * The offset used for pagination. Default `0`. Must be at least 0.
+ */
+ offset?: number;
/**
- * Sort the results by a field. Default `create_date`
+ * Sort direction. Default `desc`.
*/
- field?: 'create_date' | 'expire_date' | 'subscribe_counts' | 'subscribe_days' | 'claims_count' | null;
+ sort?: 'asc' | 'desc';
/**
- * Sort the results. Default `desc`
+ * The start date for trial links. Keep empty to get all. Must not be greater than
+ * 255 characters.
*/
- sort?: 'desc' | 'asc' | null;
+ startDate?: string | null;
/**
- * Wait for the revenue data to finish processing, instead of processing in the
- * background. **Will result in longer response times, use with caution**. Default
- * `false`
+ * Wait for revenue calculation instead of processing it in the background.
*/
- synchronous?: boolean | null;
+ synchronous?: boolean;
}
export interface TrialLinkDeleteParams {
diff --git a/src/resources/user-lists/user-lists.ts b/src/resources/user-lists/user-lists.ts
index f96c64b6..b2ca7853 100644
--- a/src/resources/user-lists/user-lists.ts
+++ b/src/resources/user-lists/user-lists.ts
@@ -31,7 +31,7 @@ export class UserLists extends APIResource {
* ```ts
* const userList = await client.userLists.create(
* 'acct_XXXXXXXXXXXXXXX',
- * { name: 'sdqtzwslsvoxbkxj' },
+ * { name: 'pplc' },
* );
* ```
*/
@@ -87,7 +87,8 @@ export class UserLists extends APIResource {
}
/**
- * Get a list of OnlyFans Collections - User Lists
+ * Get a list of OnlyFans Collections - User Lists. If you only want to get User
+ * Lists available for sending a Mass-Message, use `?view=queue`
*
* @example
* ```ts
@@ -552,6 +553,12 @@ export interface UserListListParams {
* Must be at least 0.
*/
offset?: number | null;
+
+ /**
+ * How to return the results. `queue` returns the user lists that are available for
+ * Mass-Messaging.
+ */
+ view?: 'queue';
}
export interface UserListDeleteParams {
diff --git a/src/resources/user-lists/users.ts b/src/resources/user-lists/users.ts
index 16bd1e16..f805d454 100644
--- a/src/resources/user-lists/users.ts
+++ b/src/resources/user-lists/users.ts
@@ -491,49 +491,117 @@ export namespace UserListResponse {
}
}
-export interface UserAddResponse {
- _meta?: UserAddResponse._Meta;
-
- data?: UserAddResponse.Data;
-}
+/**
+ * Default: OnlyFans accepted every User ID
+ */
+export type UserAddResponse = UserAddResponse.UnionMember0 | UserAddResponse.UnionMember1;
export namespace UserAddResponse {
- export interface _Meta {
- _cache?: _Meta._Cache;
-
- _credits?: _Meta._Credits;
+ /**
+ * Default: OnlyFans accepted every User ID
+ */
+ export interface UnionMember0 {
+ _meta?: UnionMember0._Meta;
- _rate_limits?: _Meta._RateLimits;
+ data?: UnionMember0.Data;
}
- export namespace _Meta {
- export interface _Cache {
- is_cached?: boolean;
+ export namespace UnionMember0 {
+ export interface _Meta {
+ _cache?: _Meta._Cache;
- note?: string;
+ _credits?: _Meta._Credits;
+
+ _rate_limits?: _Meta._RateLimits;
}
- export interface _Credits {
- balance?: number;
+ export namespace _Meta {
+ export interface _Cache {
+ is_cached?: boolean;
- note?: string;
+ note?: string;
+ }
- used?: number;
- }
+ export interface _Credits {
+ balance?: number;
- export interface _RateLimits {
- limit_day?: number;
+ note?: string;
- limit_minute?: number;
+ used?: number;
+ }
- remaining_day?: number;
+ export interface _RateLimits {
+ limit_day?: number;
- remaining_minute?: number;
+ limit_minute?: number;
+
+ remaining_day?: number;
+
+ remaining_minute?: number;
+ }
+ }
+
+ export interface Data {
+ '1224114714'?: Array;
}
}
- export interface Data {
- '1224114714'?: Array;
+ /**
+ * With `skip_invalid=true`: the rejected User IDs are reported instead of failing
+ * the batch
+ */
+ export interface UnionMember1 {
+ _meta?: UnionMember1._Meta;
+
+ data?: UnionMember1.Data;
+ }
+
+ export namespace UnionMember1 {
+ export interface _Meta {
+ _cache?: _Meta._Cache;
+
+ _credits?: _Meta._Credits;
+
+ _rate_limits?: _Meta._RateLimits;
+ }
+
+ export namespace _Meta {
+ export interface _Cache {
+ is_cached?: boolean;
+
+ note?: string;
+ }
+
+ export interface _Credits {
+ balance?: number;
+
+ note?: string;
+
+ used?: number;
+ }
+
+ export interface _RateLimits {
+ limit_day?: number;
+
+ limit_minute?: number;
+
+ remaining_day?: number;
+
+ remaining_minute?: number;
+ }
+ }
+
+ export interface Data {
+ added?: Array;
+
+ failed?: Data.Failed;
+ }
+
+ export namespace Data {
+ export interface Failed {
+ '123456'?: string;
+ }
+ }
}
}
@@ -1190,6 +1258,17 @@ export interface UserAddParams {
* Body param: Array of OnlyFans User IDs to be added into the list
*/
ids: Array;
+
+ /**
+ * Body param: Set to `true` to skip the User IDs OnlyFans refuses instead of
+ * failing the whole batch. We drop the rejected IDs and retry the remainder for
+ * you (up to 5 OnlyFans attempts, each costing 1 credit), then respond `200` with
+ * `data.added` (the IDs that made it in) and `data.failed` (an object mapping each
+ * rejected User ID to the reason OnlyFans gave). Note this changes the shape of
+ * `data` — see the example responses. Failures that are not about individual users
+ * (e.g. an invalid or inaccessible list ID) still return the regular `400`.
+ */
+ skip_invalid?: boolean;
}
export interface UserClearParams {
diff --git a/src/resources/webhooks.ts b/src/resources/webhooks.ts
index 2aeeaea9..1c77a723 100644
--- a/src/resources/webhooks.ts
+++ b/src/resources/webhooks.ts
@@ -367,8 +367,9 @@ export namespace WebhookListEventsResponse {
export interface WebhookCreateParams {
/**
- * The account scope for the webhook. Use "global" for all accounts, "inclusive"
- * for only selected accounts, or "exclusive" for all except selected accounts.
+ * The account scope for the webhook (OnlyFans and Fansly webhooks alike). Use
+ * "global" for all accounts, "inclusive" for only selected accounts, or
+ * "exclusive" for all except selected accounts.
*/
account_scope: string;
@@ -379,13 +380,15 @@ export interface WebhookCreateParams {
/**
* An array of webhook events to subscribe to. For all options, refer to our **List
- * Available Events** endpoint.
+ * Available Events** endpoint. A webhook is single-platform: subscribe to either
+ * OnlyFans events or Fansly (`fansly.*`) events, never both in one webhook.
*/
events: Array;
/**
- * An array of account IDs to apply the scope to. Required unless account_scope is
- * "global".
+ * An array of account IDs to apply the scope to. Use OnlyFans account IDs
+ * (`acct_...`) for OnlyFans webhooks and Fansly account IDs (`fansly_acct_...`)
+ * for Fansly webhooks. Required unless account_scope is "global".
*/
account_ids?: Array;
@@ -397,8 +400,9 @@ export interface WebhookCreateParams {
export interface WebhookUpdateParams {
/**
- * The account scope for the webhook. Use "global" for all accounts, "inclusive"
- * for only selected accounts, or "exclusive" for all except selected accounts.
+ * The account scope for the webhook (OnlyFans and Fansly webhooks alike). Use
+ * "global" for all accounts, "inclusive" for only selected accounts, or
+ * "exclusive" for all except selected accounts.
*/
account_scope: string;
@@ -409,13 +413,15 @@ export interface WebhookUpdateParams {
/**
* An array of webhook events to subscribe to. For all options, refer to our **List
- * Available Events** endpoint.
+ * Available Events** endpoint. A webhook is single-platform: subscribe to either
+ * OnlyFans events or Fansly (`fansly.*`) events, never both in one webhook.
*/
events: Array;
/**
- * An array of account IDs to apply the scope to. Required unless account_scope is
- * "global".
+ * An array of account IDs to apply the scope to. Use OnlyFans account IDs
+ * (`acct_...`) for OnlyFans webhooks and Fansly account IDs (`fansly_acct_...`)
+ * for Fansly webhooks. Required unless account_scope is "global".
*/
account_ids?: Array;
diff --git a/src/version.ts b/src/version.ts
index bade2ffc..88f4d403 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1 +1 @@
-export const VERSION = '0.2.0'; // x-release-please-version
+export const VERSION = '0.3.0'; // x-release-please-version
diff --git a/tests/api-resources/accounts.test.ts b/tests/api-resources/accounts.test.ts
index 1e3be330..530921ea 100644
--- a/tests/api-resources/accounts.test.ts
+++ b/tests/api-resources/accounts.test.ts
@@ -37,7 +37,7 @@ describe('resource accounts', () => {
// Mock server tests are disabled
test.skip('disconnect', async () => {
- const responsePromise = client.accounts.disconnect('nobis');
+ const responsePromise = client.accounts.disconnect('pariatur');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
diff --git a/tests/api-resources/authenticate.test.ts b/tests/api-resources/authenticate.test.ts
index a62f86a9..b383d593 100644
--- a/tests/api-resources/authenticate.test.ts
+++ b/tests/api-resources/authenticate.test.ts
@@ -62,22 +62,22 @@ describe('resource authenticate', () => {
await expect(
client.authenticate.start(
{
- auth_id: 'accusamus',
- auth_type: 'email_password',
- cookies: 'unde',
+ auth_id: 'nesciunt',
+ auth_type: 'mobile_app',
+ cookies: 'aperiam',
customProxy: {
host: 'proxy.example.com',
- password: '}b2XD-AinlA~Cg9=',
+ password: '9<*H%e|y}d]=)bU1<',
port: 8080,
- username: 'et',
+ username: 'molestiae',
},
- email: 'ismael91@example.com',
- force_connect: false,
- name: 'molestiae',
- password: 'iRPp(K"M[C1Qv,f',
- proxyCountry: 'us',
- user_agent: 'velit',
- xbc: 'suscipit',
+ email: 'labernathy@example.org',
+ force_connect: true,
+ name: 'debitis',
+ password: '#913++lRIwb',
+ proxyCountry: 'gb',
+ user_agent: 'explicabo',
+ xbc: 'officiis',
},
{ path: '/_stainless_unknown_path' },
),
diff --git a/tests/api-resources/chats/messages.test.ts b/tests/api-resources/chats/messages.test.ts
index d33a4619..617a9ab3 100644
--- a/tests/api-resources/chats/messages.test.ts
+++ b/tests/api-resources/chats/messages.test.ts
@@ -164,16 +164,18 @@ describe('resource messages', () => {
test.skip('send: required and optional params', async () => {
const response = await client.chats.messages.send('123', {
account: 'acct_XXXXXXXXXXXXXXX',
+ blockBannedWords: 'strict_ban',
giphyId: 'WAGC3LeqJvXglm5H7a',
lockedText: true,
mediaFiles: ['ofapi_media_abc123', 1234567890],
previews: ['ofapi_media_abc123', 1234567890],
- price: 10,
+ price: 6.97,
replyToMessageId: 123456789,
rfGuest: 'rfGuest',
rfPartner: 'rfPartner',
rfTag: 'rfTag',
text: 'Hello!',
+ 'Idempotency-Key': 'a1b2c3d4-5e6f-4789-a0b1-c2d3e4f5a6b7',
});
});
diff --git a/tests/api-resources/client-sessions.test.ts b/tests/api-resources/client-sessions.test.ts
index 229de463..9c8f1bea 100644
--- a/tests/api-resources/client-sessions.test.ts
+++ b/tests/api-resources/client-sessions.test.ts
@@ -27,7 +27,7 @@ describe('resource clientSessions', () => {
const response = await client.clientSessions.create({
display_name: 'STRLCxGLVC Agency / Model: Stella',
client_reference_id: 'my_crm_model_12345',
- proxy_country: 'uk',
+ proxy_country: 'gb',
});
});
});
diff --git a/tests/api-resources/engagement/messages/messages.test.ts b/tests/api-resources/engagement/messages/messages.test.ts
index 32dab22b..e9488683 100644
--- a/tests/api-resources/engagement/messages/messages.test.ts
+++ b/tests/api-resources/engagement/messages/messages.test.ts
@@ -10,7 +10,7 @@ const client = new OnlyFansAPI({
describe('resource messages', () => {
// Mock server tests are disabled
test.skip('getMessageBuyers: only required params', async () => {
- const responsePromise = client.engagement.messages.getMessageBuyers('et', {
+ const responsePromise = client.engagement.messages.getMessageBuyers('earum', {
account: 'acct_XXXXXXXXXXXXXXX',
});
const rawResponse = await responsePromise.asResponse();
@@ -24,7 +24,7 @@ describe('resource messages', () => {
// Mock server tests are disabled
test.skip('getMessageBuyers: required and optional params', async () => {
- const response = await client.engagement.messages.getMessageBuyers('et', {
+ const response = await client.engagement.messages.getMessageBuyers('earum', {
account: 'acct_XXXXXXXXXXXXXXX',
limit: 10,
marker: 0,
diff --git a/tests/api-resources/fans/fans.test.ts b/tests/api-resources/fans/fans.test.ts
index 6745d44f..67f33c42 100644
--- a/tests/api-resources/fans/fans.test.ts
+++ b/tests/api-resources/fans/fans.test.ts
@@ -48,6 +48,7 @@ describe('resource fans', () => {
{
filter: {
duration: 0,
+ max_total_spent: 0,
online: null,
tips: 0,
total_spent: 0,
@@ -83,6 +84,7 @@ describe('resource fans', () => {
{
filter: {
duration: 0,
+ max_total_spent: 0,
online: null,
tips: 0,
total_spent: 0,
@@ -118,6 +120,7 @@ describe('resource fans', () => {
{
filter: {
duration: 0,
+ max_total_spent: 0,
online: null,
tips: 0,
total_spent: 0,
diff --git a/tests/api-resources/following.test.ts b/tests/api-resources/following.test.ts
index 0647920c..c2cb7d1f 100644
--- a/tests/api-resources/following.test.ts
+++ b/tests/api-resources/following.test.ts
@@ -31,6 +31,8 @@ describe('resource following', () => {
limit: 10,
offset: 0,
query: 'john',
+ sort: 'subscribe_date',
+ sortDirection: 'desc',
},
{ path: '/_stainless_unknown_path' },
),
@@ -60,6 +62,8 @@ describe('resource following', () => {
limit: 10,
offset: 0,
query: 'john',
+ sort: 'subscribe_date',
+ sortDirection: 'desc',
},
{ path: '/_stainless_unknown_path' },
),
@@ -89,6 +93,8 @@ describe('resource following', () => {
limit: 10,
offset: 0,
query: 'john',
+ sort: 'subscribe_date',
+ sortDirection: 'desc',
},
{ path: '/_stainless_unknown_path' },
),
diff --git a/tests/api-resources/mass-messaging.test.ts b/tests/api-resources/mass-messaging.test.ts
index c1d69b78..090e9109 100644
--- a/tests/api-resources/mass-messaging.test.ts
+++ b/tests/api-resources/mass-messaging.test.ts
@@ -45,11 +45,12 @@ describe('resource massMessaging', () => {
const response = await client.massMessaging.update('id', {
account: 'acct_XXXXXXXXXXXXXXX',
text: 'Hello!',
+ blockBannedWords: 'strict_ban',
giphyId: 'WAGC3LeqJvXglm5H7a',
lockedText: true,
mediaFiles: ['ofapi_media_abc123', 'string'],
previews: ['ofapi_media_abc123', 'string'],
- price: 100,
+ price: 6.97,
scheduledDate: '2025-01-01T00:00:00.000Z',
userIds: ['string'],
userLists: ['fans', 'recent', 'following', 'rebill_off', 'tagged', 'string'],
@@ -130,17 +131,19 @@ describe('resource massMessaging', () => {
test.skip('send: required and optional params', async () => {
const response = await client.massMessaging.send('acct_XXXXXXXXXXXXXXX', {
text: 'Hello!',
+ blockBannedWords: 'strict_ban',
excludedLists: ['fans', 'recent', 'following', 'rebill_off', 'tagged', 'string'],
giphyId: 'WAGC3LeqJvXglm5H7a',
lockedText: true,
mediaFiles: ['ofapi_media_abc123', 1234567890],
previews: ['ofapi_media_abc123', 1234567890],
- price: 100,
+ price: 6.97,
rfGuest: 'rfGuest',
rfPartner: 'rfPartner',
rfTag: 'rfTag',
saveForLater: true,
scheduledDate: '2025-01-01T00:00:00.000Z',
+ subscribedWithinLastDays: 0,
userIds: ['string'],
userLists: ['fans', 'recent', 'following', 'rebill_off', 'tagged', 'string'],
});
diff --git a/tests/api-resources/media/vault/lists/lists.test.ts b/tests/api-resources/media/vault/lists/lists.test.ts
index e3f6929f..53b39cf1 100644
--- a/tests/api-resources/media/vault/lists/lists.test.ts
+++ b/tests/api-resources/media/vault/lists/lists.test.ts
@@ -44,7 +44,10 @@ describe('resource lists', () => {
// Mock server tests are disabled
test.skip('update: only required params', async () => {
- const responsePromise = client.media.vault.lists.update('123', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.media.vault.lists.update('123', {
+ account: 'acct_XXXXXXXXXXXXXXX',
+ name: 'My renamed list',
+ });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -56,7 +59,10 @@ describe('resource lists', () => {
// Mock server tests are disabled
test.skip('update: required and optional params', async () => {
- const response = await client.media.vault.lists.update('123', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const response = await client.media.vault.lists.update('123', {
+ account: 'acct_XXXXXXXXXXXXXXX',
+ name: 'My renamed list',
+ });
});
// Mock server tests are disabled
@@ -78,6 +84,7 @@ describe('resource lists', () => {
client.media.vault.lists.list(
'acct_XXXXXXXXXXXXXXX',
{
+ lightweight: true,
limit: 24,
offset: 0,
query: 'My list name',
diff --git a/tests/api-resources/media/vault/lists/media.test.ts b/tests/api-resources/media/vault/lists/media.test.ts
index 0195dda8..b67c2a66 100644
--- a/tests/api-resources/media/vault/lists/media.test.ts
+++ b/tests/api-resources/media/vault/lists/media.test.ts
@@ -10,7 +10,7 @@ const client = new OnlyFansAPI({
describe('resource media', () => {
// Mock server tests are disabled
test.skip('add: only required params', async () => {
- const responsePromise = client.media.vault.lists.media.add('nihil', {
+ const responsePromise = client.media.vault.lists.media.add('voluptate', {
account: 'acct_XXXXXXXXXXXXXXX',
mediaIds: ['string'],
});
@@ -25,7 +25,7 @@ describe('resource media', () => {
// Mock server tests are disabled
test.skip('add: required and optional params', async () => {
- const response = await client.media.vault.lists.media.add('nihil', {
+ const response = await client.media.vault.lists.media.add('voluptate', {
account: 'acct_XXXXXXXXXXXXXXX',
mediaIds: ['string'],
});
@@ -33,7 +33,7 @@ describe('resource media', () => {
// Mock server tests are disabled
test.skip('remove: only required params', async () => {
- const responsePromise = client.media.vault.lists.media.remove('nihil', {
+ const responsePromise = client.media.vault.lists.media.remove('voluptate', {
account: 'acct_XXXXXXXXXXXXXXX',
mediaIds: ['string'],
});
@@ -48,7 +48,7 @@ describe('resource media', () => {
// Mock server tests are disabled
test.skip('remove: required and optional params', async () => {
- const response = await client.media.vault.lists.media.remove('nihil', {
+ const response = await client.media.vault.lists.media.remove('voluptate', {
account: 'acct_XXXXXXXXXXXXXXX',
mediaIds: ['string'],
});
diff --git a/tests/api-resources/messages.test.ts b/tests/api-resources/messages.test.ts
deleted file mode 100644
index 448c31ad..00000000
--- a/tests/api-resources/messages.test.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-import OnlyFansAPI from '@onlyfansapi/onlyfans-sdk';
-
-const client = new OnlyFansAPI({
- apiKey: 'My API Key',
- baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010',
-});
-
-describe('resource messages', () => {
- // Mock server tests are disabled
- test.skip('attachTags: only required params', async () => {
- const responsePromise = client.messages.attachTags('123456789', { account: 'acct_XXXXXXXXXXXXXXX' });
- const rawResponse = await responsePromise.asResponse();
- expect(rawResponse).toBeInstanceOf(Response);
- const response = await responsePromise;
- expect(response).not.toBeInstanceOf(Response);
- const dataAndResponse = await responsePromise.withResponse();
- expect(dataAndResponse.data).toBe(response);
- expect(dataAndResponse.response).toBe(rawResponse);
- });
-
- // Mock server tests are disabled
- test.skip('attachTags: required and optional params', async () => {
- const response = await client.messages.attachTags('123456789', {
- account: 'acct_XXXXXXXXXXXXXXX',
- rfGuest: 'rfGuest',
- rfPartner: 'rfPartner',
- rfTag: 'rfTag',
- });
- });
-});
diff --git a/tests/api-resources/notifications/notifications.test.ts b/tests/api-resources/notifications/notifications.test.ts
index 7b042946..25333899 100644
--- a/tests/api-resources/notifications/notifications.test.ts
+++ b/tests/api-resources/notifications/notifications.test.ts
@@ -30,7 +30,7 @@ describe('resource notifications', () => {
from_id: 123,
limit: 10,
skip_users: 'all',
- type: 'comments',
+ type: 'subscriptions',
},
{ path: '/_stainless_unknown_path' },
),
diff --git a/tests/api-resources/payouts.test.ts b/tests/api-resources/payouts.test.ts
index aa2c6f83..57cd78fd 100644
--- a/tests/api-resources/payouts.test.ts
+++ b/tests/api-resources/payouts.test.ts
@@ -79,7 +79,7 @@ describe('resource payouts', () => {
await expect(
client.payouts.retrieveEarningStatistics(
'acct_XXXXXXXXXXXXXXX',
- { endDate: '2025-01-01 00:00:00, +30days', startDate: '2025-01-01 00:00:00, -30days' },
+ { endDate: '2025-01-31 23:59:59', startDate: '2025-01-01 00:00:00' },
{ path: '/_stainless_unknown_path' },
),
).rejects.toThrow(OnlyFansAPI.NotFoundError);
diff --git a/tests/api-resources/posts/comments.test.ts b/tests/api-resources/posts/comments.test.ts
index bf709685..0144bc2d 100644
--- a/tests/api-resources/posts/comments.test.ts
+++ b/tests/api-resources/posts/comments.test.ts
@@ -10,7 +10,7 @@ const client = new OnlyFansAPI({
describe('resource comments', () => {
// Mock server tests are disabled
test.skip('create: only required params', async () => {
- const responsePromise = client.posts.comments.create('impedit', {
+ const responsePromise = client.posts.comments.create('repellat', {
account: 'acct_XXXXXXXXXXXXXXX',
text: 'This is a comment.',
});
@@ -25,7 +25,7 @@ describe('resource comments', () => {
// Mock server tests are disabled
test.skip('create: required and optional params', async () => {
- const response = await client.posts.comments.create('impedit', {
+ const response = await client.posts.comments.create('repellat', {
account: 'acct_XXXXXXXXXXXXXXX',
text: 'This is a comment.',
answerTo: 123,
@@ -35,7 +35,7 @@ describe('resource comments', () => {
// Mock server tests are disabled
test.skip('list: only required params', async () => {
- const responsePromise = client.posts.comments.list('impedit', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.posts.comments.list('repellat', { account: 'acct_XXXXXXXXXXXXXXX' });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -47,7 +47,7 @@ describe('resource comments', () => {
// Mock server tests are disabled
test.skip('list: required and optional params', async () => {
- const response = await client.posts.comments.list('impedit', {
+ const response = await client.posts.comments.list('repellat', {
account: 'acct_XXXXXXXXXXXXXXX',
limit: 10,
offset: 0,
diff --git a/tests/api-resources/posts/posts.test.ts b/tests/api-resources/posts/posts.test.ts
index 737eca89..ab96826e 100644
--- a/tests/api-resources/posts/posts.test.ts
+++ b/tests/api-resources/posts/posts.test.ts
@@ -24,6 +24,7 @@ describe('resource posts', () => {
test.skip('create: required and optional params', async () => {
const response = await client.posts.create('acct_XXXXXXXXXXXXXXX', {
text: 'Hello!',
+ blockBannedWords: 'strict_ban',
expireDays: 3,
fundRaisingTargetAmount: 30,
fundRaisingTipsPresets: ['string', 'string', 'string'],
@@ -77,6 +78,7 @@ describe('resource posts', () => {
const response = await client.posts.update(1234567890, {
account: 'acct_XXXXXXXXXXXXXXX',
text: 'Hello!',
+ blockBannedWords: 'strict_ban',
expireDays: 3,
fundRaisingTargetAmount: 30,
fundRaisingTipsPresets: ['string', 'string', 'string'],
diff --git a/tests/api-resources/queue.test.ts b/tests/api-resources/queue.test.ts
index cc42819e..a80ba1da 100644
--- a/tests/api-resources/queue.test.ts
+++ b/tests/api-resources/queue.test.ts
@@ -11,7 +11,6 @@ describe('resource queue', () => {
// Mock server tests are disabled
test.skip('list: only required params', async () => {
const responsePromise = client.queue.list('acct_XXXXXXXXXXXXXXX', {
- limit: 20,
publishDateEnd: '2025-01-01',
publishDateStart: '2025-01-01',
timezone: 'Europe/Prague',
@@ -28,10 +27,11 @@ describe('resource queue', () => {
// Mock server tests are disabled
test.skip('list: required and optional params', async () => {
const response = await client.queue.list('acct_XXXXXXXXXXXXXXX', {
- limit: 20,
publishDateEnd: '2025-01-01',
publishDateStart: '2025-01-01',
timezone: 'Europe/Prague',
+ limit: 20,
+ type: ['chat'],
});
});
diff --git a/tests/api-resources/saved-for-later/messages/settings.test.ts b/tests/api-resources/saved-for-later/messages/settings.test.ts
index 8e5b0566..e2edc676 100644
--- a/tests/api-resources/saved-for-later/messages/settings.test.ts
+++ b/tests/api-resources/saved-for-later/messages/settings.test.ts
@@ -37,7 +37,7 @@ describe('resource settings', () => {
test.skip('enableOrUpdateAutomaticMessaging: only required params', async () => {
const responsePromise = client.savedForLater.messages.settings.enableOrUpdateAutomaticMessaging(
'acct_XXXXXXXXXXXXXXX',
- { period: 12 },
+ { period: 24 },
);
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
@@ -52,7 +52,7 @@ describe('resource settings', () => {
test.skip('enableOrUpdateAutomaticMessaging: required and optional params', async () => {
const response = await client.savedForLater.messages.settings.enableOrUpdateAutomaticMessaging(
'acct_XXXXXXXXXXXXXXX',
- { period: 12 },
+ { period: 24 },
);
});
});
diff --git a/tests/api-resources/saved-for-later/posts/settings.test.ts b/tests/api-resources/saved-for-later/posts/settings.test.ts
index 96d399de..c1510622 100644
--- a/tests/api-resources/saved-for-later/posts/settings.test.ts
+++ b/tests/api-resources/saved-for-later/posts/settings.test.ts
@@ -37,7 +37,7 @@ describe('resource settings', () => {
test.skip('enableOrUpdateAutomaticPosting: only required params', async () => {
const responsePromise = client.savedForLater.posts.settings.enableOrUpdateAutomaticPosting(
'acct_XXXXXXXXXXXXXXX',
- { period: 12 },
+ { period: 24 },
);
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
@@ -52,7 +52,7 @@ describe('resource settings', () => {
test.skip('enableOrUpdateAutomaticPosting: required and optional params', async () => {
const response = await client.savedForLater.posts.settings.enableOrUpdateAutomaticPosting(
'acct_XXXXXXXXXXXXXXX',
- { period: 12 },
+ { period: 24 },
);
});
});
diff --git a/tests/api-resources/settings/welcome-message.test.ts b/tests/api-resources/settings/welcome-message.test.ts
index d13ad1ce..6b1dc2fd 100644
--- a/tests/api-resources/settings/welcome-message.test.ts
+++ b/tests/api-resources/settings/welcome-message.test.ts
@@ -39,7 +39,7 @@ describe('resource welcomeMessage', () => {
client.settings.welcomeMessage.update(
'acct_XXXXXXXXXXXXXXX',
{
- isForward: true,
+ isForward: false,
lockedText: false,
mediaFiles: ['ofapi_media_abc123', 1234567890],
previews: ['ofapi_media_abc123', 1234567890],
diff --git a/tests/api-resources/shared-tracking-links/shared-tracking-links.test.ts b/tests/api-resources/shared-tracking-links/shared-tracking-links.test.ts
index 7586ce3c..f3044576 100644
--- a/tests/api-resources/shared-tracking-links/shared-tracking-links.test.ts
+++ b/tests/api-resources/shared-tracking-links/shared-tracking-links.test.ts
@@ -29,7 +29,11 @@ describe('resource sharedTrackingLinks', () => {
{
limit: 10,
offset: 0,
+ pagination: 1,
+ sorting_deleted: 1,
+ stats: 'true',
synchronous: false,
+ with_deleted: 1,
},
{ path: '/_stainless_unknown_path' },
),
diff --git a/tests/api-resources/shared-trial-links/shared-trial-links.test.ts b/tests/api-resources/shared-trial-links/shared-trial-links.test.ts
index d72178e6..7233346f 100644
--- a/tests/api-resources/shared-trial-links/shared-trial-links.test.ts
+++ b/tests/api-resources/shared-trial-links/shared-trial-links.test.ts
@@ -29,6 +29,7 @@ describe('resource sharedTrialLinks', () => {
{
limit: 10,
offset: 0,
+ pagination: 1,
synchronous: false,
},
{ path: '/_stainless_unknown_path' },
diff --git a/tests/api-resources/smart-link-postbacks.test.ts b/tests/api-resources/smart-link-postbacks.test.ts
index 9aec6406..09984bfe 100644
--- a/tests/api-resources/smart-link-postbacks.test.ts
+++ b/tests/api-resources/smart-link-postbacks.test.ts
@@ -13,7 +13,7 @@ describe('resource smartLinkPostbacks', () => {
const responsePromise = client.smartLinkPostbacks.create({
conversion_types: ['new_subscriber', 'new_transaction'],
smart_link_scope: 'campaign_specific',
- url: 'https://example.com/postback?click={click_id}&type={conversion_type}&gclid={gclid}',
+ url: 'https://example.com/postback?click={external_click_id}&type={conversion_type}&gclid={gclid}',
});
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
@@ -29,7 +29,10 @@ describe('resource smartLinkPostbacks', () => {
const response = await client.smartLinkPostbacks.create({
conversion_types: ['new_subscriber', 'new_transaction'],
smart_link_scope: 'campaign_specific',
- url: 'https://example.com/postback?click={click_id}&type={conversion_type}&gclid={gclid}',
+ url: 'https://example.com/postback?click={external_click_id}&type={conversion_type}&gclid={gclid}',
+ body: '{"click_id":"{click_id}","value":"{amount_gross}"}',
+ headers: [{ name: 'Authorization', value: 'Bearer token' }],
+ http_method: 'POST',
smart_link_ids: ['01JTESTLINK000000000000001'],
});
});
@@ -51,7 +54,7 @@ describe('resource smartLinkPostbacks', () => {
const responsePromise = client.smartLinkPostbacks.update(123, {
conversion_types: ['new_subscriber'],
smart_link_scope: 'global',
- url: 'https://example.com/postback?click={click_id}&type={conversion_type}',
+ url: 'https://example.com/postback?click={external_click_id}&type={conversion_type}',
});
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
@@ -67,7 +70,10 @@ describe('resource smartLinkPostbacks', () => {
const response = await client.smartLinkPostbacks.update(123, {
conversion_types: ['new_subscriber'],
smart_link_scope: 'global',
- url: 'https://example.com/postback?click={click_id}&type={conversion_type}',
+ url: 'https://example.com/postback?click={external_click_id}&type={conversion_type}',
+ body: '{"click_id":"{click_id}","value":"{amount_gross}"}',
+ headers: [{ name: 'Authorization', value: 'Bearer token' }],
+ http_method: 'POST',
smart_link_ids: ['01JTESTLINK000000000000001'],
});
});
diff --git a/tests/api-resources/smart-links.test.ts b/tests/api-resources/smart-links.test.ts
index 5f67b788..108f5efa 100644
--- a/tests/api-resources/smart-links.test.ts
+++ b/tests/api-resources/smart-links.test.ts
@@ -65,10 +65,11 @@ describe('resource smartLinks', () => {
client.smartLinks.list(
{
account_ids: 'acct_abc123,acct_def456',
+ filter: { tags: ['i'] },
limit: 50,
- meta_pixel_ids: '1,2',
name: 'Instagram',
offset: 0,
+ pixel_ids: '1,2',
},
{ path: '/_stainless_unknown_path' },
),
@@ -89,7 +90,7 @@ describe('resource smartLinks', () => {
// Mock server tests are disabled
test.skip('listClicks', async () => {
- const responsePromise = client.smartLinks.listClicks('rerum');
+ const responsePromise = client.smartLinks.listClicks('dolorem');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -104,7 +105,7 @@ describe('resource smartLinks', () => {
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
await expect(
client.smartLinks.listClicks(
- 'rerum',
+ 'dolorem',
{
date_end: '2026-01-07T23:59:59Z',
date_start: '2026-01-01T00:00:00Z',
@@ -120,7 +121,7 @@ describe('resource smartLinks', () => {
// Mock server tests are disabled
test.skip('listConversions', async () => {
- const responsePromise = client.smartLinks.listConversions('facilis');
+ const responsePromise = client.smartLinks.listConversions('a');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -135,7 +136,7 @@ describe('resource smartLinks', () => {
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
await expect(
client.smartLinks.listConversions(
- 'facilis',
+ 'a',
{
conversion_type: 'new_transaction',
date_end: '2026-01-07T23:59:59Z',
@@ -153,7 +154,7 @@ describe('resource smartLinks', () => {
// Mock server tests are disabled
test.skip('listFans', async () => {
- const responsePromise = client.smartLinks.listFans('ducimus');
+ const responsePromise = client.smartLinks.listFans('libero');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -168,7 +169,7 @@ describe('resource smartLinks', () => {
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
await expect(
client.smartLinks.listFans(
- 'ducimus',
+ 'libero',
{
has_messages: true,
limit: 100,
@@ -176,7 +177,9 @@ describe('resource smartLinks', () => {
min_revenue_net: 25,
min_tips_net: 10,
offset: 0,
+ previously_subscribed: true,
sort: '-revenue_net',
+ subscribed_using_promo: true,
},
{ path: '/_stainless_unknown_path' },
),
@@ -185,7 +188,7 @@ describe('resource smartLinks', () => {
// Mock server tests are disabled
test.skip('listSpenders', async () => {
- const responsePromise = client.smartLinks.listSpenders('nam');
+ const responsePromise = client.smartLinks.listSpenders('sed');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -200,7 +203,7 @@ describe('resource smartLinks', () => {
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
await expect(
client.smartLinks.listSpenders(
- 'nam',
+ 'sed',
{
limit: 50,
minSpend: 1,
@@ -213,7 +216,7 @@ describe('resource smartLinks', () => {
// Mock server tests are disabled
test.skip('retrieveCohortArps', async () => {
- const responsePromise = client.smartLinks.retrieveCohortArps('eaque');
+ const responsePromise = client.smartLinks.retrieveCohortArps('omnis');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -228,7 +231,7 @@ describe('resource smartLinks', () => {
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
await expect(
client.smartLinks.retrieveCohortArps(
- 'eaque',
+ 'omnis',
{
acquisition_end: '2026-01-31T23:59:59Z',
acquisition_start: '2026-01-01T00:00:00Z',
@@ -241,7 +244,7 @@ describe('resource smartLinks', () => {
// Mock server tests are disabled
test.skip('retrieveStats', async () => {
- const responsePromise = client.smartLinks.retrieveStats('impedit');
+ const responsePromise = client.smartLinks.retrieveStats('in');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -256,7 +259,7 @@ describe('resource smartLinks', () => {
// ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
await expect(
client.smartLinks.retrieveStats(
- 'impedit',
+ 'in',
{ date_end: '2026-01-31T23:59:59Z', date_start: '2026-01-01T00:00:00Z' },
{ path: '/_stainless_unknown_path' },
),
diff --git a/tests/api-resources/statistics/statements.test.ts b/tests/api-resources/statistics/statements.test.ts
index 291bfa14..7417a0da 100644
--- a/tests/api-resources/statistics/statements.test.ts
+++ b/tests/api-resources/statistics/statements.test.ts
@@ -11,6 +11,7 @@ describe('resource statements', () => {
// Mock server tests are disabled
test.skip('getEarnings: only required params', async () => {
const responsePromise = client.statistics.statements.getEarnings('acct_XXXXXXXXXXXXXXX', {
+ end_date: '2025-03-31 23:59:59',
start_date: '2025-01-01 00:00:00',
});
const rawResponse = await responsePromise.asResponse();
@@ -25,8 +26,8 @@ describe('resource statements', () => {
// Mock server tests are disabled
test.skip('getEarnings: required and optional params', async () => {
const response = await client.statistics.statements.getEarnings('acct_XXXXXXXXXXXXXXX', {
- start_date: '2025-01-01 00:00:00',
end_date: '2025-03-31 23:59:59',
+ start_date: '2025-01-01 00:00:00',
type: 'total',
});
});
diff --git a/tests/api-resources/statistics/statistics.test.ts b/tests/api-resources/statistics/statistics.test.ts
index b464237e..5452ad63 100644
--- a/tests/api-resources/statistics/statistics.test.ts
+++ b/tests/api-resources/statistics/statistics.test.ts
@@ -9,11 +9,8 @@ const client = new OnlyFansAPI({
describe('resource statistics', () => {
// Mock server tests are disabled
- test.skip('calculateTotalTransactions: only required params', async () => {
- const responsePromise = client.statistics.calculateTotalTransactions('acct_XXXXXXXXXXXXXXX', {
- end_date: '2025-03-31 23:59:59',
- start_date: '2025-01-01 00:00:00',
- });
+ test.skip('calculateTotalTransactions', async () => {
+ const responsePromise = client.statistics.calculateTotalTransactions('acct_XXXXXXXXXXXXXXX');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -24,11 +21,15 @@ describe('resource statistics', () => {
});
// Mock server tests are disabled
- test.skip('calculateTotalTransactions: required and optional params', async () => {
- const response = await client.statistics.calculateTotalTransactions('acct_XXXXXXXXXXXXXXX', {
- end_date: '2025-03-31 23:59:59',
- start_date: '2025-01-01 00:00:00',
- });
+ test.skip('calculateTotalTransactions: request options and params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ client.statistics.calculateTotalTransactions(
+ 'acct_XXXXXXXXXXXXXXX',
+ { end_date: '2025-03-31 23:59:59', start_date: '2025-01-01 00:00:00' },
+ { path: '/_stainless_unknown_path' },
+ ),
+ ).rejects.toThrow(OnlyFansAPI.NotFoundError);
});
// Mock server tests are disabled
@@ -80,6 +81,7 @@ describe('resource statistics', () => {
end_date: '2025-03-31 23:59:59',
start_date: '2025-01-01 00:00:00',
detailed: false,
+ detailed_type: 'total',
});
});
});
diff --git a/tests/api-resources/stored.test.ts b/tests/api-resources/stored.test.ts
index 801e916b..d1fa49fe 100644
--- a/tests/api-resources/stored.test.ts
+++ b/tests/api-resources/stored.test.ts
@@ -27,7 +27,7 @@ describe('resource stored', () => {
client.stored.listSharedTrackingLinks(
'acct_XXXXXXXXXXXXXXX',
{
- filter: { search: 'wjdlvaxlyadlqrwqppqxf', tags: ['eoekj'] },
+ filter: { search: 'pgstt', tags: ['lesgwiehozbjtqubznijzetuq'] },
limit: 10,
offset: 0,
},
@@ -55,7 +55,7 @@ describe('resource stored', () => {
client.stored.listSharedTrialLinks(
'acct_XXXXXXXXXXXXXXX',
{
- filter: { search: 'zeynkehufhzqvcaqjxnwtpibh', tags: ['vyjau'] },
+ filter: { search: 'vnnufloxlvajlaldbxbpdhq', tags: ['gjf'] },
limit: 10,
offset: 0,
},
@@ -84,9 +84,9 @@ describe('resource stored', () => {
'acct_XXXXXXXXXXXXXXX',
{
filter: {
- include_smart_links: true,
- search: 'ycluqgbgiibws',
- tags: ['eisqsclddcipdx'],
+ include_smart_links: false,
+ search: 'czleulihk',
+ tags: ['tykxnvkiggxelefwfyctwv'],
},
limit: 10,
offset: 0,
@@ -116,9 +116,9 @@ describe('resource stored', () => {
'acct_XXXXXXXXXXXXXXX',
{
filter: {
- include_smart_links: true,
- search: 'dharcxleeeimxrrewpni',
- tags: ['kwqzrpj'],
+ include_smart_links: false,
+ search: 'zyhaiutqpl',
+ tags: ['uddtuliiikxvhswkqz'],
},
limit: 10,
offset: 0,
diff --git a/tests/api-resources/stories/highlights.test.ts b/tests/api-resources/stories/highlights.test.ts
index 86025987..f2ac4a3b 100644
--- a/tests/api-resources/stories/highlights.test.ts
+++ b/tests/api-resources/stories/highlights.test.ts
@@ -124,7 +124,7 @@ describe('resource highlights', () => {
// Mock server tests are disabled
test.skip('addStory: only required params', async () => {
- const responsePromise = client.stories.highlights.addStory('maxime', {
+ const responsePromise = client.stories.highlights.addStory('commodi', {
account: 'acct_XXXXXXXXXXXXXXX',
highlight_id: 1234567890,
story_id: 2345678901,
@@ -140,7 +140,7 @@ describe('resource highlights', () => {
// Mock server tests are disabled
test.skip('addStory: required and optional params', async () => {
- const response = await client.stories.highlights.addStory('maxime', {
+ const response = await client.stories.highlights.addStory('commodi', {
account: 'acct_XXXXXXXXXXXXXXX',
highlight_id: 1234567890,
story_id: 2345678901,
@@ -149,7 +149,7 @@ describe('resource highlights', () => {
// Mock server tests are disabled
test.skip('removeStory: only required params', async () => {
- const responsePromise = client.stories.highlights.removeStory('maxime', {
+ const responsePromise = client.stories.highlights.removeStory('commodi', {
account: 'acct_XXXXXXXXXXXXXXX',
highlight_id: 1234567890,
});
@@ -164,7 +164,7 @@ describe('resource highlights', () => {
// Mock server tests are disabled
test.skip('removeStory: required and optional params', async () => {
- const response = await client.stories.highlights.removeStory('maxime', {
+ const response = await client.stories.highlights.removeStory('commodi', {
account: 'acct_XXXXXXXXXXXXXXX',
highlight_id: 1234567890,
});
diff --git a/tests/api-resources/stories/stories.test.ts b/tests/api-resources/stories/stories.test.ts
index 32b2000d..b42de5a5 100644
--- a/tests/api-resources/stories/stories.test.ts
+++ b/tests/api-resources/stories/stories.test.ts
@@ -26,6 +26,35 @@ describe('resource stories', () => {
test.skip('create: required and optional params', async () => {
const response = await client.stories.create('acct_XXXXXXXXXXXXXXX', {
mediaFiles: ['ofapi_media_abc123', 'string'],
+ canvasHeight: 1920,
+ canvasWidth: 1080,
+ question: {
+ color: '#FF51DC',
+ height: 160,
+ left: 25,
+ text: 'Ask me anything!',
+ top: 30,
+ width: 257,
+ },
+ texts: [
+ {
+ text: 'New drop today!',
+ angle: 0,
+ bgColor: '#FF51DC',
+ color: '#FFFFFF',
+ fontFamily: 'ShantellSans',
+ fontSize: 24,
+ fontWeight: 400,
+ left: 30.5,
+ scale: 1,
+ textAlign: 'center',
+ textHeight: 36,
+ textWidth: 140,
+ top: 60,
+ type: 'text',
+ zIndex: 8,
+ },
+ ],
});
});
diff --git a/tests/api-resources/tracking-links/tracking-links.test.ts b/tests/api-resources/tracking-links/tracking-links.test.ts
index 3ad1eccd..b1bc125f 100644
--- a/tests/api-resources/tracking-links/tracking-links.test.ts
+++ b/tests/api-resources/tracking-links/tracking-links.test.ts
@@ -30,7 +30,7 @@ describe('resource trackingLinks', () => {
// Mock server tests are disabled
test.skip('retrieve: only required params', async () => {
- const responsePromise = client.trackingLinks.retrieve('et', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.trackingLinks.retrieve('similique', { account: 'acct_XXXXXXXXXXXXXXX' });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -42,7 +42,7 @@ describe('resource trackingLinks', () => {
// Mock server tests are disabled
test.skip('retrieve: required and optional params', async () => {
- const response = await client.trackingLinks.retrieve('et', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const response = await client.trackingLinks.retrieve('similique', { account: 'acct_XXXXXXXXXXXXXXX' });
});
// Mock server tests are disabled
@@ -64,14 +64,15 @@ describe('resource trackingLinks', () => {
client.trackingLinks.list(
'acct_XXXXXXXXXXXXXXX',
{
- endDate: '2025-01-01 00:00:00, now',
- limit: 3,
+ endDate: '2025-01-31 23:59:59',
+ limit: 10,
offset: 0,
+ pagination: 1,
sort: 'desc',
sortby: 'claims',
- startDate: '2025-01-01 00:00:00, -30days',
+ startDate: '2025-01-01 00:00:00',
synchronous: false,
- with_deleted: false,
+ with_deleted: 1,
},
{ path: '/_stainless_unknown_path' },
),
@@ -80,7 +81,7 @@ describe('resource trackingLinks', () => {
// Mock server tests are disabled
test.skip('delete: only required params', async () => {
- const responsePromise = client.trackingLinks.delete('et', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.trackingLinks.delete('similique', { account: 'acct_XXXXXXXXXXXXXXX' });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -92,12 +93,14 @@ describe('resource trackingLinks', () => {
// Mock server tests are disabled
test.skip('delete: required and optional params', async () => {
- const response = await client.trackingLinks.delete('et', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const response = await client.trackingLinks.delete('similique', { account: 'acct_XXXXXXXXXXXXXXX' });
});
// Mock server tests are disabled
test.skip('getCohortArps: only required params', async () => {
- const responsePromise = client.trackingLinks.getCohortArps('et', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.trackingLinks.getCohortArps('repellat', {
+ account: 'acct_XXXXXXXXXXXXXXX',
+ });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -109,7 +112,7 @@ describe('resource trackingLinks', () => {
// Mock server tests are disabled
test.skip('getCohortArps: required and optional params', async () => {
- const response = await client.trackingLinks.getCohortArps('et', {
+ const response = await client.trackingLinks.getCohortArps('repellat', {
account: 'acct_XXXXXXXXXXXXXXX',
acquisition_end: '2026-01-31T23:59:59Z',
acquisition_start: '2026-01-01T00:00:00Z',
@@ -119,7 +122,7 @@ describe('resource trackingLinks', () => {
// Mock server tests are disabled
test.skip('getStats: only required params', async () => {
- const responsePromise = client.trackingLinks.getStats('voluptatem', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.trackingLinks.getStats('explicabo', { account: 'acct_XXXXXXXXXXXXXXX' });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -131,7 +134,7 @@ describe('resource trackingLinks', () => {
// Mock server tests are disabled
test.skip('getStats: required and optional params', async () => {
- const response = await client.trackingLinks.getStats('voluptatem', {
+ const response = await client.trackingLinks.getStats('explicabo', {
account: 'acct_XXXXXXXXXXXXXXX',
date_end: '2026-01-31T23:59:59Z',
date_start: '2026-01-01T00:00:00Z',
diff --git a/tests/api-resources/transactions.test.ts b/tests/api-resources/transactions.test.ts
index 80f7709d..8712741f 100644
--- a/tests/api-resources/transactions.test.ts
+++ b/tests/api-resources/transactions.test.ts
@@ -29,7 +29,7 @@ describe('resource transactions', () => {
{
limit: 'limit',
marker: '1739155047',
- startDate: '2025-01-01 00:00:00, -30days',
+ startDate: '2025-01-01 00:00:00',
tipsSource: 'post_all',
type: 'tips',
},
diff --git a/tests/api-resources/trial-links/trial-links.test.ts b/tests/api-resources/trial-links/trial-links.test.ts
index e273b87d..84f79285 100644
--- a/tests/api-resources/trial-links/trial-links.test.ts
+++ b/tests/api-resources/trial-links/trial-links.test.ts
@@ -37,7 +37,7 @@ describe('resource trialLinks', () => {
// Mock server tests are disabled
test.skip('retrieve: only required params', async () => {
- const responsePromise = client.trialLinks.retrieve('officia', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.trialLinks.retrieve('consectetur', { account: 'acct_XXXXXXXXXXXXXXX' });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -49,12 +49,12 @@ describe('resource trialLinks', () => {
// Mock server tests are disabled
test.skip('retrieve: required and optional params', async () => {
- const response = await client.trialLinks.retrieve('officia', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const response = await client.trialLinks.retrieve('consectetur', { account: 'acct_XXXXXXXXXXXXXXX' });
});
// Mock server tests are disabled
- test.skip('list: only required params', async () => {
- const responsePromise = client.trialLinks.list('acct_XXXXXXXXXXXXXXX', { limit: 10, offset: 0 });
+ test.skip('list', async () => {
+ const responsePromise = client.trialLinks.list('acct_XXXXXXXXXXXXXXX');
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -65,19 +65,28 @@ describe('resource trialLinks', () => {
});
// Mock server tests are disabled
- test.skip('list: required and optional params', async () => {
- const response = await client.trialLinks.list('acct_XXXXXXXXXXXXXXX', {
- limit: 10,
- offset: 0,
- field: 'create_date',
- sort: 'desc',
- synchronous: false,
- });
+ test.skip('list: request options and params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ client.trialLinks.list(
+ 'acct_XXXXXXXXXXXXXXX',
+ {
+ endDate: '2025-01-31 23:59:59',
+ field: 'create_date',
+ limit: 10,
+ offset: 0,
+ sort: 'desc',
+ startDate: '2025-01-01 00:00:00',
+ synchronous: false,
+ },
+ { path: '/_stainless_unknown_path' },
+ ),
+ ).rejects.toThrow(OnlyFansAPI.NotFoundError);
});
// Mock server tests are disabled
test.skip('delete: only required params', async () => {
- const responsePromise = client.trialLinks.delete('officia', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.trialLinks.delete('consectetur', { account: 'acct_XXXXXXXXXXXXXXX' });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -89,7 +98,7 @@ describe('resource trialLinks', () => {
// Mock server tests are disabled
test.skip('delete: required and optional params', async () => {
- const response = await client.trialLinks.delete('officia', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const response = await client.trialLinks.delete('consectetur', { account: 'acct_XXXXXXXXXXXXXXX' });
});
// Mock server tests are disabled
@@ -118,7 +127,7 @@ describe('resource trialLinks', () => {
// Mock server tests are disabled
test.skip('listSubscribers: only required params', async () => {
- const responsePromise = client.trialLinks.listSubscribers('eum', {
+ const responsePromise = client.trialLinks.listSubscribers('incidunt', {
account: 'acct_XXXXXXXXXXXXXXX',
limit: 10,
offset: 0,
@@ -134,7 +143,7 @@ describe('resource trialLinks', () => {
// Mock server tests are disabled
test.skip('listSubscribers: required and optional params', async () => {
- const response = await client.trialLinks.listSubscribers('eum', {
+ const response = await client.trialLinks.listSubscribers('incidunt', {
account: 'acct_XXXXXXXXXXXXXXX',
limit: 10,
offset: 0,
@@ -143,7 +152,9 @@ describe('resource trialLinks', () => {
// Mock server tests are disabled
test.skip('retrieveCohortArps: only required params', async () => {
- const responsePromise = client.trialLinks.retrieveCohortArps('eius', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.trialLinks.retrieveCohortArps('dolore', {
+ account: 'acct_XXXXXXXXXXXXXXX',
+ });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -155,7 +166,7 @@ describe('resource trialLinks', () => {
// Mock server tests are disabled
test.skip('retrieveCohortArps: required and optional params', async () => {
- const response = await client.trialLinks.retrieveCohortArps('eius', {
+ const response = await client.trialLinks.retrieveCohortArps('dolore', {
account: 'acct_XXXXXXXXXXXXXXX',
acquisition_end: '2026-01-31T23:59:59Z',
acquisition_start: '2026-01-01T00:00:00Z',
@@ -165,7 +176,7 @@ describe('resource trialLinks', () => {
// Mock server tests are disabled
test.skip('retrieveStats: only required params', async () => {
- const responsePromise = client.trialLinks.retrieveStats('aut', { account: 'acct_XXXXXXXXXXXXXXX' });
+ const responsePromise = client.trialLinks.retrieveStats('autem', { account: 'acct_XXXXXXXXXXXXXXX' });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -177,7 +188,7 @@ describe('resource trialLinks', () => {
// Mock server tests are disabled
test.skip('retrieveStats: required and optional params', async () => {
- const response = await client.trialLinks.retrieveStats('aut', {
+ const response = await client.trialLinks.retrieveStats('autem', {
account: 'acct_XXXXXXXXXXXXXXX',
date_end: '2026-01-31T23:59:59Z',
date_start: '2026-01-01T00:00:00Z',
diff --git a/tests/api-resources/user-lists/user-lists.test.ts b/tests/api-resources/user-lists/user-lists.test.ts
index c1e9d27d..6828ffa8 100644
--- a/tests/api-resources/user-lists/user-lists.test.ts
+++ b/tests/api-resources/user-lists/user-lists.test.ts
@@ -10,7 +10,7 @@ const client = new OnlyFansAPI({
describe('resource userLists', () => {
// Mock server tests are disabled
test.skip('create: only required params', async () => {
- const responsePromise = client.userLists.create('acct_XXXXXXXXXXXXXXX', { name: 'sdqtzwslsvoxbkxj' });
+ const responsePromise = client.userLists.create('acct_XXXXXXXXXXXXXXX', { name: 'pplc' });
const rawResponse = await responsePromise.asResponse();
expect(rawResponse).toBeInstanceOf(Response);
const response = await responsePromise;
@@ -22,7 +22,7 @@ describe('resource userLists', () => {
// Mock server tests are disabled
test.skip('create: required and optional params', async () => {
- const response = await client.userLists.create('acct_XXXXXXXXXXXXXXX', { name: 'sdqtzwslsvoxbkxj' });
+ const response = await client.userLists.create('acct_XXXXXXXXXXXXXXX', { name: 'pplc' });
});
// Mock server tests are disabled
@@ -84,7 +84,11 @@ describe('resource userLists', () => {
await expect(
client.userLists.list(
'acct_XXXXXXXXXXXXXXX',
- { limit: 10, offset: 0 },
+ {
+ limit: 10,
+ offset: 0,
+ view: 'queue',
+ },
{ path: '/_stainless_unknown_path' },
),
).rejects.toThrow(OnlyFansAPI.NotFoundError);
diff --git a/tests/api-resources/user-lists/users.test.ts b/tests/api-resources/user-lists/users.test.ts
index 0fe19b83..5a0babd9 100644
--- a/tests/api-resources/user-lists/users.test.ts
+++ b/tests/api-resources/user-lists/users.test.ts
@@ -49,6 +49,7 @@ describe('resource users', () => {
const response = await client.userLists.users.add('userListId', {
account: 'acct_XXXXXXXXXXXXXXX',
ids: ['string', 'string', 'string'],
+ skip_invalid: true,
});
});