Request a takedown
const url = 'https://app.nebty.de/core/api/takedowns/';const options = { method: 'POST', headers: {Authorization: '<Authorization>', 'Content-Type': 'application/json'}, body: '{"target_website":"https://example.com","user_comment":"example","brand":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","authorization_consent":true,"accepted_price":"example","accepted_currency":"USD"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://app.nebty.de/core/api/takedowns/ \ --header 'Authorization: <Authorization>' \ --header 'Content-Type: application/json' \ --data '{ "target_website": "https://example.com", "user_comment": "example", "brand": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "authorization_consent": true, "accepted_price": "example", "accepted_currency": "USD" }'Requests a takedown of a website. Send target_website (an http or https URL on a public host; localhost and non-public IP addresses are rejected) and optionally brand (UUID) and user_comment.
If you pass brand, the API key’s user must be a member of it, otherwise the request is rejected with 400. Once nebty enforces the price consent, a user who is a member of a brand that takes it must pass brand; without it the request is rejected with 400 and code: brand_required.
The new takedown starts as OPEN or as REQUESTED (not yet started; nebty checks it first and then moves it to OPEN, or to REJECTED). Read status in the 201 response; do not assume either.
Price consent. For some brands an order is billed at a price per successful takedown that the person ordering must accept. Then send the accepted price as accepted_price (decimal string, net, VAT on top) and accepted_currency (EUR, USD or CAD), both or neither. Sending them is a binding order at that price: show the price to a person and let them accept it before you send it, and never fill it in from an error response by itself. A price that no longer matches is rejected with 409 and code: price_changed; once nebty enforces the consent, an order without it is rejected with 400 and code: price_consent_required. Both bodies carry the current price as price: {amount, currency}. For brands that take no price consent, sending the fields is rejected with 400 and code: price_not_applicable; leave them out. The accepted price is returned as price and price_currency on the takedown, and nebty mails the requesting user a confirmation of the order with the price and the next step.
One active case per website. If the brand (or, without brand, the API key’s user) already has an active takedown (REQUESTED, OPEN, IN_PROGRESS or PENDING_RESPONSE) for the same host, the request is rejected with 409, code: duplicate and the existing case’s id as takedown_id. The host is compared without case and a leading www.; a subdomain is another host. Nothing is created or billed.
Once nebty enforces the signed Power of Attorney, also send authorization_consent: true (you confirm you are authorized to request the takedown for the brand), and the brand needs an active signed Power of Attorney. Without one the request is rejected with 400 and code: poa_required; a brand admin grants it in the nebty dashboard. Until then the field is accepted and ignored.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”Serializer for creating new takedown requests.
object
The target website URL for the takedown request
Optional comment from the requesting user
Brand associated with this takedown. All users with access to this brand can view the takedown.
The caller confirms they are authorized to request this takedown for the brand. Required (true) for customers once Power of Attorney enforcement is on.
The price per successful takedown the person ordering was shown and accepted (net, VAT on top), from the takedown quote. Send it together with accepted_currency, and only when the quote asks for consent.
The currency of accepted_price.
USD- US$CAD- CA$EUR- EUR
Serializer for creating new takedown requests.
object
The target website URL for the takedown request
Optional comment from the requesting user
Brand associated with this takedown. All users with access to this brand can view the takedown.
The caller confirms they are authorized to request this takedown for the brand. Required (true) for customers once Power of Attorney enforcement is on.
The price per successful takedown the person ordering was shown and accepted (net, VAT on top), from the takedown quote. Send it together with accepted_currency, and only when the quote asks for consent.
The currency of accepted_price.
USD- US$CAD- CA$EUR- EUR
Serializer for creating new takedown requests.
object
The target website URL for the takedown request
Optional comment from the requesting user
Brand associated with this takedown. All users with access to this brand can view the takedown.
The caller confirms they are authorized to request this takedown for the brand. Required (true) for customers once Power of Attorney enforcement is on.
The price per successful takedown the person ordering was shown and accepted (net, VAT on top), from the takedown quote. Send it together with accepted_currency, and only when the quote asks for consent.
The currency of accepted_price.
USD- US$CAD- CA$EUR- EUR
Responses
Section titled “Responses”Serializer for takedown request details.
object
The target website URL for the takedown request
What the case is against. ‘token’ is a fake crypto token (smart contract); target_website then holds the contract’s block-explorer URL, and the domain autofill and post-close rescan skip the row. Only staff may set ‘token’.
website- Websitetoken- Token
Token only: the specific listing or trading platform covered by the customer’s order.
listing_removed- Remove the agreed token listingtrading_blocked- Block trading on the agreed platform
Token only: the removal or trading block agreed before work starts.
listing_removed- Remove the agreed token listingtrading_blocked- Block trading on the agreed platform
Server timestamp when the complete token order scope was first recorded. The scope is then immutable.
Optional comment from the requesting user
Brand associated with this takedown. All users with access to this brand can view the takedown.
Legacy free-text brand name (deprecated, use brand FK instead)
Current status of the takedown request
REQUESTED- Pending reviewOPEN- OpenIN_PROGRESS- In ProgressPENDING_RESPONSE- Pending ResponseCLOSED- ClosedFAILED- FailedREJECTED- Rejected
Timestamp when the takedown case was closed.
MEASURED- Measured at closureDERIVED_FROM_EVENT- Derived from status-change eventDERIVED_FROM_NOTE- Derived from last case note (±1 day)
How closed_at was arrived at: MEASURED (stamped at closure or entered by staff), DERIVED_FROM_EVENT (reconstructed from the status-change audit event, exact), DERIVED_FROM_NOTE (reconstructed from the last case note, +/-1 day), or blank when no closing date is known. Reports averaging resolution time should state how many inputs were reconstructed.
MEASURED- Measured at closureDERIVED_FROM_EVENT- Derived from status-change eventDERIVED_FROM_NOTE- Derived from last case note (±1 day)
DOMAIN_SUSPENDED- Domain SuspendedCONTENT_REMOVED- Content RemovedSERVER_HOLD- Server HoldVOLUNTARY_TAKEDOWN- Voluntary TakedownUNRESOLVED- UnresolvedFALSE_POSITIVE- False PositiveTOKEN_LISTING_REMOVED- Agreed token listing removedTOKEN_TRADING_BLOCKED- Trading blocked on agreed platformTOKEN_WARNING_ADDED- Token warning added (partial mitigation)
Outcome of the takedown case.
DOMAIN_SUSPENDED- Domain SuspendedCONTENT_REMOVED- Content RemovedSERVER_HOLD- Server HoldVOLUNTARY_TAKEDOWN- Voluntary TakedownUNRESOLVED- UnresolvedFALSE_POSITIVE- False PositiveTOKEN_LISTING_REMOVED- Agreed token listing removedTOKEN_TRADING_BLOCKED- Trading blocked on agreed platformTOKEN_WARNING_ADDED- Token warning added (partial mitigation)
Price per successful takedown, net plus VAT, that the customer accepted with the order. 0.00 is a real price; null means no price was frozen.
Domain registrar, e.g. ‘Openprovider’, ‘Sav.com’
Domain registration date from WHOIS.
Domain expiry date from WHOIS.
WHOIS status, e.g. ‘clientTransferProhibited’, ‘serverHold’
Resolved IP address (may be proxy IP).
Real server IP behind CDN/proxy.
AS number, e.g. ‘AS13335’
Hosting provider, e.g. ‘Hostinger’, ‘Hetzner’
CDN/proxy provider, e.g. ‘Cloudflare’
Whether the domain is behind a CDN/proxy.
Backend service, e.g. ‘Supabase’, ‘Vercel’
Project ID at backend provider.
SSL certificate issue date.
SSL certificate expiry date.
Certificate issuer, e.g. ‘Let’s Encrypt’, ‘Cloudflare’
DNS A record information (DEPRECATED - use dns_raw)
DNS NS record information (DEPRECATED - use dns_raw)
Full DNS records as JSON. Expected structure: {“a”: […], “aaaa”: […], “cname”: […], “mx”: […], “ns”: […], “txt”: […], “soa”: […], “caa”: […]}
Score, e.g. ‘16/93’
Link to VirusTotal report.
Link to urlscan.io result.
URL to screenshot in Hetzner S3 Object Storage.
When the screenshot was taken.
Serializer for abuse contact details.
object
REGISTRAR- RegistrarHOSTING- Hosting ProviderCDN- CDN / ProxyBACKEND- Backend ServiceREGISTRY- Domain RegistryOTHER- Other
Provider name, e.g. ‘Cloudflare’, ‘Openprovider’
Abuse email address.
URL to abuse report form.
NOT_SENT- Not SentSENT- SentACKNOWLEDGED- AcknowledgedACTION_TAKEN- Action TakenREJECTED- RejectedNO_RESPONSE- No Response
Provider case reference, e.g. ‘Case 00954977’
Serializer for blacklist submission details.
object
P1- P1 - Immediate (GSB, Netcraft, SmartScreen)P2- P2 - Distribution (Spamhaus, Openphish, SpamCop)P3- P3 - Prevention (VirusTotal, Symantec, ScamAdviser)
Blacklist service name, e.g. ‘Google Safe Browsing’, ‘Spamhaus’
URL for submission.
PENDING- PendingSUBMITTED- SubmittedLISTED- ListedREJECTED- Rejected
When listing was confirmed.
Example
{ "category": "website", "token_objective": "listing_removed", "status": "REQUESTED", "closed_at_source": "MEASURED", "resolution": "DOMAIN_SUSPENDED", "price_currency": "USD", "abuse_contacts": [ { "contact_type": "REGISTRAR", "report_status": "NOT_SENT" } ], "blacklist_submissions": [ { "tier": "P1", "status": "PENDING" } ]}Invalid request data (field errors directly on the response), a refused order with a code (poa_required, brand_required, price_not_applicable), or code: price_consent_required with the current price.
object
Field names mapped directly to validation error messages.
object
A takedown order whose price consent is missing or outdated.
object
object
Example
{ "target_website": [ "Target host is not a public address." ]}The API key is missing, invalid, revoked or belongs to an inactive user.
object
Examplegenerated
{ "detail": "example"}code: price_changed: the accepted_price no longer matches. The body carries the current price as price: {amount, currency}; show it to the person ordering and order again. code: poa_not_approved (staff keys only): the brand’s Power of Attorney is still under review. code: duplicate: an active takedown for this host exists; takedown_id is its id.
object
A takedown order whose price consent is missing or outdated.
object
object
A takedown order for a host that already has an active takedown.
object
Example
{ "code": "price_changed", "detail": "The price has changed. Show the new price and order again.", "price": { "amount": "400.00", "currency": "EUR" }}Too many requests or failed authentication attempts. Try again later.
object
Examplegenerated
{ "detail": "example"}