API documentation
The My-GR Link Directory REST API lets SEO administrators and agencies submit websites to the directory automatically. Access costs $50.00 per year and allows 20 submissions per day (resets at midnight, Europe/Athens).
- Create an account and buy API access.
- Open My Account → API Access and generate a token. It is shown only once — store it safely.
- Send it on every request:
Authorization: Bearer ld_xxxxxxxx
Base URL
https://directory.my-gr.com/api/v1
Submit a link
POST /api/v1/links — JSON body:
| Field | Notes | |
|---|---|---|
title | required | 3–100 characters |
url | required | Full URL, must not already be listed |
description | required | 50–1000 characters, unique text recommended |
category_id or category | required | Numeric id or slug from GET /categories |
phone, email, address | optional | Shown on the listing page |
icon_base64 | optional | Base64 PNG/JPG/WebP, square, ≥200×200 |
curl -X POST https://directory.my-gr.com/api/v1/links \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"Example Studio","url":"https://example.com","category":"web-design-hosting",
"description":"Example Studio designs fast, accessible websites for small businesses, with hosting and support included."}'
Response 201:
{
"ok": true,
"link": { "id": 123, "title": "Example Studio", "url": "https://example.com/", "status": "active",
"listing_url": "https://directory.my-gr.com/site/123-example-studio", ... },
"used_today": 1,
"daily_limit": 20}
API submissions go live immediately (subject to later moderation).
Edit a link
PATCH /api/v1/links/{id} (or PUT) — send only the fields you want to change (same fields as above, plus "remove_icon": true). Edits do not count toward the daily limit. Edited links stay live. A rejected link can be fixed and resubmitted this way.
curl -X PATCH https://directory.my-gr.com/api/v1/links/123 \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"title":"Example Studio – Web Design","description":"Updated description of at least fifty characters about the website."}'
Response 200: {"ok": true, "link": { ... }}
Delete a link
DELETE /api/v1/links/{id} → {"ok": true, "deleted": 123}
Other endpoints
GET /api/v1/me | Account, subscription end, today's usage |
GET /api/v1/categories | All categories (id, name, slug, parent_id) |
GET /api/v1/links?page=1 | Your links, newest first, 100 per page |
GET /api/v1/links/{id} | One of your links with its status |
Errors
| HTTP | error | Meaning |
|---|---|---|
| 404 | not_found | Link does not exist or is not yours |
| 401 | unauthorized | Missing, invalid or revoked token |
| 402 | subscription_required | API access expired — renew on Packages |
| 422 | validation_failed | See fields for per-field messages |
| 429 | daily_limit / rate_limited | Daily quota used, or more than 120 requests/minute |
PHP example
$ch = curl_init('https://directory.my-gr.com/api/v1/links');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['title' => $title, 'url' => $url, 'category' => 'seo-digital-marketing', 'description' => $desc])]);
$res = json_decode(curl_exec($ch), true);
Python example
import requests
r = requests.post("https://directory.my-gr.com/api/v1/links", headers={"Authorization": f"Bearer {token}"},
json={"title": title, "url": url, "category_id": 12, "description": desc})
print(r.status_code, r.json())