---
updatedAt: 2026-04-24T14:52:01.000Z
agentTools:
  projectIndex: https://oysterskin.readme.io/llms.txt
---

# Get skin care goals

Get all available skin care goals for user selection.

# OpenAPI definition

````json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Oyster Skin API",
    "description": "The Oyster Skin API is a RESTful API that provides a way to interact with the Oyster Skin platform.\n\nAll endpoints return JSON responses and use standard HTTP status codes.\n\n## Authentication\nThe API uses Bearer token authentication. Include your API key in the Authorization header:\n```\nAuthorization: Bearer <your-token>\n```\n\nKeys are issued from **API Manager** in the vendor portal, by the account owner or a team\nmember with the `create api` permission.\n\n### Keys belong to the organisation\nAn API key is owned by the vendor account, not by the person who created it. Removing that\nperson from the team, changing their role, or revoking their permissions does not affect the\nkey. Only an explicit revoke or the key's expiry ends it.\n\n### Scopes\nEvery key is stamped with one or more ability groups and can only reach the endpoints they\ncover. Anything else returns `403`. Choose scopes when you mint the key.\n\n| Scope | Grants |\n|---|---|\n| `skin:read` | Read scan history, analyses, care routines and procedure recommendations |\n| `skin:write` | Submit images for analysis, create scan sessions, generate routines |\n| `catalogue:read` | List and search products, the master catalogue and lookup data |\n| `catalogue:write` | Create, update and delete products and master-catalogue imports |\n| `orders:read` | Read order history, statistics and order details |\n| `orders:write` | Act on orders |\n| `ai:chat` | Ask the vendor AI assistant questions against your knowledge base |\n| `storefront:shopify` | Connect a Shopify store and keep its catalogue and orders in sync |\n| `storefront:woocommerce` | Connect a WooCommerce store and keep its catalogue and orders in sync |\n| `vendor:read` | Read your business profile, widget configuration and dashboard metrics |\n| `vendor:write` | Update your business profile and widget configuration |\n| `billing:read` | Read usage, balance and invoices |\n| `billing:pay` | Start a checkout for your outstanding invoices |\n| `billing:settings` | Change the scan spend cap and body-scan setting |\n| `files:read` | List and download your uploaded files |\n| `files:write` | Upload and delete files |\n\n`GET /user` is reachable by any key regardless of scopes — it is how an integration\ndiscovers which vendor it is authenticated as.\n\nKeys minted before scopes existed reach the whole public API and are flagged as **legacy**\nin the portal; rotate one to a scoped key to narrow it.\n\nNo scope grants access to credential management (API keys, MCP tokens), team and role\nadministration, wallets or withdrawals. Those remain portal-only.\n\n### Connected storefronts\nThe Shopify app and WooCommerce plugin authenticate with an organisation key like any other\nclient, and each has a named preset holding the minimum scope set it needs — pick it by\nname when minting the key (`\"preset\": \"shopify\"`) or fetch the list from\n`GET /developers/api-keys/presets`.\n\n| Preset | Scopes |\n|---|---|\n| `woocommerce` | `storefront:woocommerce`, `vendor:read`, `scans:collect`, `scans:pricing`, `skin:read`, `scan:delivery` |\n| `shopify` | `storefront:shopify`, `vendor:read`, `vendor:write`, `billing:read`, `catalogue:read`, `orders:read`, `files:write` |\n\nEach preset is derived from the endpoints that app actually calls, and asserted against\nthat list in the test suite. `billing:settings` is in neither, and `billing:pay` is in\nneither: the Shopify app reports usage but no longer settles invoices.\n\nA connected store's key reads its scopes from this table on every request rather than from\nthe list stamped on it when the store connected, so a scope added to a preset reaches\nstores that connected before it existed, with no reconnect.\n\n### The two billing write scopes\n`billing:pay` **cannot charge anything**. `POST /vendors/billing/pay-all` and\n`POST /vendors/billing/invoices/{id}/pay` open a gateway checkout session and return an\n`authorization_url`; funds move only when a human completes that checkout and the provider\nwebhook reconciles. The worst a leaked key does is generate a payment link for invoices the\nvendor already owes.\n\n`billing:settings` is the consequential one: `PATCH /vendors/billing/scan-spend-cap` accepts\n`null`, which removes your spending cap entirely, and `PATCH /vendors/billing/body-scan`\nenables a billable feature. Nothing outside the vendor portal needs it.\n\n`scans:pricing` reads and writes `/vendors/billing/scan-retail-price` — what you charge\nyour own customers when you collect scan payments on your own gateway. It is kept apart\nfrom `billing:settings` because it cannot change what Oyster charges you: your invoice is\nmeasured against your billing rate whatever price you set. A storefront integration can\nhold this without also gaining the ability to lift your spend cap.\n\n## Rate Limiting\nAPI endpoints are rate limited to prevent abuse. Check response headers for rate limit information.\n\n## Error Handling\nAll errors return a consistent JSON structure:\n```json\n{\n  \"message\": \"Error description\",\n  \"errors\": {\n    \"field\": [\"Specific error message\"]\n  }\n}\n```\n",
    "version": "1.0.0",
    "contact": {
      "name": "The Oyster Skin Team",
      "email": "team@oysterskin.com"
    }
  },
  "servers": [
    {
      "url": "https://api.sandbox.oysterskin.com/api/v1",
      "description": "Sandbox server"
    }
  ],
  "tags": [
    {
      "name": "Lookups",
      "description": "Data lookup endpoints for skin care options"
    }
  ],
  "paths": {
    "/lookups/skin-care-goals": {
      "get": {
        "tags": [
          "Lookups"
        ],
        "summary": "Get skin care goals",
        "description": "Get all available skin care goals for user selection.",
        "operationId": "getSkinCareGoals",
        "responses": {
          "200": {
            "description": "Skin care goals retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "integer"
                          },
                          "name": {
                            "type": "string"
                          },
                          "description": {
                            "type": "string",
                            "nullable": true
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "updated_at": {
                            "type": "string",
                            "format": "date-time"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
````