This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Yet Another Hypermedia(ish) API specification

Yahapi is a basic hypermedia-enabled REST convention. Its primary goal is to simplify API decisions you might need to make while building backend API's.

Yahapi guides your API design to:

  • … link resources to each other;
  • … embed different resource types within your JSON response;
  • … provide a single unified error format for you API;
  • … promote you to add references to your API documentation in your JSON response;
  • … define how to return partial results;
  • … sort and paginate collections.

In the end Yahapi is just a list of preferences that make your API look nice, simple and consistent.

Example

Assume the following response:

GET /orders/43983
{
"order_id": 43983,
"created": "2014-08-05 16:22:16",
"modified": "2015-05-22 13:45:20",
"user_id": "914",
"items": [
{
"order_item_id": "912332",
"product_id": "EZ-21562",
"amount": 3
},
{
"order_item_id": "912333",
"product_id": "AF-49841",
"amount": 1
}
]
}

The same resource in Yahapi might look something like this:

GET /orders/43983
{
"id": 43983,
"created": "2014-08-05T16:22:16Z",
"modified": "2015-05-22T13:45:20Z",
"user_id": "914",
"type": "order",
"order_items": [
{
"id": "912332",
"product_id": "EZ-21562",
"amount": 3,
"links": {
"self": { "href": "/orders/43983/items/912332" },
"product": { "href": "/products/EZ-21562" }
}
},
{
"id": "912333",
"product_id": "AF-49841",
"amount": 1,
"links": {
"self": { "href": "/orders/43983/items/912333" },
"product": { "href": "/products/AF-49841" }
}
}
],
"links": {
"self": { "href": "/orders/43983" },
"user": { "href": "/users/914" },
"items": { "href": "/orders/43983/items" }
},
"meta": {
"retrieved_on": "2014-08-06T11:38:24.162Z"
}
}

Yahapi uses four reserved top-level keywords: id, type, links and meta.

  • id: the unique url parameter identifying the resource.
  • type: identifies the object as a resource (e.g. order) or as an embedded resource (e.g. orderItem) and tells the client how to process that resource.
  • links: is a collection of url's related to the resource that may be of interest to the client.
  • meta: contains any meta-information about the resource such as pagination.

Why Yet Another Hypermedia type?

In a worldfullofhypermediatypes why choose Yahapi?

In our experience no current Hypermedia type is a practical standard. That is, none of them make your life easier. Most are either too much focused on a specific use case or lack features to fully drive your API design. One hypermedia type that comes close to being a full style- and hypermedia-guide is JSON API. While JSON API is quite beautiful it requires an advanced server and smart client to make fully use of.

Yahapi is designed to keep things simple. Yahapi adds hypermedia controls with limited modifications to the "naive" JSON REST design, promoting readability and simplicity.

To this end Yahapi provides a list of guidelines for pagination, sorting, partial results and error formats; these guidelines should save you time searching for best practices and make for a more consistent API.

Yahapi makes your clients have more fun integrating your service.

Contribute!

Yahapi is a work in progress, if you feel like contributing open up an issue to start off a discussion or create a Pull Request with your suggested changes.

About

Yet Another Hypermedia(ish) API specification

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Yet Another Hypermedia(ish) API specification

Yahapi is a basic hypermedia-enabled REST convention. Its primary goal is to simplify API decisions you might need to make while building backend API's.

Yahapi guides your API design to:

  • … link resources to each other;
  • … embed different resource types within your JSON response;
  • … provide a single unified error format for you API;
  • … promote you to add references to your API documentation in your JSON response;
  • … define how to return partial results;
  • … sort and paginate collections.

In the end Yahapi is just a list of preferences that make your API look nice, simple and consistent.

Example

Assume the following response:

GET /orders/43983
{
"order_id": 43983,
"created": "2014-08-05 16:22:16",
"modified": "2015-05-22 13:45:20",
"user_id": "914",
"items": [
{
"order_item_id": "912332",
"product_id": "EZ-21562",
"amount": 3
},
{
"order_item_id": "912333",
"product_id": "AF-49841",
"amount": 1
}
]
}

The same resource in Yahapi might look something like this:

GET /orders/43983
{
"id": 43983,
"created": "2014-08-05T16:22:16Z",
"modified": "2015-05-22T13:45:20Z",
"user_id": "914",
"type": "order",
"order_items": [
{
"id": "912332",
"product_id": "EZ-21562",
"amount": 3,
"links": {
"self": { "href": "/orders/43983/items/912332" },
"product": { "href": "/products/EZ-21562" }
}
},
{
"id": "912333",
"product_id": "AF-49841",
"amount": 1,
"links": {
"self": { "href": "/orders/43983/items/912333" },
"product": { "href": "/products/AF-49841" }
}
}
],
"links": {
"self": { "href": "/orders/43983" },
"user": { "href": "/users/914" },
"items": { "href": "/orders/43983/items" }
},
"meta": {
"retrieved_on": "2014-08-06T11:38:24.162Z"
}
}

Yahapi uses four reserved top-level keywords: id, type, links and meta.

  • id: the unique url parameter identifying the resource.
  • type: identifies the object as a resource (e.g. order) or as an embedded resource (e.g. orderItem) and tells the client how to process that resource.
  • links: is a collection of url's related to the resource that may be of interest to the client.
  • meta: contains any meta-information about the resource such as pagination.

Why Yet Another Hypermedia type?

In a worldfullofhypermediatypes why choose Yahapi?

In our experience no current Hypermedia type is a practical standard. That is, none of them make your life easier. Most are either too much focused on a specific use case or lack features to fully drive your API design. One hypermedia type that comes close to being a full style- and hypermedia-guide is JSON API. While JSON API is quite beautiful it requires an advanced server and smart client to make fully use of.

Yahapi is designed to keep things simple. Yahapi adds hypermedia controls with limited modifications to the "naive" JSON REST design, promoting readability and simplicity.

To this end Yahapi provides a list of guidelines for pagination, sorting, partial results and error formats; these guidelines should save you time searching for best practices and make for a more consistent API.

Yahapi makes your clients have more fun integrating your service.

Contribute!

Yahapi is a work in progress, if you feel like contributing open up an issue to start off a discussion or create a Pull Request with your suggested changes.

About

Yet Another Hypermedia(ish) API specification

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Yet Another Hypermedia(ish) API specification

Yahapi is a basic hypermedia-enabled REST convention. Its primary goal is to simplify API decisions you might need to make while building backend API's.

Yahapi guides your API design to:

  • … link resources to each other;
  • … embed different resource types within your JSON response;
  • … provide a single unified error format for you API;
  • … promote you to add references to your API documentation in your JSON response;
  • … define how to return partial results;
  • … sort and paginate collections.

In the end Yahapi is just a list of preferences that make your API look nice, simple and consistent.

Example

Assume the following response:

GET /orders/43983
{
"order_id": 43983,
"created": "2014-08-05 16:22:16",
"modified": "2015-05-22 13:45:20",
"user_id": "914",
"items": [
{
"order_item_id": "912332",
"product_id": "EZ-21562",
"amount": 3
},
{
"order_item_id": "912333",
"product_id": "AF-49841",
"amount": 1
}
]
}

The same resource in Yahapi might look something like this:

GET /orders/43983
{
"id": 43983,
"created": "2014-08-05T16:22:16Z",
"modified": "2015-05-22T13:45:20Z",
"user_id": "914",
"type": "order",
"order_items": [
{
"id": "912332",
"product_id": "EZ-21562",
"amount": 3,
"links": {
"self": { "href": "/orders/43983/items/912332" },
"product": { "href": "/products/EZ-21562" }
}
},
{
"id": "912333",
"product_id": "AF-49841",
"amount": 1,
"links": {
"self": { "href": "/orders/43983/items/912333" },
"product": { "href": "/products/AF-49841" }
}
}
],
"links": {
"self": { "href": "/orders/43983" },
"user": { "href": "/users/914" },
"items": { "href": "/orders/43983/items" }
},
"meta": {
"retrieved_on": "2014-08-06T11:38:24.162Z"
}
}

Yahapi uses four reserved top-level keywords: id, type, links and meta.

  • id: the unique url parameter identifying the resource.
  • type: identifies the object as a resource (e.g. order) or as an embedded resource (e.g. orderItem) and tells the client how to process that resource.
  • links: is a collection of url's related to the resource that may be of interest to the client.
  • meta: contains any meta-information about the resource such as pagination.

Why Yet Another Hypermedia type?

In a worldfullofhypermediatypes why choose Yahapi?

In our experience no current Hypermedia type is a practical standard. That is, none of them make your life easier. Most are either too much focused on a specific use case or lack features to fully drive your API design. One hypermedia type that comes close to being a full style- and hypermedia-guide is JSON API. While JSON API is quite beautiful it requires an advanced server and smart client to make fully use of.

Yahapi is designed to keep things simple. Yahapi adds hypermedia controls with limited modifications to the "naive" JSON REST design, promoting readability and simplicity.

To this end Yahapi provides a list of guidelines for pagination, sorting, partial results and error formats; these guidelines should save you time searching for best practices and make for a more consistent API.

Yahapi makes your clients have more fun integrating your service.

Contribute!

Yahapi is a work in progress, if you feel like contributing open up an issue to start off a discussion or create a Pull Request with your suggested changes.

About

Yet Another Hypermedia(ish) API specification

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Yet Another Hypermedia(ish) API specification

Yahapi is a basic hypermedia-enabled REST convention. Its primary goal is to simplify API decisions you might need to make while building backend API's.

Yahapi guides your API design to:

  • … link resources to each other;
  • … embed different resource types within your JSON response;
  • … provide a single unified error format for you API;
  • … promote you to add references to your API documentation in your JSON response;
  • … define how to return partial results;
  • … sort and paginate collections.

In the end Yahapi is just a list of preferences that make your API look nice, simple and consistent.

Example

Assume the following response:

GET /orders/43983
{
"order_id": 43983,
"created": "2014-08-05 16:22:16",
"modified": "2015-05-22 13:45:20",
"user_id": "914",
"items": [
{
"order_item_id": "912332",
"product_id": "EZ-21562",
"amount": 3
},
{
"order_item_id": "912333",
"product_id": "AF-49841",
"amount": 1
}
]
}

The same resource in Yahapi might look something like this:

GET /orders/43983
{
"id": 43983,
"created": "2014-08-05T16:22:16Z",
"modified": "2015-05-22T13:45:20Z",
"user_id": "914",
"type": "order",
"order_items": [
{
"id": "912332",
"product_id": "EZ-21562",
"amount": 3,
"links": {
"self": { "href": "/orders/43983/items/912332" },
"product": { "href": "/products/EZ-21562" }
}
},
{
"id": "912333",
"product_id": "AF-49841",
"amount": 1,
"links": {
"self": { "href": "/orders/43983/items/912333" },
"product": { "href": "/products/AF-49841" }
}
}
],
"links": {
"self": { "href": "/orders/43983" },
"user": { "href": "/users/914" },
"items": { "href": "/orders/43983/items" }
},
"meta": {
"retrieved_on": "2014-08-06T11:38:24.162Z"
}
}

Yahapi uses four reserved top-level keywords: id, type, links and meta.

  • id: the unique url parameter identifying the resource.
  • type: identifies the object as a resource (e.g. order) or as an embedded resource (e.g. orderItem) and tells the client how to process that resource.
  • links: is a collection of url's related to the resource that may be of interest to the client.
  • meta: contains any meta-information about the resource such as pagination.

Why Yet Another Hypermedia type?

In a worldfullofhypermediatypes why choose Yahapi?

In our experience no current Hypermedia type is a practical standard. That is, none of them make your life easier. Most are either too much focused on a specific use case or lack features to fully drive your API design. One hypermedia type that comes close to being a full style- and hypermedia-guide is JSON API. While JSON API is quite beautiful it requires an advanced server and smart client to make fully use of.

Yahapi is designed to keep things simple. Yahapi adds hypermedia controls with limited modifications to the "naive" JSON REST design, promoting readability and simplicity.

To this end Yahapi provides a list of guidelines for pagination, sorting, partial results and error formats; these guidelines should save you time searching for best practices and make for a more consistent API.

Yahapi makes your clients have more fun integrating your service.

Contribute!

Yahapi is a work in progress, if you feel like contributing open up an issue to start off a discussion or create a Pull Request with your suggested changes.

About

Yet Another Hypermedia(ish) API specification

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Yet Another Hypermedia(ish) API specification

Yahapi is a basic hypermedia-enabled REST convention. Its primary goal is to simplify API decisions you might need to make while building backend API's.

Yahapi guides your API design to:

  • … link resources to each other;
  • … embed different resource types within your JSON response;
  • … provide a single unified error format for you API;
  • … promote you to add references to your API documentation in your JSON response;
  • … define how to return partial results;
  • … sort and paginate collections.

In the end Yahapi is just a list of preferences that make your API look nice, simple and consistent.

Example

Assume the following response:

GET /orders/43983
{
"order_id": 43983,
"created": "2014-08-05 16:22:16",
"modified": "2015-05-22 13:45:20",
"user_id": "914",
"items": [
{
"order_item_id": "912332",
"product_id": "EZ-21562",
"amount": 3
},
{
"order_item_id": "912333",
"product_id": "AF-49841",
"amount": 1
}
]
}

The same resource in Yahapi might look something like this:

GET /orders/43983
{
"id": 43983,
"created": "2014-08-05T16:22:16Z",
"modified": "2015-05-22T13:45:20Z",
"user_id": "914",
"type": "order",
"order_items": [
{
"id": "912332",
"product_id": "EZ-21562",
"amount": 3,
"links": {
"self": { "href": "/orders/43983/items/912332" },
"product": { "href": "/products/EZ-21562" }
}
},
{
"id": "912333",
"product_id": "AF-49841",
"amount": 1,
"links": {
"self": { "href": "/orders/43983/items/912333" },
"product": { "href": "/products/AF-49841" }
}
}
],
"links": {
"self": { "href": "/orders/43983" },
"user": { "href": "/users/914" },
"items": { "href": "/orders/43983/items" }
},
"meta": {
"retrieved_on": "2014-08-06T11:38:24.162Z"
}
}

Yahapi uses four reserved top-level keywords: id, type, links and meta.

  • id: the unique url parameter identifying the resource.
  • type: identifies the object as a resource (e.g. order) or as an embedded resource (e.g. orderItem) and tells the client how to process that resource.
  • links: is a collection of url's related to the resource that may be of interest to the client.
  • meta: contains any meta-information about the resource such as pagination.

Why Yet Another Hypermedia type?

In a worldfullofhypermediatypes why choose Yahapi?

In our experience no current Hypermedia type is a practical standard. That is, none of them make your life easier. Most are either too much focused on a specific use case or lack features to fully drive your API design. One hypermedia type that comes close to being a full style- and hypermedia-guide is JSON API. While JSON API is quite beautiful it requires an advanced server and smart client to make fully use of.

Yahapi is designed to keep things simple. Yahapi adds hypermedia controls with limited modifications to the "naive" JSON REST design, promoting readability and simplicity.

To this end Yahapi provides a list of guidelines for pagination, sorting, partial results and error formats; these guidelines should save you time searching for best practices and make for a more consistent API.

Yahapi makes your clients have more fun integrating your service.

Contribute!

Yahapi is a work in progress, if you feel like contributing open up an issue to start off a discussion or create a Pull Request with your suggested changes.

About

Yet Another Hypermedia(ish) API specification

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Yet Another Hypermedia(ish) API specification

Yahapi is a basic hypermedia-enabled REST convention. Its primary goal is to simplify API decisions you might need to make while building backend API's.

Yahapi guides your API design to:

  • … link resources to each other;
  • … embed different resource types within your JSON response;
  • … provide a single unified error format for you API;
  • … promote you to add references to your API documentation in your JSON response;
  • … define how to return partial results;
  • … sort and paginate collections.

In the end Yahapi is just a list of preferences that make your API look nice, simple and consistent.

Example

Assume the following response:

GET /orders/43983
{
"order_id": 43983,
"created": "2014-08-05 16:22:16",
"modified": "2015-05-22 13:45:20",
"user_id": "914",
"items": [
{
"order_item_id": "912332",
"product_id": "EZ-21562",
"amount": 3
},
{
"order_item_id": "912333",
"product_id": "AF-49841",
"amount": 1
}
]
}

The same resource in Yahapi might look something like this:

GET /orders/43983
{
"id": 43983,
"created": "2014-08-05T16:22:16Z",
"modified": "2015-05-22T13:45:20Z",
"user_id": "914",
"type": "order",
"order_items": [
{
"id": "912332",
"product_id": "EZ-21562",
"amount": 3,
"links": {
"self": { "href": "/orders/43983/items/912332" },
"product": { "href": "/products/EZ-21562" }
}
},
{
"id": "912333",
"product_id": "AF-49841",
"amount": 1,
"links": {
"self": { "href": "/orders/43983/items/912333" },
"product": { "href": "/products/AF-49841" }
}
}
],
"links": {
"self": { "href": "/orders/43983" },
"user": { "href": "/users/914" },
"items": { "href": "/orders/43983/items" }
},
"meta": {
"retrieved_on": "2014-08-06T11:38:24.162Z"
}
}

Yahapi uses four reserved top-level keywords: id, type, links and meta.

  • id: the unique url parameter identifying the resource.
  • type: identifies the object as a resource (e.g. order) or as an embedded resource (e.g. orderItem) and tells the client how to process that resource.
  • links: is a collection of url's related to the resource that may be of interest to the client.
  • meta: contains any meta-information about the resource such as pagination.

Why Yet Another Hypermedia type?

In a worldfullofhypermediatypes why choose Yahapi?

In our experience no current Hypermedia type is a practical standard. That is, none of them make your life easier. Most are either too much focused on a specific use case or lack features to fully drive your API design. One hypermedia type that comes close to being a full style- and hypermedia-guide is JSON API. While JSON API is quite beautiful it requires an advanced server and smart client to make fully use of.

Yahapi is designed to keep things simple. Yahapi adds hypermedia controls with limited modifications to the "naive" JSON REST design, promoting readability and simplicity.

To this end Yahapi provides a list of guidelines for pagination, sorting, partial results and error formats; these guidelines should save you time searching for best practices and make for a more consistent API.

Yahapi makes your clients have more fun integrating your service.

Contribute!

Yahapi is a work in progress, if you feel like contributing open up an issue to start off a discussion or create a Pull Request with your suggested changes.

About

Yet Another Hypermedia(ish) API specification

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Yet Another Hypermedia(ish) API specification

Yahapi is a basic hypermedia-enabled REST convention. Its primary goal is to simplify API decisions you might need to make while building backend API's.

Yahapi guides your API design to:

  • … link resources to each other;
  • … embed different resource types within your JSON response;
  • … provide a single unified error format for you API;
  • … promote you to add references to your API documentation in your JSON response;
  • … define how to return partial results;
  • … sort and paginate collections.

In the end Yahapi is just a list of preferences that make your API look nice, simple and consistent.

Example

Assume the following response:

GET /orders/43983
{
"order_id": 43983,
"created": "2014-08-05 16:22:16",
"modified": "2015-05-22 13:45:20",
"user_id": "914",
"items": [
{
"order_item_id": "912332",
"product_id": "EZ-21562",
"amount": 3
},
{
"order_item_id": "912333",
"product_id": "AF-49841",
"amount": 1
}
]
}

The same resource in Yahapi might look something like this:

GET /orders/43983
{
"id": 43983,
"created": "2014-08-05T16:22:16Z",
"modified": "2015-05-22T13:45:20Z",
"user_id": "914",
"type": "order",
"order_items": [
{
"id": "912332",
"product_id": "EZ-21562",
"amount": 3,
"links": {
"self": { "href": "/orders/43983/items/912332" },
"product": { "href": "/products/EZ-21562" }
}
},
{
"id": "912333",
"product_id": "AF-49841",
"amount": 1,
"links": {
"self": { "href": "/orders/43983/items/912333" },
"product": { "href": "/products/AF-49841" }
}
}
],
"links": {
"self": { "href": "/orders/43983" },
"user": { "href": "/users/914" },
"items": { "href": "/orders/43983/items" }
},
"meta": {
"retrieved_on": "2014-08-06T11:38:24.162Z"
}
}

Yahapi uses four reserved top-level keywords: id, type, links and meta.

  • id: the unique url parameter identifying the resource.
  • type: identifies the object as a resource (e.g. order) or as an embedded resource (e.g. orderItem) and tells the client how to process that resource.
  • links: is a collection of url's related to the resource that may be of interest to the client.
  • meta: contains any meta-information about the resource such as pagination.

Why Yet Another Hypermedia type?

In a worldfullofhypermediatypes why choose Yahapi?

In our experience no current Hypermedia type is a practical standard. That is, none of them make your life easier. Most are either too much focused on a specific use case or lack features to fully drive your API design. One hypermedia type that comes close to being a full style- and hypermedia-guide is JSON API. While JSON API is quite beautiful it requires an advanced server and smart client to make fully use of.

Yahapi is designed to keep things simple. Yahapi adds hypermedia controls with limited modifications to the "naive" JSON REST design, promoting readability and simplicity.

To this end Yahapi provides a list of guidelines for pagination, sorting, partial results and error formats; these guidelines should save you time searching for best practices and make for a more consistent API.

Yahapi makes your clients have more fun integrating your service.

Contribute!

Yahapi is a work in progress, if you feel like contributing open up an issue to start off a discussion or create a Pull Request with your suggested changes.

About

Yet Another Hypermedia(ish) API specification

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Yet Another Hypermedia(ish) API specification

Yahapi is a basic hypermedia-enabled REST convention. Its primary goal is to simplify API decisions you might need to make while building backend API's.

Yahapi guides your API design to:

  • … link resources to each other;
  • … embed different resource types within your JSON response;
  • … provide a single unified error format for you API;
  • … promote you to add references to your API documentation in your JSON response;
  • … define how to return partial results;
  • … sort and paginate collections.

In the end Yahapi is just a list of preferences that make your API look nice, simple and consistent.

Example

Assume the following response:

GET /orders/43983
{
"order_id": 43983,
"created": "2014-08-05 16:22:16",
"modified": "2015-05-22 13:45:20",
"user_id": "914",
"items": [
{
"order_item_id": "912332",
"product_id": "EZ-21562",
"amount": 3
},
{
"order_item_id": "912333",
"product_id": "AF-49841",
"amount": 1
}
]
}

The same resource in Yahapi might look something like this:

GET /orders/43983
{
"id": 43983,
"created": "2014-08-05T16:22:16Z",
"modified": "2015-05-22T13:45:20Z",
"user_id": "914",
"type": "order",
"order_items": [
{
"id": "912332",
"product_id": "EZ-21562",
"amount": 3,
"links": {
"self": { "href": "/orders/43983/items/912332" },
"product": { "href": "/products/EZ-21562" }
}
},
{
"id": "912333",
"product_id": "AF-49841",
"amount": 1,
"links": {
"self": { "href": "/orders/43983/items/912333" },
"product": { "href": "/products/AF-49841" }
}
}
],
"links": {
"self": { "href": "/orders/43983" },
"user": { "href": "/users/914" },
"items": { "href": "/orders/43983/items" }
},
"meta": {
"retrieved_on": "2014-08-06T11:38:24.162Z"
}
}

Yahapi uses four reserved top-level keywords: id, type, links and meta.

  • id: the unique url parameter identifying the resource.
  • type: identifies the object as a resource (e.g. order) or as an embedded resource (e.g. orderItem) and tells the client how to process that resource.
  • links: is a collection of url's related to the resource that may be of interest to the client.
  • meta: contains any meta-information about the resource such as pagination.

Why Yet Another Hypermedia type?

In a worldfullofhypermediatypes why choose Yahapi?

In our experience no current Hypermedia type is a practical standard. That is, none of them make your life easier. Most are either too much focused on a specific use case or lack features to fully drive your API design. One hypermedia type that comes close to being a full style- and hypermedia-guide is JSON API. While JSON API is quite beautiful it requires an advanced server and smart client to make fully use of.

Yahapi is designed to keep things simple. Yahapi adds hypermedia controls with limited modifications to the "naive" JSON REST design, promoting readability and simplicity.

To this end Yahapi provides a list of guidelines for pagination, sorting, partial results and error formats; these guidelines should save you time searching for best practices and make for a more consistent API.

Yahapi makes your clients have more fun integrating your service.

Contribute!

Yahapi is a work in progress, if you feel like contributing open up an issue to start off a discussion or create a Pull Request with your suggested changes.

About

Yet Another Hypermedia(ish) API specification

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors