Data center proxies
Static data center IPs.
/api/v1/dc/products List products
GET /api/v1/dc/productsThe plans on sale and the periods each can be bought for. Prices depend on the quantity and locations, so ask POST /quote for one.
Requires the api.static.read scope.
limitinteger50.offsetinteger0.curl https://api.datafuel.ai/api/v1/dc/products \ --header 'Authorization: Bearer df_live_your_key_here'
OK.
{ "results": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "string", "description": "string", "max_ips": 0, "period_days": [ 0 ] } ], "count": 0, "limit": 0, "offset": 0 }
The request is malformed: message maps each invalid field to its problem, or is a sentence when the body cannot be read at all.
{ "error": "string", "message": "string", "meta": {} }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/products/{product} Get a product
GET /api/v1/dc/products/{product}The product with every country and region it can be ordered in, its stock level and how many IPs one order may take there.
Requires the api.static.read scope.
product REQUIREDstringcurl https://api.datafuel.ai/api/v1/dc/products/{product} \ --header 'Authorization: Bearer df_live_your_key_here'
OK.
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "string", "description": "string", "max_ips": 0, "period_days": [ 0 ], "locations": [ { "country": "US", "region": "CA", "region_name": "California", "stock_level": "high", "max_ips": 0 } ] }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such resource, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
Temporarily unavailable; nothing was changed, try again shortly.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/plans List your plans
GET /api/v1/dc/plansRequires the api.static.read scope.
limitinteger50.offsetinteger0.statusstringcurl https://api.datafuel.ai/api/v1/dc/plans \ --header 'Authorization: Bearer df_live_your_key_here'
OK.
{ "results": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z" } ], "count": 0, "limit": 0, "offset": 0 }
The request is malformed: message maps each invalid field to its problem, or is a sentence when the body cannot be read at all.
{ "error": "string", "message": "string", "meta": {} }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/plans/{plan} Get a plan
GET /api/v1/dc/plans/{plan}The plan with its authentication settings and locations. The username and password are at GET /plans/{plan}/credentials.
Requires the api.static.read scope.
plan REQUIREDstringcurl https://api.datafuel.ai/api/v1/dc/plans/{plan} \ --header 'Authorization: Bearer df_live_your_key_here'
OK.
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z", "auth": { "mode": "credentials", "allowed_ips": [ "string" ] }, "replacements_left": 0, "locations": [ { "country": "US", "region": "CA", "ips": 0 } ] }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such resource, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/plans/{plan}/proxies List a plan's proxies
GET /api/v1/dc/plans/{plan}/proxiesEvery IP of the plan with its port and location, plus the credentials to use them with. It carries the password, so it needs the manage level and is never cached.
Requires the api.static.manage scope.
plan REQUIREDstringformatstringcurl https://api.datafuel.ai/api/v1/dc/plans/{plan}/proxies \ --header 'Authorization: Bearer df_live_your_key_here'
OK.
{ "username": "string", "password": "string", "proxies": [ { "ip": "string", "port": 0, "country": "string", "region": "string" } ] }
The request is malformed: message maps each invalid field to its problem, or is a sentence when the body cannot be read at all.
{ "error": "string", "message": "string", "meta": {} }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such resource, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/plans/{plan}/credentials Get the credentials
GET /api/v1/dc/plans/{plan}/credentialsThe username and password every IP of the plan accepts in credentials mode. They are a secret, so reading them needs the manage level and the answer is never cached.
Requires the api.static.manage scope. Every call is recorded in the account's audit log.
plan REQUIREDstringcurl https://api.datafuel.ai/api/v1/dc/plans/{plan}/credentials \ --header 'Authorization: Bearer df_live_your_key_here'
OK.
{ "username": "string", "password": "string" }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such resource, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/plans/{plan}/credentials/reset Reset the credentials
POST /api/v1/dc/plans/{plan}/credentials/resetIssues a new password for every IP of the plan at once and answers the credentials; the old password stops working. The username stays. 409 plan_not_active unless the plan is active, plan_provisioning while some of its IPs are still being delivered.
Requires the api.static.manage scope. Every call is recorded in the account's audit log.
plan REQUIREDstringcurl https://api.datafuel.ai/api/v1/dc/plans/{plan}/credentials/reset \ --request POST \ --header 'Authorization: Bearer df_live_your_key_here'
OK.
{ "username": "string", "password": "string" }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such resource, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
The request conflicts with the resource's current state; error names why.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
The upstream provider refused the request; nothing was changed.
{ "error": "string", "message": "string", "meta": {} }
Temporarily unavailable; nothing was changed, try again shortly.
{ "error": "string", "message": "string", "meta": {} }
Something upstream did not answer in time and the change may still happen; read the resource (or the order) again before retrying.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/plans/{plan}/auth Set how the proxies authenticate
PUT /api/v1/dc/plans/{plan}/authcredentials asks for the username and password; ip lets only allowed_ips in. The list replaces the one the plan has. 409 plan_not_active unless the plan is active, plan_provisioning while some of its IPs are still being delivered.
Requires the api.static.manage scope.
plan REQUIREDstringmode REQUIREDstringallowed_ipsarray<string>curl https://api.datafuel.ai/api/v1/dc/plans/{plan}/auth \ --request PUT \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer df_live_your_key_here' \ --data '{ "mode": "credentials", "allowed_ips": [ "string" ] }'
OK.
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z", "auth": { "mode": "credentials", "allowed_ips": [ "string" ] }, "replacements_left": 0, "locations": [ { "country": "US", "region": "CA", "ips": 0 } ] }
The request is malformed: message maps each invalid field to its problem, or is a sentence when the body cannot be read at all.
{ "error": "string", "message": "string", "meta": {} }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such resource, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
The request conflicts with the resource's current state; error names why.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
The upstream provider refused the request; nothing was changed.
{ "error": "string", "message": "string", "meta": {} }
Temporarily unavailable; nothing was changed, try again shortly.
{ "error": "string", "message": "string", "meta": {} }
Something upstream did not answer in time and the change may still happen; read the resource (or the order) again before retrying.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/plans/{plan}/replace Replace the IPs
POST /api/v1/dc/plans/{plan}/replaceSwaps every IP of the plan for new ones in the same locations and spends one of replacements_left. Buy more with POST /plans/{plan}/orders. 409 plan_not_active unless the plan is active, plan_provisioning while some of its IPs are still being delivered, no_replacements_left when none are left.
Requires the api.static.manage scope.
plan REQUIREDstringcurl https://api.datafuel.ai/api/v1/dc/plans/{plan}/replace \ --request POST \ --header 'Authorization: Bearer df_live_your_key_here'
OK.
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z", "auth": { "mode": "credentials", "allowed_ips": [ "string" ] }, "replacements_left": 0, "locations": [ { "country": "US", "region": "CA", "ips": 0 } ] }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such resource, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
The request conflicts with the resource's current state; error names why.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
The upstream provider refused the request; nothing was changed.
{ "error": "string", "message": "string", "meta": {} }
Temporarily unavailable; nothing was changed, try again shortly.
{ "error": "string", "message": "string", "meta": {} }
Something upstream did not answer in time and the change may still happen; read the resource (or the order) again before retrying.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/quote Price a new plan
POST /api/v1/dc/quoteWhat POST /orders with the same body would charge, including discounts, tax and the payment method's fee, or why it cannot be ordered. Nothing is reserved. 404 when the product does not exist; 422 promo_code_invalid when the promo code is refused.
Requires the api.static.read scope.
product_id REQUIREDstringperiod_days REQUIREDintegerlocations REQUIREDarray<object>paymentobject | nullpromo_codestringcurl https://api.datafuel.ai/api/v1/dc/quote \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer df_live_your_key_here' \ --data '{ "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "period_days": 1, "locations": [ { "country": "US", "region": "CA", "ips": 1 } ], "payment": { "method": "balance", "card_id": "string" }, "promo_code": "string" }'
OK.
{ "purchasable": false, "issues": [ { "code": "string", "message": "string", "field": "string", "limit": 0 } ], "net": 0, "discount": 0, "tax": 0, "fee": 0, "total": 0, "currency": "usd" }
The request is malformed: message maps each invalid field to its problem, or is a sentence when the body cannot be read at all.
{ "error": "string", "message": "string", "meta": {} }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such resource, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
The request is well formed but cannot be carried out; error names why.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
Temporarily unavailable; nothing was changed, try again shortly.
{ "error": "string", "message": "string", "meta": {} }
Something upstream did not answer in time and the change may still happen; read the resource (or the order) again before retrying.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/orders Buy a new plan
POST /api/v1/dc/ordersCharges the balance or a saved card straight away, without asking the customer, and delivers the plan. 201 answers the delivered plan; 202 means it is paid and still being delivered, or the bank asked for 3-D Secure (order.action_url). 404 when the product does not exist.
Requires the api.static.purchase scope. Send a unique Idempotency-Key per order; repeating it with the same body answers the first order instead of charging again.
Idempotency-Key REQUIREDstringproduct_id REQUIREDstringperiod_days REQUIREDintegerlocations REQUIREDarray<object>payment REQUIREDobjectpromo_codestringcurl https://api.datafuel.ai/api/v1/dc/orders \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer df_live_your_key_here' \ --header 'Idempotency-Key: your-idempotency-key' \ --data '{ "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "period_days": 1, "locations": [ { "country": "US", "region": "CA", "ips": 1 } ], "payment": { "method": "balance", "card_id": "string" }, "promo_code": "string" }'
A repeated Idempotency-Key: the order it placed first, with replayed: true.
{ "order": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "pending", "service": "string", "product": "string", "action": "new", "total": 0, "currency": "usd", "payment": { "method": "balance", "card_id": "string" }, "plan_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "action_url": "https://example.com", "error": { "code": "insufficient_balance", "message": "string" }, "replayed": false, "created_at": "2026-01-01T00:00:00Z", "paid_at": "2026-01-01T00:00:00Z" }, "plan": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z", "auth": { "mode": "credentials", "allowed_ips": [ "string" ] }, "replacements_left": 0, "locations": [ { "country": "US", "region": "CA", "ips": 0 } ] } }
Paid and delivered.
{ "order": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "pending", "service": "string", "product": "string", "action": "new", "total": 0, "currency": "usd", "payment": { "method": "balance", "card_id": "string" }, "plan_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "action_url": "https://example.com", "error": { "code": "insufficient_balance", "message": "string" }, "replayed": false, "created_at": "2026-01-01T00:00:00Z", "paid_at": "2026-01-01T00:00:00Z" }, "plan": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z", "auth": { "mode": "credentials", "allowed_ips": [ "string" ] }, "replacements_left": 0, "locations": [ { "country": "US", "region": "CA", "ips": 0 } ] } }
Paid and still being delivered (poll GET /api/v1/orders/{id}), or waiting for 3-D Secure at order.action_url.
{ "order": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "pending", "service": "string", "product": "string", "action": "new", "total": 0, "currency": "usd", "payment": { "method": "balance", "card_id": "string" }, "plan_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "action_url": "https://example.com", "error": { "code": "insufficient_balance", "message": "string" }, "replayed": false, "created_at": "2026-01-01T00:00:00Z", "paid_at": "2026-01-01T00:00:00Z" }, "plan": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z", "auth": { "mode": "credentials", "allowed_ips": [ "string" ] }, "replacements_left": 0, "locations": [ { "country": "US", "region": "CA", "ips": 0 } ] } }
The request is malformed: message maps each invalid field to its problem, or is a sentence when the body cannot be read at all.
{ "error": "string", "message": "string", "meta": {} }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The payment was declined; error names why and meta.order is the failed order.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required, is used from an IP it does not allow, the order would pass the key's monthly spending limit (spend_limit_exceeded), or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such product or plan, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
in_progress: another order of the account is still being placed, retry shortly with the same key; idempotency_conflict: the Idempotency-Key was already used for a different order; duplicate_request: the key was already used and its order is still being recorded, look it up instead of sending it again.
{ "error": "string", "message": "string", "meta": {} }
The order cannot be placed; error names why: not_purchasable (with meta.issues when the order itself is at fault, e.g. out of stock), promo_code_invalid, amount_too_small or payment_rejected.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
Temporarily unavailable; nothing was changed, try again shortly.
{ "error": "string", "message": "string", "meta": {} }
Something upstream did not answer in time and the change may still happen; read the resource (or the order) again before retrying.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/plans/{plan}/quote Price an add-on
POST /api/v1/dc/plans/{plan}/quoteWhat POST /plans/{plan}/orders with the same body would charge. 422 promo_code_invalid when the promo code is refused.
Requires the api.static.read scope.
plan REQUIREDstringreplacements REQUIREDintegerpaymentobject | nullpromo_codestringcurl https://api.datafuel.ai/api/v1/dc/plans/{plan}/quote \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer df_live_your_key_here' \ --data '{ "replacements": 1, "payment": { "method": "balance", "card_id": "string" }, "promo_code": "string" }'
OK.
{ "purchasable": false, "issues": [ { "code": "string", "message": "string", "field": "string", "limit": 0 } ], "net": 0, "discount": 0, "tax": 0, "fee": 0, "total": 0, "currency": "usd" }
The request is malformed: message maps each invalid field to its problem, or is a sentence when the body cannot be read at all.
{ "error": "string", "message": "string", "meta": {} }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required (or the level in meta.required_level), is used from an IP it does not allow, or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such resource, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
The request is well formed but cannot be carried out; error names why.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
Temporarily unavailable; nothing was changed, try again shortly.
{ "error": "string", "message": "string", "meta": {} }
Something upstream did not answer in time and the change may still happen; read the resource (or the order) again before retrying.
{ "error": "string", "message": "string", "meta": {} }
/api/v1/dc/plans/{plan}/orders Buy an add-on
POST /api/v1/dc/plans/{plan}/ordersBuys more IP replacements for a plan you hold, charged straight away.
Requires the api.static.purchase scope. Send a unique Idempotency-Key per order; repeating it with the same body answers the first order instead of charging again.
plan REQUIREDstringIdempotency-Key REQUIREDstringreplacements REQUIREDintegerpayment REQUIREDobjectpromo_codestringcurl https://api.datafuel.ai/api/v1/dc/plans/{plan}/orders \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer df_live_your_key_here' \ --header 'Idempotency-Key: your-idempotency-key' \ --data '{ "replacements": 1, "payment": { "method": "balance", "card_id": "string" }, "promo_code": "string" }'
A repeated Idempotency-Key: the order it placed first, with replayed: true.
{ "order": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "pending", "service": "string", "product": "string", "action": "new", "total": 0, "currency": "usd", "payment": { "method": "balance", "card_id": "string" }, "plan_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "action_url": "https://example.com", "error": { "code": "insufficient_balance", "message": "string" }, "replayed": false, "created_at": "2026-01-01T00:00:00Z", "paid_at": "2026-01-01T00:00:00Z" }, "plan": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z", "auth": { "mode": "credentials", "allowed_ips": [ "string" ] }, "replacements_left": 0, "locations": [ { "country": "US", "region": "CA", "ips": 0 } ] } }
Paid and delivered.
{ "order": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "pending", "service": "string", "product": "string", "action": "new", "total": 0, "currency": "usd", "payment": { "method": "balance", "card_id": "string" }, "plan_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "action_url": "https://example.com", "error": { "code": "insufficient_balance", "message": "string" }, "replayed": false, "created_at": "2026-01-01T00:00:00Z", "paid_at": "2026-01-01T00:00:00Z" }, "plan": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z", "auth": { "mode": "credentials", "allowed_ips": [ "string" ] }, "replacements_left": 0, "locations": [ { "country": "US", "region": "CA", "ips": 0 } ] } }
Paid and still being delivered (poll GET /api/v1/orders/{id}), or waiting for 3-D Secure at order.action_url.
{ "order": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "pending", "service": "string", "product": "string", "action": "new", "total": 0, "currency": "usd", "payment": { "method": "balance", "card_id": "string" }, "plan_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "action_url": "https://example.com", "error": { "code": "insufficient_balance", "message": "string" }, "replayed": false, "created_at": "2026-01-01T00:00:00Z", "paid_at": "2026-01-01T00:00:00Z" }, "plan": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "product_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "provisioning", "ips": 0, "period_days": 0, "expires_at": "2026-01-01T00:00:00Z", "subscription_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "created_at": "2026-01-01T00:00:00Z", "auth": { "mode": "credentials", "allowed_ips": [ "string" ] }, "replacements_left": 0, "locations": [ { "country": "US", "region": "CA", "ips": 0 } ] } }
The request is malformed: message maps each invalid field to its problem, or is a sentence when the body cannot be read at all.
{ "error": "string", "message": "string", "meta": {} }
The API key is missing, invalid, expired or revoked.
{ "error": "string", "message": "string", "meta": {} }
The payment was declined; error names why and meta.order is the failed order.
{ "error": "string", "message": "string", "meta": {} }
The key lacks the scope named in meta.required, is used from an IP it does not allow, the order would pass the key's monthly spending limit (spend_limit_exceeded), or the account is suspended.
{ "error": "string", "message": "string", "meta": {} }
No such product or plan, or it does not belong to the key's owner.
{ "error": "string", "message": "string", "meta": {} }
in_progress: another order of the account is still being placed, retry shortly with the same key; idempotency_conflict: the Idempotency-Key was already used for a different order; duplicate_request: the key was already used and its order is still being recorded, look it up instead of sending it again.
{ "error": "string", "message": "string", "meta": {} }
The order cannot be placed; error names why: not_purchasable (with meta.issues when the order itself is at fault, e.g. out of stock), promo_code_invalid, amount_too_small or payment_rejected.
{ "error": "string", "message": "string", "meta": {} }
Too many requests for this key; retry after the Retry-After seconds.
{ "error": "string", "message": "string", "meta": {} }
Something failed on our side and was logged; read the resource again before retrying a change.
{ "error": "string", "message": "string", "meta": {} }
Temporarily unavailable; nothing was changed, try again shortly.
{ "error": "string", "message": "string", "meta": {} }
Something upstream did not answer in time and the change may still happen; read the resource (or the order) again before retrying.
{ "error": "string", "message": "string", "meta": {} }