Gyda Logo

Gyda API

Keep your assistant up to date from your own tools. A spreadsheet, Zapier, Make or a script of your own can read your content, change live details, and create, edit or delete content items.

https://api.askgyda.com/v1

Overview

The API is push only: your systems tell Gyda what changed, and Gyda never connects to them or stores their credentials. Every call acts on one workspace, the one the key belongs to.

Two kinds of change behave differently. Live details (today's price, availability, a status line) reach guests the moment you send them. Titles, descriptions, new items and deletions land in the draft and reach guests after the next publish from the dashboard, exactly as when you make them in the editor.

  • Available on the Pro and Business plans.
  • Not in the API: publishing, photos and videos, call-to-action buttons, assistant settings. Those stay in the dashboard.
  • Help center guide for non-developers: Connecting your own tools with the API.

Authentication

Create a key in the dashboard under Workspace Settings, on the "Developers" tab. Owners and admins can create and revoke keys; a workspace holds up to 5 active keys. The key is shown once; keep it like a password.

Send it on every call in the Authorization header, as Bearer and the key. Tools whose authentication form only offers a custom header can send it as X-Api-Key instead.

  • A key belongs to the workspace, not to the person who created it, and keeps working until it is revoked.
  • If the workspace drops below Pro or its plan lapses, its keys stop answering until the plan is back. Revoking never needs a plan.

Request

curl https://api.askgyda.com/v1/assistants \
  -H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"

Requests and responses

Every address starts with https://api.askgyda.com/v1. Bodies are JSON with the header Content-Type: application/json, up to 100 KB. Ids are UUIDs; titles are never used to find anything.

A success answers 200 (201 for a new item) with the result inside "data". A refusal answers 4xx or 5xx with a fixed "error" word your code can test, a sentence in "message", and for validation errors a "details" list.

A success

{ "data": { ... } }

A refusal

{
  "error": "validation_error",
  "message": "The request is not valid",
  "details": ["\"title\" is required"]
}

List assistants

GET/v1/assistants

The assistants of the workspace, oldest first. The id is what the other calls need.

Request

curl https://api.askgyda.com/v1/assistants \
  -H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"

Response

{ "data": [
  { "id": "6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90", "title": "Hotel Aurora",
    "slug": "hotel-aurora_ab12cd", "created_at": "2026-08-01T10:00:00.000Z" }
] }

List an assistant's items

GET/v1/assistants/{assistantId}/items

Every content item of one assistant, oldest first, each with its live details and tag names. Descriptions are left out to keep the list small; read one item to get its description. Save the ids you need once, for example in a spreadsheet column next to the row they belong to.

Request

curl https://api.askgyda.com/v1/assistants/6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90/items \
  -H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"

Response

{ "data": [
  { "id": "9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e",
    "assistant_id": "6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90",
    "title": "Grilled salmon", "slug": "grilled-salmon_x1y2z3",
    "live_details": [
      { "key": "Price", "value": "17 euros", "source": "dashboard", "updated_at": "2026-09-20T09:12:00.000Z" }
    ],
    "tags": ["mains"],
    "updated_at": "2026-09-20T09:12:00.000Z" }
] }

Read one item

GET/v1/items/{itemId}

One item with its description, as the visible text the owner sees in the editor.

Request

curl https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e \
  -H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"

Response

{ "data": {
  "id": "9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e",
  "assistant_id": "6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90",
  "title": "Grilled salmon", "slug": "grilled-salmon_x1y2z3",
  "description": "Wild salmon from the morning market, grilled over oak.",
  "live_details": [ ... ],
  "tags": ["mains"],
  "updated_at": "2026-09-20T09:12:00.000Z" } }

Create an item

POST/v1/assistants/{assistantId}/items

A new content item in the assistant's draft. Guests find it after the next publish; its live details answer from then on.

  • title (required): up to 100 characters.
  • description (required): up to 2,000 characters. This is what the assistant answers from, so write it as you would in the editor.
  • tags (optional): a list of tag names, each at least 3 characters, stored in lowercase. A name the assistant does not use yet is created.
  • live_details (optional): name to value, as in the details update. Up to 10.
  • Counts against the plan's limit of items per assistant; a full assistant answers 403 item_limit_reached.

Request

curl -X POST https://api.askgyda.com/v1/assistants/6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90/items \
  -H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Pumpkin soup",
    "description": "Roasted pumpkin, ginger and coconut milk. Vegan.",
    "tags": ["starters"],
    "live_details": { "Price": "6.50 euros" }
  }'

Response (201)

{ "data": {
  "id": "3b7d0a44-2e1f-4c8a-9b6d-5f0e1a2b3c4d",
  "assistant_id": "6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90",
  "title": "Pumpkin soup", "slug": "pumpkin-soup_q8w2e4",
  "description": "Roasted pumpkin, ginger and coconut milk. Vegan.",
  "live_details": [
    { "key": "Price", "value": "6.50 euros", "source": "api", "updated_at": "2026-09-22T11:30:00.000Z" }
  ],
  "tags": ["starters"],
  "updated_at": "2026-09-22T11:30:00.000Z" } }

Update live details

PATCH/v1/items/{itemId}/details

The call most integrations need. Guests hear the new values on their next question, with nothing to publish.

  • Each name you send is set to its value. Names you leave out stay as they are.
  • A value of null or "" removes that detail.
  • Names match ignoring case, and the spelling already on the item is kept: sending price updates an existing Price.
  • A name up to 50 characters, a value up to 200, 10 details per item after the update.
  • Rows written here carry source "api" until someone changes the value in the dashboard.

Request

curl -X PATCH https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e/details \
  -H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi" \
  -H "Content-Type: application/json" \
  -d '{ "details": { "Price": "18.50 euros", "Availability": "few portions left tonight" } }'

Response

{ "data": {
  "id": "9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e",
  "live_details": [
    { "key": "Price", "value": "18.50 euros", "source": "api", "updated_at": "2026-09-22T11:04:09.745Z" },
    { "key": "Availability", "value": "few portions left tonight", "source": "api", "updated_at": "2026-09-22T11:04:09.773Z" }
  ] } }

Removing one

curl -X PATCH https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e/details \
  -H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi" \
  -H "Content-Type: application/json" \
  -d '{ "details": { "Availability": null } }'

Update title or description

PATCH/v1/items/{itemId}

Either field or both; a title is up to 100 characters. The change lands in the draft and reaches guests after the next publish. Tags, media and buttons are not touched. A description sent here replaces the whole text as plain words, so @-mentions of other items made in the editor are not kept.

Request

curl -X PATCH https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e \
  -H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi" \
  -H "Content-Type: application/json" \
  -d '{ "description": "Wild salmon from the morning market, grilled over oak, with seasonal greens." }'

Delete an item

DELETE/v1/items/{itemId}

Removes the item from the dashboard at once, the same as its Delete button. Guests stop finding it after the next publish. There is no undo through the API.

Request

curl -X DELETE https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e \
  -H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"

Response

{ "data": { "id": "9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e", "deleted": true } }

Errors

The error words are stable; test them rather than the sentence, which may be reworded.

HTTPerrorWhen
401missing_api_keyNo key on the request.
401invalid_api_keyThe key is unknown or was revoked.
403plan_requiredThe workspace is below the Pro plan.
403subscription_inactiveThe workspace's plan has lapsed.
403item_limit_reachedThe assistant already holds as many items as the plan allows.
400validation_errorThe body or a parameter is malformed, or the body is not JSON. "details" lists each problem.
400too_many_detailsThe item would carry more than 10 live details.
413validation_errorThe body is over 100 KB.
400request_rejectedAnother rule refused the change; the message says which.
404assistant_not_foundNo assistant with that id in your workspace.
404item_not_foundNo content item with that id in your workspace.
404not_foundNo such endpoint.
429rate_limitedMore than 600 calls in an hour from this key. See Retry-After.
500internal_errorSomething failed on our side. Try again later.

Rate limits

600 calls per hour per key, across every endpoint, on every plan. Each authenticated answer says where you stand; a 429 adds Retry-After with the seconds to wait.

In front of that, the edge limits bursts per address (240 calls a minute, 60 at once). No single integration comes near it; a caller that does gets a plain 429 without the JSON body.

Response headers

X-RateLimit-Limit: 600
X-RateLimit-Remaining: 587
X-RateLimit-Reset: 1790078627

Zapier and Make

Both work today through their generic web request step: "Webhooks by Zapier" (Custom Request) and the "HTTP" module in Make (Make a request).

A typical recipe: a spreadsheet row changes, the step sends PATCH to the details address of the item whose id sits in that row, with the Authorization header and a body built from the row, for example {"details": {"Price": "<price column>"}}.

  • Use one key per tool and name it after the tool, so you can revoke one without touching the others.
  • Store item ids next to your rows once; look them up with the items list call.