> For the complete documentation index, see [llms.txt](https://detected.gitbook.io/detected-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://detected.gitbook.io/detected-docs/api-reference/profiles/online-presence.md).

# Online Presence

A profile can have one website domain. When a domain is added, it is analysed in the background, including WHOIS records, social media, online presence and a scam advisor check. This analysis can be used to trigger risk rules, and the granular data can be retrieved by API.

## Retrieve online presence analysis

> Returns the domain and online presence details for a profile, including WHOIS, social media, reviews and scam advisor analysis.

```json
{"openapi":"3.0.0","info":{"title":"Detected API","version":"v2"},"tags":[{"name":"Profile Online Presence","description":"A profile can have one website domain. When a domain is added, it is analysed in the background, including WHOIS records, social media, online presence and a scam advisor check. This analysis can be used to trigger risk rules, and the granular data can be retrieved by API."}],"servers":[{"url":"https://api.detected.app/api/v2/public","description":"Production"}],"security":[{"AccessToken":[]}],"components":{"securitySchemes":{"AccessToken":{"type":"http","description":"The API uses OAuth 2.0. Request an access token with **Create an access token** (`POST /oauth/token`), sending the client ID and client secret of your integration client, and your account slug. Send the access token in the `Authorization` header of every request, in the format `Authorization: Bearer <access_token>`. The access token carries the scopes set on your integration client in the dashboard. Access tokens expire. When one expires, request a new one.","bearerFormat":"OAuth 2.0 access token","scheme":"bearer"}},"parameters":{"profileUuid":{"name":"uuid","in":"path","description":"UUID of the profile.","required":true,"schema":{"type":"string","format":"uuid","nullable":false}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of requests allowed in the rate limit window.","schema":{"type":"number","nullable":false}},"X-RateLimit-Remaining":{"description":"Number of requests remaining in the current rate limit window.","schema":{"type":"number","nullable":false}},"Retry-After":{"description":"Number of seconds to wait before making another request. Returned when the rate limit has been reached.","schema":{"type":"number","nullable":false}},"X-RateLimit-Reset":{"description":"Unix timestamp (in seconds) at which the rate limit resets. Returned when the rate limit has been reached.","schema":{"type":"number","nullable":false}}},"schemas":{"ProfileDomainResource":{"title":"Profile Domain Resource","required":["type","domain"],"properties":{"type":{"description":"Type of the domain. Either `portal` or `api_import`.","type":"string","nullable":false},"domain":{"description":"The domain name.","type":"string","nullable":false},"whois":{"description":"Details about the WHOIS information of the domain.","properties":{"status":{"description":"WHOIS status of the domain.","type":"string","nullable":true},"age":{"description":"Human readable age of domain.","type":"string","nullable":true},"ageDays":{"description":"Age of the domain in days.","type":"integer","nullable":true},"createdAt":{"description":"Creation date of the domain.","type":"string","format":"date-time","nullable":true},"updatedAt":{"description":"Last updated date of domain WHOIS details.","type":"string","format":"date-time","nullable":true},"expiresAt":{"description":"Expiry date of the domain registration.","type":"string","format":"date-time","nullable":true}},"type":"object","nullable":true},"social":{"description":"Details about the social media presence of the company.","properties":{"title":{"description":"Title representing the company's online presence.","type":"string","nullable":true},"description":{"description":"Description about the company's objective or online presence.","type":"string","nullable":true},"responded":{"description":"Indicates if the website was active during the crawling.","type":"boolean","nullable":true},"twitter":{"description":"Twitter profile URL of the company.","type":"string","nullable":true},"facebook":{"description":"Facebook profile URL of the company.","type":"string","nullable":true},"linkedIn":{"description":"LinkedIn profile URL of the company.","type":"string","nullable":true},"instagram":{"description":"Instagram profile URL of the company.","type":"string","nullable":true}},"type":"object","nullable":true},"online_presence":{"properties":{"founding_year":{"description":"Year the company was founded.","type":"string","nullable":true},"phone_number":{"description":"A contact phone number for the company.","type":"string","nullable":true},"industry":{"description":"The industry of the company.","type":"string","nullable":true},"tags":{"description":"Tags describing the company.","type":"array","items":{"type":"string"},"nullable":true},"address":{"description":"The company address.","type":"string","nullable":true}},"type":"object","description":"Online presence details for the domain, or `null` if not available.","nullable":true},"scam_advisor":{"description":"Scam advisor assessment details for the given domain.","properties":{"score":{"description":"The actual Trust Score of the Domain (0 = very likely a scam, 100 = very likely legit).","type":"integer","nullable":true},"blacklisted":{"description":"Whether the domain is blacklisted.","type":"boolean","nullable":true},"dns_threat_markers":{"description":"Number of DNS services identifying the domain as containing malicious (threat) content.","type":"integer","nullable":true},"dns_adult_content_markers":{"description":"Number of DNS services identifying the domain as containing adult content.","type":"integer","nullable":true},"website_title":{"description":"The meta-title of the website obtained by the scam advisor.","type":"string","nullable":true},"website_description":{"description":"The meta-description of the website retrieved by the scam advisor.","type":"string","nullable":true},"website_keywords":{"description":"Meta-keywords defined for the website.","type":"array","items":{"type":"string"},"nullable":true},"block_search_engines":{"description":"Whether the domain has a robots.txt that blocks search engines from indexing the site.","type":"boolean","nullable":true},"reviews":{"description":"List of reviews for the domain from various sources.","type":"array","items":{"properties":{"source":{"description":"The platform from which the review is sourced (e.g., Trustpilot).","type":"string","nullable":true},"source_url":{"description":"URL to the review source.","type":"string","format":"url","nullable":true},"count":{"description":"The total number of available reviews for this domain from the review source.","type":"integer","nullable":true},"avg_score":{"description":"The average review score (normalised between 1 [very bad] and 5 [very good]).","type":"number","format":"float","nullable":true}},"type":"object"},"nullable":true},"gca_domain_trust":{"description":"Assessment details for Global Cyber Alliance domain trust metrics.","properties":{"type":{"description":"The type of rating assigned (e.g., C = Third parties like Scamadviser/Spamhaus).","type":"string","nullable":true},"activity":{"description":"Domain activity status (A = active site, S = suspended, N = non-existing).","type":"string","nullable":true},"provider":{"description":"The name of the provider reporting the domain trust analysis.","type":"string","nullable":true},"created_at":{"description":"Date and time the trust data was first provided.","type":"string","format":"date-time","nullable":true},"is_blocked":{"description":"Indicates if the domain's trust level is blocked.","type":"boolean","nullable":true},"updated_at":{"description":"Date and time the trust data was last updated.","type":"string","format":"date-time","nullable":true},"source_name":{"description":"The source of the trust data (e.g., ScamAdviser).","type":"string","nullable":true},"provider_role":{"description":"The role of the provider (e.g., registry, registrar, or other).","type":"string","nullable":true},"classification":{"description":"Classification level of trustworthiness (e.g., 1 = Definitely legitimate).","type":"integer","nullable":true},"external_source":{"description":"Indicates if the data originates from an external source.","type":"boolean","nullable":true},"provider_rating":{"description":"The internal rating of the provider's reliability.","type":"string","nullable":true}},"type":"object","nullable":true},"antiphishing":{"description":"Domain data from the eCrime Exchange.","properties":{"count":{"description":"The count of sources that flagged the domain as being used for phishing.","type":"integer","nullable":true}},"type":"object","nullable":true},"certnz":{"description":"CERT NZ marker information.","properties":{"labels":{"description":"Labels describing the possible threat(s).","type":"array","items":{"type":"string"},"nullable":true},"marking":{"description":"Classification provided by CERT NZ (e.g., amber, red).","type":"string","nullable":true}},"type":"object","nullable":true},"maltiverse":{"description":"Maltiverse classification and threat tags for the domain.","properties":{"tags":{"description":"List of threat tags identified by Maltiverse.","type":"array","items":{"type":"string"},"nullable":true},"classification":{"description":"Domain threat classification by Maltiverse.","type":"string","nullable":true}},"type":"object","nullable":true},"ipqs":{"description":"IPQS domain analysis results.","properties":{"risk_score":{"description":"Overall risk score assigned by IPQS to the domain.","type":"integer","nullable":true},"unsafe":{"description":"Indicates if the domain is flagged as unsafe by IPQS.","type":"boolean","nullable":true},"dns_valid":{"description":"Whether IPQS considers the DNS of the domain valid.","type":"boolean","nullable":true},"parking":{"description":"Whether the domain is identified as parked.","type":"boolean","nullable":true},"spamming":{"description":"Indicates if significant spam activity originates from the domain.","type":"boolean","nullable":true},"malware":{"description":"Indicates if malware distribution has been detected for the domain.","type":"boolean","nullable":true},"phishing":{"description":"Indicates if phishing attempts are associated with the domain.","type":"boolean","nullable":true},"suspicious":{"description":"Identifies suspicious activity associated with the domain.","type":"boolean","nullable":true},"adult":{"description":"Whether adult content is hosted on the domain.","type":"boolean","nullable":true},"domain_age":{"description":"The age of the domain in timestamp form.","type":"integer","nullable":true}},"type":"object","nullable":true},"created_at":{"description":"Date and time this record was created.","type":"string","nullable":true},"updated_at":{"description":"Date and time this record was last updated.","type":"string","nullable":true}},"type":"object","nullable":true},"core_signal":{"description":"Additional company signals for the domain, or `null` if not available.","type":"object","nullable":true,"additionalProperties":true}},"type":"object"}},"responses":{"401":{"description":"Unauthorized. The access token is missing, invalid or has expired.","content":{"application/json":{"schema":{"properties":{"message":{"description":"A human-readable description of the error.","type":"string"}},"type":"object"}}}},"404":{"description":"Not Found. The requested resource does not exist, or is not available to your account.","content":{"application/json":{"schema":{"properties":{"message":{"description":"A human-readable description of the error.","type":"string"},"error":{"description":"Machine-readable details of the error.","type":"object","properties":{"key":{"description":"Error code, for example `error.generic`.","type":"string"},"params":{"description":"Values used in the error message, if any.","type":"array","items":{}}}}},"type":"object"}}}},"429":{"description":"Too Many Requests. You have exceeded the rate limit. Wait for the number of seconds given in the `Retry-After` header before trying again.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"Retry-After":{"$ref":"#/components/headers/Retry-After"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"properties":{"message":{"description":"A human-readable description of the error.","type":"string"}},"type":"object"}}}}}},"paths":{"/profiles/{uuid}/domain":{"get":{"tags":["Profile Online Presence"],"summary":"Retrieve online presence analysis","description":"Returns the domain and online presence details for a profile, including WHOIS, social media, reviews and scam advisor analysis.","operationId":"68304a0a248b6141fe445ecacbf50b96","parameters":[{"$ref":"#/components/parameters/profileUuid"}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"}},"content":{"application/json":{"schema":{"properties":{"data":{"description":"The domain and its analysis. An empty list (`[]`) if the profile has no domain.","oneOf":[{"$ref":"#/components/schemas/ProfileDomainResource"},{"type":"array","maxItems":0}]}},"type":"object"}}}},"401":{"$ref":"#/components/responses/401"},"404":{"$ref":"#/components/responses/404"},"429":{"$ref":"#/components/responses/429"}}}}}}
```

## Add a domain to a profile

> Adds a domain to a profile, if it does not already have one. The domain is processed in the background, so the response is \`202 Accepted\`. Retrieve the results later with \*\*Retrieve online presence analysis\*\* (\`GET /profiles/{uuid}/domain\`).\
> \
> A domain can also be added when creating a profile with \*\*Create a profile\*\* (\`POST /profiles\`), so the analysis runs as part of the initial profile creation.

```json
{"openapi":"3.0.0","info":{"title":"Detected API","version":"v2"},"tags":[{"name":"Profile Online Presence","description":"A profile can have one website domain. When a domain is added, it is analysed in the background, including WHOIS records, social media, online presence and a scam advisor check. This analysis can be used to trigger risk rules, and the granular data can be retrieved by API."}],"servers":[{"url":"https://api.detected.app/api/v2/public","description":"Production"}],"security":[{"AccessToken":[]}],"components":{"securitySchemes":{"AccessToken":{"type":"http","description":"The API uses OAuth 2.0. Request an access token with **Create an access token** (`POST /oauth/token`), sending the client ID and client secret of your integration client, and your account slug. Send the access token in the `Authorization` header of every request, in the format `Authorization: Bearer <access_token>`. The access token carries the scopes set on your integration client in the dashboard. Access tokens expire. When one expires, request a new one.","bearerFormat":"OAuth 2.0 access token","scheme":"bearer"}},"parameters":{"profileUuid":{"name":"uuid","in":"path","description":"UUID of the profile.","required":true,"schema":{"type":"string","format":"uuid","nullable":false}}},"schemas":{"CreateProfileDomainRequest":{"title":"Create Profile Domain Request","required":["domain"],"properties":{"domain":{"description":"Domain, without protocol or path, for example `subdomain.example.com`.","type":"string","nullable":false}},"type":"object"}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of requests allowed in the rate limit window.","schema":{"type":"number","nullable":false}},"X-RateLimit-Remaining":{"description":"Number of requests remaining in the current rate limit window.","schema":{"type":"number","nullable":false}},"Retry-After":{"description":"Number of seconds to wait before making another request. Returned when the rate limit has been reached.","schema":{"type":"number","nullable":false}},"X-RateLimit-Reset":{"description":"Unix timestamp (in seconds) at which the rate limit resets. Returned when the rate limit has been reached.","schema":{"type":"number","nullable":false}}},"responses":{"401":{"description":"Unauthorized. The access token is missing, invalid or has expired.","content":{"application/json":{"schema":{"properties":{"message":{"description":"A human-readable description of the error.","type":"string"}},"type":"object"}}}},"404":{"description":"Not Found. The requested resource does not exist, or is not available to your account.","content":{"application/json":{"schema":{"properties":{"message":{"description":"A human-readable description of the error.","type":"string"},"error":{"description":"Machine-readable details of the error.","type":"object","properties":{"key":{"description":"Error code, for example `error.generic`.","type":"string"},"params":{"description":"Values used in the error message, if any.","type":"array","items":{}}}}},"type":"object"}}}},"422":{"description":"Unprocessable Content. The request was understood but failed validation. `errors` lists each field that failed and why.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"description":"A human-readable description of the first error.","type":"string"},"errors":{"description":"Validation errors, keyed by the name of the field that failed. Each field has a list of messages.","type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}}}}},"429":{"description":"Too Many Requests. You have exceeded the rate limit. Wait for the number of seconds given in the `Retry-After` header before trying again.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"Retry-After":{"$ref":"#/components/headers/Retry-After"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"properties":{"message":{"description":"A human-readable description of the error.","type":"string"}},"type":"object"}}}}}},"paths":{"/profiles/{uuid}/domain":{"post":{"tags":["Profile Online Presence"],"summary":"Add a domain to a profile","description":"Adds a domain to a profile, if it does not already have one. The domain is processed in the background, so the response is `202 Accepted`. Retrieve the results later with **Retrieve online presence analysis** (`GET /profiles/{uuid}/domain`).\n\nA domain can also be added when creating a profile with **Create a profile** (`POST /profiles`), so the analysis runs as part of the initial profile creation.","operationId":"create-profile-domain-endpoint","parameters":[{"$ref":"#/components/parameters/profileUuid"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProfileDomainRequest"}}}},"responses":{"202":{"description":"Accepted. The domain has been queued for processing.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"}}},"401":{"$ref":"#/components/responses/401"},"404":{"$ref":"#/components/responses/404"},"422":{"$ref":"#/components/responses/422"},"429":{"$ref":"#/components/responses/429"}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://detected.gitbook.io/detected-docs/api-reference/profiles/online-presence.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
