Skip to main content
Browse documentation

Type to search the documentation. Press Esc to close.

Scribble account API: keys, designs, handwritings and credits

For developers

Four small GET endpoints that answer the questions every integration asks first: is this key any good (/me), which card can I send (/designs), which hand can I write in (/handwriting), and can I afford it (/credits). None of them cost a credit or change anything.

On this page

design_id and handwriting on a send both take an id, and for a long time there was no way to find one except by opening the web app and reading a uuid out of the address bar. These endpoints are that missing half. They are also what populates the dropdowns in a Zapier or Make connector, which is why a key scoped only to cards:send can still read the two catalog endpoints.

#GET/api/v1/me

Check a key and read the account it belongs to. Use this as your connection test.

Requires scope any valid key

Test a key
curl https://scribblecards.com/api/v1/me \
  -H "Authorization: Bearer sk_live_U9BXdSSU_your_key_here"
200 OK
{
  "object": "account",
  "organization": {
    "name": "On Top of I.T.",
    "default_handwriting": "miriam"
  },
  "key": {
    "name": "Production CRM",
    "prefix": "sk_live_U9BXdSSU",
    "scopes": ["cards:send", "cards:read"]
  },
  "credits_available": 625,
  "can_send_cards": true
}

#GET/api/v1/designs

List your saved card designs. These ids are what design_id takes.

Requires scope cards:read or cards:send

200 OK
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "id": "1cba1acd-6988-443d-af00-46e64ef56d89",
      "object": "design",
      "name": "Holiday 2026 — clients",
      "kind": "card",
      "source": "catalog",
      "preview_url": null,
      "created_at": "2026-08-05T06:54:26.205Z",
      "updated_at": "2026-08-05T06:57:20.553Z"
    }
  ],
  "note": "Pass an `id` from this list as `design_id` on POST /api/v1/cards. Every card is a greeting card with a printed front — leaving it out uses your most recent design."
}

#GET/api/v1/handwriting

List the handwritings on offer. These ids are what handwriting takes.

Requires scope cards:read or cards:send

200 OK (truncated)
{
  "object": "list",
  "has_more": false,
  "default": "agnes",
  "styles": ["Everyday", "Quick", "Flowing", "Print", "Classic", "Wildcard"],
  "data": [
    {
      "id": "agnes",
      "object": "handwriting",
      "name": "Agnes",
      "style": "Everyday",
      "is_default": true,
      "sample_font_url": "https://scribblecards.com/fonts/all_fonts/agnes.ttf"
    }
  ]
}

This endpoint lists the 30 current handwriting choices. Group a picker by style so people can browse by appearance. The styles array retains all recognized categories, including the legacy Wildcard category. All 198 known handwriting ids remain valid for saved work and API calls. An older house handwriting can therefore appear in default even when it is absent from data.

#GET/api/v1/credits

How many cards you can still send.

Requires scope any valid key

200 OK
{
  "object": "credit_balance",
  "available": 625,
  "balance": 625,
  "reserved_for_campaigns": 0,
  "cards_you_can_send": 625,
  "top_up_url": "https://scribblecards.com/app/credits"
}

Read available, not balance. The difference is credits a scheduled campaign has already promised — spending those would leave the campaign short on the morning it runs.

Last checked against the product on . Something wrong or missing? Tell us.